diff --git a/.bazelversion b/.bazelversion index 0e79152459e..e7fdef7e2e6 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -8.1.1 +8.4.2 diff --git a/.gitattributes b/.gitattributes index df5bed028be..610342ef78b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -82,9 +82,6 @@ /csharp/paket.main.bzl linguist-generated=true /csharp/paket.main_extension.bzl linguist-generated=true -# ripunzip tool -/misc/ripunzip/ripunzip-* filter=lfs diff=lfs merge=lfs -text - # swift prebuilt resources /swift/third_party/resources/*.zip filter=lfs diff=lfs merge=lfs -text /swift/third_party/resources/*.tar.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9ce291fa33c..60b21a86163 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -40,3 +40,8 @@ updates: - dependency-name: "*" reviewers: - "github/codeql-go" + + - package-ecosystem: bazel + directory: "/" + schedule: + interval: weekly diff --git a/.github/workflows/build-ripunzip.yml b/.github/workflows/build-ripunzip.yml deleted file mode 100644 index 08547268e3b..00000000000 --- a/.github/workflows/build-ripunzip.yml +++ /dev/null @@ -1,166 +0,0 @@ -name: Build ripunzip - -on: - workflow_dispatch: - inputs: - ripunzip-version: - description: What reference to checkout from google/ripunzip. Latest by default - required: false - openssl-version: - description: What reference to checkout from openssl/openssl for Linux. Latest by default - required: false - open-pr: - description: Open a pull request updating the ripunzip versions committed to lfs - required: false - default: true # will be false on PRs - pull_request: - paths: - - .github/workflows/build-ripunzip.yml - -permissions: {} - -jobs: - versions: - runs-on: ubuntu-slim - outputs: - ripunzip-version: ${{ inputs.ripunzip-version || steps.fetch-ripunzip-version.outputs.version }} - openssl-version: ${{ inputs.openssl-version || steps.fetch-openssl-version.outputs.version }} - steps: - - name: Fetch latest ripunzip version - id: fetch-ripunzip-version - if: "!inputs.ripunzip-version" - run: &fetch-version - echo "version=$(gh release view --repo $REPO --json tagName --jq .tagName)" | tee -a $GITHUB_OUTPUT - env: - REPO: "google/ripunzip" - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Fetch latest openssl version - id: fetch-openssl-version - if: "!inputs.openssl-version" - run: *fetch-version - env: - REPO: "openssl/openssl" - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - build: - needs: versions - strategy: - fail-fast: false - matrix: - os: [ubuntu-24.04, macos-15, windows-2025] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v5 - with: - repository: google/ripunzip - ref: ${{ needs.versions.outputs.ripunzip-version }} - # we need to avoid ripunzip dynamically linking into libssl - # see https://github.com/sfackler/rust-openssl/issues/183 - - if: runner.os == 'Linux' - name: checkout openssl - uses: actions/checkout@v5 - with: - repository: openssl/openssl - path: openssl - ref: ${{ needs.versions.outputs.openssl-version }} - - if: runner.os == 'Linux' - name: build and install openssl with fPIC - shell: bash - working-directory: openssl - run: | - ./config -fPIC --prefix=$HOME/.local --openssldir=$HOME/.local/ssl - make -j $(nproc) - make install_sw -j $(nproc) - - if: runner.os == 'Linux' - name: build (linux) - shell: bash - run: | - env OPENSSL_LIB_DIR=$HOME/.local/lib64 OPENSSL_INCLUDE_DIR=$HOME/.local/include OPENSSL_STATIC=yes cargo build --release - mv target/release/ripunzip ripunzip-linux - - if: runner.os == 'Windows' - name: build (windows) - shell: bash - run: | - cargo build --release - mv target/release/ripunzip ripunzip-windows - - name: build (macOS) - if: runner.os == 'macOS' - shell: bash - run: | - rustup target install x86_64-apple-darwin - rustup target install aarch64-apple-darwin - cargo build --target x86_64-apple-darwin --release - cargo build --target aarch64-apple-darwin --release - lipo -create -output ripunzip-macos \ - -arch x86_64 target/x86_64-apple-darwin/release/ripunzip \ - -arch arm64 target/aarch64-apple-darwin/release/ripunzip - - name: Archive - shell: bash - run: | - tar acf ripunzip-$RUNNER_OS.tar.zst ripunzip-$(echo $RUNNER_OS | tr '[:upper:]' '[:lower:]') - - name: Upload built binary - uses: actions/upload-artifact@v4 - with: - name: ripunzip-${{ runner.os }} - path: ripunzip-${{ runner.os }}.tar.zst - retention-days: 5 - compression: 0 - - name: Check built binary - shell: bash - run: | - rm -f ripunzip-*.tar.zst - ./ripunzip-* --version - publish: - needs: [versions, build] - if: inputs.open-pr == 'true' - permissions: - contents: write - pull-requests: write - runs-on: ubuntu-slim - steps: - # workaround for git-lfs not being installed yet on ubuntu-slim runners - - name: Ensure git-lfs is installed - shell: bash - run: | - if which git-lfs &>/dev/null; then - echo "git-lfs is already installed" - exit 0 - fi - cd $TMP - gh release download --repo git-lfs/git-lfs --pattern "git-lfs-linux-amd64-*.tar.gz" --clobber - tar xzf git-lfs-linux-amd64-*.tar.gz - rm git-lfs-linux-amd64-*.tar.gz - cd git-lfs-* - pwd | tee -a $GITHUB_PATH - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/checkout@v5 - with: - sparse-checkout: | - .github - misc/ripunzip - lfs: true - - name: Download built binaries - uses: actions/download-artifact@v4 - with: - merge-multiple: true - path: misc/ripunzip - - name: Open PR - shell: bash - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git switch -c update-ripunzip - git add misc/ripunzip - git commit -m "Update ripunzip binaries to version $VERSION" - git push --set-upstream origin update-ripunzip --force - TITLE="Update ripunzip binaries to version $VERSION" - gh pr create \ - --draft \ - --title "$TITLE" \ - --body "Automated update of ripunzip binaries." \ - --assignee "$ACTOR" || - (gh pr edit --title "$TITLE" --add-assignee "$ACTOR" && gh pr ready --undo) - env: - ACTOR: ${{ github.actor }} - VERSION: ${{ needs.versions.outputs.ripunzip-version }} - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 72bf2052627..64b46b00a22 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,7 +34,7 @@ jobs: - name: Setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.300 + dotnet-version: 10.0.100 - name: Checkout repository uses: actions/checkout@v5 diff --git a/.github/workflows/csharp-qltest.yml b/.github/workflows/csharp-qltest.yml index 3c73eaec3b6..fc8bc218fe7 100644 --- a/.github/workflows/csharp-qltest.yml +++ b/.github/workflows/csharp-qltest.yml @@ -43,14 +43,14 @@ jobs: - name: Setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.300 + dotnet-version: 10.0.100 - name: Extractor unit tests run: | dotnet tool restore - dotnet test -p:RuntimeFrameworkVersion=9.0.5 extractor/Semmle.Util.Tests - dotnet test -p:RuntimeFrameworkVersion=9.0.5 extractor/Semmle.Extraction.Tests - dotnet test -p:RuntimeFrameworkVersion=9.0.5 autobuilder/Semmle.Autobuild.CSharp.Tests - dotnet test -p:RuntimeFrameworkVersion=9.0.5 autobuilder/Semmle.Autobuild.Cpp.Tests + dotnet test -p:RuntimeFrameworkVersion=10.0.0 extractor/Semmle.Util.Tests + dotnet test -p:RuntimeFrameworkVersion=10.0.0 extractor/Semmle.Extraction.Tests + dotnet test -p:RuntimeFrameworkVersion=10.0.0 autobuilder/Semmle.Autobuild.CSharp.Tests + dotnet test -p:RuntimeFrameworkVersion=10.0.0 autobuilder/Semmle.Autobuild.Cpp.Tests shell: bash stubgentest: runs-on: ubuntu-latest diff --git a/MODULE.bazel b/MODULE.bazel index dfd2c469a5e..8ba6c2fcd8c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -23,10 +23,10 @@ bazel_dep(name = "rules_shell", version = "0.5.0") bazel_dep(name = "bazel_skylib", version = "1.8.1") bazel_dep(name = "abseil-cpp", version = "20240116.1", repo_name = "absl") bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json") -bazel_dep(name = "fmt", version = "10.0.0") +bazel_dep(name = "fmt", version = "12.1.0-codeql.1") bazel_dep(name = "rules_kotlin", version = "2.1.3-codeql.1") bazel_dep(name = "gazelle", version = "0.40.0") -bazel_dep(name = "rules_dotnet", version = "0.19.2-codeql.1") +bazel_dep(name = "rules_dotnet", version = "0.21.5-codeql.1") bazel_dep(name = "googletest", version = "1.14.0.bcr.1") bazel_dep(name = "rules_rust", version = "0.66.0") bazel_dep(name = "zstd", version = "1.5.5.bcr.1") @@ -172,7 +172,7 @@ http_archive( ) dotnet = use_extension("@rules_dotnet//dotnet:extensions.bzl", "dotnet") -dotnet.toolchain(dotnet_version = "9.0.300") +dotnet.toolchain(dotnet_version = "10.0.100") use_repo(dotnet, "dotnet_toolchains") register_toolchains("@dotnet_toolchains//:all") @@ -269,24 +269,16 @@ go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//go/extractor:go.mod") use_repo(go_deps, "org_golang_x_mod", "org_golang_x_tools") -lfs_archive = use_repo_rule("//misc/bazel:lfs.bzl", "lfs_archive") +ripunzip_archive = use_repo_rule("//misc/ripunzip:ripunzip.bzl", "ripunzip_archive") -lfs_archive( - name = "ripunzip-linux", - src = "//misc/ripunzip:ripunzip-Linux.tar.zst", - build_file = "//misc/ripunzip:BUILD.ripunzip.bazel", -) - -lfs_archive( - name = "ripunzip-windows", - src = "//misc/ripunzip:ripunzip-Windows.tar.zst", - build_file = "//misc/ripunzip:BUILD.ripunzip.bazel", -) - -lfs_archive( - name = "ripunzip-macos", - src = "//misc/ripunzip:ripunzip-macOS.tar.zst", - build_file = "//misc/ripunzip:BUILD.ripunzip.bazel", +# go to https://github.com/GoogleChrome/ripunzip/releases to find latest version and corresponding sha256s +ripunzip_archive( + name = "ripunzip", + sha256_linux = "71482d7a7e4ea9176d5596161c49250c34b136b157c45f632b1111323fbfc0de", + sha256_macos_arm = "604194ab13f0aba3972995d995f11002b8fc285c8170401fcd46655065df20c9", + sha256_macos_intel = "65367b94fd579d93d46f2d2595cc4c9a60cfcf497e3c824f9d1a7b80fa8bd38a", + sha256_windows = "ac3874075def2b9e5074a3b5945005ab082cc6e689e1de658da8965bc23e643e", + version = "2.0.4", ) register_toolchains( diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index ffe1cba8281..4713be3d4f5 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,19 @@ +## 0.4.24 + +No user-facing changes. + +## 0.4.23 + +No user-facing changes. + +## 0.4.22 + +No user-facing changes. + +## 0.4.21 + +No user-facing changes. + ## 0.4.20 No user-facing changes. diff --git a/actions/ql/lib/change-notes/2025-11-28-fix-code-injection-alert-filtering.md b/actions/ql/lib/change-notes/2025-11-28-fix-code-injection-alert-filtering.md new file mode 100644 index 00000000000..b80ef77c2bc --- /dev/null +++ b/actions/ql/lib/change-notes/2025-11-28-fix-code-injection-alert-filtering.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* The query `actions/code-injection/medium` has been updated to include results which were incorrectly excluded while filtering out results that are reported by `actions/code-injection/critical`. diff --git a/actions/ql/lib/change-notes/released/0.4.21.md b/actions/ql/lib/change-notes/released/0.4.21.md new file mode 100644 index 00000000000..4457437acf2 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.21.md @@ -0,0 +1,3 @@ +## 0.4.21 + +No user-facing changes. diff --git a/actions/ql/lib/change-notes/released/0.4.22.md b/actions/ql/lib/change-notes/released/0.4.22.md new file mode 100644 index 00000000000..289b153fdc9 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.22.md @@ -0,0 +1,3 @@ +## 0.4.22 + +No user-facing changes. diff --git a/actions/ql/lib/change-notes/released/0.4.23.md b/actions/ql/lib/change-notes/released/0.4.23.md new file mode 100644 index 00000000000..bec5c9a2085 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.23.md @@ -0,0 +1,3 @@ +## 0.4.23 + +No user-facing changes. diff --git a/actions/ql/lib/change-notes/released/0.4.24.md b/actions/ql/lib/change-notes/released/0.4.24.md new file mode 100644 index 00000000000..c481220bc14 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.24.md @@ -0,0 +1,3 @@ +## 0.4.24 + +No user-facing changes. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 380b2d09423..b26f62aec37 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.20 +lastReleaseVersion: 0.4.24 diff --git a/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll b/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll index 0f77acc2444..3d5b8852b85 100644 --- a/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll +++ b/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll @@ -19,12 +19,7 @@ class CodeInjectionSink extends DataFlow::Node { Event getRelevantCriticalEventForSink(DataFlow::Node sink) { inPrivilegedContext(sink.asExpr(), result) and not exists(ControlCheck check | check.protects(sink.asExpr(), result, "code-injection")) and - // exclude cases where the sink is a JS script and the expression uses toJson - not exists(UsesStep script | - script.getCallee() = "actions/github-script" and - script.getArgumentExpr("script") = sink.asExpr() and - exists(getAToJsonReferenceExpression(sink.asExpr().(Expression).getExpression(), _)) - ) + not isGithubScriptUsingToJson(sink.asExpr()) } /** @@ -91,3 +86,38 @@ private module CodeInjectionConfig implements DataFlow::ConfigSig { /** Tracks flow of unsafe user input that is used to construct and evaluate a code script. */ module CodeInjectionFlow = TaintTracking::Global; + +/** + * Holds if there is a code injection flow from `source` to `sink` with + * critical severity, linked by `event`. + */ +predicate criticalSeverityCodeInjection( + CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink, Event event +) { + CodeInjectionFlow::flowPath(source, sink) and + event = getRelevantCriticalEventForSink(sink.getNode()) and + source.getNode().(RemoteFlowSource).getEventName() = event.getName() +} + +/** + * Holds if there is a code injection flow from `source` to `sink` with medium severity. + */ +predicate mediumSeverityCodeInjection( + CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink +) { + CodeInjectionFlow::flowPath(source, sink) and + not criticalSeverityCodeInjection(source, sink, _) and + not isGithubScriptUsingToJson(sink.getNode().asExpr()) +} + +/** + * Holds if `expr` is the `script` input to `actions/github-script` and it uses + * `toJson`. + */ +predicate isGithubScriptUsingToJson(Expression expr) { + exists(UsesStep script | + script.getCallee() = "actions/github-script" and + script.getArgumentExpr("script") = expr and + exists(getAToJsonReferenceExpression(expr.getExpression(), _)) + ) +} diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 295d925c318..2ef4b7765bf 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.21-dev +version: 0.4.25-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index c7253227b7c..9a9f8964755 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,19 @@ +## 0.6.16 + +No user-facing changes. + +## 0.6.15 + +No user-facing changes. + +## 0.6.14 + +No user-facing changes. + +## 0.6.13 + +No user-facing changes. + ## 0.6.12 No user-facing changes. diff --git a/actions/ql/src/Security/CWE-094/CodeInjectionCritical.ql b/actions/ql/src/Security/CWE-094/CodeInjectionCritical.ql index ed30e4da71c..001aadd66cb 100644 --- a/actions/ql/src/Security/CWE-094/CodeInjectionCritical.ql +++ b/actions/ql/src/Security/CWE-094/CodeInjectionCritical.ql @@ -20,10 +20,7 @@ import CodeInjectionFlow::PathGraph import codeql.actions.security.ControlChecks from CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink, Event event -where - CodeInjectionFlow::flowPath(source, sink) and - event = getRelevantCriticalEventForSink(sink.getNode()) and - source.getNode().(RemoteFlowSource).getEventName() = event.getName() +where criticalSeverityCodeInjection(source, sink, event) select sink.getNode(), source, sink, "Potential code injection in $@, which may be controlled by an external user ($@).", sink, sink.getNode().asExpr().(Expression).getRawExpression(), event, event.getName() diff --git a/actions/ql/src/Security/CWE-094/CodeInjectionMedium.ql b/actions/ql/src/Security/CWE-094/CodeInjectionMedium.ql index 0f8b6e13a29..8bc3fe8f51a 100644 --- a/actions/ql/src/Security/CWE-094/CodeInjectionMedium.ql +++ b/actions/ql/src/Security/CWE-094/CodeInjectionMedium.ql @@ -19,15 +19,7 @@ import codeql.actions.security.CodeInjectionQuery import CodeInjectionFlow::PathGraph from CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink -where - CodeInjectionFlow::flowPath(source, sink) and - inNonPrivilegedContext(sink.getNode().asExpr()) and - // exclude cases where the sink is a JS script and the expression uses toJson - not exists(UsesStep script | - script.getCallee() = "actions/github-script" and - script.getArgumentExpr("script") = sink.getNode().asExpr() and - exists(getAToJsonReferenceExpression(sink.getNode().asExpr().(Expression).getExpression(), _)) - ) +where mediumSeverityCodeInjection(source, sink) select sink.getNode(), source, sink, "Potential code injection in $@, which may be controlled by an external user.", sink, sink.getNode().asExpr().(Expression).getRawExpression() diff --git a/actions/ql/src/Security/CWE-275/MissingActionsPermissions.md b/actions/ql/src/Security/CWE-275/MissingActionsPermissions.md index e932fcf50fd..bbe918bba7e 100644 --- a/actions/ql/src/Security/CWE-275/MissingActionsPermissions.md +++ b/actions/ql/src/Security/CWE-275/MissingActionsPermissions.md @@ -2,6 +2,8 @@ If a GitHub Actions job or workflow has no explicit permissions set, then the repository permissions are used. Repositories created under organizations inherit the organization permissions. The organizations or repositories created before February 2023 have the default permissions set to read-write. Often these permissions do not adhere to the principle of least privilege and can be reduced to read-only, leaving the `write` permission only to a specific types as `issues: write` or `pull-requests: write`. +Note that this query cannot check whether the organization or repository token settings are set to read-only. However, even if they are, it is recommended to define explicit permissions (`contents: read` and `packages: read` are equivalent to the read-only default) so that (a) the actual needs of the workflow are documented, and (b) the permissions will remain restricted if the default is subsequently changed, or the workflow is copied to a different repository or organization. + ## Recommendation Add the `permissions` key to the job or the root of workflow (in this case it is applied to all jobs in the workflow that do not have their own `permissions` key) and assign the least privileges required to complete the task. diff --git a/actions/ql/src/change-notes/released/0.6.13.md b/actions/ql/src/change-notes/released/0.6.13.md new file mode 100644 index 00000000000..0dad2009c46 --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.13.md @@ -0,0 +1,3 @@ +## 0.6.13 + +No user-facing changes. diff --git a/actions/ql/src/change-notes/released/0.6.14.md b/actions/ql/src/change-notes/released/0.6.14.md new file mode 100644 index 00000000000..f96f2afc5fd --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.14.md @@ -0,0 +1,3 @@ +## 0.6.14 + +No user-facing changes. diff --git a/actions/ql/src/change-notes/released/0.6.15.md b/actions/ql/src/change-notes/released/0.6.15.md new file mode 100644 index 00000000000..3060ada741e --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.15.md @@ -0,0 +1,3 @@ +## 0.6.15 + +No user-facing changes. diff --git a/actions/ql/src/change-notes/released/0.6.16.md b/actions/ql/src/change-notes/released/0.6.16.md new file mode 100644 index 00000000000..ec5c49b7d64 --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.16.md @@ -0,0 +1,3 @@ +## 0.6.16 + +No user-facing changes. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index 28c22ccab7c..169788bff08 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.12 +lastReleaseVersion: 0.6.16 diff --git a/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql b/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql index 517a9d1eaad..d03d2407cb7 100644 --- a/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql +++ b/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql @@ -1,5 +1,5 @@ /** - * @name Artifact Poisoning (Path Traversal). + * @name Artifact Poisoning (Path Traversal) * @description An attacker may be able to poison the workflow's artifacts and influence on consequent steps. * @kind problem * @problem.severity error diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index b612696b816..51286147674 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.13-dev +version: 0.6.17-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/push_and_workflow_dispatch.yml b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/push_and_workflow_dispatch.yml new file mode 100644 index 00000000000..8b7a6df009c --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/push_and_workflow_dispatch.yml @@ -0,0 +1,18 @@ +on: + push: + workflow_dispatch: + +jobs: + echo-chamber: + runs-on: ubuntu-latest + steps: + - run: echo '${{ github.event.commits[11].message }}' + - run: echo '${{ github.event.commits[11].author.email }}' + - run: echo '${{ github.event.commits[11].author.name }}' + - run: echo '${{ github.event.head_commit.message }}' + - run: echo '${{ github.event.head_commit.author.email }}' + - run: echo '${{ github.event.head_commit.author.name }}' + - run: echo '${{ github.event.head_commit.committer.email }}' + - run: echo '${{ github.event.head_commit.committer.name }}' + - run: echo '${{ github.event.commits[11].committer.email }}' + - run: echo '${{ github.event.commits[11].committer.name }}' \ No newline at end of file diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected index af788f6280b..9bf7e9aa56d 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected @@ -435,6 +435,16 @@ nodes | .github/workflows/push.yml:14:19:14:64 | github.event.head_commit.committer.name | semmle.label | github.event.head_commit.committer.name | | .github/workflows/push.yml:15:19:15:65 | github.event.commits[11].committer.email | semmle.label | github.event.commits[11].committer.email | | .github/workflows/push.yml:16:19:16:64 | github.event.commits[11].committer.name | semmle.label | github.event.commits[11].committer.name | +| .github/workflows/push_and_workflow_dispatch.yml:9:19:9:57 | github.event.commits[11].message | semmle.label | github.event.commits[11].message | +| .github/workflows/push_and_workflow_dispatch.yml:10:19:10:62 | github.event.commits[11].author.email | semmle.label | github.event.commits[11].author.email | +| .github/workflows/push_and_workflow_dispatch.yml:11:19:11:61 | github.event.commits[11].author.name | semmle.label | github.event.commits[11].author.name | +| .github/workflows/push_and_workflow_dispatch.yml:12:19:12:57 | github.event.head_commit.message | semmle.label | github.event.head_commit.message | +| .github/workflows/push_and_workflow_dispatch.yml:13:19:13:62 | github.event.head_commit.author.email | semmle.label | github.event.head_commit.author.email | +| .github/workflows/push_and_workflow_dispatch.yml:14:19:14:61 | github.event.head_commit.author.name | semmle.label | github.event.head_commit.author.name | +| .github/workflows/push_and_workflow_dispatch.yml:15:19:15:65 | github.event.head_commit.committer.email | semmle.label | github.event.head_commit.committer.email | +| .github/workflows/push_and_workflow_dispatch.yml:16:19:16:64 | github.event.head_commit.committer.name | semmle.label | github.event.head_commit.committer.name | +| .github/workflows/push_and_workflow_dispatch.yml:17:19:17:65 | github.event.commits[11].committer.email | semmle.label | github.event.commits[11].committer.email | +| .github/workflows/push_and_workflow_dispatch.yml:18:19:18:64 | github.event.commits[11].committer.name | semmle.label | github.event.commits[11].committer.name | | .github/workflows/reusable-workflow-1.yml:6:7:6:11 | input taint | semmle.label | input taint | | .github/workflows/reusable-workflow-1.yml:36:21:36:39 | inputs.taint | semmle.label | inputs.taint | | .github/workflows/reusable-workflow-1.yml:44:19:44:56 | github.event.pull_request.title | semmle.label | github.event.pull_request.title | diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected index 6c948d9559e..4bbe7da0aaf 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected @@ -435,6 +435,16 @@ nodes | .github/workflows/push.yml:14:19:14:64 | github.event.head_commit.committer.name | semmle.label | github.event.head_commit.committer.name | | .github/workflows/push.yml:15:19:15:65 | github.event.commits[11].committer.email | semmle.label | github.event.commits[11].committer.email | | .github/workflows/push.yml:16:19:16:64 | github.event.commits[11].committer.name | semmle.label | github.event.commits[11].committer.name | +| .github/workflows/push_and_workflow_dispatch.yml:9:19:9:57 | github.event.commits[11].message | semmle.label | github.event.commits[11].message | +| .github/workflows/push_and_workflow_dispatch.yml:10:19:10:62 | github.event.commits[11].author.email | semmle.label | github.event.commits[11].author.email | +| .github/workflows/push_and_workflow_dispatch.yml:11:19:11:61 | github.event.commits[11].author.name | semmle.label | github.event.commits[11].author.name | +| .github/workflows/push_and_workflow_dispatch.yml:12:19:12:57 | github.event.head_commit.message | semmle.label | github.event.head_commit.message | +| .github/workflows/push_and_workflow_dispatch.yml:13:19:13:62 | github.event.head_commit.author.email | semmle.label | github.event.head_commit.author.email | +| .github/workflows/push_and_workflow_dispatch.yml:14:19:14:61 | github.event.head_commit.author.name | semmle.label | github.event.head_commit.author.name | +| .github/workflows/push_and_workflow_dispatch.yml:15:19:15:65 | github.event.head_commit.committer.email | semmle.label | github.event.head_commit.committer.email | +| .github/workflows/push_and_workflow_dispatch.yml:16:19:16:64 | github.event.head_commit.committer.name | semmle.label | github.event.head_commit.committer.name | +| .github/workflows/push_and_workflow_dispatch.yml:17:19:17:65 | github.event.commits[11].committer.email | semmle.label | github.event.commits[11].committer.email | +| .github/workflows/push_and_workflow_dispatch.yml:18:19:18:64 | github.event.commits[11].committer.name | semmle.label | github.event.commits[11].committer.name | | .github/workflows/reusable-workflow-1.yml:6:7:6:11 | input taint | semmle.label | input taint | | .github/workflows/reusable-workflow-1.yml:36:21:36:39 | inputs.taint | semmle.label | inputs.taint | | .github/workflows/reusable-workflow-1.yml:44:19:44:56 | github.event.pull_request.title | semmle.label | github.event.pull_request.title | @@ -719,6 +729,16 @@ subpaths | .github/workflows/push.yml:14:19:14:64 | github.event.head_commit.committer.name | .github/workflows/push.yml:14:19:14:64 | github.event.head_commit.committer.name | .github/workflows/push.yml:14:19:14:64 | github.event.head_commit.committer.name | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push.yml:14:19:14:64 | github.event.head_commit.committer.name | ${{ github.event.head_commit.committer.name }} | | .github/workflows/push.yml:15:19:15:65 | github.event.commits[11].committer.email | .github/workflows/push.yml:15:19:15:65 | github.event.commits[11].committer.email | .github/workflows/push.yml:15:19:15:65 | github.event.commits[11].committer.email | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push.yml:15:19:15:65 | github.event.commits[11].committer.email | ${{ github.event.commits[11].committer.email }} | | .github/workflows/push.yml:16:19:16:64 | github.event.commits[11].committer.name | .github/workflows/push.yml:16:19:16:64 | github.event.commits[11].committer.name | .github/workflows/push.yml:16:19:16:64 | github.event.commits[11].committer.name | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push.yml:16:19:16:64 | github.event.commits[11].committer.name | ${{ github.event.commits[11].committer.name }} | +| .github/workflows/push_and_workflow_dispatch.yml:9:19:9:57 | github.event.commits[11].message | .github/workflows/push_and_workflow_dispatch.yml:9:19:9:57 | github.event.commits[11].message | .github/workflows/push_and_workflow_dispatch.yml:9:19:9:57 | github.event.commits[11].message | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:9:19:9:57 | github.event.commits[11].message | ${{ github.event.commits[11].message }} | +| .github/workflows/push_and_workflow_dispatch.yml:10:19:10:62 | github.event.commits[11].author.email | .github/workflows/push_and_workflow_dispatch.yml:10:19:10:62 | github.event.commits[11].author.email | .github/workflows/push_and_workflow_dispatch.yml:10:19:10:62 | github.event.commits[11].author.email | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:10:19:10:62 | github.event.commits[11].author.email | ${{ github.event.commits[11].author.email }} | +| .github/workflows/push_and_workflow_dispatch.yml:11:19:11:61 | github.event.commits[11].author.name | .github/workflows/push_and_workflow_dispatch.yml:11:19:11:61 | github.event.commits[11].author.name | .github/workflows/push_and_workflow_dispatch.yml:11:19:11:61 | github.event.commits[11].author.name | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:11:19:11:61 | github.event.commits[11].author.name | ${{ github.event.commits[11].author.name }} | +| .github/workflows/push_and_workflow_dispatch.yml:12:19:12:57 | github.event.head_commit.message | .github/workflows/push_and_workflow_dispatch.yml:12:19:12:57 | github.event.head_commit.message | .github/workflows/push_and_workflow_dispatch.yml:12:19:12:57 | github.event.head_commit.message | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:12:19:12:57 | github.event.head_commit.message | ${{ github.event.head_commit.message }} | +| .github/workflows/push_and_workflow_dispatch.yml:13:19:13:62 | github.event.head_commit.author.email | .github/workflows/push_and_workflow_dispatch.yml:13:19:13:62 | github.event.head_commit.author.email | .github/workflows/push_and_workflow_dispatch.yml:13:19:13:62 | github.event.head_commit.author.email | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:13:19:13:62 | github.event.head_commit.author.email | ${{ github.event.head_commit.author.email }} | +| .github/workflows/push_and_workflow_dispatch.yml:14:19:14:61 | github.event.head_commit.author.name | .github/workflows/push_and_workflow_dispatch.yml:14:19:14:61 | github.event.head_commit.author.name | .github/workflows/push_and_workflow_dispatch.yml:14:19:14:61 | github.event.head_commit.author.name | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:14:19:14:61 | github.event.head_commit.author.name | ${{ github.event.head_commit.author.name }} | +| .github/workflows/push_and_workflow_dispatch.yml:15:19:15:65 | github.event.head_commit.committer.email | .github/workflows/push_and_workflow_dispatch.yml:15:19:15:65 | github.event.head_commit.committer.email | .github/workflows/push_and_workflow_dispatch.yml:15:19:15:65 | github.event.head_commit.committer.email | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:15:19:15:65 | github.event.head_commit.committer.email | ${{ github.event.head_commit.committer.email }} | +| .github/workflows/push_and_workflow_dispatch.yml:16:19:16:64 | github.event.head_commit.committer.name | .github/workflows/push_and_workflow_dispatch.yml:16:19:16:64 | github.event.head_commit.committer.name | .github/workflows/push_and_workflow_dispatch.yml:16:19:16:64 | github.event.head_commit.committer.name | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:16:19:16:64 | github.event.head_commit.committer.name | ${{ github.event.head_commit.committer.name }} | +| .github/workflows/push_and_workflow_dispatch.yml:17:19:17:65 | github.event.commits[11].committer.email | .github/workflows/push_and_workflow_dispatch.yml:17:19:17:65 | github.event.commits[11].committer.email | .github/workflows/push_and_workflow_dispatch.yml:17:19:17:65 | github.event.commits[11].committer.email | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:17:19:17:65 | github.event.commits[11].committer.email | ${{ github.event.commits[11].committer.email }} | +| .github/workflows/push_and_workflow_dispatch.yml:18:19:18:64 | github.event.commits[11].committer.name | .github/workflows/push_and_workflow_dispatch.yml:18:19:18:64 | github.event.commits[11].committer.name | .github/workflows/push_and_workflow_dispatch.yml:18:19:18:64 | github.event.commits[11].committer.name | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/push_and_workflow_dispatch.yml:18:19:18:64 | github.event.commits[11].committer.name | ${{ github.event.commits[11].committer.name }} | | .github/workflows/reusable-workflow-1.yml:36:21:36:39 | inputs.taint | .github/workflows/reusable-workflow-caller-1.yml:11:15:11:52 | github.event.pull_request.title | .github/workflows/reusable-workflow-1.yml:36:21:36:39 | inputs.taint | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/reusable-workflow-1.yml:36:21:36:39 | inputs.taint | ${{ inputs.taint }} | | .github/workflows/reusable-workflow-1.yml:53:26:53:39 | env.log | .github/workflows/reusable-workflow-1.yml:44:19:44:56 | github.event.pull_request.title | .github/workflows/reusable-workflow-1.yml:53:26:53:39 | env.log | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/reusable-workflow-1.yml:53:26:53:39 | env.log | ${{ env.log }} | | .github/workflows/reusable-workflow-1.yml:66:34:66:52 | env.prev_log | .github/workflows/reusable-workflow-1.yml:45:24:45:61 | github.event.changes.title.from | .github/workflows/reusable-workflow-1.yml:66:34:66:52 | env.prev_log | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/reusable-workflow-1.yml:66:34:66:52 | env.prev_log | ${{ env.prev_log }} | @@ -729,6 +749,10 @@ subpaths | .github/workflows/test10.yml:333:34:333:77 | github.event.workflow_run.head_branch | .github/workflows/test10.yml:333:34:333:77 | github.event.workflow_run.head_branch | .github/workflows/test10.yml:333:34:333:77 | github.event.workflow_run.head_branch | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/test10.yml:333:34:333:77 | github.event.workflow_run.head_branch | ${{ github.event.workflow_run.head_branch }} | | .github/workflows/test10.yml:423:34:423:77 | github.event.workflow_run.head_branch | .github/workflows/test10.yml:423:34:423:77 | github.event.workflow_run.head_branch | .github/workflows/test10.yml:423:34:423:77 | github.event.workflow_run.head_branch | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/test10.yml:423:34:423:77 | github.event.workflow_run.head_branch | ${{ github.event.workflow_run.head_branch }} | | .github/workflows/test10.yml:518:34:518:77 | github.event.workflow_run.head_branch | .github/workflows/test10.yml:518:34:518:77 | github.event.workflow_run.head_branch | .github/workflows/test10.yml:518:34:518:77 | github.event.workflow_run.head_branch | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/test10.yml:518:34:518:77 | github.event.workflow_run.head_branch | ${{ github.event.workflow_run.head_branch }} | +| .github/workflows/test20.yml:15:54:15:94 | github.event.pull_request.head.ref | .github/workflows/test20.yml:15:54:15:94 | github.event.pull_request.head.ref | .github/workflows/test20.yml:15:54:15:94 | github.event.pull_request.head.ref | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/test20.yml:15:54:15:94 | github.event.pull_request.head.ref | ${{ github.event.pull_request.head.ref }} | +| .github/workflows/test21.yml:22:35:22:73 | github.event.head_commit.message | .github/workflows/test21.yml:22:35:22:73 | github.event.head_commit.message | .github/workflows/test21.yml:22:35:22:73 | github.event.head_commit.message | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/test21.yml:22:35:22:73 | github.event.head_commit.message | ${{ github.event.head_commit.message }} | +| .github/workflows/test21.yml:23:36:23:74 | github.event.head_commit.message | .github/workflows/test21.yml:23:36:23:74 | github.event.head_commit.message | .github/workflows/test21.yml:23:36:23:74 | github.event.head_commit.message | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/test21.yml:23:36:23:74 | github.event.head_commit.message | ${{ github.event.head_commit.message }} | +| .github/workflows/test21.yml:24:50:24:88 | github.event.head_commit.message | .github/workflows/test21.yml:24:50:24:88 | github.event.head_commit.message | .github/workflows/test21.yml:24:50:24:88 | github.event.head_commit.message | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/test21.yml:24:50:24:88 | github.event.head_commit.message | ${{ github.event.head_commit.message }} | | .github/workflows/workflow_run_branches1.yml:13:20:13:63 | github.event.workflow_run.head_branch | .github/workflows/workflow_run_branches1.yml:13:20:13:63 | github.event.workflow_run.head_branch | .github/workflows/workflow_run_branches1.yml:13:20:13:63 | github.event.workflow_run.head_branch | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/workflow_run_branches1.yml:13:20:13:63 | github.event.workflow_run.head_branch | ${{ github.event.workflow_run.head_branch }} | | .github/workflows/workflow_run_branches2.yml:13:20:13:63 | github.event.workflow_run.head_branch | .github/workflows/workflow_run_branches2.yml:13:20:13:63 | github.event.workflow_run.head_branch | .github/workflows/workflow_run_branches2.yml:13:20:13:63 | github.event.workflow_run.head_branch | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/workflow_run_branches2.yml:13:20:13:63 | github.event.workflow_run.head_branch | ${{ github.event.workflow_run.head_branch }} | | .github/workflows/workflow_run_branches4.yml:13:20:13:63 | github.event.workflow_run.head_branch | .github/workflows/workflow_run_branches4.yml:13:20:13:63 | github.event.workflow_run.head_branch | .github/workflows/workflow_run_branches4.yml:13:20:13:63 | github.event.workflow_run.head_branch | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/workflow_run_branches4.yml:13:20:13:63 | github.event.workflow_run.head_branch | ${{ github.event.workflow_run.head_branch }} | diff --git a/config/identical-files.json b/config/identical-files.json index 89beb48acd4..bdaf567ae17 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -276,5 +276,13 @@ "Python model summaries test extension": [ "python/ql/test/library-tests/dataflow/model-summaries/InlineTaintTest.ext.yml", "python/ql/test/library-tests/dataflow/model-summaries/NormalDataflowTest.ext.yml" + ], + "XML discard predicates": [ + "javascript/ql/lib/semmle/javascript/internal/OverlayXml.qll", + "java/ql/lib/semmle/code/java/internal/OverlayXml.qll", + "go/ql/lib/semmle/go/internal/OverlayXml.qll", + "python/ql/lib/semmle/python/internal/OverlayXml.qll", + "csharp/ql/lib/semmle/code/csharp/internal/OverlayXml.qll", + "cpp/ql/lib/semmle/code/cpp/internal/OverlayXml.qll" ] } diff --git a/cpp/downgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/old.dbscheme b/cpp/downgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/old.dbscheme new file mode 100644 index 00000000000..1a6854060d5 --- /dev/null +++ b/cpp/downgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/old.dbscheme @@ -0,0 +1,2450 @@ +/*- 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 +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 + | @decltype; + +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/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/semmlecode.cpp.dbscheme b/cpp/downgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..2121ffec11f --- /dev/null +++ b/cpp/downgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/semmlecode.cpp.dbscheme @@ -0,0 +1,2437 @@ +/*- 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 + | @decltype; + +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/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/upgrade.properties b/cpp/downgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/upgrade.properties new file mode 100644 index 00000000000..6fa192fc000 --- /dev/null +++ b/cpp/downgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/upgrade.properties @@ -0,0 +1,3 @@ +description: Support expanded compilation argument lists +compatibility: full +compilation_expanded_args.rel: delete diff --git a/cpp/downgrades/a42ce5fc943254097f85471b94ae2247e819104a/old.dbscheme b/cpp/downgrades/a42ce5fc943254097f85471b94ae2247e819104a/old.dbscheme new file mode 100644 index 00000000000..a42ce5fc943 --- /dev/null +++ b/cpp/downgrades/a42ce5fc943254097f85471b94ae2247e819104a/old.dbscheme @@ -0,0 +1,2469 @@ + +/*- 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 +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 + | @decltype; + +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 +); + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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/a42ce5fc943254097f85471b94ae2247e819104a/semmlecode.dbscheme b/cpp/downgrades/a42ce5fc943254097f85471b94ae2247e819104a/semmlecode.dbscheme new file mode 100644 index 00000000000..1a6854060d5 --- /dev/null +++ b/cpp/downgrades/a42ce5fc943254097f85471b94ae2247e819104a/semmlecode.dbscheme @@ -0,0 +1,2450 @@ +/*- 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 +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 + | @decltype; + +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/a42ce5fc943254097f85471b94ae2247e819104a/upgrade.properties b/cpp/downgrades/a42ce5fc943254097f85471b94ae2247e819104a/upgrade.properties new file mode 100644 index 00000000000..1a7cdb0ad71 --- /dev/null +++ b/cpp/downgrades/a42ce5fc943254097f85471b94ae2247e819104a/upgrade.properties @@ -0,0 +1,4 @@ +description: Add databaseMetadata and overlayChangedFiles relations +compatibility: full +databaseMetadata.rel: delete +overlayChangedFiles.rel: delete diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 0f158cd3fb5..e0c8b287adc 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,27 @@ +## 6.1.3 + +No user-facing changes. + +## 6.1.2 + +No user-facing changes. + +## 6.1.1 + +### Minor Analysis Improvements + +* The class `DataFlow::FieldContent` now covers both `union` and `struct`/`class` types. A new predicate `FieldContent.getAField` has been added to access the union members associated with the `FieldContent`. The old `FieldContent` has been renamed to `NonUnionFieldContent`. + +## 6.1.0 + +### New Features + +* New predicates `getAnExpandedArgument` and `getExpandedArgument` were added to the `Compilation` class, yielding compilation arguments after expansion of response files. + +### Bug Fixes + +* Improve performance of the range analysis in cases where it would otherwise take an exorbitant amount of time. + ## 6.0.1 No user-facing changes. @@ -259,8 +283,8 @@ No user-facing changes. ### Breaking Changes -* Deleted many deprecated taint-tracking configurations based on `TaintTracking::Configuration`. -* Deleted many deprecated dataflow configurations based on `DataFlow::Configuration`. +* Deleted many deprecated taint-tracking configurations based on `TaintTracking::Configuration`. +* Deleted many deprecated dataflow configurations based on `DataFlow::Configuration`. * Deleted the deprecated `hasQualifiedName` and `isDefined` predicates from the `Declaration` class, use `hasGlobalName` and `hasDefinition` respectively instead. * Deleted the `getFullSignature` predicate from the `Function` class, use `getIdentityString(Declaration)` from `semmle.code.cpp.Print` instead. * Deleted the deprecated `freeCall` predicate from `Alloc.qll`. Use `DeallocationExpr` instead. @@ -294,7 +318,7 @@ No user-facing changes. * A `getTemplateClass` predicate was added to the `DeductionGuide` class to get the class template for which the deduction guide is a guide. * An `isExplicit` predicate was added to the `Function` class that determines whether the function was declared as explicit. * A `getExplicitExpr` predicate was added to the `Function` class that yields the constant boolean expression (if any) that conditionally determines whether the function is explicit. -* A `isDestroyingDeleteDeallocation` predicate was added to the `NewOrNewArrayExpr` and `DeleteOrDeleteArrayExpr` classes to indicate whether the deallocation function is a destroying delete. +* A `isDestroyingDeleteDeallocation` predicate was added to the `NewOrNewArrayExpr` and `DeleteOrDeleteArrayExpr` classes to indicate whether the deallocation function is a destroying delete. ### Minor Analysis Improvements @@ -372,9 +396,9 @@ No user-facing changes. ### New Features * Added a `TaintInheritingContent` class that can be extended to model taint flowing from a qualifier to a field. -* Added a predicate `GuardCondition.comparesEq/4` to query whether an expression is compared to a constant. +* Added a predicate `GuardCondition.comparesEq/4` to query whether an expression is compared to a constant. * Added a predicate `GuardCondition.ensuresEq/4` to query whether a basic block is guarded by an expression being equal to a constant. -* Added a predicate `GuardCondition.comparesLt/4` to query whether an expression is compared to a constant. +* Added a predicate `GuardCondition.comparesLt/4` to query whether an expression is compared to a constant. * Added a predicate `GuardCondition.ensuresLt/4` to query whether a basic block is guarded by an expression being less than a constant. * Added a predicate `GuardCondition.valueControls` to query whether a basic block is guarded by a particular `case` of a `switch` statement. @@ -490,7 +514,7 @@ No user-facing changes. * Functions that do not return due to calling functions that don't return (e.g. `exit`) are now detected as non-returning in the IR and dataflow. * Treat functions that reach the end of the function as returning in the IR. - They used to be treated as unreachable but it is allowed in C. + They used to be treated as unreachable but it is allowed in C. * The `DataFlow::asDefiningArgument` predicate now takes its argument from the range starting at `1` instead of `2`. Queries that depend on the single-parameter version of `DataFlow::asDefiningArgument` should have their arguments updated accordingly. ## 0.9.3 @@ -539,7 +563,7 @@ No user-facing changes. ### New Features -* The `DataFlow::StateConfigSig` signature module has gained default implementations for `isBarrier/2` and `isAdditionalFlowStep/4`. +* The `DataFlow::StateConfigSig` signature module has gained default implementations for `isBarrier/2` and `isAdditionalFlowStep/4`. Hence it is no longer needed to provide `none()` implementations of these predicates if they are not needed. ### Minor Analysis Improvements @@ -733,7 +757,7 @@ No user-facing changes. ### Deprecated APIs -* Some classes/modules with upper-case acronyms in their name have been renamed to follow our style-guide. +* Some classes/modules with upper-case acronyms in their name have been renamed to follow our style-guide. The old name still exists as a deprecated alias. ### New Features @@ -750,7 +774,7 @@ No user-facing changes. ### Deprecated APIs -* Many classes/predicates/modules with upper-case acronyms in their name have been renamed to follow our style-guide. +* Many classes/predicates/modules with upper-case acronyms in their name have been renamed to follow our style-guide. The old name still exists as a deprecated alias. ### New Features @@ -849,7 +873,7 @@ No user-facing changes. ### Deprecated APIs -* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. +* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. The old name still exists as a deprecated alias. ### New Features diff --git a/cpp/ql/lib/change-notes/released/6.1.0.md b/cpp/ql/lib/change-notes/released/6.1.0.md new file mode 100644 index 00000000000..a904793a03f --- /dev/null +++ b/cpp/ql/lib/change-notes/released/6.1.0.md @@ -0,0 +1,9 @@ +## 6.1.0 + +### New Features + +* New predicates `getAnExpandedArgument` and `getExpandedArgument` were added to the `Compilation` class, yielding compilation arguments after expansion of response files. + +### Bug Fixes + +* Improve performance of the range analysis in cases where it would otherwise take an exorbitant amount of time. diff --git a/cpp/ql/lib/change-notes/released/6.1.1.md b/cpp/ql/lib/change-notes/released/6.1.1.md new file mode 100644 index 00000000000..d88c93a5ed7 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/6.1.1.md @@ -0,0 +1,5 @@ +## 6.1.1 + +### Minor Analysis Improvements + +* The class `DataFlow::FieldContent` now covers both `union` and `struct`/`class` types. A new predicate `FieldContent.getAField` has been added to access the union members associated with the `FieldContent`. The old `FieldContent` has been renamed to `NonUnionFieldContent`. diff --git a/cpp/ql/lib/change-notes/released/6.1.2.md b/cpp/ql/lib/change-notes/released/6.1.2.md new file mode 100644 index 00000000000..8e41b366dab --- /dev/null +++ b/cpp/ql/lib/change-notes/released/6.1.2.md @@ -0,0 +1,3 @@ +## 6.1.2 + +No user-facing changes. diff --git a/cpp/ql/lib/change-notes/released/6.1.3.md b/cpp/ql/lib/change-notes/released/6.1.3.md new file mode 100644 index 00000000000..34916dd37c8 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/6.1.3.md @@ -0,0 +1,3 @@ +## 6.1.3 + +No user-facing changes. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index d1f3c68c812..e641a874973 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.1 +lastReleaseVersion: 6.1.3 diff --git a/cpp/ql/lib/cpp.qll b/cpp/ql/lib/cpp.qll index 46c651daf57..560a4444bfa 100644 --- a/cpp/ql/lib/cpp.qll +++ b/cpp/ql/lib/cpp.qll @@ -74,3 +74,4 @@ import semmle.code.cpp.Preprocessor import semmle.code.cpp.Iteration import semmle.code.cpp.NameQualifiers import DefaultOptions +private import semmle.code.cpp.internal.Overlay diff --git a/cpp/ql/lib/ext/empty.model.yml b/cpp/ql/lib/ext/empty.model.yml index 6f160b62d7a..e5202b5ad73 100644 --- a/cpp/ql/lib/ext/empty.model.yml +++ b/cpp/ql/lib/ext/empty.model.yml @@ -9,6 +9,14 @@ extensions: pack: codeql/cpp-all extensible: sinkModel data: [] + - addsTo: + pack: codeql/cpp-all + extensible: barrierModel + data: [] + - addsTo: + pack: codeql/cpp-all + extensible: barrierGuardModel + data: [] - addsTo: pack: codeql/cpp-all extensible: summaryModel diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 8b211353323..76f68c8b83e 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 6.0.2-dev +version: 6.1.4-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp @@ -21,3 +21,4 @@ dataExtensions: - ext/deallocation/*.model.yml - ext/allocation/*.model.yml warnOnImplicitThis: true +compileForOverlayEval: true diff --git a/cpp/ql/lib/semmle/code/cpp/Compilation.qll b/cpp/ql/lib/semmle/code/cpp/Compilation.qll index 407dc31e05f..6f19be0481a 100644 --- a/cpp/ql/lib/semmle/code/cpp/Compilation.qll +++ b/cpp/ql/lib/semmle/code/cpp/Compilation.qll @@ -94,6 +94,25 @@ class Compilation extends @compilation { */ string getArgument(int i) { compilation_args(this, i, result) } + /** + * Gets an expanded argument passed to the extractor on this invocation. + */ + string getAnExpandedArgument() { result = this.getExpandedArgument(_) } + + /** + * Gets the `i`th expanded argument passed to the extractor on this + * invocation. + * + * This is similar to `getArgument`, but for a `@someFile` argument, it + * includes the arguments from that file, rather than just taking the + * argument literally. + */ + string getExpandedArgument(int i) { + if exists(string arg | compilation_expanded_args(this, _, arg)) + then compilation_expanded_args(this, i, result) + else result = this.getArgument(i) + } + /** * Gets the total amount of CPU time spent processing all the files in the * front-end and extractor. diff --git a/cpp/ql/lib/semmle/code/cpp/Function.qll b/cpp/ql/lib/semmle/code/cpp/Function.qll index 8ddb07a868e..10b156e3fb6 100644 --- a/cpp/ql/lib/semmle/code/cpp/Function.qll +++ b/cpp/ql/lib/semmle/code/cpp/Function.qll @@ -171,12 +171,14 @@ class Function extends Declaration, ControlFlowNode, AccessHolder, @function { * Gets the nth parameter of this function. There is no result for the * implicit `this` parameter, and there is no `...` varargs pseudo-parameter. */ + pragma[nomagic] Parameter getParameter(int n) { params(unresolveElement(result), underlyingElement(this), n, _) } /** * Gets a parameter of this function. There is no result for the implicit * `this` parameter, and there is no `...` varargs pseudo-parameter. */ + pragma[nomagic] Parameter getAParameter() { params(unresolveElement(result), underlyingElement(this), _, _) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index b71a46f6961..7232326f1b3 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -15,16 +15,17 @@ * reading. * 1. The `namespace` column selects a namespace. * 2. The `type` column selects a type within that namespace. This column can - * introduce template names that can be mentioned in the `signature` column. + * introduce template type names that can be mentioned in the `signature` column. * For example, `vector` introduces the template names `T` and - * `Allocator`. + * `Allocator`. Non-type template parameters cannot be specified. * 3. The `subtypes` is a boolean that indicates whether to jump to an * arbitrary subtype of that type. Set this to `false` if leaving the `type` * blank (for example, a free function). * 4. The `name` column optionally selects a specific named member of the type. - * Like the `type` column, this column can introduce template names that can - * be mentioned in the `signature` column. For example, `insert` - * introduces the template name `InputIt`. + * Like the `type` column, this column can introduce template type names + * that can be mentioned in the `signature` column. For example, + * `insert` introduces the template name `InputIt`. Non-type + * template parameters cannot be specified. * 5. The `signature` column optionally restricts the named member. If * `signature` is blank then no such filtering is done. The format of the * signature is a comma-separated list of types enclosed in parentheses. The @@ -100,9 +101,10 @@ private import internal.FlowSummaryImpl private import internal.FlowSummaryImpl::Public private import internal.FlowSummaryImpl::Private private import internal.FlowSummaryImpl::Private::External -private import internal.ExternalFlowExtensions as Extensions +private import internal.ExternalFlowExtensions::Extensions as Extensions private import codeql.mad.ModelValidation as SharedModelVal private import codeql.util.Unit +private import codeql.mad.static.ModelsAsData as SharedMaD /** * A unit class for adding additional source model rows. @@ -143,134 +145,81 @@ predicate sinkModel(string row) { any(SinkModelCsv s).row(row) } /** Holds if `row` is a summary model. */ predicate summaryModel(string row) { any(SummaryModelCsv s).row(row) } -/** Holds if a source model exists for the given parameters. */ -predicate sourceModel( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind, string provenance, string model -) { - exists(string row | - sourceModel(row) and - row.splitAt(";", 0) = namespace and - row.splitAt(";", 1) = type and - row.splitAt(";", 2) = subtypes.toString() and - subtypes = [true, false] and - row.splitAt(";", 3) = name and - row.splitAt(";", 4) = signature and - row.splitAt(";", 5) = ext and - row.splitAt(";", 6) = output and - row.splitAt(";", 7) = kind - ) and - provenance = "manual" and - model = "" - or - exists(QlBuiltins::ExtensionId madId | - Extensions::sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, - provenance, madId) and - model = "MaD:" + madId.toString() - ) +private module MadInput implements SharedMaD::InputSig { + /** Holds if a source model exists for the given parameters. */ + predicate additionalSourceModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, string model + ) { + exists(string row | + sourceModel(row) and + row.splitAt(";", 0) = namespace and + row.splitAt(";", 1) = type and + row.splitAt(";", 2) = subtypes.toString() and + subtypes = [true, false] and + row.splitAt(";", 3) = name and + row.splitAt(";", 4) = signature and + row.splitAt(";", 5) = ext and + row.splitAt(";", 6) = output and + row.splitAt(";", 7) = kind + ) and + provenance = "manual" and + model = "" + } + + /** Holds if a sink model exists for the given parameters. */ + predicate additionalSinkModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind, string provenance, string model + ) { + exists(string row | + sinkModel(row) and + row.splitAt(";", 0) = namespace and + row.splitAt(";", 1) = type and + row.splitAt(";", 2) = subtypes.toString() and + subtypes = [true, false] and + row.splitAt(";", 3) = name and + row.splitAt(";", 4) = signature and + row.splitAt(";", 5) = ext and + row.splitAt(";", 6) = input and + row.splitAt(";", 7) = kind + ) and + provenance = "manual" and + model = "" + } + + /** + * Holds if a summary model exists for the given parameters. + * + * This predicate does not expand `@` to `*`s. + */ + predicate additionalSummaryModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string provenance, string model + ) { + exists(string row | + summaryModel(row) and + row.splitAt(";", 0) = namespace and + row.splitAt(";", 1) = type and + row.splitAt(";", 2) = subtypes.toString() and + subtypes = [true, false] and + row.splitAt(";", 3) = name and + row.splitAt(";", 4) = signature and + row.splitAt(";", 5) = ext and + row.splitAt(";", 6) = input and + row.splitAt(";", 7) = output and + row.splitAt(";", 8) = kind + ) and + provenance = "manual" and + model = "" + } + + string namespaceSegmentSeparator() { result = "::" } } -/** Holds if a sink model exists for the given parameters. */ -predicate sinkModel( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance, string model -) { - exists(string row | - sinkModel(row) and - row.splitAt(";", 0) = namespace and - row.splitAt(";", 1) = type and - row.splitAt(";", 2) = subtypes.toString() and - subtypes = [true, false] and - row.splitAt(";", 3) = name and - row.splitAt(";", 4) = signature and - row.splitAt(";", 5) = ext and - row.splitAt(";", 6) = input and - row.splitAt(";", 7) = kind - ) and - provenance = "manual" and - model = "" - or - exists(QlBuiltins::ExtensionId madId | - Extensions::sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, - madId) and - model = "MaD:" + madId.toString() - ) -} +private module MaD = SharedMaD::ModelsAsData; -/** - * Holds if a summary model exists for the given parameters. - * - * This predicate does not expand `@` to `*`s. - */ -private predicate summaryModel0( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind, string provenance, string model -) { - exists(string row | - summaryModel(row) and - row.splitAt(";", 0) = namespace and - row.splitAt(";", 1) = type and - row.splitAt(";", 2) = subtypes.toString() and - subtypes = [true, false] and - row.splitAt(";", 3) = name and - row.splitAt(";", 4) = signature and - row.splitAt(";", 5) = ext and - row.splitAt(";", 6) = input and - row.splitAt(";", 7) = output and - row.splitAt(";", 8) = kind - ) and - provenance = "manual" and - model = "" - or - exists(QlBuiltins::ExtensionId madId | - Extensions::summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) and - model = "MaD:" + madId.toString() - ) -} - -/** - * Holds if the given extension tuple `madId` should pretty-print as `model`. - * - * This predicate should only be used in tests. - */ -predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind, string provenance - | - Extensions::sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, - provenance, madId) - | - model = - "Source: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " - + ext + "; " + output + "; " + kind + "; " + provenance - ) - or - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance - | - Extensions::sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, - madId) - | - model = - "Sink: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " + - ext + "; " + input + "; " + kind + "; " + provenance - ) - or - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind, string provenance - | - Extensions::summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) - | - model = - "Summary: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + - "; " + ext + "; " + input + "; " + output + "; " + kind + "; " + provenance - ) -} +import MaD /** * Holds if `input` is `input0`, but with all occurrences of `@` replaced @@ -293,69 +242,13 @@ predicate summaryModel( string input, string output, string kind, string provenance, string model ) { exists(string input0, string output0 | - summaryModel0(namespace, type, subtypes, name, signature, ext, input0, output0, kind, + MaD::summaryModel(namespace, type, subtypes, name, signature, ext, input0, output0, kind, provenance, model) and expandInputAndOutput(input0, input, output0, output, [0 .. Private::getMaxElementContentIndirectionIndex() - 1]) ) } -private predicate relevantNamespace(string namespace) { - sourceModel(namespace, _, _, _, _, _, _, _, _, _) or - sinkModel(namespace, _, _, _, _, _, _, _, _, _) or - summaryModel(namespace, _, _, _, _, _, _, _, _, _, _) -} - -private predicate namespaceLink(string shortns, string longns) { - relevantNamespace(shortns) and - relevantNamespace(longns) and - longns.prefix(longns.indexOf("::")) = shortns -} - -private predicate canonicalNamespace(string namespace) { - relevantNamespace(namespace) and not namespaceLink(_, namespace) -} - -private predicate canonicalNamespaceLink(string namespace, string subns) { - canonicalNamespace(namespace) and - (subns = namespace or namespaceLink(namespace, subns)) -} - -/** - * Holds if MaD framework coverage of `namespace` is `n` api endpoints of the - * kind `(kind, part)`, and `namespaces` is the number of subnamespaces of - * `namespace` which have MaD framework coverage (including `namespace` - * itself). - */ -predicate modelCoverage(string namespace, int namespaces, string kind, string part, int n) { - namespaces = strictcount(string subns | canonicalNamespaceLink(namespace, subns)) and - ( - part = "source" and - n = - strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string output, string provenance, string model | - canonicalNamespaceLink(namespace, subns) and - sourceModel(subns, type, subtypes, name, signature, ext, output, kind, provenance, model) - ) - or - part = "sink" and - n = - strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string input, string provenance, string model | - canonicalNamespaceLink(namespace, subns) and - sinkModel(subns, type, subtypes, name, signature, ext, input, kind, provenance, model) - ) - or - part = "summary" and - n = - strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string input, string output, string provenance | - canonicalNamespaceLink(namespace, subns) and - summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind, provenance, _) - ) - ) -} - /** Provides a query predicate to check the CSV data for validation errors. */ module CsvValidation { private string getInvalidModelInput() { @@ -633,6 +526,28 @@ string getParameterTypeWithoutTemplateArguments(Function f, int n, boolean canon canonical = true } +/** + * Gets the largest index of a template parameter of `templateFunction` that + * is a type template parameter. + */ +private int getLastTypeTemplateFunctionParameterIndex(Function templateFunction) { + result = + max(int index | templateFunction.getTemplateArgument(index) instanceof TypeTemplateParameter) +} + +/** Gets the number of supported template parameters for `templateFunction`. */ +private int getNumberOfSupportedFunctionTemplateArguments(Function templateFunction) { + result = count(int i | exists(getSupportedFunctionTemplateArgument(templateFunction, i)) | i) +} + +/** Gets the `i`'th supported template parameter for `templateFunction`. */ +private Locatable getSupportedFunctionTemplateArgument(Function templateFunction, int i) { + result = templateFunction.getTemplateArgument(i) and + // We don't yet support non-type template parameters in the middle of a + // template parameter list + i <= getLastTypeTemplateFunctionParameterIndex(templateFunction) +} + /** * Normalize the `n`'th parameter of `f` by replacing template names * with `func:N` (where `N` is the index of the template). @@ -640,18 +555,41 @@ string getParameterTypeWithoutTemplateArguments(Function f, int n, boolean canon private string getTypeNameWithoutFunctionTemplates(Function f, int n, int remaining) { exists(Function templateFunction | templateFunction = getFullyTemplatedFunction(f) and - remaining = templateFunction.getNumberOfTemplateArguments() and + remaining = getNumberOfSupportedFunctionTemplateArguments(templateFunction) and result = getParameterTypeWithoutTemplateArguments(templateFunction, n, _) ) or exists(string mid, TypeTemplateParameter tp, Function templateFunction | mid = getTypeNameWithoutFunctionTemplates(f, n, remaining + 1) and templateFunction = getFullyTemplatedFunction(f) and - tp = templateFunction.getTemplateArgument(remaining) and + tp = getSupportedFunctionTemplateArgument(templateFunction, remaining) + | result = mid.replaceAll(tp.getName(), "func:" + remaining.toString()) ) } +/** + * Gets the largest index of a template parameter of `templateClass` that + * is a type template parameter. + */ +private int getLastTypeTemplateClassParameterIndex(Class templateClass) { + result = + max(int index | templateClass.getTemplateArgument(index) instanceof TypeTemplateParameter) +} + +/** Gets the `i`'th supported template parameter for `templateClass`. */ +private Locatable getSupportedClassTemplateArgument(Class templateClass, int i) { + result = templateClass.getTemplateArgument(i) and + // We don't yet support non-type template parameters in the middle of a + // template parameter list + i <= getLastTypeTemplateClassParameterIndex(templateClass) +} + +/** Gets the number of supported template parameters for `templateClass`. */ +private int getNumberOfSupportedClassTemplateArguments(Class templateClass) { + result = count(int i | exists(getSupportedClassTemplateArgument(templateClass, i)) | i) +} + /** * Normalize the `n`'th parameter of `f` by replacing template names * with `class:N` (where `N` is the index of the template). @@ -661,7 +599,7 @@ private string getTypeNameWithoutClassTemplates(Function f, int n, int remaining // If there is a declaring type then we start by expanding the function templates exists(Class template | isClassConstructedFrom(f.getDeclaringType(), template) and - remaining = template.getNumberOfTemplateArguments() and + remaining = getNumberOfSupportedClassTemplateArguments(template) and result = getTypeNameWithoutFunctionTemplates(f, n, 0) ) or @@ -673,7 +611,8 @@ private string getTypeNameWithoutClassTemplates(Function f, int n, int remaining exists(string mid, TypeTemplateParameter tp, Class template | mid = getTypeNameWithoutClassTemplates(f, n, remaining + 1) and isClassConstructedFrom(f.getDeclaringType(), template) and - tp = template.getTemplateArgument(remaining) and + tp = getSupportedClassTemplateArgument(template, remaining) + | result = mid.replaceAll(tp.getName(), "class:" + remaining.toString()) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll index cd1af34c8d8..1a572c221d9 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll @@ -2,6 +2,8 @@ * This module provides extensible predicates for defining MaD models. */ +private import codeql.mad.static.ModelsAsData as SharedMaD + /** * Holds if an external source model exists for the given parameters. */ @@ -18,6 +20,22 @@ extensible predicate sinkModel( string input, string kind, string provenance, QlBuiltins::ExtensionId madId ); +/** + * Holds if a barrier model exists for the given parameters. + */ +extensible predicate barrierModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, QlBuiltins::ExtensionId madId +); + +/** + * Holds if a barrier guard model exists for the given parameters. + */ +extensible predicate barrierGuardModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string acceptingvalue, string kind, string provenance, QlBuiltins::ExtensionId madId +); + /** * Holds if an external summary model exists for the given parameters. */ @@ -25,3 +43,16 @@ extensible predicate summaryModel( string namespace, string type, boolean subtypes, string name, string signature, string ext, string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId ); + +/** + * Holds if a neutral model exists for the given parameters. + */ +extensible predicate neutralModel( + string namespace, string type, string name, string signature, string kind, string provenance +); + +module Extensions implements SharedMaD::ExtensionsSig { + import ExternalFlowExtensions + + predicate namespaceGrouping(string group, string namespace) { none() } +} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index d89ab06ed82..a1d9dd86c40 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -148,6 +148,19 @@ module SourceSinkInterpretationInput implements ) } + predicate barrierElement( + Element n, string output, string kind, Public::Provenance provenance, string model + ) { + none() + } + + predicate barrierGuardElement( + Element n, string input, Public::AcceptingValue acceptingvalue, string kind, + Public::Provenance provenance, string model + ) { + none() + } + private newtype TInterpretNode = TElement_(Element n) or TNode_(Node n) diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll index 83364e422eb..e5df5cb160f 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll @@ -750,6 +750,16 @@ class SizeofPackTypeOperator extends SizeofPackOperator { */ class SizeofOperator extends Expr, @runtime_sizeof { override int getPrecedence() { result = 16 } + + /** + * Gets the contained type of this `sizeof`. For example, + * the result is `int` in both cases below: + * ``` + * sizeof(int); + * sizeof(42); + * ``` + */ + Type getTypeOperand() { none() } // overridden in subclasses } /** @@ -766,6 +776,8 @@ class SizeofExprOperator extends SizeofOperator { /** Gets the contained expression. */ Expr getExprOperand() { result = this.getChild(0) } + override Type getTypeOperand() { result = this.getExprOperand().getType() } + override string toString() { result = "sizeof()" } override predicate mayBeImpure() { this.getExprOperand().mayBeImpure() } @@ -784,8 +796,7 @@ class SizeofTypeOperator extends SizeofOperator { override string getAPrimaryQlClass() { result = "SizeofTypeOperator" } - /** Gets the contained type. */ - Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) } + override Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) } override string toString() { result = "sizeof(" + this.getTypeOperand().getName() + ")" } @@ -842,6 +853,16 @@ class AlignofTypeOperator extends AlignofOperator { */ class DatasizeofOperator extends Expr, @datasizeof { override int getPrecedence() { result = 16 } + + /** + * Gets the contained type of this `__datasizeof`. For example, + * the result is `int` in both cases below: + * ``` + * __datasizeof(int); + * __datasizeof(42); + * ``` + */ + Type getTypeOperand() { none() } } /** @@ -855,6 +876,8 @@ class DatasizeofExprOperator extends DatasizeofOperator { /** Gets the contained expression. */ Expr getExprOperand() { result = this.getChild(0) } + override Type getTypeOperand() { result = this.getExprOperand().getType() } + override string toString() { result = "__datasizeof()" } override predicate mayBeImpure() { this.getExprOperand().mayBeImpure() } @@ -870,8 +893,7 @@ class DatasizeofTypeOperator extends DatasizeofOperator { override string getAPrimaryQlClass() { result = "DatasizeofTypeOperator" } - /** Gets the contained type. */ - Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) } + override Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) } override string toString() { result = "__datasizeof(" + this.getTypeOperand().getName() + ")" } diff --git a/cpp/ql/lib/semmle/code/cpp/internal/Overlay.qll b/cpp/ql/lib/semmle/code/cpp/internal/Overlay.qll new file mode 100644 index 00000000000..b870bbfb9f6 --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/internal/Overlay.qll @@ -0,0 +1,80 @@ +/** + * Defines entity discard predicates for C++ overlay analysis. + */ + +private import OverlayXml + +/** + * Holds always for the overlay variant and never for the base variant. + * This local predicate is used to define local predicates that behave + * differently for the base and overlay variant. + */ +overlay[local] +predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +overlay[local] +private string getLocationFilePath(@location_default loc) { + exists(@file file | locations_default(loc, file, _, _, _, _) | files(file, result)) +} + +/** + * Gets the file path for an element with a single location. + */ +overlay[local] +private string getSingleLocationFilePath(@element e) { + exists(@location_default loc | + var_decls(e, _, _, _, loc) + or + fun_decls(e, _, _, _, loc) + or + type_decls(e, _, loc) + or + namespace_decls(e, _, loc, _) + or + macroinvocations(e, _, loc, _) + or + preprocdirects(e, _, loc) + | + result = getLocationFilePath(loc) + ) +} + +/** + * Gets the file path for an element with potentially multiple locations. + */ +overlay[local] +private string getMultiLocationFilePath(@element e) { + exists(@location_default loc | + exists(@var_decl vd | var_decls(vd, e, _, _, loc)) + or + exists(@fun_decl fd | fun_decls(fd, e, _, _, loc)) + or + exists(@type_decl td | type_decls(td, e, loc)) + or + exists(@namespace_decl nd | namespace_decls(nd, e, loc, _)) + | + result = getLocationFilePath(loc) + ) +} + +/** + * A local helper predicate that holds in the base variant and never in the + * overlay variant. + */ +overlay[local] +private predicate holdsInBase() { not isOverlay() } + +/** + * Discards an element from the base variant if: + * - It has a single location in a changed file, or + * - All of its locations are in changed files. + */ +overlay[discard_entity] +private predicate discardElement(@element e) { + holdsInBase() and + ( + overlayChangedFiles(getSingleLocationFilePath(e)) + or + forex(string path | path = getMultiLocationFilePath(e) | overlayChangedFiles(path)) + ) +} diff --git a/cpp/ql/lib/semmle/code/cpp/internal/OverlayXml.qll b/cpp/ql/lib/semmle/code/cpp/internal/OverlayXml.qll new file mode 100644 index 00000000000..95d49f2d611 --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/internal/OverlayXml.qll @@ -0,0 +1,46 @@ +overlay[local] +module; + +/** + * A local predicate that always holds for the overlay variant and never holds for the base variant. + * This is used to define local predicates that behave differently for the base and overlay variant. + */ +private predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +private string getXmlFile(@xmllocatable locatable) { + exists(@location_default location, @file file | xmllocations(locatable, location) | + locations_default(location, file, _, _, _, _) and + files(file, result) + ) +} + +private string getXmlFileInBase(@xmllocatable locatable) { + not isOverlay() and + result = getXmlFile(locatable) +} + +/** + * Holds if the given `file` was extracted as part of the overlay and was extracted by the HTML/XML + * extractor. + */ +private predicate overlayXmlExtracted(string file) { + isOverlay() and + exists(@xmllocatable locatable | + not files(locatable, _) and not xmlNs(locatable, _, _, _) and file = getXmlFile(locatable) + ) +} + +/** + * Holds if the given XML `locatable` should be discarded, because it is part of the overlay base + * and is in a file that was also extracted as part of the overlay database. + */ +overlay[discard_entity] +private predicate discardXmlLocatable(@xmllocatable locatable) { + exists(string file | file = getXmlFileInBase(locatable) | + overlayChangedFiles(file) + or + // The HTML/XML extractor is currently not incremental and may extract more files than those + // included in overlayChangedFiles. + overlayXmlExtracted(file) + ) +} 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 582391e81cc..b5f4f88f4bd 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 @@ -861,6 +861,10 @@ predicate jumpStep(Node n1, Node n2) { n2.(FlowSummaryNode).getSummaryNode()) } +bindingset[c] +pragma[inline_late] +private int getIndirectionIndexLate(Content c) { result = c.getIndirectionIndex() } + /** * Holds if data can flow from `node1` to `node2` via an assignment to `f`. * Thus, `node2` references an object with a field `f` that contains the @@ -873,23 +877,17 @@ predicate jumpStep(Node n1, Node n2) { predicate storeStepImpl(Node node1, Content c, Node node2, boolean certain) { exists( PostFieldUpdateNode postFieldUpdate, int indirectionIndex1, int numberOfLoads, - StoreInstruction store + StoreInstruction store, FieldContent fc | postFieldUpdate = node2 and - nodeHasInstruction(node1, store, pragma[only_bind_into](indirectionIndex1)) and + fc = c and + nodeHasInstruction(node1, pragma[only_bind_into](store), + pragma[only_bind_into](indirectionIndex1)) and postFieldUpdate.getIndirectionIndex() = 1 and numberOfLoadsFromOperand(postFieldUpdate.getFieldAddress(), - store.getDestinationAddressOperand(), numberOfLoads, certain) - | - exists(FieldContent fc | fc = c | - fc.getField() = postFieldUpdate.getUpdatedField() and - fc.getIndirectionIndex() = 1 + indirectionIndex1 + numberOfLoads - ) - or - exists(UnionContent uc | uc = c | - uc.getAField() = postFieldUpdate.getUpdatedField() and - uc.getIndirectionIndex() = 1 + indirectionIndex1 + numberOfLoads - ) + store.getDestinationAddressOperand(), numberOfLoads, certain) and + fc.getAField() = postFieldUpdate.getUpdatedField() and + getIndirectionIndexLate(fc) = 1 + indirectionIndex1 + numberOfLoads ) or // models-as-data summarized flow @@ -965,22 +963,17 @@ predicate nodeHasInstruction(Node node, Instruction instr, int indirectionIndex) * `node2`. */ predicate readStep(Node node1, ContentSet c, Node node2) { - exists(FieldAddress fa1, Operand operand, int numberOfLoads, int indirectionIndex2 | + exists( + FieldAddress fa1, Operand operand, int numberOfLoads, int indirectionIndex2, FieldContent fc + | + fc = c and nodeHasOperand(node2, operand, indirectionIndex2) and // The `1` here matches the `node2.getIndirectionIndex() = 1` conjunct // in `storeStep`. nodeHasOperand(node1, fa1.getObjectAddressOperand(), 1) and - numberOfLoadsFromOperand(fa1, operand, numberOfLoads, _) - | - exists(FieldContent fc | fc = c | - fc.getField() = fa1.getField() and - fc.getIndirectionIndex() = indirectionIndex2 + numberOfLoads - ) - or - exists(UnionContent uc | uc = c | - uc.getAField() = fa1.getField() and - uc.getIndirectionIndex() = indirectionIndex2 + numberOfLoads - ) + numberOfLoadsFromOperand(fa1, operand, numberOfLoads, _) and + fc.getAField() = fa1.getField() and + getIndirectionIndexLate(fc) = indirectionIndex2 + numberOfLoads ) or // models-as-data summarized flow @@ -1574,7 +1567,7 @@ pragma[inline] ContentApprox getContentApprox(Content c) { exists(string prefix, Field f | prefix = result.(FieldApproxContent).getPrefix() and - f = c.(FieldContent).getField() and + f = c.(NonUnionFieldContent).getField() and fieldHasApproxName(f, prefix) ) or 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 82dcd43e136..1185b6a0c9c 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 @@ -2078,38 +2078,151 @@ predicate localExprFlow(Expr e1, Expr e2) { localExprFlowPlus(e1, e2) } +/** + * A canonical representation of a field. + * + * For performance reasons we want a unique `Content` that represents + * a given field across any template instantiation of a class. + * + * This is possible in _almost_ all cases, but there are cases where it is + * not possible to map between a field in the uninstantiated template to a + * field in the instantiated template. This happens in the case of local class + * definitions (because the local class is not the template that constructs + * the instantiation - it is the enclosing function). So this abstract class + * has two implementations: a non-local case (where we can represent a + * canonical field as the field declaration from an uninstantiated class + * template or a non-templated class), and a local case (where we simply use + * the field from the instantiated class). + */ +abstract private class CanonicalField extends Field { + /** Gets a field represented by this canonical field. */ + abstract Field getAField(); + + /** + * Gets a class that declares a field represented by this canonical field. + */ + abstract Class getADeclaringType(); + + /** + * Gets a type that this canonical field may have. Note that this may + * not be a unique type. For example, consider this case: + * ``` + * template + * struct S { T x; }; + * + * S s1; + * S s2; + * ``` + * In this case the canonical field corresponding to `S::x` has two types: + * `int` and `char`. + */ + Type getAType() { result = this.getAField().getType() } + + Type getAnUnspecifiedType() { result = this.getAType().getUnspecifiedType() } +} + +private class NonLocalCanonicalField extends CanonicalField { + Class declaringType; + + NonLocalCanonicalField() { + declaringType = this.getDeclaringType() and + not declaringType.isFromTemplateInstantiation(_) and + not declaringType.isLocal() // handled in LocalCanonicalField + } + + override Field getAField() { + exists(Class c | result.getDeclaringType() = c | + // Either the declaring class of the field is a template instantiation + // that has been constructed from this canonical declaration + c.isConstructedFrom(declaringType) and + pragma[only_bind_out](result.getName()) = pragma[only_bind_out](this.getName()) + or + // or this canonical declaration is not a template. + not c.isConstructedFrom(_) and + result = this + ) + } + + override Class getADeclaringType() { + result = this.getDeclaringType() + or + result.isConstructedFrom(this.getDeclaringType()) + } +} + +private class LocalCanonicalField extends CanonicalField { + Class declaringType; + + LocalCanonicalField() { + declaringType = this.getDeclaringType() and + declaringType.isLocal() + } + + override Field getAField() { result = this } + + override Class getADeclaringType() { result = declaringType } +} + +/** + * A canonical representation of a `Union`. See `CanonicalField` for the explanation for + * why we need a canonical representation. + */ +abstract private class CanonicalUnion extends Union { + /** Gets a union represented by this canonical union. */ + abstract Union getAUnion(); + + /** Gets a canonical field of this canonical union. */ + CanonicalField getACanonicalField() { result.getDeclaringType() = this } +} + +private class NonLocalCanonicalUnion extends CanonicalUnion { + NonLocalCanonicalUnion() { not this.isFromTemplateInstantiation(_) and not this.isLocal() } + + override Union getAUnion() { + result = this + or + result.isConstructedFrom(this) + } +} + +private class LocalCanonicalUnion extends CanonicalUnion { + LocalCanonicalUnion() { this.isLocal() } + + override Union getAUnion() { result = this } +} + bindingset[f] pragma[inline_late] -private int getFieldSize(Field f) { result = f.getType().getSize() } +private int getFieldSize(CanonicalField f) { result = max(f.getAType().getSize()) } /** * Gets a field in the union `u` whose size * is `bytes` number of bytes. */ -private Field getAFieldWithSize(Union u, int bytes) { - result = u.getAField() and +private CanonicalField getAFieldWithSize(CanonicalUnion u, int bytes) { + result = u.getACanonicalField() and bytes = getFieldSize(result) } cached private newtype TContent = - TFieldContent(Field f, int indirectionIndex) { - // the indirection index for field content starts at 1 (because `TFieldContent` is thought of as + TNonUnionContent(CanonicalField f, int indirectionIndex) { + // the indirection index for field content starts at 1 (because `TNonUnionContent` is thought of as // the address of the field, `FieldAddress` in the IR). - indirectionIndex = [1 .. SsaImpl::getMaxIndirectionsForType(f.getUnspecifiedType())] and + indirectionIndex = [1 .. max(SsaImpl::getMaxIndirectionsForType(f.getAnUnspecifiedType()))] and // Reads and writes of union fields are tracked using `UnionContent`. not f.getDeclaringType() instanceof Union } or - TUnionContent(Union u, int bytes, int indirectionIndex) { - exists(Field f | - f = u.getAField() and + TUnionContent(CanonicalUnion u, int bytes, int indirectionIndex) { + exists(CanonicalField f | + f = u.getACanonicalField() and bytes = getFieldSize(f) and // We key `UnionContent` by the union instead of its fields since a write to one // field can be read by any read of the union's fields. Again, the indirection index // is 1-based (because 0 is considered the address). indirectionIndex = [1 .. max(SsaImpl::getMaxIndirectionsForType(getAFieldWithSize(u, bytes) - .getUnspecifiedType()) + .getAnUnspecifiedType()) )] ) } or @@ -2124,14 +2237,14 @@ private newtype TContent = */ class Content extends TContent { /** Gets a textual representation of this element. */ - abstract string toString(); + string toString() { none() } // overridden in subclasses predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { path = "" and sl = 0 and sc = 0 and el = 0 and ec = 0 } /** Gets the indirection index of this `Content`. */ - abstract int getIndirectionIndex(); + int getIndirectionIndex() { none() } // overridden in subclasses /** * INTERNAL: Do not use. @@ -2142,7 +2255,7 @@ class Content extends TContent { * For example, a write to a field `f` implies that any content of * the form `*f` is also cleared. */ - abstract predicate impliesClearOf(Content c); + predicate impliesClearOf(Content c) { none() } // overridden in subclasses } /** @@ -2162,37 +2275,62 @@ private module ContentStars { private import ContentStars -/** A reference through a non-union instance field. */ +private class TFieldContent = TNonUnionContent or TUnionContent; + +/** + * A `Content` that references a `Field`. This may be a field of a `struct`, + * `class`, or `union`. In the case of a `union` there may be multiple fields + * associated with the same `Content`. + */ class FieldContent extends Content, TFieldContent { - private Field f; + /** Gets a `Field` of this `Content`. */ + Field getAField() { none() } + + /** + * Gets the field associated with this `Content`, if a unique one exists. + * + * For fields from template instantiations this predicate may still return + * more than one field, but all the fields will be constructed from the same + * template. + */ + Field getField() { none() } // overridden in subclasses + + override int getIndirectionIndex() { none() } // overridden in subclasses + + override string toString() { none() } // overridden in subclasses + + override predicate impliesClearOf(Content c) { none() } // overridden in subclasses +} + +/** A reference through a non-union instance field. */ +class NonUnionFieldContent extends FieldContent, TNonUnionContent { + private CanonicalField f; private int indirectionIndex; - FieldContent() { this = TFieldContent(f, indirectionIndex) } + NonUnionFieldContent() { this = TNonUnionContent(f, indirectionIndex) } override string toString() { result = contentStars(this) + f.toString() } - Field getField() { result = f } + final override Field getField() { result = f.getAField() } + + override Field getAField() { result = this.getField() } /** Gets the indirection index of this `FieldContent`. */ - pragma[inline] - override int getIndirectionIndex() { - pragma[only_bind_into](result) = pragma[only_bind_out](indirectionIndex) - } + override int getIndirectionIndex() { result = indirectionIndex } override predicate impliesClearOf(Content c) { - exists(FieldContent fc | - fc = c and - fc.getField() = f and + exists(int i | + c = TNonUnionContent(f, i) and // If `this` is `f` then `c` is cleared if it's of the // form `*f`, `**f`, etc. - fc.getIndirectionIndex() >= indirectionIndex + i >= indirectionIndex ) } } /** A reference through an instance field of a union. */ -class UnionContent extends Content, TUnionContent { - private Union u; +class UnionContent extends FieldContent, TUnionContent { + private CanonicalUnion u; private int indirectionIndex; private int bytes; @@ -2200,27 +2338,31 @@ class UnionContent extends Content, TUnionContent { override string toString() { result = contentStars(this) + u.toString() } + final override Field getField() { result = unique( | | u.getACanonicalField()).getAField() } + /** Gets a field of the underlying union of this `UnionContent`, if any. */ - Field getAField() { result = u.getAField() and getFieldSize(result) = bytes } - - /** Gets the underlying union of this `UnionContent`. */ - Union getUnion() { result = u } - - /** Gets the indirection index of this `UnionContent`. */ - pragma[inline] - override int getIndirectionIndex() { - pragma[only_bind_into](result) = pragma[only_bind_out](indirectionIndex) + override Field getAField() { + exists(CanonicalField cf | + cf = u.getACanonicalField() and + result = cf.getAField() and + getFieldSize(cf) = bytes + ) } + /** Gets the underlying union of this `UnionContent`. */ + Union getUnion() { result = u.getAUnion() } + + /** Gets the indirection index of this `UnionContent`. */ + override int getIndirectionIndex() { result = indirectionIndex } + override predicate impliesClearOf(Content c) { - exists(UnionContent uc | - uc = c and - uc.getUnion() = u and + exists(int i | + c = TUnionContent(u, _, i) and // If `this` is `u` then `c` is cleared if it's of the // form `*u`, `**u`, etc. (and we ignore `bytes` because // we know the entire union is overwritten because it's a // union). - uc.getIndirectionIndex() >= indirectionIndex + i >= indirectionIndex ) } } @@ -2234,10 +2376,7 @@ class ElementContent extends Content, TElementContent { ElementContent() { this = TElementContent(indirectionIndex) } - pragma[inline] - override int getIndirectionIndex() { - pragma[only_bind_into](result) = pragma[only_bind_out](indirectionIndex) - } + override int getIndirectionIndex() { result = indirectionIndex } override predicate impliesClearOf(Content c) { none() } 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 285e0dc8419..8dc3513b444 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 @@ -1051,12 +1051,12 @@ module BarrierGuardWithIntParam { } private predicate guardChecksInstr( - IRGuards::Guards_v1::Guard g, IRGuards::GuardsInput::Expr instr, boolean branch, + IRGuards::Guards_v1::Guard g, IRGuards::GuardsInput::Expr instr, IRGuards::GuardValue gv, int indirectionIndex ) { exists(Node node | nodeHasInstruction(node, instr, indirectionIndex) and - guardChecksNode(g, node, branch, indirectionIndex) + guardChecksNode(g, node, gv.asBooleanValue(), indirectionIndex) ) } @@ -1064,8 +1064,8 @@ module BarrierGuardWithIntParam { DataFlowIntegrationInput::Guard g, SsaImpl::Definition def, IRGuards::GuardValue val, int indirectionIndex ) { - IRGuards::Guards_v1::ValidationWrapperWithState::guardChecksDef(g, def, - val, indirectionIndex) + IRGuards::Guards_v1::ParameterizedValidationWrapper::guardChecksDef(g, + def, val, indirectionIndex) } Node getABarrierNode(int indirectionIndex) { diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll index 95cdb2624b5..722866c512f 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll @@ -93,6 +93,18 @@ private float wideningUpperBounds(ArithmeticType t) { result = 1.0 / 0.0 // +Inf } +/** Gets the widened lower bound for a given type and lower bound. */ +bindingset[type, lb] +float widenLowerBound(Type type, float lb) { + result = max(float widenLB | widenLB = wideningLowerBounds(type) and widenLB <= lb | widenLB) +} + +/** Gets the widened upper bound for a given type and upper bound. */ +bindingset[type, ub] +float widenUpperBound(Type type, float ub) { + result = min(float widenUB | widenUB = wideningUpperBounds(type) and widenUB >= ub | widenUB) +} + /** * Gets the value of the expression `e`, if it is a constant. * This predicate also handles the case of constant variables initialized in different @@ -504,6 +516,336 @@ private predicate isRecursiveExpr(Expr e) { ) } +/** + * Provides predicates that estimate the number of bounds that the range + * analysis might produce. + */ +private module BoundsEstimate { + /** + * Gets the limit beyond which we enable widening. That is, if the estimated + * number of bounds exceeds this limit, we enable widening such that the limit + * will not be reached. + */ + float getBoundsLimit() { + // This limit is arbitrary, but low enough that it prevents timeouts on + // specific observed customer databases (and the in the tests). + result = 2.0.pow(40) + } + + /** Gets the maximum number of bounds possible for `t` when widening is used. */ + private int getNrOfWideningBounds(ArithmeticType t) { + result = strictcount(wideningLowerBounds(t)).maximum(strictcount(wideningUpperBounds(t))) + } + + /** + * Holds if `boundFromGuard(guard, v, _, branch)` holds, but without + * relying on range analysis (which would cause non-monotonic recursion + * elsewhere). + */ + private predicate hasBoundFromGuard(Expr guard, VariableAccess v, boolean branch) { + exists(Expr lhs | linearAccess(lhs, v, _, _) | + relOpWithSwapAndNegate(guard, lhs, _, _, _, branch) + or + eqOpWithSwapAndNegate(guard, lhs, _, true, branch) + or + eqZeroWithNegate(guard, lhs, true, branch) + ) + } + + /** Holds if `def` is a guard phi node for `v` with a bound from a guard. */ + predicate isGuardPhiWithBound(RangeSsaDefinition def, StackVariable v, VariableAccess access) { + exists(Expr guard, boolean branch | + def.isGuardPhi(v, access, guard, branch) and + hasBoundFromGuard(guard, access, branch) + ) + } + + /** + * Gets the number of bounds for `def` when `def` is a guard phi node for the + * variable `v`. + */ + language[monotonicAggregates] + private float nrOfBoundsPhiGuard(RangeSsaDefinition def, StackVariable v) { + // If we have + // + // if (x < c) { e1 } + // e2 + // + // then `e2` is both a guard phi node (guarded by `x < c`) and a normal + // phi node (control is merged after the `if` statement). + // + // Assume `x` has `n` bounds. Then `n` bounds are propagated to the guard + // phi node `{ e1 }` and, since `{ e1 }` is input to `e2` as a normal phi + // node, `n` bounds are propagated to `e2`. If we also propagate the `n` + // bounds to `e2` as a guard phi node, then we square the number of + // bounds. + // + // However in practice `x < c` is going to cut down the number of bounds: + // The tracked bounds can't flow to both branches as that would require + // them to simultaneously be greater and smaller than `c`. To approximate + // this better, the contribution from a guard phi node that is also a + // normal phi node is 1. + exists(def.getAPhiInput(v)) and + isGuardPhiWithBound(def, v, _) and + result = 1 + or + not exists(def.getAPhiInput(v)) and + // If there's different `access`es, then they refer to the same variable + // with the same lower bounds. Hence adding these guards make no sense (the + // implementation will take the union, but they'll be removed by + // deduplication). Hence we use `max` as an approximation. + result = + max(VariableAccess access | isGuardPhiWithBound(def, v, access) | nrOfBoundsExpr(access)) + or + def.isPhiNode(v) and + not isGuardPhiWithBound(def, v, _) and + result = 0 + } + + /** + * Gets the number of bounds for `def` when `def` is a normal phi node for the + * variable `v`. + */ + language[monotonicAggregates] + private float nrOfBoundsPhiNormal(RangeSsaDefinition def, StackVariable v) { + result = + strictsum(RangeSsaDefinition inputDef | + inputDef = def.getAPhiInput(v) + | + nrOfBoundsDef(inputDef, v) + ) + or + def.isPhiNode(v) and + not exists(def.getAPhiInput(v)) and + result = 0 + } + + /** + * Gets the number of bounds for `def` when `def` is an NE phi node for the + * variable `v`. + */ + language[monotonicAggregates] + float nrOfBoundsNEPhi(RangeSsaDefinition def, StackVariable v) { + // If there's different `access`es, then they refer to the same variable + // with the same lower bounds. Hence adding these guards make no sense (the + // implementation will take the union, but they'll be removed by + // deduplication). Hence we use `max` as an approximation. + result = max(VariableAccess access | isNEPhi(v, def, access, _) | nrOfBoundsExpr(access)) + or + def.isPhiNode(v) and + not isNEPhi(v, def, _, _) and + result = 0 + } + + /** + * Gets the number of bounds for `def` when `def` is an unsupported guard phi + * node for the variable `v`. + */ + language[monotonicAggregates] + private float nrOfBoundsUnsupportedGuardPhi(RangeSsaDefinition def, StackVariable v) { + // If there's different `access`es, then they refer to the same variable + // with the same lower bounds. Hence adding these guards make no sense (the + // implementation will take the union, but they'll be removed by + // deduplication). Hence we use `max` as an approximation. + result = + max(VariableAccess access | isUnsupportedGuardPhi(v, def, access) | nrOfBoundsExpr(access)) + or + def.isPhiNode(v) and + not isUnsupportedGuardPhi(v, def, _) and + result = 0 + } + + private float nrOfBoundsPhi(RangeSsaDefinition def, StackVariable v) { + // The cases for phi nodes are not mutually exclusive. For instance a phi + // node can be both a guard phi node and a normal phi node. To handle this + // we sum the contributions from the different cases. + result = + nrOfBoundsPhiGuard(def, v) + nrOfBoundsPhiNormal(def, v) + nrOfBoundsNEPhi(def, v) + + nrOfBoundsUnsupportedGuardPhi(def, v) + } + + /** Gets the estimated number of bounds for `def` and `v`. */ + float nrOfBoundsDef(RangeSsaDefinition def, StackVariable v) { + // Recursive definitions are already widened, so we simply estimate them as + // having the number of widening bounds available. This is crucial as it + // ensures that we don't follow recursive cycles when calculating the + // estimate. Had that not been the case the estimate itself would be at risk + // of causing performance issues and being non-functional. + if isRecursiveDef(def, v) + then result = getNrOfWideningBounds(getVariableRangeType(v)) + else ( + // Definitions with a defining value + exists(Expr defExpr | assignmentDef(def, v, defExpr) and result = nrOfBoundsExpr(defExpr)) + or + // Assignment operations with a defining value + exists(AssignOperation assignOp | + def = assignOp and + assignOp.getLValue() = v.getAnAccess() and + result = nrOfBoundsExpr(assignOp) + ) + or + // Phi nodes + result = nrOfBoundsPhi(def, v) + or + unanalyzableDefBounds(def, v, _, _) and result = 1 + ) + } + + /** + * Gets a naive estimate of the number of bounds for `e`. + * + * The estimate is like an abstract interpretation of the range analysis, + * where the abstract value is the number of bounds. For instance, + * `nrOfBoundsExpr(12) = 1` and `nrOfBoundsExpr(x + y) = nrOfBoundsExpr(x) * + * nrOfBoundsExpr(y)`. + * + * The estimated number of bounds will usually be greater than the actual + * number of bounds, as the estimate can not detect cases where bounds are cut + * down when tracked precisely. For instance, in + * ```c + * int x = 1; + * if (cond) { x = 1; } + * int y = x + x; + * ``` + * the actual number of bounds for `y` is 1. However, the estimate will be 4 + * as the conditional assignment to `x` gives two bounds for `x` on the last + * line and the addition gives 2 * 2 bounds. There are two sources of inaccuracies: + * + * 1. Without tracking the lower bounds we can't see that `x` is assigned a + * value that is equal to its lower bound. + * 2. Had the conditional assignment been `x = 2` then the estimate of two + * bounds for `x` would have been correct. However, the estimate of 4 for `y` + * would still be incorrect. Summing the actual bounds `{1,2}` with itself + * gives `{2,3,4}` which is only three bounds. Again, we can't realise this + * without tracking the bounds. + * + * Since these inaccuracies compound the estimated number of bounds can often + * be _much_ greater than the actual number of bounds. Do note though that the + * estimate is not _guaranteed_ to be an upper bound. In some cases the + * approximations might underestimate the number of bounds. + * + * This predicate is functional. This is crucial as: + * + * - It ensures that the computing the estimate itself is fast. + * - Our use of monotonic aggregates assumes functionality. + * + * Any non-functional case should be considered a bug. + */ + float nrOfBoundsExpr(Expr e) { + // Similarly to what we do for definitions, we do not attempt to measure the + // number of bounds for recursive expressions. + if isRecursiveExpr(e) + then result = getNrOfWideningBounds(e.getUnspecifiedType()) + else + if analyzableExpr(e) + then + // The cases here are an abstraction of and mirrors the cases inside + // `getLowerBoundsImpl`/`getUpperBoundsImpl`. + result = 1 and exists(getValue(e).toFloat()) + or + exists(Expr operand | result = nrOfBoundsExpr(operand) | + effectivelyMultipliesByPositive(e, operand, _) + or + effectivelyMultipliesByNegative(e, operand, _) + ) + or + exists(ConditionalExpr condExpr | + e = condExpr and + result = nrOfBoundsExpr(condExpr.getThen()) * nrOfBoundsExpr(condExpr.getElse()) + ) + or + exists(BinaryOperation binop | + e = binop and + result = nrOfBoundsExpr(binop.getLeftOperand()) * nrOfBoundsExpr(binop.getRightOperand()) + | + e instanceof MaxExpr or + e instanceof MinExpr or + e instanceof AddExpr or + e instanceof SubExpr or + e instanceof UnsignedMulExpr or + e instanceof UnsignedBitwiseAndExpr + ) + or + exists(AssignExpr assign | e = assign and result = nrOfBoundsExpr(assign.getRValue())) + or + exists(AssignArithmeticOperation assignOp | + e = assignOp and + result = nrOfBoundsExpr(assignOp.getLValue()) * nrOfBoundsExpr(assignOp.getRValue()) + | + e instanceof AssignAddExpr or + e instanceof AssignSubExpr or + e instanceof UnsignedAssignMulExpr + ) + or + // Handles `AssignMulByPositiveConstantExpr` and `AssignMulByNegativeConstantExpr` + exists(AssignMulByConstantExpr mulExpr | + e = mulExpr and + result = nrOfBoundsExpr(mulExpr.getLValue()) + ) + or + // Handles the prefix and postfix increment and decrement operators. + exists(CrementOperation crementOp | + e = crementOp and result = nrOfBoundsExpr(crementOp.getOperand()) + ) + or + exists(RemExpr remExpr | e = remExpr | result = nrOfBoundsExpr(remExpr.getRightOperand())) + or + exists(Conversion convExpr | + e = convExpr and + if convExpr.getUnspecifiedType() instanceof BoolType + then result = 1 + else result = nrOfBoundsExpr(convExpr.getExpr()) + ) + or + exists(RangeSsaDefinition def, StackVariable v | + e = def.getAUse(v) and + result = nrOfBoundsDef(def, v) and + // Avoid returning two numbers when `e` is a use with a constant value. + not exists(getValue(e).toFloat()) + ) + or + exists(RShiftExpr rsExpr | + e = rsExpr and + exists(getValue(rsExpr.getRightOperand().getFullyConverted()).toInt()) and + result = nrOfBoundsExpr(rsExpr.getLeftOperand()) + ) + else ( + exists(exprMinVal(e)) and result = 1 + ) + } +} + +/** + * Holds if `v` is a variable for which widening should be used, as otherwise a + * very large number of bounds might be generated during the range analysis for + * `v`. + */ +private predicate varHasTooManyBounds(StackVariable v) { + exists(RangeSsaDefinition def | + def.getAVariable() = v and + BoundsEstimate::nrOfBoundsDef(def, v) > BoundsEstimate::getBoundsLimit() + ) +} + +/** + * Holds if `e` is an expression for which widening should be used, as otherwise + * a very large number of bounds might be generated during the range analysis + * for `e`. + */ +private predicate exprHasTooManyBounds(Expr e) { + BoundsEstimate::nrOfBoundsExpr(e) > BoundsEstimate::getBoundsLimit() + or + // A subexpressions of an expression with too many bounds may itself not have + // to many bounds. For instance, `x + y` can have too many bounds without `x` + // having as well. But in these cases, still want to consider `e` as having + // too many bounds since: + // - The overall result is widened anyway, so widening `e` as well is unlikely + // to cause further precision loss. + // - The number of bounds could be very large but still below the arbitrary + // limit. Hence widening `e` can improve performance. + exists(Expr pe | exprHasTooManyBounds(pe) and e.getParent() = pe) +} + /** * Holds if `binop` is a binary operation that's likely to be assigned a * quadratic (or more) number of candidate bounds during the analysis. This can @@ -654,13 +996,8 @@ private float getTruncatedLowerBounds(Expr expr) { if exprMinVal(expr) <= newLB and newLB <= exprMaxVal(expr) then // Apply widening where we might get a combinatorial explosion. - if isRecursiveBinary(expr) - then - result = - max(float widenLB | - widenLB = wideningLowerBounds(expr.getUnspecifiedType()) and - not widenLB > newLB - ) + if isRecursiveBinary(expr) or exprHasTooManyBounds(expr) + then result = widenLowerBound(expr.getUnspecifiedType(), newLB) else result = newLB else result = exprMinVal(expr) ) and @@ -713,13 +1050,8 @@ private float getTruncatedUpperBounds(Expr expr) { if exprMinVal(expr) <= newUB and newUB <= exprMaxVal(expr) then // Apply widening where we might get a combinatorial explosion. - if isRecursiveBinary(expr) - then - result = - min(float widenUB | - widenUB = wideningUpperBounds(expr.getUnspecifiedType()) and - not widenUB < newUB - ) + if isRecursiveBinary(expr) or exprHasTooManyBounds(expr) + then result = widenUpperBound(expr.getUnspecifiedType(), newUB) else result = newUB else result = exprMaxVal(expr) ) @@ -1796,18 +2128,12 @@ module SimpleRangeAnalysisInternal { | // Widening: check whether the new lower bound is from a source which // depends recursively on the current definition. - if isRecursiveDef(def, v) + if isRecursiveDef(def, v) or varHasTooManyBounds(v) then // The new lower bound is from a recursive source, so we round // down to one of a limited set of values to prevent the // recursion from exploding. - result = - max(float widenLB | - widenLB = wideningLowerBounds(getVariableRangeType(v)) and - not widenLB > truncatedLB - | - widenLB - ) + result = widenLowerBound(getVariableRangeType(v), truncatedLB) else result = truncatedLB ) or @@ -1826,18 +2152,12 @@ module SimpleRangeAnalysisInternal { | // Widening: check whether the new upper bound is from a source which // depends recursively on the current definition. - if isRecursiveDef(def, v) + if isRecursiveDef(def, v) or varHasTooManyBounds(v) then // The new upper bound is from a recursive source, so we round // up to one of a fixed set of values to prevent the recursion // from exploding. - result = - min(float widenUB | - widenUB = wideningUpperBounds(getVariableRangeType(v)) and - not widenUB < truncatedUB - | - widenUB - ) + result = widenUpperBound(getVariableRangeType(v), truncatedUB) else result = truncatedUB ) or @@ -1845,4 +2165,60 @@ module SimpleRangeAnalysisInternal { // bound is `typeUpperBound`. defMightOverflowNegatively(def, v) and result = varMaxVal(v) } + + /** Gets the estimate of the number of bounds for `e`. */ + float estimateNrOfBounds(Expr e) { result = BoundsEstimate::nrOfBoundsExpr(e) } +} + +/** Provides predicates for debugging the simple range analysis library. */ +private module Debug { + Locatable getRelevantLocatable() { + exists(string filepath, int startline | + result.getLocation().hasLocationInfo(filepath, startline, _, _, _) and + filepath.matches("%/test.c") and + startline = [621 .. 639] + ) + } + + float debugGetLowerBoundsImpl(Expr e) { + e = getRelevantLocatable() and + result = getLowerBoundsImpl(e) + } + + float debugGetUpperBoundsImpl(Expr e) { + e = getRelevantLocatable() and + result = getUpperBoundsImpl(e) + } + + /** + * Counts the number of lower bounds for a given expression. This predicate is + * useful for identifying performance issues in the range analysis. + */ + predicate countGetLowerBoundsImpl(Expr e, int n) { + e = getRelevantLocatable() and + n = strictcount(float lb | lb = getLowerBoundsImpl(e) | lb) + } + + float debugNrOfBounds(Expr e) { + e = getRelevantLocatable() and + result = BoundsEstimate::nrOfBoundsExpr(e) + } + + /** + * Finds any expressions for which `nrOfBounds` is not functional. The result + * should be empty, so this predicate is useful to debug non-functional cases. + */ + int nonFunctionalNrOfBounds(Expr e) { + strictcount(BoundsEstimate::nrOfBoundsExpr(e)) > 1 and + result = BoundsEstimate::nrOfBoundsExpr(e) + } + + /** + * Holds if `e` is an expression that has a lower bound, but where + * `nrOfBounds` does not compute an estimate. + */ + predicate missingNrOfBounds(Expr e, float n) { + n = lowerBound(e) and + not exists(BoundsEstimate::nrOfBoundsExpr(e)) + } } diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index 2121ffec11f..a42ce5fc943 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -1,3 +1,4 @@ + /*- Compilations -*/ /** @@ -47,6 +48,19 @@ compilation_args( string arg : string ref ); +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + /** * Optionally, record the build mode for each compilation. */ @@ -2365,6 +2379,24 @@ link_parent( int link_target : @link_target ref ); +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + /*- XML Files -*/ xmlEncoding( diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index 42cff5d8d16..4ff7d2dd67b 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -2,7 +2,7 @@ @compilation - 12643 + 12641 @externalDataElement @@ -10,35 +10,35 @@ @file - 65212 + 65204 @folder - 12389 + 12388 @diagnostic - 1484 - - - @location_default - 46945087 + 359 @pch 249 + + @location_default + 46943825 + @macro_expansion - 40256583 + 40272429 @other_macro_reference - 300694 + 300698 @normal_function - 2738022 + 2737949 @unknown_function @@ -46,11 +46,11 @@ @constructor - 698728 + 698692 @destructor - 86202 + 86200 @conversion_function @@ -58,11 +58,11 @@ @operator - 652444 + 652427 @user_defined_literal - 998 + 997 @deduction_guide @@ -70,27 +70,27 @@ @fun_decl - 4202967 + 4202854 @var_decl - 9383104 + 9383101 @type_decl - 1633482 + 1633438 @namespace_decl - 407775 + 407918 @using_declaration - 267822 + 268041 @using_directive - 6473 + 6472 @using_enum_declaration @@ -98,27 +98,27 @@ @static_assert - 173262 + 172982 @parameter - 7019832 + 7019643 @membervariable - 1497674 + 1499494 @globalvariable - 488148 + 488384 @localvariable - 726300 + 726016 @enumconstant - 347816 + 347930 @errortype @@ -366,23 +366,23 @@ @pointer - 452469 + 452457 @type_with_specifiers - 693238 + 693219 @array - 90319 + 90316 @routineptr - 684112 + 684282 @reference - 967314 + 967288 @gnu_vector @@ -394,7 +394,7 @@ @rvalue_reference - 291042 + 291034 @block @@ -406,7 +406,7 @@ @decltype - 102349 + 102350 @typeof @@ -458,7 +458,7 @@ @remove_cv - 2065 + 2062 @remove_cvref @@ -486,27 +486,27 @@ @remove_reference - 5723 + 5715 @struct - 979892 + 979799 @union - 20958 + 20957 @enum - 41550 + 41551 @template_parameter - 867095 + 866985 @alias - 1762360 + 1762169 @unknown_usertype @@ -514,15 +514,15 @@ @class - 324974 + 324966 @template_template_parameter - 6115 + 6114 @proxy_class - 48439 + 48433 @scoped_enum @@ -530,11 +530,11 @@ @template_struct - 212084 + 212057 @template_class - 29316 + 29315 @template_union @@ -542,23 +542,23 @@ @mangledname - 6364268 + 6364346 @type_mention - 5903894 + 5907630 @concept_template - 3614 + 3609 @routinetype - 604322 + 604495 @ptrtomember - 9728 + 9726 @specifier @@ -570,11 +570,11 @@ @stdattribute - 352794 + 352784 @declspec - 330281 + 330286 @msattribute @@ -590,7 +590,7 @@ @attribute_arg_constant_expr - 71856 + 71889 @attribute_arg_expr @@ -610,19 +610,19 @@ @derivation - 476902 + 476878 @frienddecl - 700465 + 700430 @comment - 11233402 + 11233100 @namespace - 8650 + 8649 @specialnamequalifyingelement @@ -630,15 +630,15 @@ @namequalifier - 3041979 + 3037638 @value - 13474601 + 13474772 @initialiser - 2251321 + 2247637 @address_of @@ -646,43 +646,43 @@ @indirect - 404153 + 404158 @array_to_pointer - 1953750 + 1953767 @parexpr - 4915206 + 4915249 @arithnegexpr - 586534 + 586539 @unaryplusexpr - 4069 + 4068 @complementexpr - 38199 + 38200 @notexpr - 355764 + 355767 @postincrexpr - 84571 + 84572 @postdecrexpr - 57394 + 57395 @preincrexpr - 96714 + 96715 @predecrexpr @@ -690,87 +690,87 @@ @conditionalexpr - 897879 + 897887 @addexpr - 571552 + 571560 @subexpr - 466799 + 466803 @mulexpr - 435793 + 435798 @divexpr - 52387 + 52388 @remexpr - 16012 + 16011 @paddexpr - 118669 + 118671 @psubexpr - 68016 + 68017 @pdiffexpr - 43912 + 43910 @lshiftexpr - 551696 + 551703 @rshiftexpr - 200554 + 200557 @andexpr - 481218 + 481224 @orexpr - 194055 + 194058 @xorexpr - 73952 + 73953 @eqexpr - 643372 + 643380 @neexpr - 411870 + 411874 @gtexpr - 111149 + 111150 @ltexpr - 139429 + 139430 @geexpr - 81358 + 81359 @leexpr - 292036 + 292039 @assignexpr - 1281144 + 1281160 @assignaddexpr @@ -782,7 +782,7 @@ @assignmulexpr - 11185 + 11184 @assigndivexpr @@ -806,11 +806,11 @@ @assignorexpr - 19606 + 19607 @assignxorexpr - 29909 + 29910 @assignpaddexpr @@ -822,27 +822,27 @@ @andlogicalexpr - 346589 + 346593 @orlogicalexpr - 1103522 + 1103536 @commaexpr - 168288 + 168283 @subscriptexpr - 435142 + 435148 @callexpr - 239780 + 239767 @vastartexpr - 4979 + 4970 @vaargexpr @@ -858,43 +858,43 @@ @varaccess - 8254629 + 8254733 @runtime_sizeof - 402047 + 402052 @runtime_alignof - 49877 + 49874 @expr_stmt - 148364 + 148366 @routineexpr - 5732444 + 5729912 @type_operand - 1405362 + 1405380 @offsetofexpr - 149024 + 149026 @typescompexpr - 701934 + 701943 @literal - 7966299 + 7966268 @aggregateliteral - 1397521 + 1397522 @c_style_cast @@ -902,19 +902,19 @@ @temp_init - 992173 + 990622 @errorexpr - 45686 + 45480 @reference_to - 1903138 + 1903214 @ref_indirect - 2107325 + 2107218 @vacuous_destructor_call @@ -922,7 +922,7 @@ @assume - 4151 + 4143 @conjugation @@ -974,31 +974,31 @@ @thisaccess - 1558277 + 1555764 @new_expr - 46198 + 46195 @delete_expr - 11481 + 11480 @throw_expr - 24178 + 24214 @condition_decl - 408920 + 408340 @braced_init_list - 2151 + 2146 @type_id - 47901 + 47899 @sizeof_pack @@ -1050,11 +1050,11 @@ @isbaseofexpr - 258 + 257 @isclassexpr - 2388 + 2384 @isconvtoexpr @@ -1066,7 +1066,7 @@ @isenumexpr - 2994 + 2993 @ispodexpr @@ -1090,7 +1090,7 @@ @uuidof - 26677 + 26695 @delete_array_expr @@ -1098,23 +1098,23 @@ @new_array_expr - 6653 + 6641 @foldexpr - 1247 + 1246 @ctordirectinit - 112837 + 112831 @ctorvirtualinit - 4020 + 4019 @ctorfieldinit - 206212 + 206206 @ctordelegatinginit @@ -1122,27 +1122,27 @@ @dtordirectdestruct - 39452 + 39450 @dtorvirtualdestruct - 3986 + 3985 @dtorfielddestruct - 39827 + 39825 @static_cast - 348053 + 348044 @reinterpret_cast - 40088 + 40018 @const_cast - 24461 + 24460 @dynamic_cast @@ -1150,11 +1150,11 @@ @lambdaexpr - 19057 + 19023 @param_ref - 164066 + 163867 @noopexpr @@ -1174,7 +1174,7 @@ @istriviallydestructibleexpr - 998 + 997 @istriviallyassignableexpr @@ -1186,7 +1186,7 @@ @istrivialexpr - 3367 + 3375 @isstandardlayoutexpr @@ -1254,11 +1254,11 @@ @isfinalexpr - 9403 + 9402 @noexceptexpr - 28465 + 28463 @builtinshufflevector @@ -1270,7 +1270,7 @@ @builtinaddressof - 15469 + 15468 @vec_fill @@ -1286,7 +1286,7 @@ @spaceshipexpr - 1312 + 1310 @co_await @@ -1306,7 +1306,7 @@ @hasuniqueobjectrepresentations - 43 + 42 @builtinbitcast @@ -1322,7 +1322,7 @@ @issame - 4539 + 4533 @isfunction @@ -1430,7 +1430,7 @@ @reuseexpr - 847039 + 845836 @istriviallycopyassignable @@ -1486,7 +1486,7 @@ @referenceconstructsfromtemporary - 43 + 42 @referenceconvertsfromtemporary @@ -1494,7 +1494,7 @@ @isconvertible - 129 + 128 @isvalidwinrttype @@ -1530,67 +1530,67 @@ @requires_expr - 16503 + 16479 @nested_requirement - 688 + 687 @compound_requirement - 10951 + 10936 @concept_id - 90433 + 90305 @lambdacapture - 31965 + 31909 @stmt_expr - 2031613 + 2031639 @stmt_if - 990214 + 990227 @stmt_while - 39647 + 39648 @stmt_goto - 157909 + 157889 @stmt_label - 78025 + 78015 @stmt_return - 1241788 + 1241800 @stmt_block - 1728666 + 1728620 @stmt_end_test_while - 233641 + 233644 @stmt_for - 84389 + 84390 @stmt_switch_case - 836152 + 834964 @stmt_switch - 411868 + 411283 @stmt_asm @@ -1598,11 +1598,11 @@ @stmt_decl - 772425 + 771066 @stmt_empty - 429404 + 428794 @stmt_continue @@ -1610,15 +1610,15 @@ @stmt_break - 137934 + 137691 @stmt_try_block - 26740 + 26771 @stmt_microsoft_try - 211 + 210 @stmt_set_vla_size @@ -1630,19 +1630,19 @@ @stmt_assigned_goto - 12426 + 12427 @stmt_range_based_for - 6384 + 6372 @stmt_handler - 43781 + 43779 @stmt_constexpr_if - 106037 + 106035 @stmt_co_return @@ -1662,43 +1662,43 @@ @ppd_if - 590942 + 590926 @ppd_ifdef - 214363 + 214366 @ppd_ifndef - 158633 + 160378 @ppd_elif - 21917 + 21914 @ppd_else - 234905 + 234898 @ppd_endif - 888971 + 888947 @ppd_plain_include - 318564 + 318524 @ppd_define - 2750123 + 2750049 @ppd_undef - 100424 + 100421 @ppd_pragma - 406187 + 406176 @ppd_include_next @@ -1706,7 +1706,7 @@ @ppd_line - 18812 + 18805 @ppd_error @@ -1762,13 +1762,60 @@ + + databaseMetadata + 1 + + + metadataKey + 1 + + + value + 1 + + + + + metadataKey + value + + + 12 + + + + + + value + metadataKey + + + 12 + + + + + + + + overlayChangedFiles + 50 + + + path + 50 + + + + compilations - 12643 + 12641 id - 12643 + 12641 cwd @@ -1786,7 +1833,7 @@ 1 2 - 12643 + 12641 @@ -1812,19 +1859,19 @@ compilation_args - 1012213 + 1012084 id - 12643 + 12641 num - 1468 + 1467 arg - 29268 + 29264 @@ -1944,7 +1991,7 @@ 42 53 - 602 + 601 53 @@ -2152,12 +2199,12 @@ 1 2 - 13403 + 13402 2 3 - 12685 + 12683 3 @@ -2183,12 +2230,403 @@ 1 2 - 19382 + 19379 2 3 - 8724 + 8723 + + + 3 + 62 + 1161 + + + + + + + + + compilation_expanded_args + 1012084 + + + id + 12641 + + + num + 1467 + + + arg + 29264 + + + + + id + num + + + 12 + + + 36 + 42 + 1003 + + + 42 + 43 + 1098 + + + 43 + 44 + 718 + + + 44 + 45 + 506 + + + 45 + 51 + 950 + + + 51 + 70 + 485 + + + 71 + 72 + 707 + + + 72 + 90 + 897 + + + 94 + 96 + 390 + + + 98 + 99 + 1341 + + + 100 + 102 + 95 + + + 103 + 104 + 1996 + + + 104 + 119 + 1066 + + + 120 + 138 + 929 + + + 139 + 140 + 454 + + + + + + + id + arg + + + 12 + + + 34 + 38 + 591 + + + 38 + 39 + 1499 + + + 39 + 40 + 982 + + + 40 + 42 + 1087 + + + 42 + 53 + 601 + + + 53 + 54 + 707 + + + 54 + 63 + 897 + + + 64 + 67 + 401 + + + 67 + 68 + 1404 + + + 68 + 70 + 971 + + + 70 + 71 + 1404 + + + 73 + 79 + 950 + + + 79 + 89 + 1130 + + + 89 + 90 + 10 + + + + + + + num + id + + + 12 + + + 43 + 90 + 63 + + + 90 + 108 + 116 + + + 108 + 183 + 105 + + + 198 + 422 + 116 + + + 422 + 595 + 126 + + + 595 + 605 + 126 + + + 605 + 749 + 116 + + + 750 + 778 + 116 + + + 781 + 883 + 116 + + + 930 + 1190 + 84 + + + 1197 + 1198 + 380 + + + + + + + num + arg + + + 12 + + + 1 + 5 + 126 + + + 5 + 7 + 116 + + + 9 + 12 + 73 + + + 12 + 15 + 116 + + + 15 + 18 + 95 + + + 18 + 22 + 116 + + + 22 + 27 + 126 + + + 27 + 29 + 84 + + + 29 + 34 + 116 + + + 34 + 44 + 126 + + + 45 + 63 + 116 + + + 67 + 94 + 116 + + + 94 + 164 + 116 + + + 171 + 199 + 21 + + + + + + + arg + id + + + 12 + + + 1 + 2 + 13402 + + + 2 + 3 + 12683 + + + 3 + 103 + 2196 + + + 104 + 1198 + 982 + + + + + + + arg + num + + + 12 + + + 1 + 2 + 19379 + + + 2 + 3 + 8723 3 @@ -2497,7 +2935,7 @@ compilation_time - 62952 + 62953 id @@ -2513,7 +2951,7 @@ seconds - 13396 + 18352 @@ -2594,48 +3032,53 @@ 3 4 - 816 + 653 4 5 - 544 + 707 6 - 7 - 163 + 9 + 217 - 8 - 9 - 163 + 9 + 10 + 108 10 11 - 217 + 163 11 - 15 + 12 217 15 - 19 - 217 - - - 19 - 26 - 217 - - - 42 - 92 + 17 163 + + 17 + 21 + 217 + + + 21 + 51 + 217 + + + 118 + 119 + 54 + @@ -2707,17 +3150,17 @@ 3 4 - 1361 + 1252 4 5 - 980 + 1089 5 6 - 272 + 163 6 @@ -2727,27 +3170,27 @@ 7 8 - 163 + 272 8 9 - 272 + 326 9 - 14 + 17 381 - 17 - 44 + 23 + 53 381 - 49 - 87 - 108 + 98 + 99 + 54 @@ -2792,24 +3235,24 @@ 12 - - 3 - 4 - 54 - 4 5 54 - 144 - 145 + 5 + 6 54 - 149 - 150 + 195 + 196 + 54 + + + 197 + 198 54 @@ -2826,27 +3269,22 @@ 1 2 - 6807 + 12198 2 3 - 3376 + 4084 3 4 - 1633 + 1415 4 - 5 - 1034 - - - 5 - 45 - 544 + 44 + 653 @@ -2862,32 +3300,22 @@ 1 2 - 6208 + 10891 2 3 - 2668 + 4465 3 4 - 2069 + 1579 4 - 5 - 925 - - - 5 - 8 - 1198 - - - 8 - 74 - 326 + 71 + 1415 @@ -2903,17 +3331,12 @@ 1 2 - 10510 + 14866 2 3 - 2831 - - - 3 - 4 - 54 + 3485 @@ -2923,23 +3346,23 @@ diagnostic_for - 4152 + 506 diagnostic - 1484 + 359 compilation - 1355 + 190 file_number - 21 + 10 file_number_diagnostic_number - 107 + 52 @@ -2953,12 +3376,12 @@ 1 2 - 1441 + 211 - 63 - 64 - 43 + 2 + 3 + 147 @@ -2974,7 +3397,7 @@ 1 2 - 1484 + 359 @@ -2990,7 +3413,7 @@ 1 2 - 1484 + 359 @@ -3003,15 +3426,20 @@ 12 + + 2 + 3 + 105 + 3 4 - 1312 + 63 5 6 - 43 + 21 @@ -3027,7 +3455,7 @@ 1 2 - 1355 + 190 @@ -3040,15 +3468,20 @@ 12 + + 2 + 3 + 105 + 3 4 - 1312 + 63 5 6 - 43 + 21 @@ -3062,9 +3495,9 @@ 12 - 69 - 70 - 21 + 34 + 35 + 10 @@ -3078,9 +3511,9 @@ 12 - 63 - 64 - 21 + 18 + 19 + 10 @@ -3096,7 +3529,7 @@ 5 6 - 21 + 10 @@ -3112,18 +3545,23 @@ 1 2 - 43 - - - 2 - 3 - 43 - - - 63 - 64 21 + + 4 + 5 + 10 + + + 10 + 11 + 10 + + + 18 + 19 + 10 + @@ -3138,12 +3576,17 @@ 2 3 - 43 + 21 - 63 - 64 - 64 + 8 + 9 + 10 + + + 18 + 19 + 21 @@ -3159,7 +3602,7 @@ 1 2 - 107 + 52 @@ -3169,19 +3612,19 @@ compilation_finished - 12643 + 12641 id - 12643 + 12641 cpu_seconds - 9379 + 9409 elapsed_seconds - 232 + 200 @@ -3195,7 +3638,7 @@ 1 2 - 12643 + 12641 @@ -3211,7 +3654,7 @@ 1 2 - 12643 + 12641 @@ -3227,17 +3670,17 @@ 1 2 - 7763 + 7846 2 3 - 1172 + 1130 3 - 29 - 443 + 35 + 433 @@ -3253,12 +3696,12 @@ 1 2 - 8735 + 8744 2 3 - 644 + 665 @@ -3274,46 +3717,81 @@ 1 2 - 63 + 42 2 3 - 21 + 10 3 - 5 - 21 + 4 + 10 - 8 - 9 - 31 + 4 + 5 + 10 + + + 9 + 10 + 10 + + + 10 + 11 + 10 + + + 11 + 12 + 10 12 + 13 + 10 + + + 14 15 - 21 + 10 - 15 - 37 - 21 + 19 + 20 + 10 - 51 - 177 - 21 + 32 + 33 + 10 - 241 - 286 - 21 + 57 + 58 + 10 - 326 - 327 + 154 + 155 + 10 + + + 251 + 252 + 10 + + + 306 + 307 + 10 + + + 309 + 310 10 @@ -3330,46 +3808,81 @@ 1 2 - 63 + 42 2 3 - 21 + 10 3 - 5 - 21 + 4 + 10 - 8 - 9 - 31 + 4 + 5 + 10 + + + 9 + 10 + 10 + + + 10 + 11 + 10 + + + 11 + 12 + 10 12 + 13 + 10 + + + 14 15 - 21 + 10 - 15 - 37 - 21 + 18 + 19 + 10 - 48 - 162 - 21 + 29 + 30 + 10 - 165 - 221 - 21 + 54 + 55 + 10 - 237 - 238 + 149 + 150 + 10 + + + 152 + 153 + 10 + + + 228 + 229 + 10 + + + 255 + 256 10 @@ -3607,31 +4120,31 @@ locations_default - 46945087 + 46943825 id - 46945087 + 46943825 file - 40918 + 40917 beginLine - 7500620 + 7500418 beginColumn - 21956 + 21955 endLine - 7501742 + 7501541 endColumn - 53393 + 53391 @@ -3645,7 +4158,7 @@ 1 2 - 46945087 + 46943825 @@ -3661,7 +4174,7 @@ 1 2 - 46945087 + 46943825 @@ -3677,7 +4190,7 @@ 1 2 - 46945087 + 46943825 @@ -3693,7 +4206,7 @@ 1 2 - 46945087 + 46943825 @@ -3709,7 +4222,7 @@ 1 2 - 46945087 + 46943825 @@ -3942,7 +4455,7 @@ 112 156 - 1996 + 1995 @@ -4039,7 +4552,7 @@ 13 26 - 3493 + 3492 26 @@ -4069,7 +4582,7 @@ 67 76 - 3493 + 3492 76 @@ -4084,7 +4597,7 @@ 102 116 - 3493 + 3492 116 @@ -4094,7 +4607,7 @@ 136 363 - 1497 + 1496 @@ -4110,32 +4623,32 @@ 1 2 - 4957457 + 4957324 2 3 - 779066 + 779045 3 4 - 543911 + 543897 4 12 - 570359 + 570343 12 97 - 563372 + 563357 97 637 - 86452 + 86449 @@ -4151,27 +4664,27 @@ 1 2 - 5019458 + 5019323 2 3 - 1221306 + 1221273 3 6 - 639969 + 639952 6 57 - 563248 + 563233 57 329 - 56636 + 56635 @@ -4187,27 +4700,27 @@ 1 2 - 5641339 + 5641187 2 3 - 483158 + 483145 3 7 - 582085 + 582069 7 25 - 565244 + 565229 25 94 - 228792 + 228786 @@ -4223,12 +4736,12 @@ 1 2 - 7034552 + 7034363 2 85 - 466067 + 466055 @@ -4244,32 +4757,32 @@ 1 2 - 5026444 + 5026309 2 3 - 739395 + 739375 3 4 - 539795 + 539780 4 12 - 586950 + 586935 12 72 - 564121 + 564106 72 250 - 43912 + 43910 @@ -4290,7 +4803,7 @@ 2 6 - 1996 + 1995 6 @@ -4361,7 +4874,7 @@ 1 2 - 1996 + 1995 2 @@ -4421,7 +4934,7 @@ 243 329 - 499 + 498 @@ -4594,7 +5107,7 @@ 2 5 - 1497 + 1496 5 @@ -4609,7 +5122,7 @@ 13 23 - 1996 + 1995 23 @@ -4629,7 +5142,7 @@ 58 73 - 1497 + 1496 73 @@ -4665,32 +5178,32 @@ 1 2 - 4955336 + 4955203 2 3 - 781561 + 781540 3 4 - 544785 + 544770 4 12 - 567864 + 567848 12 95 - 563497 + 563482 95 620 - 88697 + 88695 @@ -4706,27 +5219,27 @@ 1 2 - 5016589 + 5016454 2 3 - 1223801 + 1223768 3 6 - 633357 + 633340 6 52 - 564121 + 564106 52 329 - 63872 + 63870 @@ -4742,12 +5255,12 @@ 1 2 - 7051643 + 7051453 2 15 - 450099 + 450087 @@ -4763,27 +5276,27 @@ 1 2 - 5640466 + 5640314 2 3 - 480538 + 480525 3 7 - 587075 + 587059 7 25 - 568862 + 568846 25 89 - 224800 + 224794 @@ -4799,32 +5312,32 @@ 1 2 - 5025072 + 5024937 2 3 - 743762 + 743742 3 4 - 539545 + 539531 4 12 - 587574 + 587558 12 72 - 562749 + 562734 72 250 - 43038 + 43037 @@ -4962,12 +5475,12 @@ 1 2 - 15968 + 15967 2 3 - 5988 + 5987 3 @@ -5048,7 +5561,7 @@ 14 28 - 4491 + 4490 28 @@ -5084,12 +5597,12 @@ 1 2 - 15968 + 15967 2 3 - 5988 + 5987 3 @@ -5139,15 +5652,15 @@ files - 65212 + 65204 id - 65212 + 65204 name - 65212 + 65204 @@ -5161,7 +5674,7 @@ 1 2 - 65212 + 65204 @@ -5177,7 +5690,7 @@ 1 2 - 65212 + 65204 @@ -5187,15 +5700,15 @@ folders - 12389 + 12388 id - 12389 + 12388 name - 12389 + 12388 @@ -5209,7 +5722,7 @@ 1 2 - 12389 + 12388 @@ -5225,7 +5738,7 @@ 1 2 - 12389 + 12388 @@ -5235,15 +5748,15 @@ containerparent - 77581 + 77571 parent - 12389 + 12388 child - 77581 + 77571 @@ -5257,7 +5770,7 @@ 1 2 - 6031 + 6030 2 @@ -5308,7 +5821,7 @@ 1 2 - 77581 + 77571 @@ -5318,23 +5831,23 @@ numlines - 807883 + 807862 element_id - 806761 + 806739 num_lines - 39421 + 39420 num_code - 34056 + 34055 num_comment - 18338 + 18337 @@ -5348,7 +5861,7 @@ 1 2 - 805638 + 805616 2 @@ -5369,7 +5882,7 @@ 1 2 - 805638 + 805616 2 @@ -5390,7 +5903,7 @@ 1 2 - 806511 + 806489 2 @@ -5411,7 +5924,7 @@ 1 2 - 26696 + 26695 2 @@ -5426,7 +5939,7 @@ 5 35 - 2994 + 2993 39 @@ -5447,7 +5960,7 @@ 1 2 - 27195 + 27194 2 @@ -5457,12 +5970,12 @@ 3 4 - 2495 + 2494 4 7 - 3493 + 3492 7 @@ -5483,7 +5996,7 @@ 1 2 - 26821 + 26820 2 @@ -5519,7 +6032,7 @@ 1 2 - 21831 + 21830 2 @@ -5560,7 +6073,7 @@ 1 2 - 22205 + 22204 2 @@ -5585,7 +6098,7 @@ 9 13 - 1497 + 1496 @@ -5601,7 +6114,7 @@ 1 2 - 21956 + 21955 2 @@ -5637,12 +6150,12 @@ 1 2 - 11352 + 11351 2 3 - 1996 + 1995 3 @@ -5652,12 +6165,12 @@ 4 7 - 1497 + 1496 8 22 - 1497 + 1496 42 @@ -5678,12 +6191,12 @@ 1 2 - 11352 + 11351 2 3 - 1996 + 1995 3 @@ -5698,7 +6211,7 @@ 8 27 - 1497 + 1496 30 @@ -5719,12 +6232,12 @@ 1 2 - 11352 + 11351 2 3 - 1996 + 1995 3 @@ -5734,12 +6247,12 @@ 4 8 - 1497 + 1496 8 31 - 1497 + 1496 35 @@ -5754,11 +6267,11 @@ diagnostics - 1484 + 359 id - 1484 + 359 severity @@ -5766,19 +6279,19 @@ error_tag - 43 + 73 error_message - 150 + 147 full_error_message - 150 + 179 location - 64 + 179 @@ -5792,7 +6305,7 @@ 1 2 - 1484 + 359 @@ -5808,7 +6321,7 @@ 1 2 - 1484 + 359 @@ -5824,7 +6337,7 @@ 1 2 - 1484 + 359 @@ -5840,7 +6353,7 @@ 1 2 - 1484 + 359 @@ -5856,7 +6369,7 @@ 1 2 - 1484 + 359 @@ -5870,9 +6383,14 @@ 12 - 69 - 70 - 21 + 3 + 4 + 10 + + + 31 + 32 + 10 @@ -5881,6 +6399,27 @@ severity error_tag + + + 12 + + + 1 + 2 + 10 + + + 6 + 7 + 10 + + + + + + + severity + error_message 12 @@ -5888,23 +6427,12 @@ 2 3 - 21 + 10 - - - - - - severity - error_message - - - 12 - - 7 - 8 - 21 + 12 + 13 + 10 @@ -5918,9 +6446,14 @@ 12 - 7 - 8 - 21 + 3 + 4 + 10 + + + 14 + 15 + 10 @@ -5936,7 +6469,12 @@ 3 4 - 21 + 10 + + + 14 + 15 + 10 @@ -5950,14 +6488,24 @@ 12 - 6 - 7 - 21 + 1 + 2 + 42 - 63 - 64 - 21 + 3 + 4 + 10 + + + 9 + 10 + 10 + + + 18 + 19 + 10 @@ -5973,7 +6521,7 @@ 1 2 - 43 + 73 @@ -5989,54 +6537,69 @@ 1 2 - 21 - - - 6 - 7 - 21 - - - - - - - error_tag - full_error_message - - - 12 - - - 1 - 2 - 21 - - - 6 - 7 - 21 - - - - - - - error_tag - location - - - 12 - - - 1 - 2 - 21 + 52 2 3 - 21 + 10 + + + 7 + 8 + 10 + + + + + + + error_tag + full_error_message + + + 12 + + + 1 + 2 + 52 + + + 3 + 4 + 10 + + + 9 + 10 + 10 + + + + + + + error_tag + location + + + 12 + + + 1 + 2 + 52 + + + 3 + 4 + 10 + + + 9 + 10 + 10 @@ -6052,12 +6615,17 @@ 1 2 - 129 + 105 - 63 - 64 - 21 + 2 + 3 + 31 + + + 18 + 19 + 10 @@ -6073,7 +6641,7 @@ 1 2 - 150 + 147 @@ -6089,7 +6657,7 @@ 1 2 - 150 + 147 @@ -6105,7 +6673,12 @@ 1 2 - 150 + 116 + + + 2 + 3 + 31 @@ -6121,7 +6694,12 @@ 1 2 - 150 + 116 + + + 2 + 3 + 31 @@ -6137,12 +6715,12 @@ 1 2 - 129 + 168 - 63 - 64 - 21 + 18 + 19 + 10 @@ -6158,7 +6736,7 @@ 1 2 - 150 + 179 @@ -6174,7 +6752,7 @@ 1 2 - 150 + 179 @@ -6190,7 +6768,7 @@ 1 2 - 150 + 179 @@ -6206,7 +6784,7 @@ 1 2 - 150 + 179 @@ -6220,14 +6798,14 @@ 12 - 3 - 4 - 43 + 1 + 2 + 168 - 63 - 64 - 21 + 18 + 19 + 10 @@ -6243,7 +6821,7 @@ 1 2 - 64 + 179 @@ -6259,7 +6837,7 @@ 1 2 - 64 + 179 @@ -6275,12 +6853,7 @@ 1 2 - 21 - - - 3 - 4 - 43 + 179 @@ -6296,12 +6869,7 @@ 1 2 - 21 - - - 3 - 4 - 43 + 179 @@ -6359,7 +6927,7 @@ pch_uses - 4134 + 4127 pch @@ -6367,11 +6935,11 @@ compilation - 4134 + 4127 id - 4134 + 4127 @@ -6567,7 +7135,7 @@ 1 2 - 4134 + 4127 @@ -6583,7 +7151,7 @@ 1 2 - 4134 + 4127 @@ -6599,7 +7167,7 @@ 1 2 - 4134 + 4127 @@ -6615,7 +7183,7 @@ 1 2 - 4134 + 4127 @@ -6741,11 +7309,11 @@ fileannotations - 4200551 + 4200019 id - 5767 + 5766 kind @@ -6753,11 +7321,11 @@ name - 58716 + 58709 value - 39514 + 39509 @@ -6776,7 +7344,7 @@ 2 3 - 5566 + 5565 @@ -7002,22 +7570,22 @@ 1 2 - 11027 + 11025 2 3 - 4362 + 4361 3 5 - 5059 + 5058 5 7 - 4098 + 4097 7 @@ -7032,7 +7600,7 @@ 16 19 - 4890 + 4889 19 @@ -7047,17 +7615,17 @@ 47 128 - 4922 + 4921 128 459 - 4626 + 4625 459 546 - 1711 + 1710 @@ -7073,7 +7641,7 @@ 1 2 - 58716 + 58709 @@ -7089,17 +7657,17 @@ 1 2 - 11587 + 11585 2 3 - 7689 + 7688 3 4 - 4098 + 4097 4 @@ -7109,27 +7677,27 @@ 6 8 - 3422 + 3421 8 11 - 4742 + 4741 11 17 - 5397 + 5396 17 23 - 4700 + 4699 23 41 - 4679 + 4678 41 @@ -7160,7 +7728,7 @@ 2 4 - 1637 + 1636 4 @@ -7170,12 +7738,12 @@ 5 8 - 2461 + 2460 8 14 - 2968 + 2967 14 @@ -7190,7 +7758,7 @@ 24 51 - 3538 + 3537 51 @@ -7205,7 +7773,7 @@ 81 151 - 3084 + 3083 151 @@ -7220,7 +7788,7 @@ 473 547 - 2313 + 2312 @@ -7236,7 +7804,7 @@ 1 2 - 39503 + 39498 2 @@ -7257,7 +7825,7 @@ 1 2 - 3401 + 3400 2 @@ -7272,7 +7840,7 @@ 5 8 - 2482 + 2481 8 @@ -7302,7 +7870,7 @@ 41 66 - 2989 + 2988 66 @@ -7312,7 +7880,7 @@ 92 113 - 2989 + 2988 113 @@ -7332,15 +7900,15 @@ inmacroexpansion - 149995903 + 149997296 id - 24670868 + 24671176 inv - 3705270 + 3705372 @@ -7354,37 +7922,37 @@ 1 3 - 2209399 + 2209512 3 5 - 1474977 + 1474990 5 6 - 1620368 + 1620382 6 7 - 6582542 + 6582599 7 8 - 8718997 + 8719073 8 9 - 3557047 + 3557078 9 22 - 507534 + 507539 @@ -7400,32 +7968,32 @@ 1 2 - 531661 + 531711 2 3 - 743208 + 743239 3 4 - 481512 + 481516 4 7 - 275303 + 275305 7 8 - 282152 + 282155 8 9 - 330246 + 330249 9 @@ -7435,22 +8003,22 @@ 10 11 - 444650 + 444654 11 337 - 307798 + 307801 339 423 - 281755 + 281757 423 7616 - 23934 + 23935 @@ -7460,15 +8028,15 @@ affectedbymacroexpansion - 48735823 + 48736245 id - 7044739 + 7044800 inv - 3803120 + 3803153 @@ -7482,37 +8050,37 @@ 1 2 - 3846709 + 3846743 2 3 - 766304 + 766311 3 4 - 361841 + 361844 4 5 - 772736 + 772743 5 12 - 535160 + 535164 12 50 - 556267 + 556272 50 9900 - 205719 + 205721 @@ -7528,62 +8096,62 @@ 1 4 - 313248 + 313251 4 7 - 316607 + 316610 7 9 - 301087 + 301090 9 12 - 342938 + 342941 12 13 - 456004 + 456008 13 14 - 226099 + 226101 14 15 - 408038 + 408042 15 16 - 166429 + 166430 16 17 - 377677 + 377681 17 18 - 200636 + 200638 18 20 - 344255 + 344258 20 25 - 285393 + 285395 25 @@ -7598,19 +8166,19 @@ macroinvocations - 40337724 + 40354061 id - 40337724 + 40354061 macro_id - 182049 + 182487 location - 5912934 + 5919829 kind @@ -7628,7 +8196,7 @@ 1 2 - 40337724 + 40354061 @@ -7644,7 +8212,7 @@ 1 2 - 40337724 + 40354061 @@ -7660,7 +8228,7 @@ 1 2 - 40337724 + 40354061 @@ -7676,17 +8244,17 @@ 1 2 - 60773 + 61156 2 3 - 27555 + 27610 3 4 - 17970 + 17971 4 @@ -7710,13 +8278,13 @@ 33 - 180 - 13668 + 182 + 13723 - 181 + 185 72152 - 9802 + 9747 @@ -7732,12 +8300,12 @@ 1 2 - 77274 + 77656 2 3 - 30550 + 30605 3 @@ -7757,17 +8325,17 @@ 8 18 - 14158 + 14213 18 - 88 - 13668 + 90 + 13723 - 89 + 90 12187 - 7678 + 7569 @@ -7783,12 +8351,12 @@ 1 2 - 177475 + 177859 2 3 - 4574 + 4628 @@ -7804,17 +8372,17 @@ 1 2 - 5256183 + 5256860 2 4 - 422313 + 428528 4 72152 - 234437 + 234440 @@ -7830,12 +8398,12 @@ 1 2 - 5890770 + 5897665 2 37 - 22163 + 22164 @@ -7851,7 +8419,7 @@ 1 2 - 5912934 + 5919829 @@ -7865,13 +8433,13 @@ 12 - 1490 - 1491 + 1499 + 1500 54 - 739237 - 739238 + 739517 + 739518 54 @@ -7886,8 +8454,8 @@ 12 - 282 - 283 + 291 + 292 54 @@ -7907,13 +8475,13 @@ 12 - 1069 - 1070 + 1078 + 1079 54 - 107511 - 107512 + 107627 + 107628 54 @@ -7924,15 +8492,15 @@ macroparent - 33655149 + 33658318 id - 33655149 + 33658318 parent_id - 15926203 + 15929108 @@ -7946,7 +8514,7 @@ 1 2 - 33655149 + 33658318 @@ -7962,27 +8530,27 @@ 1 2 - 7806456 + 7809240 2 3 - 1595479 + 1595503 3 4 - 4702955 + 4703025 4 5 - 1295312 + 1295331 5 205 - 525999 + 526007 @@ -7992,15 +8560,15 @@ macrolocationbind - 6040022 + 6033959 id - 4221190 + 4217710 location - 2279306 + 2276069 @@ -8014,27 +8582,27 @@ 1 2 - 3294948 + 3292783 2 3 - 491264 + 490566 3 4 - 7896 + 7885 4 5 - 413891 + 413303 5 17 - 13189 + 13170 @@ -8050,27 +8618,27 @@ 1 2 - 1337013 + 1335114 2 3 - 482141 + 481456 3 4 - 7810 + 7799 4 5 - 428221 + 427613 5 522 - 24119 + 24085 @@ -8080,11 +8648,11 @@ macro_argument_unexpanded - 82495572 + 82486758 invocation - 26282637 + 26280952 argument_index @@ -8092,7 +8660,7 @@ text - 343270 + 343226 @@ -8106,22 +8674,22 @@ 1 2 - 9679766 + 9680186 2 3 - 9770635 + 9769396 3 4 - 5002265 + 5001631 4 67 - 1829971 + 1829739 @@ -8137,22 +8705,22 @@ 1 2 - 9862401 + 9862798 2 3 - 9788179 + 9786938 3 4 - 4845602 + 4844988 4 67 - 1786453 + 1786227 @@ -8177,7 +8745,7 @@ 646840 - 2488302 + 2488458 31 @@ -8220,57 +8788,57 @@ 1 2 - 39704 + 39699 2 3 - 62329 + 62321 3 4 - 21029 + 21027 4 5 - 34581 + 34577 5 6 - 39250 + 39245 6 9 - 30874 + 30870 9 15 - 28983 + 28979 15 26 - 25888 + 25885 26 57 - 27145 + 27142 57 517 - 25994 + 25990 518 486610 - 7488 + 7487 @@ -8286,17 +8854,17 @@ 1 2 - 243180 + 243149 2 3 - 89876 + 89864 3 9 - 10213 + 10212 @@ -8306,11 +8874,11 @@ macro_argument_expanded - 82495572 + 82486758 invocation - 26282637 + 26280952 argument_index @@ -8318,7 +8886,7 @@ text - 207933 + 207906 @@ -8332,22 +8900,22 @@ 1 2 - 9679766 + 9680186 2 3 - 9770635 + 9769396 3 4 - 5002265 + 5001631 4 67 - 1829971 + 1829739 @@ -8363,22 +8931,22 @@ 1 2 - 12638444 + 12638489 2 3 - 8428470 + 8427402 3 4 - 4225331 + 4224795 4 9 - 990391 + 990265 @@ -8403,7 +8971,7 @@ 646840 - 2488302 + 2488458 31 @@ -8420,7 +8988,7 @@ 1 2 - 602 + 601 2 @@ -8446,22 +9014,22 @@ 1 2 - 21832 + 21829 2 3 - 26860 + 26856 3 4 - 43496 + 43490 4 5 - 15907 + 15905 5 @@ -8471,32 +9039,32 @@ 6 7 - 18399 + 18397 7 10 - 18970 + 18967 10 19 - 18325 + 18323 19 51 - 15780 + 15778 51 252 - 15600 + 15598 252 - 1169205 - 9495 + 1169361 + 9494 @@ -8512,17 +9080,17 @@ 1 2 - 105086 + 105072 2 3 - 88914 + 88903 3 66 - 13931 + 13930 @@ -8532,15 +9100,15 @@ functions - 4049399 + 4049290 id - 4049399 + 4049290 name - 1693362 + 1693316 kind @@ -8558,7 +9126,7 @@ 1 2 - 4049399 + 4049290 @@ -8574,7 +9142,7 @@ 1 2 - 4049399 + 4049290 @@ -8590,17 +9158,17 @@ 1 2 - 1447229 + 1447190 2 4 - 138971 + 138968 4 3162 - 107160 + 107157 @@ -8616,7 +9184,7 @@ 1 2 - 1690493 + 1690447 2 @@ -8723,26 +9291,26 @@ builtin_functions - 30926 + 30923 id - 30926 + 30923 function_entry_point - 1141561 + 1141776 id - 1137813 + 1138028 entry_point - 1141561 + 1141776 @@ -8756,7 +9324,7 @@ 1 2 - 1134611 + 1134826 2 @@ -8777,7 +9345,7 @@ 1 2 - 1141561 + 1141776 @@ -8787,15 +9355,15 @@ function_return_type - 4066864 + 4066754 id - 4049399 + 4049290 return_type - 619261 + 619244 @@ -8809,12 +9377,12 @@ 1 2 - 4031934 + 4031825 2 3 - 17465 + 17464 @@ -8830,22 +9398,22 @@ 1 2 - 309880 + 309871 2 3 - 213697 + 213691 3 5 - 48028 + 48027 5 365 - 46531 + 46530 432 @@ -9130,44 +9698,44 @@ purefunctions - 131703 + 131626 id - 131703 + 131626 function_deleted - 88088 + 87963 id - 88088 + 87963 function_defaulted - 51682 + 51609 id - 51682 + 51609 function_prototyped - 4047902 + 4047793 id - 4047902 + 4047793 @@ -9247,15 +9815,15 @@ member_function_this_type - 674151 + 674133 id - 674151 + 674133 this_type - 176022 + 176018 @@ -9269,7 +9837,7 @@ 1 2 - 674151 + 674133 @@ -9285,17 +9853,17 @@ 1 2 - 47155 + 47154 2 3 - 36926 + 36925 3 4 - 32684 + 32683 4 @@ -9305,17 +9873,17 @@ 5 6 - 12849 + 12848 6 10 - 14471 + 14470 10 65 - 11851 + 11850 @@ -9325,27 +9893,27 @@ fun_decls - 4208955 + 4208841 id - 4202967 + 4202854 function - 4024823 + 4024715 type_id - 611277 + 611260 name - 1691865 + 1691819 location - 2813247 + 2813171 @@ -9359,7 +9927,7 @@ 1 2 - 4202967 + 4202854 @@ -9375,12 +9943,12 @@ 1 2 - 4196979 + 4196866 2 3 - 5988 + 5987 @@ -9396,7 +9964,7 @@ 1 2 - 4202967 + 4202854 @@ -9412,7 +9980,7 @@ 1 2 - 4202967 + 4202854 @@ -9428,12 +9996,12 @@ 1 2 - 3861275 + 3861171 2 5 - 163547 + 163543 @@ -9449,12 +10017,12 @@ 1 2 - 4006360 + 4006252 2 3 - 18463 + 18462 @@ -9470,7 +10038,7 @@ 1 2 - 4024823 + 4024715 @@ -9486,12 +10054,12 @@ 1 2 - 3881734 + 3881630 2 4 - 143088 + 143084 @@ -9507,22 +10075,22 @@ 1 2 - 295159 + 295151 2 3 - 220558 + 220552 3 5 - 48403 + 48401 5 364 - 45908 + 45906 364 @@ -9543,22 +10111,22 @@ 1 2 - 305264 + 305256 2 3 - 211826 + 211820 3 5 - 48028 + 48027 5 1163 - 45908 + 45906 1483 @@ -9579,17 +10147,17 @@ 1 2 - 491516 + 491503 2 3 - 52894 + 52892 3 7 - 50149 + 50148 7 @@ -9610,22 +10178,22 @@ 1 2 - 454964 + 454952 2 3 - 69485 + 69484 3 6 - 56012 + 56011 6 4756 - 30813 + 30812 @@ -9641,22 +10209,22 @@ 1 2 - 1331336 + 1331300 2 3 - 194485 + 194480 3 11 - 129490 + 129487 11 3169 - 36551 + 36550 @@ -9672,17 +10240,17 @@ 1 2 - 1446730 + 1446691 2 4 - 139470 + 139467 4 3162 - 105663 + 105660 @@ -9698,12 +10266,12 @@ 1 2 - 1602045 + 1602002 2 1596 - 89820 + 89817 @@ -9719,17 +10287,17 @@ 1 2 - 1367264 + 1367228 2 3 - 208333 + 208327 3 1592 - 116267 + 116264 @@ -9745,17 +10313,17 @@ 1 2 - 2420283 + 2420218 2 3 - 251496 + 251490 3 211 - 141466 + 141463 @@ -9771,17 +10339,17 @@ 1 2 - 2438995 + 2438930 2 3 - 233283 + 233277 3 211 - 140967 + 140964 @@ -9797,12 +10365,12 @@ 1 2 - 2698851 + 2698778 2 211 - 114396 + 114393 @@ -9818,12 +10386,12 @@ 1 2 - 2774075 + 2774000 2 8 - 39171 + 39170 @@ -9833,22 +10401,22 @@ fun_def - 1422279 + 1422241 id - 1422279 + 1422241 fun_specialized - 7936 + 7922 id - 7936 + 7922 @@ -9866,11 +10434,11 @@ fun_decl_specifiers - 4279688 + 4279573 id - 1748252 + 1748205 name @@ -9888,22 +10456,22 @@ 1 2 - 362899 + 362889 2 3 - 262225 + 262218 3 4 - 1100174 + 1100144 4 5 - 22954 + 22953 @@ -10100,26 +10668,26 @@ fun_decl_empty_throws - 420911 + 421168 fun_decl - 420911 + 421168 fun_decl_noexcept - 141830 + 141823 fun_decl - 141830 + 141823 constant - 141353 + 141346 @@ -10133,7 +10701,7 @@ 1 2 - 141830 + 141823 @@ -10149,7 +10717,7 @@ 1 2 - 140910 + 140903 2 @@ -10164,22 +10732,22 @@ fun_decl_empty_noexcept - 1163672 + 1163640 fun_decl - 1163672 + 1163640 fun_decl_typedef_type - 2761 + 2760 fun_decl - 2761 + 2760 typedeftype_id @@ -10197,7 +10765,7 @@ 1 2 - 2761 + 2760 @@ -10273,19 +10841,19 @@ fun_requires - 29111 + 29070 id - 10112 + 10098 kind - 43 + 42 constraint - 28875 + 28834 @@ -10299,7 +10867,7 @@ 1 2 - 10048 + 10033 2 @@ -10320,7 +10888,7 @@ 1 2 - 7272 + 7262 2 @@ -10330,7 +10898,7 @@ 3 6 - 860 + 859 6 @@ -10340,7 +10908,7 @@ 13 14 - 1140 + 1138 19 @@ -10403,7 +10971,7 @@ 1 2 - 28638 + 28597 2 @@ -10424,7 +10992,7 @@ 1 2 - 28875 + 28834 @@ -10434,19 +11002,19 @@ param_decl_bind - 7310375 + 7310179 id - 7310375 + 7310179 index - 7984 + 7983 fun_decl - 3531684 + 3531589 @@ -10460,7 +11028,7 @@ 1 2 - 7310375 + 7310179 @@ -10476,7 +11044,7 @@ 1 2 - 7310375 + 7310179 @@ -10492,12 +11060,12 @@ 2 3 - 3992 + 3991 6 7 - 1996 + 1995 16 @@ -10533,12 +11101,12 @@ 2 3 - 3992 + 3991 6 7 - 1996 + 1995 16 @@ -10574,27 +11142,27 @@ 1 2 - 1508981 + 1508940 2 3 - 976296 + 976270 3 4 - 602045 + 602029 4 5 - 290668 + 290660 5 65 - 153692 + 153688 @@ -10610,27 +11178,27 @@ 1 2 - 1508981 + 1508940 2 3 - 976296 + 976270 3 4 - 602045 + 602029 4 5 - 290668 + 290660 5 65 - 153692 + 153688 @@ -10640,27 +11208,27 @@ var_decls - 9389965 + 9389962 id - 9383104 + 9383101 variable - 9034676 + 9034682 type_id - 1456461 + 1456422 name - 852544 + 852521 location - 6274572 + 6274404 @@ -10674,7 +11242,7 @@ 1 2 - 9383104 + 9383101 @@ -10690,7 +11258,7 @@ 1 2 - 9376243 + 9376240 2 @@ -10711,7 +11279,7 @@ 1 2 - 9383104 + 9383101 @@ -10727,7 +11295,7 @@ 1 2 - 9383104 + 9383101 @@ -10743,12 +11311,12 @@ 1 2 - 8703713 + 8703728 2 5 - 330962 + 330954 @@ -10764,12 +11332,12 @@ 1 2 - 8981158 + 8981166 2 3 - 53517 + 53516 @@ -10785,12 +11353,12 @@ 1 2 - 8929262 + 8929271 2 4 - 105414 + 105411 @@ -10806,12 +11374,12 @@ 1 2 - 8783054 + 8783068 2 4 - 251621 + 251614 @@ -10827,27 +11395,27 @@ 1 2 - 849924 + 849901 2 3 - 284056 + 284049 3 5 - 127370 + 127366 5 11 - 113148 + 113145 11 2944 - 81961 + 81958 @@ -10863,27 +11431,27 @@ 1 2 - 870758 + 870734 2 3 - 269086 + 269079 3 5 - 122754 + 122751 5 11 - 113023 + 113020 11 2860 - 80838 + 80836 @@ -10899,17 +11467,17 @@ 1 2 - 1119510 + 1119480 2 3 - 192614 + 192609 3 7 - 115269 + 115266 7 @@ -10930,22 +11498,22 @@ 1 2 - 985403 + 985377 2 3 - 219061 + 219055 3 6 - 133607 + 133604 6 95 - 109281 + 109278 97 @@ -10966,32 +11534,32 @@ 1 2 - 465942 + 465930 2 3 - 165793 + 165788 3 4 - 59630 + 59629 4 7 - 65868 + 65866 7 25 - 64121 + 64120 25 27139 - 31187 + 31186 @@ -11007,27 +11575,27 @@ 1 2 - 478916 + 478904 2 3 - 165044 + 165040 3 4 - 54640 + 54639 4 8 - 71606 + 71604 8 45 - 64246 + 64244 45 @@ -11048,17 +11616,17 @@ 1 2 - 654690 + 654672 2 3 - 110778 + 110775 3 11 - 65493 + 65492 11 @@ -11079,27 +11647,27 @@ 1 2 - 493762 + 493748 2 3 - 183258 + 183253 3 4 - 51646 + 51645 4 8 - 64994 + 64993 8 22619 - 58882 + 58880 @@ -11115,17 +11683,17 @@ 1 2 - 5774822 + 5774667 2 21 - 472305 + 472292 21 2943 - 27445 + 27444 @@ -11141,12 +11709,12 @@ 1 2 - 5855660 + 5855503 2 2935 - 418911 + 418900 @@ -11162,12 +11730,12 @@ 1 2 - 5976045 + 5975884 2 2555 - 298527 + 298519 @@ -11183,12 +11751,12 @@ 1 2 - 6262222 + 6262054 2 5 - 12350 + 12349 @@ -11198,37 +11766,37 @@ var_def - 3766964 + 3766862 id - 3766964 + 3766862 var_specialized - 645 + 644 id - 645 + 644 var_decl_specifiers - 489894 + 489881 id - 489894 + 489881 name - 499 + 498 @@ -11242,7 +11810,7 @@ 1 2 - 489894 + 489881 @@ -11283,18 +11851,18 @@ is_structured_binding - 946 + 945 id - 946 + 945 var_requires - 387 + 386 id @@ -11302,7 +11870,7 @@ constraint - 387 + 386 @@ -11342,7 +11910,7 @@ 1 2 - 387 + 386 @@ -11352,19 +11920,19 @@ type_decls - 1633482 + 1633438 id - 1633482 + 1633438 type_id - 1614520 + 1614476 location - 1547404 + 1547362 @@ -11378,7 +11946,7 @@ 1 2 - 1633482 + 1633438 @@ -11394,7 +11962,7 @@ 1 2 - 1633482 + 1633438 @@ -11410,12 +11978,12 @@ 1 2 - 1598177 + 1598134 2 10 - 16342 + 16341 @@ -11431,7 +11999,7 @@ 1 2 - 1598302 + 1598259 2 @@ -11452,7 +12020,7 @@ 1 2 - 1525323 + 1525282 2 @@ -11473,12 +12041,12 @@ 1 2 - 1525448 + 1525407 2 64 - 21956 + 21955 @@ -11488,37 +12056,37 @@ type_def - 1095558 + 1095528 id - 1095558 + 1095528 type_decl_top - 673959 + 675276 type_decl - 673959 + 675276 type_requires - 7681 + 7670 id - 2044 + 2041 constraint - 7659 + 7648 @@ -11532,7 +12100,7 @@ 1 2 - 1011 + 1009 2 @@ -11542,12 +12110,12 @@ 5 6 - 602 + 601 6 13 - 172 + 171 13 @@ -11568,7 +12136,7 @@ 1 2 - 7638 + 7627 2 @@ -11583,23 +12151,23 @@ namespace_decls - 407775 + 407918 id - 407775 + 407918 namespace_id - 1844 + 1840 location - 407775 + 407918 bodylocation - 407775 + 407918 @@ -11613,7 +12181,7 @@ 1 2 - 407775 + 407918 @@ -11629,7 +12197,7 @@ 1 2 - 407775 + 407918 @@ -11645,7 +12213,7 @@ 1 2 - 407775 + 407918 @@ -11666,7 +12234,7 @@ 2 3 - 203 + 202 3 @@ -11681,36 +12249,36 @@ 15 34 - 146 + 145 35 62 - 154 + 145 63 - 87 - 146 + 81 + 145 - 90 + 86 144 - 154 + 162 - 146 + 151 264 - 146 + 145 270 1870 - 146 + 145 2205 - 12461 + 12488 32 @@ -11732,7 +12300,7 @@ 2 3 - 203 + 202 3 @@ -11747,36 +12315,36 @@ 15 34 - 146 + 145 35 62 - 154 + 145 63 - 87 - 146 + 81 + 145 - 90 + 86 144 - 154 + 162 - 146 + 151 264 - 146 + 145 270 1870 - 146 + 145 2205 - 12461 + 12488 32 @@ -11798,7 +12366,7 @@ 2 3 - 203 + 202 3 @@ -11813,36 +12381,36 @@ 15 34 - 146 + 145 35 62 - 154 + 145 63 - 87 - 146 + 81 + 145 - 90 + 86 144 - 154 + 162 - 146 + 151 264 - 146 + 145 270 1870 - 146 + 145 2205 - 12461 + 12488 32 @@ -11859,7 +12427,7 @@ 1 2 - 407775 + 407918 @@ -11875,7 +12443,7 @@ 1 2 - 407775 + 407918 @@ -11891,7 +12459,7 @@ 1 2 - 407775 + 407918 @@ -11907,7 +12475,7 @@ 1 2 - 407775 + 407918 @@ -11923,7 +12491,7 @@ 1 2 - 407775 + 407918 @@ -11939,7 +12507,7 @@ 1 2 - 407775 + 407918 @@ -11949,19 +12517,19 @@ usings - 271973 + 272192 id - 271973 + 272192 element_id - 58938 + 59184 location - 26849 + 26846 kind @@ -11979,7 +12547,7 @@ 1 2 - 271973 + 272192 @@ -11995,7 +12563,7 @@ 1 2 - 271973 + 272192 @@ -12011,7 +12579,7 @@ 1 2 - 271973 + 272192 @@ -12027,7 +12595,7 @@ 1 2 - 51206 + 51453 2 @@ -12053,7 +12621,7 @@ 1 2 - 51206 + 51453 2 @@ -12079,7 +12647,7 @@ 1 2 - 58938 + 59184 @@ -12095,21 +12663,21 @@ 1 2 - 21177 + 21175 2 4 - 2292 + 2291 4 132 - 1954 + 1953 145 - 367 + 371 1425 @@ -12126,21 +12694,21 @@ 1 2 - 21177 + 21175 2 4 - 2292 + 2291 4 132 - 1954 + 1953 145 - 367 + 371 1425 @@ -12157,7 +12725,7 @@ 1 2 - 26849 + 26846 @@ -12176,8 +12744,8 @@ 10 - 25356 - 25357 + 25380 + 25381 10 @@ -12197,8 +12765,8 @@ 10 - 5366 - 5367 + 5390 + 5391 10 @@ -12230,15 +12798,15 @@ using_container - 580049 + 580229 parent - 21874 + 21914 child - 271973 + 272192 @@ -12252,12 +12820,12 @@ 1 2 - 10372 + 10371 2 3 - 1616 + 1615 3 @@ -12267,7 +12835,7 @@ 6 7 - 2270 + 2312 7 @@ -12303,27 +12871,27 @@ 1 2 - 96488 + 96729 2 3 - 120285 + 120270 3 4 - 20100 + 20097 4 5 - 26712 + 26709 5 65 - 8386 + 8385 @@ -12333,27 +12901,27 @@ static_asserts - 173262 + 172982 id - 173262 + 172982 condition - 173262 + 172982 message - 38764 + 38704 location - 22647 + 22616 enclosing - 6807 + 6819 @@ -12367,7 +12935,7 @@ 1 2 - 173262 + 172982 @@ -12383,7 +12951,7 @@ 1 2 - 173262 + 172982 @@ -12399,7 +12967,7 @@ 1 2 - 173262 + 172982 @@ -12415,7 +12983,7 @@ 1 2 - 173262 + 172982 @@ -12431,7 +12999,7 @@ 1 2 - 173262 + 172982 @@ -12447,7 +13015,7 @@ 1 2 - 173262 + 172982 @@ -12463,7 +13031,7 @@ 1 2 - 173262 + 172982 @@ -12479,7 +13047,7 @@ 1 2 - 173262 + 172982 @@ -12495,32 +13063,32 @@ 1 2 - 28504 + 28454 2 3 - 641 + 640 3 4 - 3623 + 3624 4 12 - 2087 + 2084 12 17 - 3135 + 3130 17 513 - 771 + 770 @@ -12536,32 +13104,32 @@ 1 2 - 28504 + 28454 2 3 - 641 + 640 3 4 - 3623 + 3624 4 12 - 2087 + 2084 12 17 - 3135 + 3130 17 513 - 771 + 770 @@ -12577,12 +13145,12 @@ 1 2 - 35921 + 35866 2 33 - 2843 + 2838 @@ -12598,27 +13166,27 @@ 1 2 - 30316 + 30263 2 3 - 349 + 348 3 4 - 3387 + 3389 4 12 - 1908 + 1905 12 43 - 2802 + 2797 @@ -12634,17 +13202,17 @@ 1 2 - 4281 + 4273 2 3 - 3728 + 3722 3 4 - 1738 + 1743 4 @@ -12654,17 +13222,17 @@ 5 6 - 4735 + 4727 6 13 - 430 + 429 14 15 - 2648 + 2643 16 @@ -12674,12 +13242,12 @@ 17 18 - 4394 + 4387 19 52 - 503 + 502 @@ -12695,17 +13263,17 @@ 1 2 - 4281 + 4273 2 3 - 3728 + 3722 3 4 - 1738 + 1743 4 @@ -12715,17 +13283,17 @@ 5 6 - 4735 + 4727 6 13 - 430 + 429 14 15 - 2648 + 2643 16 @@ -12735,12 +13303,12 @@ 17 18 - 4394 + 4387 19 52 - 503 + 502 @@ -12756,17 +13324,17 @@ 1 2 - 6953 + 6949 2 3 - 7676 + 7663 3 4 - 7782 + 7768 4 @@ -12787,32 +13355,32 @@ 1 2 - 5068 + 5060 2 3 - 8098 + 8084 3 4 - 1478 + 1483 4 5 - 4760 + 4751 5 13 - 495 + 494 13 14 - 2648 + 2643 16 @@ -12833,17 +13401,17 @@ 1 2 - 5702 + 5716 2 3 - 528 + 527 3 228 - 528 + 527 229 @@ -12864,17 +13432,17 @@ 1 2 - 5702 + 5716 2 3 - 528 + 527 3 228 - 528 + 527 229 @@ -12895,17 +13463,17 @@ 1 2 - 5856 + 5870 2 3 - 519 + 518 3 2936 - 430 + 429 @@ -12921,17 +13489,17 @@ 1 2 - 5840 + 5854 2 3 - 536 + 535 3 1929 - 430 + 429 @@ -12941,23 +13509,23 @@ params - 7060750 + 7060560 id - 7019832 + 7019643 function - 3404938 + 3404846 index - 7984 + 7983 type_id - 1220308 + 1220275 @@ -12971,7 +13539,7 @@ 1 2 - 7019832 + 7019643 @@ -12987,7 +13555,7 @@ 1 2 - 7019832 + 7019643 @@ -13003,12 +13571,12 @@ 1 2 - 6978913 + 6978726 2 3 - 40918 + 40917 @@ -13024,27 +13592,27 @@ 1 2 - 1473177 + 1473138 2 3 - 926272 + 926247 3 4 - 578717 + 578701 4 5 - 280813 + 280805 5 65 - 145958 + 145954 @@ -13060,27 +13628,27 @@ 1 2 - 1473177 + 1473138 2 3 - 926272 + 926247 3 4 - 578717 + 578701 4 5 - 280813 + 280805 5 65 - 145958 + 145954 @@ -13096,22 +13664,22 @@ 1 2 - 1781685 + 1781637 2 3 - 1030688 + 1030660 3 4 - 437499 + 437488 4 11 - 155064 + 155060 @@ -13127,12 +13695,12 @@ 2 3 - 3992 + 3991 6 7 - 1996 + 1995 14 @@ -13168,12 +13736,12 @@ 2 3 - 3992 + 3991 6 7 - 1996 + 1995 14 @@ -13209,12 +13777,12 @@ 1 2 - 3992 + 3991 2 3 - 1996 + 1995 4 @@ -13250,27 +13818,27 @@ 1 2 - 737524 + 737504 2 3 - 240394 + 240387 3 5 - 93188 + 93186 5 13 - 93812 + 93809 13 2574 - 55389 + 55387 @@ -13286,27 +13854,27 @@ 1 2 - 819610 + 819588 2 3 - 179640 + 179635 3 6 - 106162 + 106159 6 27 - 92190 + 92188 27 2562 - 22704 + 22703 @@ -13322,17 +13890,17 @@ 1 2 - 995134 + 995107 2 3 - 166791 + 166786 3 65 - 58383 + 58381 @@ -13342,15 +13910,15 @@ overrides - 159778 + 159497 new - 151069 + 150804 old - 17993 + 17961 @@ -13364,12 +13932,12 @@ 1 2 - 142369 + 142119 2 4 - 8700 + 8684 @@ -13385,32 +13953,32 @@ 1 2 - 9845 + 9828 2 3 - 2437 + 2432 3 4 - 1632 + 1629 4 6 - 1486 + 1483 6 18 - 1356 + 1354 18 230 - 1234 + 1232 @@ -13420,19 +13988,19 @@ membervariables - 1500125 + 1501944 id - 1497674 + 1499494 type_id - 456185 + 457553 name - 642156 + 642220 @@ -13446,7 +14014,7 @@ 1 2 - 1495333 + 1497152 2 @@ -13467,7 +14035,7 @@ 1 2 - 1497674 + 1499494 @@ -13483,12 +14051,12 @@ 1 2 - 338449 + 339380 2 3 - 72155 + 72592 3 @@ -13498,7 +14066,7 @@ 10 4445 - 10128 + 10129 @@ -13514,22 +14082,22 @@ 1 2 - 356039 + 356970 2 3 - 64313 + 64750 3 - 49 - 34253 + 57 + 34362 - 49 + 60 2186 - 1579 + 1470 @@ -13545,12 +14113,12 @@ 1 2 - 421496 + 421557 2 3 - 122419 + 122421 3 @@ -13559,7 +14127,7 @@ 5 - 656 + 664 40189 @@ -13576,17 +14144,17 @@ 1 2 - 524420 + 524482 2 3 - 73190 + 73191 3 - 660 - 44545 + 668 + 44546 @@ -13596,11 +14164,11 @@ globalvariables - 488148 + 488384 id - 488148 + 488384 type_id @@ -13608,7 +14176,7 @@ name - 112524 + 112521 @@ -13622,7 +14190,7 @@ 1 2 - 488148 + 488384 @@ -13638,7 +14206,7 @@ 1 2 - 488148 + 488384 @@ -13654,7 +14222,7 @@ 1 2 - 6986 + 6985 2 @@ -13679,7 +14247,7 @@ 152 2216 - 499 + 498 @@ -13720,7 +14288,7 @@ 125 228 - 499 + 498 @@ -13736,7 +14304,7 @@ 1 2 - 95309 + 95306 2 @@ -13762,12 +14330,12 @@ 1 2 - 96931 + 96928 2 3 - 15344 + 15343 3 @@ -13782,19 +14350,19 @@ localvariables - 726300 + 726016 id - 726300 + 726016 type_id - 53440 + 53423 name - 101634 + 101594 @@ -13808,7 +14376,7 @@ 1 2 - 726300 + 726016 @@ -13824,7 +14392,7 @@ 1 2 - 726300 + 726016 @@ -13840,32 +14408,32 @@ 1 2 - 28865 + 28857 2 3 - 7843 + 7840 3 4 - 4029 + 4028 4 6 - 4065 + 4064 6 12 - 4133 + 4132 12 162 - 4009 + 4008 162 @@ -13886,22 +14454,22 @@ 1 2 - 38369 + 38358 2 3 - 6707 + 6704 3 5 - 4478 + 4476 5 3509 - 3885 + 3884 @@ -13917,27 +14485,27 @@ 1 2 - 62540 + 62515 2 3 - 16039 + 16032 3 4 - 6530 + 6528 4 8 - 8147 + 8144 8 134 - 7623 + 7620 134 @@ -13958,17 +14526,17 @@ 1 2 - 84586 + 84553 2 3 - 8411 + 8408 3 15 - 7683 + 7680 15 @@ -13983,11 +14551,11 @@ autoderivation - 229166 + 229160 var - 229166 + 229160 derivation_type @@ -14005,7 +14573,7 @@ 1 2 - 229166 + 229160 @@ -14051,15 +14619,15 @@ orphaned_variables - 44324 + 44321 var - 44324 + 44321 function - 41053 + 41051 @@ -14073,7 +14641,7 @@ 1 2 - 44324 + 44321 @@ -14089,7 +14657,7 @@ 1 2 - 40201 + 40199 2 @@ -14104,19 +14672,19 @@ enumconstants - 347816 + 347930 id - 347816 + 347930 parent - 41550 + 41551 index - 13940 + 13941 type_id @@ -14124,11 +14692,11 @@ name - 347435 + 347549 location - 320424 + 320538 @@ -14142,7 +14710,7 @@ 1 2 - 347816 + 347930 @@ -14158,7 +14726,7 @@ 1 2 - 347816 + 347930 @@ -14174,7 +14742,7 @@ 1 2 - 347816 + 347930 @@ -14190,7 +14758,7 @@ 1 2 - 347816 + 347930 @@ -14206,7 +14774,7 @@ 1 2 - 347816 + 347930 @@ -14354,7 +14922,7 @@ 1 2 - 41550 + 41551 @@ -14471,12 +15039,12 @@ 8 11 - 3811 + 3812 11 17 - 3212 + 3213 17 @@ -14614,7 +15182,7 @@ 1 2 - 13940 + 13941 @@ -14740,8 +15308,8 @@ 12 - 6387 - 6388 + 6389 + 6390 54 @@ -14788,8 +15356,8 @@ 12 - 6380 - 6381 + 6382 + 6383 54 @@ -14804,8 +15372,8 @@ 12 - 5884 - 5885 + 5886 + 5887 54 @@ -14822,7 +15390,7 @@ 1 2 - 347054 + 347168 2 @@ -14843,7 +15411,7 @@ 1 2 - 347054 + 347168 2 @@ -14864,7 +15432,7 @@ 1 2 - 347435 + 347549 @@ -14880,7 +15448,7 @@ 1 2 - 347435 + 347549 @@ -14896,7 +15464,7 @@ 1 2 - 347054 + 347168 2 @@ -14917,7 +15485,7 @@ 1 2 - 319389 + 319503 2 @@ -14938,7 +15506,7 @@ 1 2 - 320424 + 320538 @@ -14954,7 +15522,7 @@ 1 2 - 319389 + 319503 2 @@ -14975,7 +15543,7 @@ 1 2 - 320424 + 320538 @@ -14991,7 +15559,7 @@ 1 2 - 319389 + 319503 2 @@ -15428,7 +15996,7 @@ 1 2 - 499 + 498 2 @@ -15683,15 +16251,15 @@ derivedtypes - 3030936 + 3030855 id - 3030936 + 3030855 name - 1460578 + 1460538 kind @@ -15699,7 +16267,7 @@ type_id - 1946730 + 1946678 @@ -15713,7 +16281,7 @@ 1 2 - 3030936 + 3030855 @@ -15729,7 +16297,7 @@ 1 2 - 3030936 + 3030855 @@ -15745,7 +16313,7 @@ 1 2 - 3030936 + 3030855 @@ -15761,12 +16329,12 @@ 1 2 - 1344061 + 1344025 2 28 - 109905 + 109902 29 @@ -15787,7 +16355,7 @@ 1 2 - 1460578 + 1460538 @@ -15803,12 +16371,12 @@ 1 2 - 1344185 + 1344149 2 28 - 109780 + 109777 29 @@ -15952,22 +16520,22 @@ 1 2 - 1317489 + 1317453 2 3 - 375873 + 375862 3 4 - 123253 + 123250 4 137 - 130114 + 130111 @@ -15983,22 +16551,22 @@ 1 2 - 1318986 + 1318950 2 3 - 375873 + 375862 3 4 - 121756 + 121753 4 137 - 130114 + 130111 @@ -16014,22 +16582,22 @@ 1 2 - 1319360 + 1319325 2 3 - 376496 + 376486 3 4 - 123502 + 123499 4 6 - 127370 + 127366 @@ -16039,11 +16607,11 @@ pointerishsize - 2247379 + 2247318 id - 2247379 + 2247318 size @@ -16065,7 +16633,7 @@ 1 2 - 2247379 + 2247318 @@ -16081,7 +16649,7 @@ 1 2 - 2247379 + 2247318 @@ -16165,15 +16733,15 @@ arraysizes - 80588 + 80586 id - 80588 + 80586 num_elements - 17839 + 17838 bytesize @@ -16195,7 +16763,7 @@ 1 2 - 80588 + 80586 @@ -16211,7 +16779,7 @@ 1 2 - 80588 + 80586 @@ -16227,7 +16795,7 @@ 1 2 - 80588 + 80586 @@ -16248,7 +16816,7 @@ 2 3 - 10853 + 10852 3 @@ -16258,12 +16826,12 @@ 4 5 - 3493 + 3492 5 9 - 1497 + 1496 9 @@ -16294,12 +16862,12 @@ 2 3 - 3992 + 3991 3 5 - 998 + 997 5 @@ -16325,7 +16893,7 @@ 2 3 - 3992 + 3991 3 @@ -16361,7 +16929,7 @@ 3 4 - 499 + 498 4 @@ -16371,7 +16939,7 @@ 5 7 - 1497 + 1496 7 @@ -16381,7 +16949,7 @@ 24 45 - 499 + 498 @@ -16428,7 +16996,7 @@ 1 2 - 14845 + 14844 2 @@ -16604,15 +17172,15 @@ typedefbase - 1762360 + 1762169 id - 1762360 + 1762169 type_id - 838037 + 837952 @@ -16626,7 +17194,7 @@ 1 2 - 1762360 + 1762169 @@ -16642,7 +17210,7 @@ 1 2 - 662552 + 662479 2 @@ -16652,12 +17220,12 @@ 3 6 - 64177 + 64169 6 4526 - 30367 + 30363 @@ -16667,15 +17235,15 @@ decltypes - 814475 + 814486 id - 27563 + 27564 expr - 814475 + 814486 kind @@ -16757,7 +17325,7 @@ 1 2 - 27563 + 27564 @@ -16773,7 +17341,7 @@ 1 2 - 27563 + 27564 @@ -16789,7 +17357,7 @@ 1 2 - 27563 + 27564 @@ -16805,7 +17373,7 @@ 1 2 - 814475 + 814486 @@ -16821,7 +17389,7 @@ 1 2 - 814475 + 814486 @@ -16837,7 +17405,7 @@ 1 2 - 814475 + 814486 @@ -16853,7 +17421,7 @@ 1 2 - 814475 + 814486 @@ -17115,23 +17683,23 @@ type_operators - 7961 + 7949 id - 7961 + 7949 arg_type - 7186 + 7176 kind - 86 + 85 base_type - 5250 + 5242 @@ -17145,7 +17713,7 @@ 1 2 - 7961 + 7949 @@ -17161,7 +17729,7 @@ 1 2 - 7961 + 7949 @@ -17177,7 +17745,7 @@ 1 2 - 7961 + 7949 @@ -17193,12 +17761,12 @@ 1 2 - 6411 + 6402 2 3 - 774 + 773 @@ -17214,12 +17782,12 @@ 1 2 - 6411 + 6402 2 3 - 774 + 773 @@ -17235,7 +17803,7 @@ 1 2 - 7164 + 7154 2 @@ -17349,17 +17917,17 @@ 1 2 - 3636 + 3631 2 3 - 903 + 902 3 4 - 344 + 343 4 @@ -17380,12 +17948,12 @@ 1 2 - 3786 + 3781 2 3 - 989 + 988 3 @@ -17411,12 +17979,12 @@ 1 2 - 4088 + 4082 2 3 - 1140 + 1138 3 @@ -17431,15 +17999,15 @@ usertypes - 4151710 + 4151247 id - 4151710 + 4151247 name - 918534 + 918449 kind @@ -17457,7 +18025,7 @@ 1 2 - 4151710 + 4151247 @@ -17473,7 +18041,7 @@ 1 2 - 4151710 + 4151247 @@ -17489,22 +18057,22 @@ 1 2 - 654261 + 654210 2 3 - 158669 + 158649 3 8 - 70567 + 70559 8 - 32669 - 35035 + 32672 + 35031 @@ -17520,12 +18088,12 @@ 1 2 - 866789 + 866710 2 10 - 51745 + 51739 @@ -17589,13 +18157,13 @@ 10 - 92771 - 92772 + 92774 + 92775 10 - 166851 - 166852 + 166854 + 166855 10 @@ -17665,8 +18233,8 @@ 10 - 57608 - 57609 + 57611 + 57612 10 @@ -17677,11 +18245,11 @@ usertypesize - 1363817 + 1363676 id - 1363817 + 1363676 size @@ -17703,7 +18271,7 @@ 1 2 - 1363817 + 1363676 @@ -17719,7 +18287,7 @@ 1 2 - 1363817 + 1363676 @@ -17779,7 +18347,7 @@ 1839 - 99774 + 99777 52 @@ -17796,7 +18364,7 @@ 1 2 - 1204 + 1203 2 @@ -17855,8 +18423,8 @@ 10 - 114969 - 114970 + 114972 + 114973 10 @@ -17913,26 +18481,26 @@ usertype_final - 11477 + 11476 id - 11477 + 11476 usertype_uuid - 47716 + 47827 id - 47716 + 47827 uuid - 47237 + 47283 @@ -17946,7 +18514,7 @@ 1 2 - 47716 + 47827 @@ -17962,12 +18530,12 @@ 1 2 - 46758 + 46740 2 3 - 479 + 543 @@ -17977,11 +18545,11 @@ usertype_alias_kind - 1762360 + 1762169 id - 1762360 + 1762169 alias_kind @@ -17999,7 +18567,7 @@ 1 2 - 1762360 + 1762169 @@ -18018,8 +18586,8 @@ 10 - 129944 - 129945 + 129947 + 129948 10 @@ -18030,26 +18598,26 @@ nontype_template_parameters - 766287 + 766248 id - 766287 + 766248 type_template_type_constraint - 27153 + 27115 id - 13383 + 13364 constraint - 26013 + 25976 @@ -18063,22 +18631,22 @@ 1 2 - 10220 + 10205 2 3 - 903 + 902 3 5 - 1032 + 1031 5 14 - 1118 + 1117 14 @@ -18099,12 +18667,12 @@ 1 2 - 24873 + 24837 2 3 - 1140 + 1138 @@ -18114,15 +18682,15 @@ mangled_name - 7852416 + 7853951 id - 7852416 + 7853951 mangled_name - 6364268 + 6364346 is_complete @@ -18140,7 +18708,7 @@ 1 2 - 7852416 + 7853951 @@ -18156,7 +18724,7 @@ 1 2 - 7852416 + 7853951 @@ -18172,12 +18740,12 @@ 1 2 - 6036174 + 6036261 2 1120 - 328093 + 328084 @@ -18193,7 +18761,7 @@ 1 2 - 6364268 + 6364346 @@ -18212,8 +18780,8 @@ 124 - 62939 - 62940 + 62953 + 62954 124 @@ -18233,8 +18801,8 @@ 124 - 51010 - 51011 + 51012 + 51013 124 @@ -18245,59 +18813,59 @@ is_pod_class - 593760 + 593798 id - 593760 + 593798 is_standard_layout_class - 1124418 + 1124307 id - 1124418 + 1124307 is_complete - 1346294 + 1346155 id - 1346294 + 1346155 is_class_template - 232173 + 232144 id - 232173 + 232144 class_instantiation - 1126076 + 1125965 to - 1123034 + 1122924 from - 71803 + 71794 @@ -18311,7 +18879,7 @@ 1 2 - 1120901 + 1120790 2 @@ -18332,42 +18900,42 @@ 1 2 - 20501 + 20499 2 3 - 12886 + 12884 3 4 - 7108 + 7107 4 5 - 4658 + 4657 5 7 - 6073 + 6072 7 10 - 5714 + 5713 10 17 - 5904 + 5903 17 51 - 5397 + 5396 51 @@ -18382,11 +18950,11 @@ class_template_argument - 2898672 + 2898347 type_id - 1367112 + 1366971 index @@ -18394,7 +18962,7 @@ arg_type - 822099 + 822016 @@ -18408,27 +18976,27 @@ 1 2 - 579362 + 579310 2 3 - 410289 + 410247 3 4 - 251049 + 251017 4 7 - 103100 + 103087 7 113 - 23311 + 23308 @@ -18444,22 +19012,22 @@ 1 2 - 607902 + 607846 2 3 - 424294 + 424251 3 4 - 251883 + 251851 4 113 - 83031 + 83021 @@ -18504,7 +19072,7 @@ 11968 - 129429 + 129432 42 @@ -18550,7 +19118,7 @@ 10413 - 44533 + 44535 31 @@ -18567,27 +19135,27 @@ 1 2 - 513716 + 513672 2 3 - 167647 + 167626 3 5 - 75088 + 75079 5 47 - 61737 + 61729 47 - 12618 - 3908 + 12619 + 3907 @@ -18603,17 +19171,17 @@ 1 2 - 723815 + 723744 2 3 - 79915 + 79905 3 22 - 18368 + 18365 @@ -18623,11 +19191,11 @@ class_template_argument_value - 510086 + 510060 type_id - 205812 + 205802 index @@ -18635,7 +19203,7 @@ arg_value - 509949 + 509924 @@ -18649,12 +19217,12 @@ 1 2 - 155799 + 155791 2 3 - 43370 + 43368 3 @@ -18675,17 +19243,17 @@ 1 2 - 147929 + 147921 2 3 - 40474 + 40472 3 45 - 15535 + 15534 45 @@ -18818,7 +19386,7 @@ 1 2 - 509813 + 509787 2 @@ -18839,7 +19407,7 @@ 1 2 - 509949 + 509924 @@ -18849,15 +19417,15 @@ is_proxy_class_for - 48439 + 48433 id - 48439 + 48433 templ_param_id - 45767 + 45761 @@ -18871,7 +19439,7 @@ 1 2 - 48439 + 48433 @@ -18887,7 +19455,7 @@ 1 2 - 45048 + 45043 2 @@ -18902,19 +19470,19 @@ type_mentions - 5903894 + 5907630 id - 5903894 + 5907630 type_id - 276913 + 277788 location - 5847585 + 5851321 kind @@ -18932,7 +19500,7 @@ 1 2 - 5903894 + 5907630 @@ -18948,7 +19516,7 @@ 1 2 - 5903894 + 5907630 @@ -18964,7 +19532,7 @@ 1 2 - 5903894 + 5907630 @@ -18980,22 +19548,22 @@ 1 2 - 136795 + 137233 2 3 - 31203 + 31204 3 4 - 11272 + 11653 4 5 - 14921 + 14975 5 @@ -19010,12 +19578,12 @@ 12 28 - 21074 + 21075 28 8941 - 19876 + 19877 @@ -19031,22 +19599,22 @@ 1 2 - 136795 + 137233 2 3 - 31203 + 31204 3 4 - 11272 + 11653 4 5 - 14921 + 14975 5 @@ -19061,12 +19629,12 @@ 12 28 - 21074 + 21075 28 8941 - 19876 + 19877 @@ -19082,7 +19650,7 @@ 1 2 - 276913 + 277788 @@ -19098,12 +19666,12 @@ 1 2 - 5801896 + 5805631 2 4 - 45689 + 45690 @@ -19119,12 +19687,12 @@ 1 2 - 5801896 + 5805631 2 4 - 45689 + 45690 @@ -19140,7 +19708,7 @@ 1 2 - 5847585 + 5851321 @@ -19154,8 +19722,8 @@ 12 - 108414 - 108415 + 108481 + 108482 54 @@ -19170,8 +19738,8 @@ 12 - 5085 - 5086 + 5101 + 5102 54 @@ -19186,8 +19754,8 @@ 12 - 107380 - 107381 + 107447 + 107448 54 @@ -19198,26 +19766,26 @@ is_function_template - 1331336 + 1331300 id - 1331336 + 1331300 function_instantiation - 973633 + 973788 to - 973633 + 973788 from - 182645 + 182704 @@ -19231,7 +19799,7 @@ 1 2 - 973633 + 973788 @@ -19247,17 +19815,17 @@ 1 2 - 110589 + 110583 2 3 - 42791 + 42788 3 9 - 14377 + 14444 9 @@ -19277,11 +19845,11 @@ function_template_argument - 2484813 + 2484687 function_id - 1453296 + 1453222 index @@ -19289,7 +19857,7 @@ arg_type - 298004 + 297989 @@ -19303,22 +19871,22 @@ 1 2 - 783015 + 782976 2 3 - 413158 + 413137 3 4 - 171811 + 171802 4 15 - 85309 + 85305 @@ -19334,22 +19902,22 @@ 1 2 - 802162 + 802122 2 3 - 411251 + 411230 3 4 - 169631 + 169622 4 9 - 70250 + 70247 @@ -19487,32 +20055,32 @@ 1 2 - 174775 + 174766 2 3 - 26335 + 26334 3 4 - 19998 + 19997 4 6 - 22656 + 22654 6 11 - 23235 + 23234 11 76 - 23371 + 23370 79 @@ -19533,17 +20101,17 @@ 1 2 - 256814 + 256801 2 3 - 32127 + 32125 3 15 - 9062 + 9061 @@ -19553,11 +20121,11 @@ function_template_argument_value - 452781 + 452758 function_id - 196784 + 196774 index @@ -19565,7 +20133,7 @@ arg_value - 450090 + 450067 @@ -19579,17 +20147,17 @@ 1 2 - 151404 + 151396 2 3 - 42893 + 42891 3 8 - 2487 + 2486 @@ -19605,17 +20173,17 @@ 1 2 - 144488 + 144480 2 3 - 36692 + 36690 3 54 - 14854 + 14853 54 @@ -19758,7 +20326,7 @@ 1 2 - 447398 + 447375 2 @@ -19779,7 +20347,7 @@ 1 2 - 450090 + 450067 @@ -19789,26 +20357,26 @@ is_variable_template - 58632 + 58631 id - 58632 + 58631 variable_instantiation - 422779 + 423017 to - 422779 + 423017 from - 35304 + 35303 @@ -19822,7 +20390,7 @@ 1 2 - 422779 + 423017 @@ -19853,7 +20421,7 @@ 4 6 - 2994 + 2993 6 @@ -19883,19 +20451,19 @@ variable_template_argument - 768462 + 768941 variable_id - 400947 + 401186 index - 1996 + 1995 arg_type - 256112 + 256355 @@ -19909,17 +20477,17 @@ 1 2 - 156561 + 156557 2 3 - 189745 + 189989 3 4 - 36427 + 36426 4 @@ -19940,22 +20508,22 @@ 1 2 - 171407 + 171402 2 3 - 180014 + 180259 3 4 - 33682 + 33681 4 17 - 15843 + 15842 @@ -19999,13 +20567,13 @@ 124 - 1959 - 1960 + 1961 + 1962 124 - 3214 - 3215 + 3216 + 3217 124 @@ -20050,8 +20618,8 @@ 124 - 745 - 746 + 747 + 748 124 @@ -20073,12 +20641,12 @@ 1 2 - 175399 + 175519 2 3 - 44660 + 44784 3 @@ -20088,7 +20656,7 @@ 6 206 - 14471 + 14470 @@ -20104,12 +20672,12 @@ 1 2 - 227794 + 228037 2 3 - 24700 + 24699 3 @@ -20124,19 +20692,19 @@ variable_template_argument_value - 19960 + 19959 variable_id - 14845 + 14844 index - 499 + 498 arg_value - 19960 + 19959 @@ -20150,12 +20718,12 @@ 1 2 - 13348 + 13347 2 3 - 1497 + 1496 @@ -20171,12 +20739,12 @@ 1 2 - 10479 + 10478 2 3 - 3992 + 3991 4 @@ -20259,7 +20827,7 @@ 1 2 - 19960 + 19959 @@ -20275,7 +20843,7 @@ 1 2 - 19960 + 19959 @@ -20289,7 +20857,7 @@ to - 4990 + 4989 from @@ -20353,11 +20921,11 @@ template_template_argument - 9675 + 9674 type_id - 6115 + 6114 index @@ -20365,7 +20933,7 @@ arg_type - 9083 + 9082 @@ -20379,7 +20947,7 @@ 1 2 - 5017 + 5016 2 @@ -20410,7 +20978,7 @@ 1 2 - 5038 + 5037 2 @@ -20563,7 +21131,7 @@ 1 2 - 9052 + 9050 3 @@ -20584,7 +21152,7 @@ 1 2 - 9062 + 9061 2 @@ -20735,19 +21303,19 @@ concept_templates - 3614 + 3609 concept_id - 3614 + 3609 name - 3614 + 3609 location - 3614 + 3609 @@ -20761,7 +21329,7 @@ 1 2 - 3614 + 3609 @@ -20777,7 +21345,7 @@ 1 2 - 3614 + 3609 @@ -20793,7 +21361,7 @@ 1 2 - 3614 + 3609 @@ -20809,7 +21377,7 @@ 1 2 - 3614 + 3609 @@ -20825,7 +21393,7 @@ 1 2 - 3614 + 3609 @@ -20841,7 +21409,7 @@ 1 2 - 3614 + 3609 @@ -20851,15 +21419,15 @@ concept_instantiation - 90433 + 90305 to - 90433 + 90305 from - 3442 + 3437 @@ -20873,7 +21441,7 @@ 1 2 - 90433 + 90305 @@ -20904,12 +21472,12 @@ 4 5 - 129 + 128 5 6 - 301 + 300 6 @@ -20929,37 +21497,37 @@ 12 15 - 215 + 214 15 19 - 215 + 214 19 25 - 258 + 257 25 37 - 258 + 257 38 49 - 258 + 257 50 72 - 258 + 257 78 387 - 215 + 214 @@ -20969,30 +21537,30 @@ is_type_constraint - 36900 + 36848 concept_id - 36900 + 36848 concept_template_argument - 113047 + 112887 concept_id - 76383 + 76275 index - 129 + 128 arg_type - 21430 + 21399 @@ -21006,17 +21574,17 @@ 1 2 - 46475 + 46409 2 3 - 24679 + 24644 3 7 - 5228 + 5221 @@ -21032,17 +21600,17 @@ 1 2 - 50090 + 50019 2 3 - 22377 + 22345 3 7 - 3916 + 3910 @@ -21140,42 +21708,42 @@ 1 2 - 10392 + 10377 2 3 - 2969 + 2965 3 4 - 1054 + 1052 4 5 - 1355 + 1353 5 6 - 1161 + 1160 6 9 - 1613 + 1611 9 14 - 1979 + 1976 14 259 - 903 + 902 @@ -21191,17 +21759,17 @@ 1 2 - 18030 + 18005 2 3 - 3270 + 3265 3 4 - 129 + 128 @@ -21342,15 +21910,15 @@ routinetypes - 604322 + 604495 id - 604322 + 604495 return_type - 283865 + 283851 @@ -21364,7 +21932,7 @@ 1 2 - 604322 + 604495 @@ -21380,17 +21948,17 @@ 1 2 - 234226 + 234078 2 3 - 35091 + 35225 3 - 4676 - 14547 + 4677 + 14546 @@ -21400,11 +21968,11 @@ routinetypeargs - 1176651 + 1178520 routine - 415070 + 416002 index @@ -21412,7 +21980,7 @@ type_id - 111582 + 112074 @@ -21426,22 +21994,22 @@ 1 2 - 82502 + 82939 2 3 - 126013 + 126069 3 4 - 107443 + 107880 4 5 - 49283 + 49284 5 @@ -21451,7 +22019,7 @@ 7 19 - 16663 + 16664 @@ -21467,27 +22035,27 @@ 1 2 - 88492 + 88929 2 3 - 138647 + 138703 3 4 - 114196 + 114633 4 5 - 40733 + 40734 5 10 - 32891 + 32892 10 @@ -21571,18 +22139,18 @@ 54 - 3793 - 3794 + 3801 + 3802 54 - 6107 - 6108 + 6116 + 6117 54 - 7622 - 7623 + 7639 + 7640 54 @@ -21662,13 +22230,13 @@ 54 - 787 - 788 + 788 + 789 54 - 1174 - 1175 + 1182 + 1183 54 @@ -21685,17 +22253,17 @@ 1 2 - 33218 + 33273 2 3 - 15193 + 15574 3 4 - 13233 + 13287 4 @@ -21715,7 +22283,7 @@ 8 13 - 9529 + 9530 13 @@ -21724,7 +22292,7 @@ 26 - 918 + 926 6099 @@ -21741,7 +22309,7 @@ 1 2 - 78908 + 79399 2 @@ -21766,19 +22334,19 @@ ptrtomembers - 9728 + 9726 id - 9728 + 9726 type_id - 7974 + 7973 class_id - 4869 + 4868 @@ -21792,7 +22360,7 @@ 1 2 - 9728 + 9726 @@ -21808,7 +22376,7 @@ 1 2 - 9728 + 9726 @@ -21824,7 +22392,7 @@ 1 2 - 7752 + 7751 2 @@ -21845,7 +22413,7 @@ 1 2 - 7752 + 7751 2 @@ -21970,11 +22538,11 @@ typespecifiers - 854272 + 854164 type_id - 849128 + 849020 spec_id @@ -21992,7 +22560,7 @@ 1 2 - 843984 + 843877 2 @@ -22063,11 +22631,11 @@ funspecifiers - 9714441 + 9714180 func_id - 4008855 + 4008747 spec_id @@ -22085,27 +22653,27 @@ 1 2 - 1527070 + 1527029 2 3 - 506237 + 506223 3 4 - 1036925 + 1036897 4 5 - 692863 + 692845 5 8 - 245758 + 245751 @@ -22221,11 +22789,11 @@ varspecifiers - 3075347 + 3075514 var_id - 2314869 + 2315056 spec_id @@ -22243,17 +22811,17 @@ 1 2 - 1658058 + 1658263 2 3 - 553642 + 553627 3 5 - 103168 + 103165 @@ -22282,8 +22850,8 @@ 124 - 1332 - 1333 + 1334 + 1335 124 @@ -22319,15 +22887,15 @@ explicit_specifier_exprs - 41292 + 41291 func_id - 41292 + 41291 constant - 41292 + 41291 @@ -22341,7 +22909,7 @@ 1 2 - 41292 + 41291 @@ -22357,7 +22925,7 @@ 1 2 - 41292 + 41291 @@ -22367,11 +22935,11 @@ attributes - 653817 + 653799 id - 653817 + 653799 kind @@ -22387,7 +22955,7 @@ location - 647704 + 647686 @@ -22401,7 +22969,7 @@ 1 2 - 653817 + 653799 @@ -22417,7 +22985,7 @@ 1 2 - 653817 + 653799 @@ -22433,7 +23001,7 @@ 1 2 - 653817 + 653799 @@ -22449,7 +23017,7 @@ 1 2 - 653817 + 653799 @@ -22852,7 +23420,7 @@ 1 2 - 641841 + 641823 2 @@ -22873,7 +23441,7 @@ 1 2 - 647704 + 647686 @@ -22889,7 +23457,7 @@ 1 2 - 642589 + 642572 2 @@ -22910,7 +23478,7 @@ 1 2 - 647704 + 647686 @@ -22920,11 +23488,11 @@ attribute_args - 82562 + 82563 id - 82562 + 82563 kind @@ -22932,7 +23500,7 @@ attribute - 71259 + 71260 index @@ -22940,7 +23508,7 @@ location - 57184 + 57185 @@ -22954,7 +23522,7 @@ 1 2 - 82562 + 82563 @@ -22970,7 +23538,7 @@ 1 2 - 82562 + 82563 @@ -22986,7 +23554,7 @@ 1 2 - 82562 + 82563 @@ -23002,7 +23570,7 @@ 1 2 - 82562 + 82563 @@ -23122,7 +23690,7 @@ 1 2 - 65790 + 65791 2 @@ -23148,7 +23716,7 @@ 1 2 - 69743 + 69744 2 @@ -23169,7 +23737,7 @@ 1 2 - 68215 + 68216 2 @@ -23190,7 +23758,7 @@ 1 2 - 68747 + 68748 2 @@ -23375,7 +23943,7 @@ 1 2 - 41506 + 41507 2 @@ -23448,7 +24016,7 @@ 1 2 - 56935 + 56936 2 @@ -23619,15 +24187,15 @@ attribute_arg_constant - 71856 + 71889 arg - 71856 + 71889 constant - 71856 + 71889 @@ -23641,7 +24209,7 @@ 1 2 - 71856 + 71889 @@ -23657,7 +24225,7 @@ 1 2 - 71856 + 71889 @@ -23768,15 +24336,15 @@ typeattributes - 96307 + 96304 type_id - 94560 + 94558 spec_id - 32435 + 32434 @@ -23790,7 +24358,7 @@ 1 2 - 92814 + 92811 2 @@ -23811,17 +24379,17 @@ 1 2 - 27944 + 27943 2 9 - 2495 + 2494 11 58 - 1996 + 1995 @@ -23831,15 +24399,15 @@ funcattributes - 843562 + 843539 func_id - 799026 + 799005 spec_id - 616766 + 616749 @@ -23853,12 +24421,12 @@ 1 2 - 758981 + 758961 2 7 - 40044 + 40043 @@ -23874,12 +24442,12 @@ 1 2 - 571731 + 571715 2 213 - 45034 + 45033 @@ -23952,7 +24520,7 @@ namespaceattributes - 5996 + 5995 namespace_id @@ -23960,7 +24528,7 @@ spec_id - 5996 + 5995 @@ -24000,7 +24568,7 @@ 1 2 - 5996 + 5995 @@ -24010,15 +24578,15 @@ stmtattributes - 2216 + 2213 stmt_id - 2216 + 2213 spec_id - 559 + 558 @@ -24032,7 +24600,7 @@ 1 2 - 2216 + 2213 @@ -24048,7 +24616,7 @@ 1 2 - 215 + 214 2 @@ -24058,7 +24626,7 @@ 3 4 - 43 + 42 9 @@ -24068,7 +24636,7 @@ 13 16 - 43 + 42 @@ -24078,15 +24646,15 @@ unspecifiedtype - 7172900 + 7174204 type_id - 7172900 + 7174204 unspecified_type_id - 3962323 + 3962840 @@ -24100,7 +24668,7 @@ 1 2 - 7172900 + 7174204 @@ -24116,22 +24684,22 @@ 1 2 - 2480537 + 2481094 2 3 - 1116765 + 1116611 3 7 - 302644 + 302636 7 537 - 62375 + 62498 @@ -24141,19 +24709,19 @@ member - 4189618 + 4189506 parent - 543288 + 543273 index - 29690 + 29689 child - 4185003 + 4184890 @@ -24167,52 +24735,52 @@ 1 2 - 128991 + 128988 2 3 - 83333 + 83331 3 4 - 32435 + 32434 4 5 - 44910 + 44908 5 6 - 42415 + 42414 6 7 - 33932 + 33931 7 9 - 42290 + 42289 9 13 - 41167 + 41166 13 18 - 41292 + 41291 18 42 - 40793 + 40792 42 @@ -24233,57 +24801,57 @@ 1 2 - 128742 + 128738 2 3 - 83458 + 83455 3 4 - 32185 + 32184 4 5 - 45034 + 45033 5 6 - 42539 + 42538 6 7 - 32809 + 32808 7 9 - 42664 + 42663 9 13 - 41541 + 41540 13 18 - 41417 + 41416 18 42 - 40918 + 40917 42 265 - 11976 + 11975 @@ -24299,7 +24867,7 @@ 1 2 - 6487 + 6486 2 @@ -24329,7 +24897,7 @@ 26 36 - 2495 + 2494 36 @@ -24365,7 +24933,7 @@ 1 2 - 5489 + 5488 2 @@ -24431,7 +24999,7 @@ 1 2 - 4185003 + 4184890 @@ -24447,7 +25015,7 @@ 1 2 - 4180387 + 4180274 2 @@ -24462,15 +25030,15 @@ enclosingfunction - 114813 + 114807 child - 114813 + 114807 parent - 71341 + 71337 @@ -24484,7 +25052,7 @@ 1 2 - 114813 + 114807 @@ -24500,7 +25068,7 @@ 1 2 - 49332 + 49329 2 @@ -24510,12 +25078,12 @@ 3 4 - 15365 + 15364 4 37 - 2010 + 2009 @@ -24525,15 +25093,15 @@ derivations - 476902 + 476878 derivation - 476902 + 476878 sub - 455166 + 455143 index @@ -24541,11 +25109,11 @@ super - 235555 + 235543 location - 35398 + 35396 @@ -24559,7 +25127,7 @@ 1 2 - 476902 + 476878 @@ -24575,7 +25143,7 @@ 1 2 - 476902 + 476878 @@ -24591,7 +25159,7 @@ 1 2 - 476902 + 476878 @@ -24607,7 +25175,7 @@ 1 2 - 476902 + 476878 @@ -24623,12 +25191,12 @@ 1 2 - 438642 + 438620 2 9 - 16523 + 16522 @@ -24644,12 +25212,12 @@ 1 2 - 438642 + 438620 2 8 - 16523 + 16522 @@ -24665,12 +25233,12 @@ 1 2 - 438642 + 438620 2 9 - 16523 + 16522 @@ -24686,12 +25254,12 @@ 1 2 - 438642 + 438620 2 8 - 16523 + 16522 @@ -24846,7 +25414,7 @@ 1 2 - 225743 + 225732 2 @@ -24867,7 +25435,7 @@ 1 2 - 225743 + 225732 2 @@ -24888,7 +25456,7 @@ 1 2 - 235112 + 235100 2 @@ -24909,7 +25477,7 @@ 1 2 - 230206 + 230194 2 @@ -24930,7 +25498,7 @@ 1 2 - 26505 + 26504 2 @@ -24966,7 +25534,7 @@ 1 2 - 26505 + 26504 2 @@ -25002,7 +25570,7 @@ 1 2 - 35398 + 35396 @@ -25018,7 +25586,7 @@ 1 2 - 28720 + 28718 2 @@ -25043,11 +25611,11 @@ derspecifiers - 478674 + 478649 der_id - 476459 + 476435 spec_id @@ -25065,7 +25633,7 @@ 1 2 - 474245 + 474221 2 @@ -25111,11 +25679,11 @@ direct_base_offsets - 449987 + 449965 der_id - 449987 + 449965 offset @@ -25133,7 +25701,7 @@ 1 2 - 449987 + 449965 @@ -25330,19 +25898,19 @@ frienddecls - 700465 + 700430 id - 700465 + 700430 type_id - 42416 + 42414 decl_id - 77848 + 77742 location @@ -25360,7 +25928,7 @@ 1 2 - 700465 + 700430 @@ -25376,7 +25944,7 @@ 1 2 - 700465 + 700430 @@ -25392,7 +25960,7 @@ 1 2 - 700465 + 700430 @@ -25413,7 +25981,7 @@ 2 3 - 13968 + 13967 3 @@ -25423,7 +25991,7 @@ 7 12 - 3441 + 3440 12 @@ -25469,7 +26037,7 @@ 2 3 - 13968 + 13967 3 @@ -25479,7 +26047,7 @@ 7 12 - 3441 + 3440 12 @@ -25520,7 +26088,7 @@ 1 2 - 41053 + 41051 2 @@ -25541,17 +26109,17 @@ 1 2 - 48071 + 47864 2 3 - 5962 + 6064 3 8 - 5996 + 5995 8 @@ -25582,17 +26150,17 @@ 1 2 - 48071 + 47864 2 3 - 5962 + 6064 3 8 - 5996 + 5995 8 @@ -25623,7 +26191,7 @@ 1 2 - 77167 + 77060 2 @@ -25665,7 +26233,7 @@ 1 2 - 5962 + 5961 2 @@ -25690,7 +26258,7 @@ 2 - 2132 + 2129 340 @@ -25701,19 +26269,19 @@ comments - 11233402 + 11233100 id - 11233402 + 11233100 contents - 4303640 + 4303524 location - 11233402 + 11233100 @@ -25727,7 +26295,7 @@ 1 2 - 11233402 + 11233100 @@ -25743,7 +26311,7 @@ 1 2 - 11233402 + 11233100 @@ -25759,17 +26327,17 @@ 1 2 - 3928890 + 3928784 2 6 - 322978 + 322970 6 34447 - 51771 + 51770 @@ -25785,17 +26353,17 @@ 1 2 - 3928890 + 3928784 2 6 - 322978 + 322970 6 34447 - 51771 + 51770 @@ -25811,7 +26379,7 @@ 1 2 - 11233402 + 11233100 @@ -25827,7 +26395,7 @@ 1 2 - 11233402 + 11233100 @@ -25837,15 +26405,15 @@ commentbinding - 3914793 + 3914688 id - 3350796 + 3350706 element - 3749249 + 3749148 @@ -25859,12 +26427,12 @@ 1 2 - 3289170 + 3289081 2 1706 - 61626 + 61625 @@ -25880,12 +26448,12 @@ 1 2 - 3583705 + 3583609 2 3 - 165543 + 165539 @@ -25895,15 +26463,15 @@ exprconv - 9633084 + 9633168 converted - 9632979 + 9633062 conversion - 9633084 + 9633168 @@ -25917,7 +26485,7 @@ 1 2 - 9632873 + 9632957 2 @@ -25938,7 +26506,7 @@ 1 2 - 9633084 + 9633168 @@ -25948,30 +26516,30 @@ compgenerated - 9892394 + 9895967 id - 9892394 + 9895967 synthetic_destructor_call - 1671701 + 1669328 element - 1244965 + 1243197 i - 387 + 386 destructor_call - 1671701 + 1669328 @@ -25985,17 +26553,17 @@ 1 2 - 828685 + 827509 2 3 - 409480 + 408898 3 19 - 6799 + 6789 @@ -26011,17 +26579,17 @@ 1 2 - 828685 + 827509 2 3 - 409480 + 408898 3 19 - 6799 + 6789 @@ -26037,17 +26605,17 @@ 1 2 - 43 + 42 2 3 - 86 + 85 3 4 - 86 + 85 13 @@ -26103,17 +26671,17 @@ 1 2 - 43 + 42 2 3 - 86 + 85 3 4 - 86 + 85 13 @@ -26169,7 +26737,7 @@ 1 2 - 1671701 + 1669328 @@ -26185,7 +26753,7 @@ 1 2 - 1671701 + 1669328 @@ -26195,15 +26763,15 @@ namespaces - 8650 + 8649 id - 8650 + 8649 name - 4573 + 4572 @@ -26217,7 +26785,7 @@ 1 2 - 8650 + 8649 @@ -26233,7 +26801,7 @@ 1 2 - 3739 + 3738 2 @@ -26253,26 +26821,26 @@ namespace_inline - 499 + 498 id - 499 + 498 namespacembrs - 2037673 + 2038492 parentid - 3992 + 3991 memberid - 2037673 + 2038492 @@ -26286,7 +26854,7 @@ 1 2 - 499 + 498 2 @@ -26296,7 +26864,7 @@ 3 4 - 499 + 498 4 @@ -26344,8 +26912,8 @@ 249 - 15606 - 15607 + 15613 + 15614 124 @@ -26362,7 +26930,7 @@ 1 2 - 2037673 + 2038492 @@ -26372,11 +26940,11 @@ exprparents - 19454210 + 19454457 expr_id - 19454210 + 19454457 child_index @@ -26384,7 +26952,7 @@ parent_id - 12939983 + 12940148 @@ -26398,7 +26966,7 @@ 1 2 - 19454210 + 19454457 @@ -26414,7 +26982,7 @@ 1 2 - 19454210 + 19454457 @@ -26532,17 +27100,17 @@ 1 2 - 7394754 + 7394848 2 3 - 5082678 + 5082743 3 712 - 462550 + 462556 @@ -26558,17 +27126,17 @@ 1 2 - 7394754 + 7394848 2 3 - 5082678 + 5082743 3 712 - 462550 + 462556 @@ -26578,11 +27146,11 @@ expr_isload - 6909332 + 6899311 expr_id - 6909332 + 6899311 @@ -26667,11 +27235,11 @@ iscall - 5802824 + 5800192 caller - 5802824 + 5800192 kind @@ -26689,7 +27257,7 @@ 1 2 - 5802824 + 5800192 @@ -26713,8 +27281,8 @@ 21 - 268054 - 268055 + 268315 + 268316 21 @@ -26725,11 +27293,11 @@ numtemplatearguments - 627369 + 627727 expr_id - 627369 + 627727 num @@ -26747,7 +27315,7 @@ 1 2 - 627369 + 627727 @@ -26766,8 +27334,8 @@ 124 - 1263 - 1264 + 1266 + 1267 124 @@ -26831,23 +27399,23 @@ namequalifiers - 3041979 + 3037638 id - 3041979 + 3037638 qualifiableelement - 3041979 + 3037638 qualifyingelement - 47486 + 47419 location - 552457 + 551672 @@ -26861,7 +27429,7 @@ 1 2 - 3041979 + 3037638 @@ -26877,7 +27445,7 @@ 1 2 - 3041979 + 3037638 @@ -26893,7 +27461,7 @@ 1 2 - 3041979 + 3037638 @@ -26909,7 +27477,7 @@ 1 2 - 3041979 + 3037638 @@ -26925,7 +27493,7 @@ 1 2 - 3041979 + 3037638 @@ -26941,7 +27509,7 @@ 1 2 - 3041979 + 3037638 @@ -26957,27 +27525,27 @@ 1 2 - 31543 + 31498 2 3 - 8176 + 8164 3 5 - 4109 + 4103 5 - 6811 - 3571 + 6810 + 3566 19018 41956 - 86 + 85 @@ -26993,27 +27561,27 @@ 1 2 - 31543 + 31498 2 3 - 8176 + 8164 3 5 - 4109 + 4103 5 - 6811 - 3571 + 6810 + 3566 19018 41956 - 86 + 85 @@ -27029,22 +27597,22 @@ 1 2 - 34404 + 34356 2 3 - 7358 + 7348 3 6 - 3571 + 3566 6 20057 - 2151 + 2148 @@ -27060,22 +27628,22 @@ 1 2 - 79137 + 79046 2 6 - 38105 + 38030 6 7 - 399001 + 398435 7 192 - 36212 + 36160 @@ -27091,22 +27659,22 @@ 1 2 - 79137 + 79046 2 6 - 38105 + 38030 6 7 - 399001 + 398435 7 192 - 36212 + 36160 @@ -27122,22 +27690,22 @@ 1 2 - 111541 + 111383 2 4 - 13297 + 13278 4 5 - 415311 + 414721 5 33 - 12307 + 12289 @@ -27147,15 +27715,15 @@ varbind - 8254629 + 8254733 expr - 8254629 + 8254733 var - 1050375 + 1050389 @@ -27169,7 +27737,7 @@ 1 2 - 8254629 + 8254733 @@ -27185,52 +27753,52 @@ 1 2 - 171535 + 171538 2 3 - 188700 + 188703 3 4 - 145647 + 145649 4 5 - 116636 + 116637 5 6 - 83150 + 83152 6 7 - 65817 + 65818 7 9 - 80815 + 80816 9 13 - 81575 + 81576 13 27 - 79127 + 79128 27 5137 - 37368 + 37369 @@ -27240,15 +27808,15 @@ funbind - 5812528 + 5809904 expr - 5810054 + 5807433 fun - 275948 + 275686 @@ -27262,12 +27830,12 @@ 1 2 - 5807579 + 5804962 2 3 - 2474 + 2470 @@ -27283,27 +27851,27 @@ 1 2 - 181448 + 181298 2 3 - 38837 + 38782 3 4 - 17191 + 17167 4 8 - 22742 + 22710 8 37798 - 15728 + 15727 @@ -27313,11 +27881,11 @@ expr_allocator - 45244 + 45241 expr - 45244 + 45241 func @@ -27339,7 +27907,7 @@ 1 2 - 45244 + 45241 @@ -27355,7 +27923,7 @@ 1 2 - 45244 + 45241 @@ -27439,11 +28007,11 @@ expr_deallocator - 53829 + 53826 expr - 53829 + 53826 func @@ -27465,7 +28033,7 @@ 1 2 - 53829 + 53826 @@ -27481,7 +28049,7 @@ 1 2 - 53829 + 53826 @@ -27586,15 +28154,15 @@ expr_cond_guard - 897879 + 897887 cond - 897879 + 897887 guard - 897879 + 897887 @@ -27608,7 +28176,7 @@ 1 2 - 897879 + 897887 @@ -27624,7 +28192,7 @@ 1 2 - 897879 + 897887 @@ -27634,15 +28202,15 @@ expr_cond_true - 897876 + 897883 cond - 897876 + 897883 true - 897876 + 897883 @@ -27656,7 +28224,7 @@ 1 2 - 897876 + 897883 @@ -27672,7 +28240,7 @@ 1 2 - 897876 + 897883 @@ -27682,15 +28250,15 @@ expr_cond_false - 897879 + 897887 cond - 897879 + 897887 false - 897879 + 897887 @@ -27704,7 +28272,7 @@ 1 2 - 897879 + 897887 @@ -27720,7 +28288,7 @@ 1 2 - 897879 + 897887 @@ -27730,15 +28298,15 @@ values - 13474601 + 13474772 id - 13474601 + 13474772 str - 114566 + 114567 @@ -27752,7 +28320,7 @@ 1 2 - 13474601 + 13474772 @@ -27768,7 +28336,7 @@ 1 2 - 78302 + 78303 2 @@ -27783,7 +28351,7 @@ 6 52 - 8628 + 8629 52 @@ -27798,11 +28366,11 @@ valuetext - 6647456 + 6647555 id - 6647456 + 6647555 text @@ -27820,7 +28388,7 @@ 1 2 - 6647456 + 6647555 @@ -27861,15 +28429,15 @@ valuebind - 13583183 + 13583356 val - 13474601 + 13474772 expr - 13583183 + 13583356 @@ -27883,12 +28451,12 @@ 1 2 - 13384046 + 13384216 2 6 - 90554 + 90555 @@ -27904,7 +28472,7 @@ 1 2 - 13583183 + 13583356 @@ -27914,11 +28482,11 @@ fieldoffsets - 1497674 + 1499494 id - 1497674 + 1499494 byteoffset @@ -27940,7 +28508,7 @@ 1 2 - 1497674 + 1499494 @@ -27956,7 +28524,7 @@ 1 2 - 1497674 + 1499494 @@ -28001,7 +28569,7 @@ 250 - 5950 + 5966 1089 @@ -28018,7 +28586,7 @@ 1 2 - 30386 + 30387 2 @@ -28072,8 +28640,8 @@ 54 - 27146 - 27147 + 27179 + 27180 54 @@ -28115,19 +28683,19 @@ bitfield - 30314 + 30313 id - 30314 + 30313 bits - 3493 + 3492 declared_bits - 3493 + 3492 @@ -28141,7 +28709,7 @@ 1 2 - 30314 + 30313 @@ -28157,7 +28725,7 @@ 1 2 - 30314 + 30313 @@ -28173,7 +28741,7 @@ 1 2 - 998 + 997 2 @@ -28188,7 +28756,7 @@ 4 5 - 499 + 498 5 @@ -28224,7 +28792,7 @@ 1 2 - 3493 + 3492 @@ -28240,7 +28808,7 @@ 1 2 - 998 + 997 2 @@ -28255,7 +28823,7 @@ 4 5 - 499 + 498 5 @@ -28291,7 +28859,7 @@ 1 2 - 3493 + 3492 @@ -28301,23 +28869,23 @@ initialisers - 2251321 + 2247637 init - 2251321 + 2247637 var - 981178 + 979696 expr - 2251321 + 2247637 location - 516961 + 516295 @@ -28331,7 +28899,7 @@ 1 2 - 2251321 + 2247637 @@ -28347,7 +28915,7 @@ 1 2 - 2251321 + 2247637 @@ -28363,7 +28931,7 @@ 1 2 - 2251321 + 2247637 @@ -28379,17 +28947,17 @@ 1 2 - 870758 + 869453 2 15 - 37448 + 37398 16 25 - 72972 + 72843 @@ -28405,17 +28973,17 @@ 1 2 - 870758 + 869453 2 15 - 37448 + 37398 16 25 - 72972 + 72843 @@ -28431,7 +28999,7 @@ 1 2 - 981170 + 979688 2 @@ -28452,7 +29020,7 @@ 1 2 - 2251321 + 2247637 @@ -28468,7 +29036,7 @@ 1 2 - 2251321 + 2247637 @@ -28484,7 +29052,7 @@ 1 2 - 2251321 + 2247637 @@ -28500,22 +29068,22 @@ 1 2 - 415111 + 414608 2 3 - 33614 + 33555 3 13 - 42070 + 42013 13 111925 - 26165 + 26119 @@ -28531,17 +29099,17 @@ 1 2 - 444412 + 443873 2 3 - 34524 + 34463 3 12238 - 38025 + 37958 @@ -28557,22 +29125,22 @@ 1 2 - 415111 + 414608 2 3 - 33614 + 33555 3 13 - 42070 + 42013 13 111925 - 26165 + 26119 @@ -28582,26 +29150,26 @@ braced_initialisers - 68438 + 68305 init - 68438 + 68305 expr_ancestor - 1677683 + 1675301 exp - 1677683 + 1675301 ancestor - 839659 + 838467 @@ -28615,7 +29183,7 @@ 1 2 - 1677683 + 1675301 @@ -28631,17 +29199,17 @@ 1 2 - 17084 + 17059 2 3 - 812505 + 811351 3 19 - 10069 + 10055 @@ -28651,11 +29219,11 @@ exprs - 25210567 + 25210887 id - 25210567 + 25210887 kind @@ -28663,7 +29231,7 @@ location - 10585854 + 10585988 @@ -28677,7 +29245,7 @@ 1 2 - 25210567 + 25210887 @@ -28693,7 +29261,7 @@ 1 2 - 25210567 + 25210887 @@ -28871,22 +29439,22 @@ 1 2 - 8903885 + 8903998 2 3 - 820608 + 820618 3 16 - 797198 + 797208 16 71733 - 64161 + 64162 @@ -28902,17 +29470,17 @@ 1 2 - 9043287 + 9043402 2 3 - 774272 + 774282 3 32 - 768294 + 768303 @@ -28922,19 +29490,19 @@ expr_reuse - 847039 + 845836 reuse - 847039 + 845836 original - 847039 + 845836 value_category - 43 + 42 @@ -28948,7 +29516,7 @@ 1 2 - 847039 + 845836 @@ -28964,7 +29532,7 @@ 1 2 - 847039 + 845836 @@ -28980,7 +29548,7 @@ 1 2 - 847039 + 845836 @@ -28996,7 +29564,7 @@ 1 2 - 847039 + 845836 @@ -29048,15 +29616,15 @@ expr_types - 25210567 + 25210887 id - 25210567 + 25210887 typeid - 214202 + 214205 value_category @@ -29074,7 +29642,7 @@ 1 2 - 25210567 + 25210887 @@ -29090,7 +29658,7 @@ 1 2 - 25210567 + 25210887 @@ -29131,7 +29699,7 @@ 8 14 - 17386 + 17387 14 @@ -29141,17 +29709,17 @@ 24 49 - 16067 + 16068 49 134 - 16177 + 16178 134 441505 - 13825 + 13826 @@ -29167,7 +29735,7 @@ 1 2 - 185913 + 185915 2 @@ -29235,15 +29803,15 @@ new_allocated_type - 46198 + 46195 expr - 46198 + 46195 type_id - 27391 + 27390 @@ -29257,7 +29825,7 @@ 1 2 - 46198 + 46195 @@ -29273,12 +29841,12 @@ 1 2 - 11515 + 11514 2 3 - 14479 + 14478 3 @@ -29293,15 +29861,15 @@ new_array_allocated_type - 6653 + 6641 expr - 6653 + 6641 type_id - 2843 + 2838 @@ -29315,7 +29883,7 @@ 1 2 - 6653 + 6641 @@ -29336,17 +29904,17 @@ 2 3 - 2510 + 2505 3 5 - 219 + 218 6 15 - 73 + 72 @@ -29356,19 +29924,19 @@ aggregate_field_init - 5717380 + 5717381 aggregate - 1243068 + 1243069 initializer - 5717202 + 5717203 field - 3227 + 3228 position @@ -29390,7 +29958,7 @@ 1 2 - 19690 + 19691 2 @@ -29441,7 +30009,7 @@ 1 2 - 19686 + 19687 2 @@ -29492,7 +30060,7 @@ 1 2 - 19690 + 19691 2 @@ -29543,7 +30111,7 @@ 1 2 - 1242986 + 1242987 2 @@ -29564,7 +30132,7 @@ 1 2 - 5717202 + 5717203 @@ -29580,7 +30148,7 @@ 1 2 - 5717024 + 5717025 2 @@ -29601,7 +30169,7 @@ 1 2 - 5717202 + 5717203 @@ -29617,7 +30185,7 @@ 1 2 - 5717202 + 5717203 @@ -29633,7 +30201,7 @@ 1 2 - 1433 + 1434 2 @@ -29689,7 +30257,7 @@ 1 2 - 1433 + 1434 2 @@ -29745,7 +30313,7 @@ 1 2 - 3213 + 3214 2 @@ -29766,7 +30334,7 @@ 1 2 - 3201 + 3202 2 @@ -29840,8 +30408,8 @@ 2 - 1243068 - 1243069 + 1243069 + 1243070 1 @@ -29911,8 +30479,8 @@ 2 - 1243068 - 1243069 + 1243069 + 1243070 1 @@ -29982,8 +30550,8 @@ 2 - 1283 - 1284 + 1284 + 1285 1 @@ -30024,8 +30592,8 @@ 1 - 1242670 - 1242671 + 1242671 + 1242672 1 @@ -30045,8 +30613,8 @@ 1 - 5716492 - 5716493 + 5716493 + 5716494 1 @@ -30066,8 +30634,8 @@ 1 - 3035 - 3036 + 3036 + 3037 1 @@ -30099,15 +30667,15 @@ aggregate_array_init - 1349246 + 1349502 aggregate - 152356 + 152357 initializer - 1349246 + 1349502 element_index @@ -30168,7 +30736,7 @@ 58 62923 - 1762 + 1763 @@ -30219,7 +30787,7 @@ 58 62923 - 1762 + 1763 @@ -30270,7 +30838,7 @@ 58 62923 - 1762 + 1763 @@ -30286,7 +30854,7 @@ 1 2 - 152356 + 152357 @@ -30302,7 +30870,7 @@ 1 2 - 1349246 + 1349502 @@ -30318,7 +30886,7 @@ 1 2 - 1349246 + 1349502 @@ -30334,7 +30902,7 @@ 1 2 - 1349246 + 1349502 @@ -30350,7 +30918,7 @@ 1 2 - 1349246 + 1349502 @@ -30390,7 +30958,7 @@ 37 - 152356 + 152357 2151 @@ -30431,7 +30999,7 @@ 37 - 152356 + 152357 2151 @@ -30514,7 +31082,7 @@ 37 - 152357 + 152358 2151 @@ -30555,7 +31123,7 @@ 37 - 152357 + 152358 2151 @@ -30617,8 +31185,8 @@ 1 - 152353 - 152354 + 152354 + 152355 1 @@ -30638,8 +31206,8 @@ 1 - 1349230 - 1349231 + 1349486 + 1349487 1 @@ -30692,15 +31260,15 @@ condition_decl_bind - 408920 + 408340 expr - 408920 + 408340 decl - 408920 + 408340 @@ -30714,7 +31282,7 @@ 1 2 - 408920 + 408340 @@ -30730,7 +31298,7 @@ 1 2 - 408920 + 408340 @@ -30740,15 +31308,15 @@ typeid_bind - 47901 + 47899 expr - 47901 + 47899 type_id - 15944 + 15943 @@ -30762,7 +31330,7 @@ 1 2 - 47901 + 47899 @@ -30778,12 +31346,12 @@ 1 2 - 2964 + 2963 2 3 - 12571 + 12570 3 @@ -30798,15 +31366,15 @@ uuidof_bind - 26677 + 26695 expr - 26677 + 26695 type_id - 26425 + 26443 @@ -30820,7 +31388,7 @@ 1 2 - 26677 + 26695 @@ -30836,12 +31404,12 @@ 1 2 - 26214 + 26232 2 4 - 211 + 210 @@ -30851,11 +31419,11 @@ sizeof_bind - 242026 + 242030 expr - 242026 + 242030 type_id @@ -30873,7 +31441,7 @@ 1 2 - 242026 + 242030 @@ -30982,11 +31550,11 @@ lambdas - 19057 + 19023 expr - 19057 + 19023 default_capture @@ -31012,7 +31580,7 @@ 1 2 - 19057 + 19023 @@ -31028,7 +31596,7 @@ 1 2 - 19057 + 19023 @@ -31044,7 +31612,7 @@ 1 2 - 19057 + 19023 @@ -31228,23 +31796,23 @@ lambda_capture - 31965 + 31909 id - 31965 + 31909 lambda - 15491 + 15463 index - 138 + 137 field - 31965 + 31909 captured_by_reference @@ -31256,7 +31824,7 @@ location - 17944 + 17912 @@ -31270,7 +31838,7 @@ 1 2 - 31965 + 31909 @@ -31286,7 +31854,7 @@ 1 2 - 31965 + 31909 @@ -31302,7 +31870,7 @@ 1 2 - 31965 + 31909 @@ -31318,7 +31886,7 @@ 1 2 - 31965 + 31909 @@ -31334,7 +31902,7 @@ 1 2 - 31965 + 31909 @@ -31350,7 +31918,7 @@ 1 2 - 31965 + 31909 @@ -31366,27 +31934,27 @@ 1 2 - 8212 + 8198 2 3 - 3541 + 3535 3 4 - 1657 + 1654 4 6 - 1259 + 1256 6 18 - 820 + 819 @@ -31402,27 +31970,27 @@ 1 2 - 8212 + 8198 2 3 - 3541 + 3535 3 4 - 1657 + 1654 4 6 - 1259 + 1256 6 18 - 820 + 819 @@ -31438,27 +32006,27 @@ 1 2 - 8212 + 8198 2 3 - 3541 + 3535 3 4 - 1657 + 1654 4 6 - 1259 + 1256 6 18 - 820 + 819 @@ -31474,12 +32042,12 @@ 1 2 - 14248 + 14223 2 3 - 1242 + 1240 @@ -31495,7 +32063,7 @@ 1 2 - 15369 + 15342 2 @@ -31516,22 +32084,22 @@ 1 2 - 8805 + 8790 2 3 - 3696 + 3689 3 4 - 1389 + 1386 4 7 - 1291 + 1289 7 @@ -31978,7 +32546,7 @@ 1 2 - 31965 + 31909 @@ -31994,7 +32562,7 @@ 1 2 - 31965 + 31909 @@ -32010,7 +32578,7 @@ 1 2 - 31965 + 31909 @@ -32026,7 +32594,7 @@ 1 2 - 31965 + 31909 @@ -32042,7 +32610,7 @@ 1 2 - 31965 + 31909 @@ -32058,7 +32626,7 @@ 1 2 - 31965 + 31909 @@ -32316,17 +32884,17 @@ 1 2 - 15694 + 15666 2 6 - 1437 + 1435 6 68 - 812 + 810 @@ -32342,17 +32910,17 @@ 1 2 - 16271 + 16242 2 13 - 1470 + 1467 13 68 - 203 + 202 @@ -32368,12 +32936,12 @@ 1 2 - 17253 + 17223 2 8 - 690 + 689 @@ -32389,17 +32957,17 @@ 1 2 - 15694 + 15666 2 6 - 1437 + 1435 6 68 - 812 + 810 @@ -32415,7 +32983,7 @@ 1 2 - 17920 + 17888 2 @@ -32436,7 +33004,7 @@ 1 2 - 17944 + 17912 @@ -32446,15 +33014,15 @@ fold - 1247 + 1246 expr - 1247 + 1246 operator - 86 + 85 is_left_fold @@ -32472,7 +33040,7 @@ 1 2 - 1247 + 1246 @@ -32488,7 +33056,7 @@ 1 2 - 1247 + 1246 @@ -32504,7 +33072,7 @@ 1 2 - 43 + 42 2 @@ -32530,7 +33098,7 @@ 1 2 - 86 + 85 @@ -32572,11 +33140,11 @@ stmts - 6368836 + 6358201 id - 6368836 + 6358201 kind @@ -32584,7 +33152,7 @@ location - 2684483 + 2679769 @@ -32598,7 +33166,7 @@ 1 2 - 6368836 + 6358201 @@ -32614,7 +33182,7 @@ 1 2 - 6368836 + 6358201 @@ -32713,13 +33281,13 @@ 8 - 119871 - 119872 + 119906 + 119907 8 - 200105 - 200106 + 200140 + 200141 8 @@ -32824,13 +33392,13 @@ 8 - 49039 - 49040 + 49040 + 49041 8 - 86405 - 86406 + 86406 + 86407 8 @@ -32852,22 +33420,22 @@ 1 2 - 2224993 + 2221080 2 3 - 182231 + 181910 3 10 - 202173 + 201818 10 1789 - 75084 + 74960 @@ -32883,12 +33451,12 @@ 1 2 - 2601527 + 2596951 2 10 - 82955 + 82817 @@ -32898,15 +33466,15 @@ type_vla - 1 + 3 type_id - 1 + 3 decl - 1 + 3 @@ -32920,7 +33488,7 @@ 1 2 - 1 + 3 @@ -32936,7 +33504,7 @@ 1 2 - 1 + 3 @@ -33053,15 +33621,15 @@ if_then - 990214 + 990227 if_stmt - 990214 + 990227 then_id - 990214 + 990227 @@ -33075,7 +33643,7 @@ 1 2 - 990214 + 990227 @@ -33091,7 +33659,7 @@ 1 2 - 990214 + 990227 @@ -33101,15 +33669,15 @@ if_else - 437107 + 436486 if_stmt - 437107 + 436486 else_id - 437107 + 436486 @@ -33123,7 +33691,7 @@ 1 2 - 437107 + 436486 @@ -33139,7 +33707,7 @@ 1 2 - 437107 + 436486 @@ -33197,15 +33765,15 @@ constexpr_if_then - 106037 + 106035 constexpr_if_stmt - 106037 + 106035 then_id - 106037 + 106035 @@ -33219,7 +33787,7 @@ 1 2 - 106037 + 106035 @@ -33235,7 +33803,7 @@ 1 2 - 106037 + 106035 @@ -33245,15 +33813,15 @@ constexpr_if_else - 76097 + 76095 constexpr_if_stmt - 76097 + 76095 else_id - 76097 + 76095 @@ -33267,7 +33835,7 @@ 1 2 - 76097 + 76095 @@ -33283,7 +33851,7 @@ 1 2 - 76097 + 76095 @@ -33389,15 +33957,15 @@ while_body - 39647 + 39648 while_stmt - 39647 + 39648 body_id - 39647 + 39648 @@ -33411,7 +33979,7 @@ 1 2 - 39647 + 39648 @@ -33427,7 +33995,7 @@ 1 2 - 39647 + 39648 @@ -33437,15 +34005,15 @@ do_body - 233641 + 233644 do_stmt - 233641 + 233644 body_id - 233641 + 233644 @@ -33459,7 +34027,7 @@ 1 2 - 233641 + 233644 @@ -33475,7 +34043,7 @@ 1 2 - 233641 + 233644 @@ -33533,19 +34101,19 @@ switch_case - 836152 + 834964 switch_stmt - 411868 + 411283 index - 387 + 386 case_id - 836152 + 834964 @@ -33564,12 +34132,12 @@ 2 3 - 408985 + 408404 3 19 - 2861 + 2857 @@ -33590,12 +34158,12 @@ 2 3 - 408985 + 408404 3 19 - 2861 + 2857 @@ -33753,7 +34321,7 @@ 1 2 - 836152 + 834964 @@ -33769,7 +34337,7 @@ 1 2 - 836152 + 834964 @@ -33779,15 +34347,15 @@ switch_body - 411868 + 411283 switch_stmt - 411868 + 411283 body_id - 411868 + 411283 @@ -33801,7 +34369,7 @@ 1 2 - 411868 + 411283 @@ -33817,7 +34385,7 @@ 1 2 - 411868 + 411283 @@ -33875,15 +34443,15 @@ for_condition - 76341 + 76342 for_stmt - 76341 + 76342 condition_id - 76341 + 76342 @@ -33897,7 +34465,7 @@ 1 2 - 76341 + 76342 @@ -33913,7 +34481,7 @@ 1 2 - 76341 + 76342 @@ -33923,15 +34491,15 @@ for_update - 73386 + 73387 for_stmt - 73386 + 73387 update_id - 73386 + 73387 @@ -33945,7 +34513,7 @@ 1 2 - 73386 + 73387 @@ -33961,7 +34529,7 @@ 1 2 - 73386 + 73387 @@ -33971,15 +34539,15 @@ for_body - 84389 + 84390 for_stmt - 84389 + 84390 body_id - 84389 + 84390 @@ -33993,7 +34561,7 @@ 1 2 - 84389 + 84390 @@ -34009,7 +34577,7 @@ 1 2 - 84389 + 84390 @@ -34019,19 +34587,19 @@ stmtparents - 5628263 + 5618647 id - 5628263 + 5618647 index - 15775 + 15747 parent - 2381441 + 2377536 @@ -34045,7 +34613,7 @@ 1 2 - 5628263 + 5618647 @@ -34061,7 +34629,7 @@ 1 2 - 5628263 + 5618647 @@ -34077,52 +34645,52 @@ 1 2 - 5182 + 5173 2 3 - 1291 + 1289 3 4 - 284 + 283 4 5 - 2006 + 2002 7 8 - 1315 + 1313 8 12 - 1023 + 1021 12 29 - 1389 + 1386 29 39 - 1186 + 1183 42 78 - 1194 + 1192 78 - 209668 - 901 + 209703 + 900 @@ -34138,52 +34706,52 @@ 1 2 - 5182 + 5173 2 3 - 1291 + 1289 3 4 - 284 + 283 4 5 - 2006 + 2002 7 8 - 1315 + 1313 8 12 - 1023 + 1021 12 29 - 1389 + 1386 29 39 - 1186 + 1183 42 78 - 1194 + 1192 78 - 209668 - 901 + 209703 + 900 @@ -34199,32 +34767,32 @@ 1 2 - 1358987 + 1356881 2 3 - 517368 + 516458 3 4 - 151516 + 151250 4 6 - 155724 + 155450 6 16 - 178868 + 178553 16 1943 - 18976 + 18942 @@ -34240,32 +34808,32 @@ 1 2 - 1358987 + 1356881 2 3 - 517368 + 516458 3 4 - 151516 + 151250 4 6 - 155724 + 155450 6 16 - 178868 + 178553 16 1943 - 18976 + 18942 @@ -34275,30 +34843,30 @@ ishandler - 43781 + 43779 block - 43781 + 43779 stmt_decl_bind - 725870 + 724593 stmt - 715301 + 714043 num - 73 + 72 decl - 725870 + 724593 @@ -34312,12 +34880,12 @@ 1 2 - 707836 + 706591 2 10 - 7465 + 7452 @@ -34333,12 +34901,12 @@ 1 2 - 707836 + 706591 2 10 - 7465 + 7452 @@ -34466,7 +35034,7 @@ 1 2 - 725870 + 724593 @@ -34482,7 +35050,7 @@ 1 2 - 725870 + 724593 @@ -34492,19 +35060,19 @@ stmt_decl_entry_bind - 725870 + 724593 stmt - 715301 + 714043 num - 73 + 72 decl_entry - 725870 + 724593 @@ -34518,12 +35086,12 @@ 1 2 - 707836 + 706591 2 10 - 7465 + 7452 @@ -34539,12 +35107,12 @@ 1 2 - 707836 + 706591 2 10 - 7465 + 7452 @@ -34672,7 +35240,7 @@ 1 2 - 725870 + 724593 @@ -34688,7 +35256,7 @@ 1 2 - 725870 + 724593 @@ -34698,15 +35266,15 @@ blockscope - 1644335 + 1644291 block - 1644335 + 1644291 enclosing - 1427145 + 1427106 @@ -34720,7 +35288,7 @@ 1 2 - 1644335 + 1644291 @@ -34736,17 +35304,17 @@ 1 2 - 1294535 + 1294500 2 4 - 117265 + 117262 4 29 - 15344 + 15343 @@ -34756,19 +35324,19 @@ jumpinfo - 348320 + 348325 id - 348320 + 348325 str - 28948 + 28949 target - 72706 + 72707 @@ -34782,7 +35350,7 @@ 1 2 - 348320 + 348325 @@ -34798,7 +35366,7 @@ 1 2 - 348320 + 348325 @@ -34814,7 +35382,7 @@ 2 3 - 13596 + 13597 3 @@ -34860,7 +35428,7 @@ 1 2 - 23190 + 23191 2 @@ -34891,7 +35459,7 @@ 2 3 - 36210 + 36211 3 @@ -34927,7 +35495,7 @@ 1 2 - 72706 + 72707 @@ -34937,11 +35505,11 @@ preprocdirects - 5408430 + 5408285 id - 5408430 + 5408285 kind @@ -34949,7 +35517,7 @@ location - 5405187 + 5405041 @@ -34963,7 +35531,7 @@ 1 2 - 5408430 + 5408285 @@ -34979,7 +35547,7 @@ 1 2 - 5408430 + 5408285 @@ -35127,7 +35695,7 @@ 1 2 - 5405062 + 5404916 27 @@ -35148,7 +35716,7 @@ 1 2 - 5405187 + 5405041 @@ -35158,15 +35726,15 @@ preprocpair - 1141217 + 1141186 begin - 888971 + 888947 elseelifend - 1141217 + 1141186 @@ -35180,17 +35748,17 @@ 1 2 - 649575 + 649558 2 3 - 230414 + 230407 3 9 - 8982 + 8981 @@ -35206,7 +35774,7 @@ 1 2 - 1141217 + 1141186 @@ -35216,41 +35784,41 @@ preproctrue - 439371 + 439359 branch - 439371 + 439359 preprocfalse - 285304 + 285296 branch - 285304 + 285296 preproctext - 4352418 + 4352301 id - 4352418 + 4352301 head - 2955088 + 2955008 body - 1683382 + 1683337 @@ -35264,7 +35832,7 @@ 1 2 - 4352418 + 4352301 @@ -35280,7 +35848,7 @@ 1 2 - 4352418 + 4352301 @@ -35296,12 +35864,12 @@ 1 2 - 2756485 + 2756411 2 798 - 198602 + 198597 @@ -35317,12 +35885,12 @@ 1 2 - 2873875 + 2873798 2 5 - 81212 + 81210 @@ -35338,17 +35906,17 @@ 1 2 - 1535178 + 1535137 2 10 - 127245 + 127242 10 13606 - 20958 + 20957 @@ -35364,12 +35932,12 @@ 1 2 - 1539420 + 1539379 2 12 - 126871 + 126867 12 @@ -35384,15 +35952,15 @@ includes - 318638 + 318598 id - 318638 + 318598 included - 58695 + 58688 @@ -35406,7 +35974,7 @@ 1 2 - 318638 + 318598 @@ -35422,12 +35990,12 @@ 1 2 - 29046 + 29043 2 3 - 9442 + 9441 3 @@ -35437,7 +36005,7 @@ 4 6 - 5355 + 5354 6 @@ -35447,7 +36015,7 @@ 11 47 - 4404 + 4403 47 @@ -35510,11 +36078,11 @@ link_parent - 30398238 + 30401054 element - 3866121 + 3866469 link_target @@ -35532,17 +36100,17 @@ 1 2 - 530459 + 530500 2 9 - 26948 + 26947 9 10 - 3308712 + 3309021 @@ -35561,48 +36129,48 @@ 34 - 97375 - 97376 + 97389 + 97390 34 - 97494 - 97495 + 97508 + 97509 34 - 97547 - 97548 + 97561 + 97562 34 - 97574 - 97575 + 97588 + 97589 34 - 97596 - 97597 + 97610 + 97611 34 - 97628 - 97629 + 97642 + 97643 34 - 99635 - 99636 + 99649 + 99650 34 - 103015 - 103016 + 103029 + 103030 34 - 104379 - 104380 + 104395 + 104396 34 diff --git a/cpp/ql/lib/upgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/old.dbscheme b/cpp/ql/lib/upgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/old.dbscheme new file mode 100644 index 00000000000..1a6854060d5 --- /dev/null +++ b/cpp/ql/lib/upgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/old.dbscheme @@ -0,0 +1,2450 @@ +/*- 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 +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 + | @decltype; + +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/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..a42ce5fc943 --- /dev/null +++ b/cpp/ql/lib/upgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/semmlecode.cpp.dbscheme @@ -0,0 +1,2469 @@ + +/*- 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 +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 + | @decltype; + +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 +); + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string 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/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/upgrade.properties b/cpp/ql/lib/upgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/upgrade.properties new file mode 100644 index 00000000000..52b67d65af7 --- /dev/null +++ b/cpp/ql/lib/upgrades/1a6854060d5d3ada16c580a29f8c5ce21f3367f8/upgrade.properties @@ -0,0 +1,2 @@ +description: Add databaseMetadata and overlayChangedFiles relations +compatibility: full diff --git a/cpp/ql/lib/upgrades/2121ffec11fac265524955fee1775217364d4ca4/old.dbscheme b/cpp/ql/lib/upgrades/2121ffec11fac265524955fee1775217364d4ca4/old.dbscheme new file mode 100644 index 00000000000..2121ffec11f --- /dev/null +++ b/cpp/ql/lib/upgrades/2121ffec11fac265524955fee1775217364d4ca4/old.dbscheme @@ -0,0 +1,2437 @@ +/*- 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 + | @decltype; + +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/2121ffec11fac265524955fee1775217364d4ca4/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/2121ffec11fac265524955fee1775217364d4ca4/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..1a6854060d5 --- /dev/null +++ b/cpp/ql/lib/upgrades/2121ffec11fac265524955fee1775217364d4ca4/semmlecode.cpp.dbscheme @@ -0,0 +1,2450 @@ +/*- 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 +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 + | @decltype; + +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/2121ffec11fac265524955fee1775217364d4ca4/upgrade.properties b/cpp/ql/lib/upgrades/2121ffec11fac265524955fee1775217364d4ca4/upgrade.properties new file mode 100644 index 00000000000..046b67dcbf3 --- /dev/null +++ b/cpp/ql/lib/upgrades/2121ffec11fac265524955fee1775217364d4ca4/upgrade.properties @@ -0,0 +1,2 @@ +description: Support expanded compilation argument lists +compatibility: backwards diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 880cab8a58d..a6caf3c6a6b 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.5.7 + +No user-facing changes. + +## 1.5.6 + +No user-facing changes. + +## 1.5.5 + +No user-facing changes. + +## 1.5.4 + +No user-facing changes. + ## 1.5.3 No user-facing changes. diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll index 51dad0fc18c..74fe756093c 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll @@ -10,7 +10,7 @@ import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flowTo(this) } /** Gets a source of untrusted data which is passed to this external API data node. */ DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll index 51dad0fc18c..74fe756093c 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll @@ -10,7 +10,7 @@ import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flowTo(this) } /** Gets a source of untrusted data which is passed to this external API data node. */ DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql index 01d078cf545..392650022e2 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql @@ -263,7 +263,7 @@ module FromSensitiveFlow = TaintTracking::Global; * A taint flow configuration for flow from a sensitive expression to an encryption operation. */ module ToEncryptionConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { FromSensitiveFlow::flow(source, _) } + predicate isSource(DataFlow::Node source) { FromSensitiveFlow::flowFrom(source) } predicate isSink(DataFlow::Node sink) { isSinkEncrypt(sink, _) } @@ -311,7 +311,7 @@ where FromSensitiveFlow::flowPath(source, sink) and isSinkSendRecv(sink.getNode(), networkSendRecv) and // no flow from sensitive -> evidence of encryption - not ToEncryptionFlow::flow(source.getNode(), _) and + not ToEncryptionFlow::flowFrom(source.getNode()) and not FromEncryptionFlow::flowTo(sink.getNode()) and // construct result if networkSendRecv instanceof NetworkSend diff --git a/cpp/ql/src/change-notes/released/1.5.4.md b/cpp/ql/src/change-notes/released/1.5.4.md new file mode 100644 index 00000000000..5ff5ac8ebb7 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.5.4.md @@ -0,0 +1,3 @@ +## 1.5.4 + +No user-facing changes. diff --git a/cpp/ql/src/change-notes/released/1.5.5.md b/cpp/ql/src/change-notes/released/1.5.5.md new file mode 100644 index 00000000000..76d0ac89489 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.5.5.md @@ -0,0 +1,3 @@ +## 1.5.5 + +No user-facing changes. diff --git a/cpp/ql/src/change-notes/released/1.5.6.md b/cpp/ql/src/change-notes/released/1.5.6.md new file mode 100644 index 00000000000..17fb577dc9e --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.5.6.md @@ -0,0 +1,3 @@ +## 1.5.6 + +No user-facing changes. diff --git a/cpp/ql/src/change-notes/released/1.5.7.md b/cpp/ql/src/change-notes/released/1.5.7.md new file mode 100644 index 00000000000..c60c55034a6 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.5.7.md @@ -0,0 +1,3 @@ +## 1.5.7 + +No user-facing changes. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 232224b0e26..227ac5febef 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.5.3 +lastReleaseVersion: 1.5.7 diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql b/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql index 74ac8e6da66..c562e28326b 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql @@ -1,5 +1,5 @@ /** - * @name Dangerous use convert function. + * @name Dangerous use convert function * @description Using convert function with an invalid length argument can result in an out-of-bounds access error or unexpected result. * @kind problem * @id cpp/dangerous-use-convert-function diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql index e848b97ef8f..47ece4a2aae 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-190/DangerousUseOfTransformationAfterOperation.ql @@ -1,5 +1,5 @@ /** - * @name Dangerous use of transformation after operation. + * @name Dangerous use of transformation after operation * @description By using the transformation after the operation, you are doing a pointless and dangerous action. * @kind problem * @id cpp/dangerous-use-of-transformation-after-operation diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql index 58f5dc2ade4..003c4f27f49 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql @@ -129,7 +129,7 @@ module PointerArithmeticToDerefFlow = DataFlow::Global; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 33 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 34 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 35 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 36 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 37 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | provenance | MaD:36 | +| asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | provenance | MaD:37 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:17 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | *recv_buffer | provenance | Src:MaD:17 Sink:MaD:2 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | @@ -45,10 +46,10 @@ edges | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | *send_buffer | provenance | Sink:MaD:2 | | asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | provenance | | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:36 | -| test.cpp:4:5:4:17 | [summary param] 0 in ymlStepManual | test.cpp:4:5:4:17 | [summary] to write: ReturnValue in ymlStepManual | provenance | MaD:34 | -| test.cpp:5:5:5:20 | [summary param] 0 in ymlStepGenerated | test.cpp:5:5:5:20 | [summary] to write: ReturnValue in ymlStepGenerated | provenance | MaD:33 | -| test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | test.cpp:6:5:6:27 | [summary] to write: ReturnValue in ymlStepManual_with_body | provenance | MaD:35 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:37 | +| test.cpp:4:5:4:17 | [summary param] 0 in ymlStepManual | test.cpp:4:5:4:17 | [summary] to write: ReturnValue in ymlStepManual | provenance | MaD:35 | +| test.cpp:5:5:5:20 | [summary param] 0 in ymlStepGenerated | test.cpp:5:5:5:20 | [summary] to write: ReturnValue in ymlStepGenerated | provenance | MaD:34 | +| test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | test.cpp:6:5:6:27 | [summary] to write: ReturnValue in ymlStepManual_with_body | provenance | MaD:36 | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:16 | @@ -60,15 +61,15 @@ edges | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | | test.cpp:17:24:17:24 | x | test.cpp:4:5:4:17 | [summary param] 0 in ymlStepManual | provenance | | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:34 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:35 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | | test.cpp:21:27:21:27 | x | test.cpp:5:5:5:20 | [summary param] 0 in ymlStepGenerated | provenance | | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:33 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:34 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | | test.cpp:25:35:25:35 | x | test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | provenance | | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:35 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:36 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | @@ -76,7 +77,7 @@ edges | test.cpp:46:30:46:32 | *arg [x] | test.cpp:47:12:47:19 | *arg [x] | provenance | | | test.cpp:47:12:47:19 | *arg [x] | test.cpp:48:13:48:13 | *s [x] | provenance | | | test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | -| test.cpp:52:5:52:18 | [summary param] *3 in pthread_create [x] | test.cpp:52:5:52:18 | [summary] to write: Argument[2].Parameter[*0] in pthread_create [x] | provenance | MaD:32 | +| test.cpp:52:5:52:18 | [summary param] *3 in pthread_create [x] | test.cpp:52:5:52:18 | [summary] to write: Argument[2].Parameter[*0] in pthread_create [x] | provenance | MaD:33 | | test.cpp:52:5:52:18 | [summary] to write: Argument[2].Parameter[*0] in pthread_create [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | @@ -103,6 +104,13 @@ edges | test.cpp:101:26:101:26 | x | test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | provenance | | | test.cpp:103:63:103:63 | x | test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | provenance | | | test.cpp:104:62:104:62 | x | test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | provenance | | +| test.cpp:111:3:111:25 | [summary param] *0 in callWithNonTypeTemplate | test.cpp:111:3:111:25 | [summary] to write: ReturnValue in callWithNonTypeTemplate | provenance | MaD:32 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:16 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | +| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | +| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | +| test.cpp:118:44:118:44 | *x | test.cpp:111:3:111:25 | [summary param] *0 in callWithNonTypeTemplate | provenance | | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:32 | | windows.cpp:17:8:17:25 | [summary param] *0 in CommandLineToArgvA | windows.cpp:17:8:17:25 | [summary] to write: ReturnValue[**] in CommandLineToArgvA | provenance | MaD:18 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | @@ -314,6 +322,14 @@ nodes | test.cpp:101:26:101:26 | x | semmle.label | x | | test.cpp:103:63:103:63 | x | semmle.label | x | | test.cpp:104:62:104:62 | x | semmle.label | x | +| test.cpp:111:3:111:25 | [summary param] *0 in callWithNonTypeTemplate | semmle.label | [summary param] *0 in callWithNonTypeTemplate | +| test.cpp:111:3:111:25 | [summary] to write: ReturnValue in callWithNonTypeTemplate | semmle.label | [summary] to write: ReturnValue in callWithNonTypeTemplate | +| test.cpp:114:10:114:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:114:10:114:18 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | semmle.label | call to callWithNonTypeTemplate | +| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | semmle.label | call to callWithNonTypeTemplate | +| test.cpp:118:44:118:44 | *x | semmle.label | *x | +| test.cpp:119:10:119:11 | y2 | semmle.label | y2 | | windows.cpp:17:8:17:25 | [summary param] *0 in CommandLineToArgvA | semmle.label | [summary param] *0 in CommandLineToArgvA | | windows.cpp:17:8:17:25 | [summary] to write: ReturnValue[**] in CommandLineToArgvA | semmle.label | [summary] to write: ReturnValue[**] in CommandLineToArgvA | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | @@ -472,6 +488,7 @@ subpaths | test.cpp:21:27:21:27 | x | test.cpp:5:5:5:20 | [summary param] 0 in ymlStepGenerated | test.cpp:5:5:5:20 | [summary] to write: ReturnValue in ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | test.cpp:6:5:6:27 | [summary] to write: ReturnValue in ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | +| test.cpp:118:44:118:44 | *x | test.cpp:111:3:111:25 | [summary param] *0 in callWithNonTypeTemplate | test.cpp:111:3:111:25 | [summary] to write: ReturnValue in callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | | windows.cpp:27:36:27:38 | *cmd | windows.cpp:17:8:17:25 | [summary param] *0 in CommandLineToArgvA | windows.cpp:17:8:17:25 | [summary] to write: ReturnValue[**] in CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | | windows.cpp:537:40:537:41 | *& ... | windows.cpp:473:17:473:37 | [summary param] *1 in RtlCopyVolatileMemory | windows.cpp:473:17:473:37 | [summary param] *0 in RtlCopyVolatileMemory [Return] | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | | windows.cpp:542:38:542:39 | *& ... | windows.cpp:479:17:479:35 | [summary param] *1 in RtlCopyDeviceMemory | windows.cpp:479:17:479:35 | [summary param] *0 in RtlCopyDeviceMemory [Return] | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index f0df3e749e6..8e200aabfbd 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -17,4 +17,5 @@ extensions: - ["", "", False, "ymlStepGenerated", "", "", "Argument[0]", "ReturnValue", "taint", "df-generated"] - ["", "", False, "ymlStepManual_with_body", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["", "", False, "ymlStepGenerated_with_body", "", "", "Argument[0]", "ReturnValue", "taint", "df-generated"] - - ["", "", False, "callWithArgument", "", "", "Argument[1]", "Argument[0].Parameter[0]", "value", "manual"] \ No newline at end of file + - ["", "", False, "callWithArgument", "", "", "Argument[1]", "Argument[0].Parameter[0]", "value", "manual"] + - ["", "", False, "callWithNonTypeTemplate", "(const T &)", "", "Argument[*0]", "ReturnValue", "value", "manual"] \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 0cc01c8165e..e28349b7159 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -13,3 +13,5 @@ | test.cpp:75:11:75:11 | y | test-sink | | test.cpp:83:11:83:11 | y | test-sink | | test.cpp:89:11:89:11 | y | test-sink | +| test.cpp:116:10:116:11 | y1 | test-sink | +| test.cpp:119:10:119:11 | y2 | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 401fffdbd59..cb7e06b801d 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -2,6 +2,7 @@ | test.cpp:10:10:10:18 | call to ymlSource | local | | test.cpp:56:8:56:16 | call to ymlSource | local | | test.cpp:94:10:94:18 | call to ymlSource | local | +| test.cpp:114:10:114:18 | call to ymlSource | local | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index f357b934b2f..af11ff958f5 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -102,4 +102,19 @@ void test_callWithArgument() { } callWithArgument(StructWithOperatorCall_has_constructor_2(), x); callWithArgument(StructWithOperatorCall_no_constructor_2(), x); -} \ No newline at end of file +} + +template +T callWithNonTypeTemplate(const T&); + +template +T callWithNonTypeTemplate(const T&); + +void test_callWithNonTypeTemplate() { + int x = ymlSource(); + int y1 = callWithNonTypeTemplate<10, int>(x); + ymlSink(y1); // $ MISSING: ir + + int y2 = callWithNonTypeTemplate(x); + ymlSink(y2); // $ ir +} diff --git a/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected b/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected index 4021dbc492a..1b0b906af52 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected @@ -142,6 +142,7 @@ postWithInFlow | simple.cpp:92:7:92:7 | i [post update] | PostUpdateNode should not be the target of local flow. | | simple.cpp:118:7:118:7 | i [post update] | PostUpdateNode should not be the target of local flow. | | simple.cpp:124:5:124:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | +| simple.cpp:167:9:167:9 | x [post update] | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition diff --git a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected index 8137e350d85..6cce6ac4f89 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected @@ -308,3 +308,5 @@ WARNING: module 'DataFlow' has been deprecated and may be removed in future (par | simple.cpp:124:5:124:6 | * ... | AST only | | simple.cpp:131:14:131:14 | a | IR only | | simple.cpp:136:10:136:10 | a | IR only | +| simple.cpp:167:9:167:9 | x | AST only | +| simple.cpp:168:8:168:12 | u_int | IR only | diff --git a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected index 8df575d8e16..b09f949271d 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected @@ -670,6 +670,8 @@ | simple.cpp:131:14:131:14 | a | | simple.cpp:135:20:135:20 | q | | simple.cpp:136:10:136:10 | a | +| simple.cpp:167:3:167:7 | u_int | +| simple.cpp:168:8:168:12 | u_int | | struct_init.c:15:8:15:9 | ab | | struct_init.c:15:12:15:12 | a | | struct_init.c:16:8:16:9 | ab | diff --git a/cpp/ql/test/library-tests/dataflow/fields/partial-definition.expected b/cpp/ql/test/library-tests/dataflow/fields/partial-definition.expected index 397e069c166..127cbadd971 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/partial-definition.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/partial-definition.expected @@ -597,6 +597,8 @@ WARNING: module 'DataFlow' has been deprecated and may be removed in future (par | simple.cpp:118:7:118:7 | i | | simple.cpp:124:5:124:6 | * ... | | simple.cpp:135:20:135:20 | q | +| simple.cpp:167:3:167:7 | u_int | +| simple.cpp:167:9:167:9 | x | | struct_init.c:15:8:15:9 | ab | | struct_init.c:15:12:15:12 | a | | struct_init.c:16:8:16:9 | ab | diff --git a/cpp/ql/test/library-tests/dataflow/fields/simple.cpp b/cpp/ql/test/library-tests/dataflow/fields/simple.cpp index 3b8d882bc2b..d220b416e1a 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/simple.cpp +++ b/cpp/ql/test/library-tests/dataflow/fields/simple.cpp @@ -136,4 +136,36 @@ void alias_with_fields(bool b) { sink(a.i); // $ MISSING: ast,ir } +template +union U_with_two_instantiations_of_different_size { + int x; + T y; +}; + +struct LargeStruct { + int data[64]; +}; + +void test_union_with_two_instantiations_of_different_sizes() { + // A union's fields is partitioned into "chunks" for field-flow in order to + // improve performance (so that a write to a field of a union does not flow + // to too many reads that don't happen at runtime). The partitioning is based + // the size of the types in the union. So a write to a field of size k only + // flows to a read of size k. + // Since field-flow is based on uninstantiated types a field can have + // multiple sizes if the union is instantiated with types of + // different sizes. So to compute the partition we pick the maximum size. + // Because of this there are `Content`s corresponding to the union + // `U_with_two_instantiations_of_different_size`: The one for size + // `sizeof(int)`, and the one for size `sizeof(LargeStruct)` (because + // `LargeStruct` is larger than `int`). So the write to `x` writes to the + // `Content` for size `sizeof(int)`, and the read of `y` reads from the + // `Content` for size `sizeof(LargeStruct)`. + U_with_two_instantiations_of_different_size u_int; + U_with_two_instantiations_of_different_size u_very_large; + + u_int.x = user_input(); + sink(u_int.y); // $ MISSING: ir +} + } // namespace Simple \ No newline at end of file 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 2409e711e6d..e0002aa9c03 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 @@ -26843,6 +26843,24 @@ getParameterTypeName | atl.cpp:71:5:71:17 | _U_STRINGorID | 0 | unsigned int | | atl.cpp:72:5:72:17 | _U_STRINGorID | 0 | LPCTSTR | | atl.cpp:72:5:72:17 | _U_STRINGorID | 0 | const char * | +| atl.cpp:96:5:96:10 | CA2AEX | 0 | LPCSTR | +| atl.cpp:96:5:96:10 | CA2AEX | 0 | const char * | +| atl.cpp:96:5:96:10 | CA2AEX | 1 | UINT | +| atl.cpp:96:5:96:10 | CA2AEX | 1 | unsigned int | +| atl.cpp:97:5:97:10 | CA2AEX | 0 | LPCSTR | +| atl.cpp:97:5:97:10 | CA2AEX | 0 | const char * | +| atl.cpp:124:5:124:11 | CA2CAEX | 0 | LPCSTR | +| atl.cpp:124:5:124:11 | CA2CAEX | 0 | const char * | +| atl.cpp:124:5:124:11 | CA2CAEX | 1 | UINT | +| atl.cpp:124:5:124:11 | CA2CAEX | 1 | unsigned int | +| atl.cpp:125:5:125:11 | CA2CAEX | 0 | LPCSTR | +| atl.cpp:125:5:125:11 | CA2CAEX | 0 | const char * | +| atl.cpp:149:5:149:10 | CA2WEX | 0 | LPCSTR | +| atl.cpp:149:5:149:10 | CA2WEX | 0 | const char * | +| atl.cpp:149:5:149:10 | CA2WEX | 1 | UINT | +| atl.cpp:149:5:149:10 | CA2WEX | 1 | unsigned int | +| atl.cpp:150:5:150:10 | CA2WEX | 0 | LPCSTR | +| atl.cpp:150:5:150:10 | CA2WEX | 0 | const char * | | atl.cpp:196:12:196:14 | Add | 0 | INARGTYPclass:0 | | atl.cpp:198:12:198:17 | Append | 0 | const CAtlArray & | | atl.cpp:199:10:199:13 | Copy | 0 | const CAtlArray & | @@ -27083,6 +27101,10 @@ getParameterTypeName | atl.cpp:940:10:940:18 | SetString | 0 | PCXSTR | | atl.cpp:940:10:940:18 | SetString | 0 | const class:0 * | | atl.cpp:942:11:942:20 | operator[] | 0 | int | +| atl.cpp:1018:10:1018:10 | operator= | 0 | MakeOther && | +| atl.cpp:1018:10:1018:10 | operator= | 0 | const MakeOther & | +| atl.cpp:1023:10:1023:10 | operator= | 0 | MakeOther && | +| atl.cpp:1023:10:1023:10 | operator= | 0 | const MakeOther & | | atl.cpp:1036:5:1036:12 | CStringT | 0 | const VARIANT & | | atl.cpp:1036:5:1036:12 | CStringT | 0 | const tagVARIANT & | | atl.cpp:1037:5:1037:12 | CStringT | 0 | const VARIANT & | @@ -27286,6 +27308,8 @@ getParameterTypeName | standalone_iterators.cpp:20:7:20:7 | operator= | 0 | const int_iterator_by_trait & | | standalone_iterators.cpp:20:7:20:7 | operator= | 0 | int_iterator_by_trait && | | standalone_iterators.cpp:23:27:23:36 | operator++ | 0 | int | +| standalone_iterators.cpp:28:13:28:13 | operator= | 0 | const iterator_traits & | +| standalone_iterators.cpp:28:13:28:13 | operator= | 0 | iterator_traits && | | standalone_iterators.cpp:36:7:36:7 | operator= | 0 | const non_iterator & | | standalone_iterators.cpp:36:7:36:7 | operator= | 0 | non_iterator && | | standalone_iterators.cpp:39:18:39:27 | operator++ | 0 | int | @@ -27297,6 +27321,8 @@ getParameterTypeName | standalone_iterators.cpp:66:30:66:39 | operator++ | 0 | int | | standalone_iterators.cpp:68:30:68:39 | operator-- | 0 | int | | standalone_iterators.cpp:70:31:70:39 | operator= | 0 | int | +| standalone_iterators.cpp:74:13:74:13 | operator= | 0 | const iterator_traits & | +| standalone_iterators.cpp:74:13:74:13 | operator= | 0 | iterator_traits && | | standalone_iterators.cpp:82:7:82:7 | container | 0 | const container & | | standalone_iterators.cpp:82:7:82:7 | container | 0 | container && | | standalone_iterators.cpp:82:7:82:7 | operator= | 0 | const container & | diff --git a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/lowerBound.expected b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/lowerBound.expected index bc8f42dafc3..cfebbd974c0 100644 --- a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/lowerBound.expected +++ b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/lowerBound.expected @@ -485,197 +485,529 @@ | test.c:411:59:411:59 | k | 0.205191 | | test.c:411:63:411:63 | l | 0.132041 | | test.c:413:10:413:15 | output | 1.842468 | -| test.c:418:20:418:20 | x | 0 | -| test.c:418:30:418:30 | x | 0 | -| test.c:421:3:421:4 | y1 | 0 | -| test.c:421:11:421:11 | y | 0 | -| test.c:421:14:421:14 | y | 1 | -| test.c:422:3:422:4 | y2 | 0 | -| test.c:422:9:422:9 | y | 1 | -| test.c:422:14:422:14 | y | 2 | -| test.c:422:22:422:22 | y | 5 | -| test.c:423:10:423:11 | y1 | 1 | -| test.c:423:15:423:16 | y2 | 5 | -| test.c:431:3:431:3 | i | -2147483648 | -| test.c:432:7:432:7 | i | 10 | -| test.c:434:3:434:3 | i | -2147483648 | -| test.c:435:3:435:3 | i | 10 | -| test.c:436:7:436:7 | i | 20 | -| test.c:438:3:438:3 | i | -2147483648 | -| test.c:439:3:439:3 | i | 40 | -| test.c:440:7:440:7 | i | 30 | -| test.c:442:3:442:3 | i | -2147483648 | -| test.c:442:7:442:7 | j | -2147483648 | -| test.c:443:7:443:7 | i | 40 | -| test.c:445:3:445:3 | i | -2147483648 | -| test.c:445:8:445:8 | j | 40 | -| test.c:446:7:446:7 | i | 50 | -| test.c:448:3:448:3 | i | -2147483648 | -| test.c:448:13:448:13 | j | 50 | -| test.c:449:7:449:7 | i | 60 | -| test.c:456:12:456:12 | a | 0 | -| test.c:456:17:456:17 | a | 3 | -| test.c:456:33:456:33 | b | 0 | -| test.c:456:38:456:38 | b | 5 | -| test.c:457:13:457:13 | a | 3 | -| test.c:457:15:457:15 | b | 5 | -| test.c:458:5:458:9 | total | 0 | -| test.c:458:14:458:14 | r | 15 | -| test.c:460:12:460:12 | a | 0 | -| test.c:460:17:460:17 | a | 3 | -| test.c:460:33:460:33 | b | 0 | -| test.c:460:38:460:38 | b | 0 | -| test.c:461:13:461:13 | a | 3 | -| test.c:461:15:461:15 | b | 0 | -| test.c:462:5:462:9 | total | 0 | -| test.c:462:14:462:14 | r | 0 | -| test.c:464:12:464:12 | a | 0 | -| test.c:464:17:464:17 | a | 3 | -| test.c:464:34:464:34 | b | 0 | -| test.c:464:39:464:39 | b | 13 | -| test.c:465:13:465:13 | a | 3 | -| test.c:465:15:465:15 | b | 13 | -| test.c:466:5:466:9 | total | 0 | -| test.c:466:14:466:14 | r | 39 | -| test.c:469:10:469:14 | total | 0 | -| test.c:475:12:475:12 | b | 0 | -| test.c:475:17:475:17 | b | 5 | -| test.c:476:16:476:16 | b | 5 | -| test.c:477:5:477:9 | total | 0 | -| test.c:477:14:477:14 | r | 55 | -| test.c:479:12:479:12 | b | 0 | -| test.c:479:17:479:17 | b | 0 | -| test.c:480:16:480:16 | b | 0 | -| test.c:481:5:481:9 | total | 0 | -| test.c:481:14:481:14 | r | 0 | -| test.c:483:13:483:13 | b | 0 | -| test.c:483:18:483:18 | b | 13 | -| test.c:484:16:484:16 | b | 13 | -| test.c:485:5:485:9 | total | 0 | -| test.c:485:14:485:14 | r | 143 | -| test.c:488:10:488:14 | total | 0 | -| test.c:493:3:493:3 | x | 0 | -| test.c:493:7:493:7 | y | 0 | -| test.c:494:3:494:4 | xy | 0 | -| test.c:494:8:494:8 | x | 1000000003 | -| test.c:494:12:494:12 | y | 1000000003 | -| test.c:495:10:495:11 | xy | 1000000006000000000 | -| test.c:500:3:500:3 | x | 0 | -| test.c:501:3:501:3 | y | 0 | -| test.c:502:3:502:4 | xy | 0 | -| test.c:502:8:502:8 | x | 274177 | -| test.c:502:12:502:12 | y | 67280421310721 | -| test.c:503:10:503:11 | xy | 18446744073709551616 | -| test.c:507:7:507:8 | ui | 0 | -| test.c:508:43:508:44 | ui | 10 | -| test.c:508:48:508:49 | ui | 10 | -| test.c:509:12:509:17 | result | 100 | -| test.c:511:7:511:8 | ul | 0 | -| test.c:512:28:512:29 | ul | 10 | -| test.c:512:33:512:34 | ul | 10 | -| test.c:513:12:513:17 | result | 0 | -| test.c:519:7:519:8 | ui | 0 | -| test.c:519:19:519:20 | ui | 0 | -| test.c:520:5:520:6 | ui | 2 | -| test.c:520:11:520:12 | ui | 2 | -| test.c:521:12:521:13 | ui | 4 | -| test.c:525:3:525:9 | uiconst | 10 | -| test.c:528:3:528:9 | ulconst | 10 | -| test.c:529:10:529:16 | uiconst | 40 | -| test.c:529:20:529:26 | ulconst | 40 | -| test.c:533:7:533:7 | i | -2147483648 | -| test.c:533:18:533:18 | i | -1 | -| test.c:534:5:534:5 | i | -2147483648 | -| test.c:534:13:534:13 | i | -1 | -| test.c:535:9:535:9 | i | -5 | -| test.c:537:5:537:5 | i | -2147483648 | -| test.c:537:9:537:9 | i | -5 | -| test.c:538:9:538:9 | i | -30 | -| test.c:540:5:540:5 | i | -30 | -| test.c:541:9:541:9 | i | -210 | -| test.c:543:5:543:5 | i | -210 | -| test.c:544:9:544:9 | i | -1155 | -| test.c:546:7:546:7 | i | -2147483648 | -| test.c:547:5:547:5 | i | -2147483648 | -| test.c:547:9:547:9 | i | -1 | -| test.c:548:9:548:9 | i | 1 | -| test.c:550:3:550:3 | i | -2147483648 | -| test.c:550:7:550:7 | i | -2147483648 | -| test.c:551:10:551:10 | i | -2147483648 | -| test.c:554:3:554:3 | i | -2147483648 | -| test.c:554:10:554:11 | sc | 1 | -| test.c:556:7:556:7 | i | -128 | -| test.c:563:7:563:7 | n | 0 | -| test.c:565:7:565:7 | n | 0 | -| test.c:566:9:566:9 | n | 1 | -| test.c:569:7:569:7 | n | 0 | -| test.c:570:9:570:9 | n | 1 | -| test.c:572:9:572:9 | n | 0 | -| test.c:575:8:575:8 | n | 0 | -| test.c:576:9:576:9 | n | 0 | -| test.c:578:9:578:9 | n | 1 | -| test.c:581:10:581:10 | n | 0 | -| test.c:582:5:582:5 | n | 1 | -| test.c:585:7:585:7 | n | 0 | -| test.c:589:7:589:7 | n | -32768 | -| test.c:592:7:592:7 | n | 0 | -| test.c:593:9:593:9 | n | 0 | -| test.c:595:9:595:9 | n | 1 | -| test.c:598:7:598:7 | n | 0 | -| test.c:599:9:599:9 | n | 1 | -| test.c:601:9:601:9 | n | 0 | -| test.c:604:10:604:10 | n | 0 | -| test.c:605:5:605:5 | n | 1 | -| test.c:608:7:608:7 | n | 0 | -| test.c:612:7:612:7 | n | -32768 | -| test.c:613:9:613:9 | n | -32768 | -| test.c:614:11:614:11 | n | 0 | -| test.c:618:7:618:7 | n | -32768 | -| test.c:619:13:619:13 | n | 5 | -| test.c:622:9:622:9 | n | 6 | -| test.c:625:7:625:7 | n | -32768 | -| test.c:625:22:625:22 | n | -32767 | -| test.c:626:9:626:9 | n | -32766 | -| test.c:629:7:629:7 | n | -32768 | -| test.c:630:5:630:5 | n | 0 | -| test.c:630:10:630:10 | n | 1 | -| test.c:630:14:630:14 | n | 0 | -| test.c:631:6:631:6 | n | 0 | -| test.c:631:10:631:10 | n | 0 | -| test.c:631:14:631:14 | n | 1 | -| test.c:642:7:642:8 | ss | -32768 | -| test.c:643:9:643:10 | ss | 0 | -| test.c:646:7:646:8 | ss | -32768 | -| test.c:647:9:647:10 | ss | -32768 | -| test.c:650:14:650:15 | us | 0 | -| test.c:651:9:651:10 | us | 0 | -| test.c:654:14:654:15 | us | 0 | -| test.c:655:9:655:10 | us | 0 | -| test.c:658:7:658:8 | ss | -32768 | -| test.c:659:9:659:10 | ss | -32768 | -| test.c:662:7:662:8 | ss | -32768 | -| test.c:663:9:663:10 | ss | -1 | -| test.c:669:8:669:8 | s | -2147483648 | -| test.c:669:15:669:15 | s | 0 | -| test.c:669:23:669:23 | s | 0 | -| test.c:670:18:670:18 | s | 0 | -| test.c:670:22:670:22 | s | 0 | -| test.c:671:9:671:14 | result | 0 | -| test.c:677:7:677:7 | i | 0 | -| test.c:678:9:678:9 | i | -2147483648 | -| test.c:682:7:682:7 | u | 0 | -| test.c:683:9:683:9 | u | 0 | -| test.c:688:12:688:12 | s | -2147483648 | -| test.c:689:7:689:8 | s2 | -4 | -| test.c:694:7:694:7 | x | -2147483648 | -| test.c:695:9:695:9 | y | -2147483648 | -| test.c:699:7:699:7 | y | -2147483648 | -| test.c:708:7:708:7 | x | -2147483648 | -| test.c:713:7:713:7 | x | -2147483648 | -| test.c:720:8:720:8 | x | 2147483647 | -| test.c:720:12:720:12 | y | 256 | -| test.c:721:9:721:9 | x | 2147483647 | -| test.c:722:9:722:9 | y | 256 | +| test.c:420:7:420:9 | rhs | 0 | +| test.c:420:19:420:21 | rhs | 0 | +| test.c:421:7:421:9 | rhs | 0 | +| test.c:421:19:421:21 | rhs | 0 | +| test.c:422:7:422:9 | rhs | 0 | +| test.c:422:19:422:21 | rhs | 0 | +| test.c:423:7:423:9 | rhs | 0 | +| test.c:423:19:423:21 | rhs | 0 | +| test.c:424:7:424:9 | rhs | 0 | +| test.c:424:19:424:21 | rhs | 0 | +| test.c:425:10:425:12 | rhs | 0 | +| test.c:429:7:429:7 | a | -2147483648 | +| test.c:430:9:430:9 | b | -2147483648 | +| test.c:431:7:431:7 | a | 17 | +| test.c:431:12:431:12 | b | 23 | +| test.c:433:9:433:9 | a | 17 | +| test.c:434:7:434:7 | b | -2147483648 | +| test.c:439:11:439:11 | a | -2147483648 | +| test.c:439:15:439:15 | b | -2147483648 | +| test.c:440:10:440:10 | a | -2147483648 | +| test.c:440:14:440:14 | b | -2147483648 | +| test.c:447:10:447:11 | ip | 0 | +| test.c:447:20:447:21 | ip | 0 | +| test.c:447:40:447:41 | ip | 0 | +| test.c:448:14:448:15 | ip | 1 | +| test.c:449:14:449:15 | ip | 0 | +| test.c:449:34:449:35 | ip | 0 | +| test.c:450:11:450:12 | ip | 0 | +| test.c:451:13:451:14 | ip | 0 | +| test.c:452:14:452:15 | ip | 0 | +| test.c:453:14:453:15 | ip | 0 | +| test.c:454:15:454:16 | ip | 0 | +| test.c:454:41:454:42 | ip | 0 | +| test.c:454:52:454:53 | ip | 0 | +| test.c:454:67:454:68 | ip | 0 | +| test.c:454:78:454:79 | ip | 0 | +| test.c:455:18:455:19 | ip | 0 | +| test.c:456:23:456:24 | ip | 0 | +| test.c:456:34:456:35 | ip | 0 | +| test.c:457:25:457:26 | ip | 0 | +| test.c:458:20:458:21 | ip | 0 | +| test.c:459:11:459:12 | ip | 0 | +| test.c:459:26:459:27 | ip | 0 | +| test.c:460:16:460:17 | ip | 0 | +| test.c:461:16:461:17 | ip | 0 | +| test.c:462:16:462:17 | ip | 0 | +| test.c:463:17:463:18 | ip | 0 | +| test.c:464:22:464:23 | ip | 0 | +| test.c:464:33:464:34 | ip | 0 | +| test.c:464:48:464:49 | ip | 0 | +| test.c:464:59:464:60 | ip | 0 | +| test.c:465:20:465:21 | ip | 0 | +| test.c:466:25:466:26 | ip | 0 | +| test.c:466:36:466:37 | ip | 0 | +| test.c:467:27:467:28 | ip | 0 | +| test.c:468:22:468:23 | ip | 0 | +| test.c:469:15:469:16 | ip | 0 | +| test.c:469:30:469:31 | ip | 0 | +| test.c:470:11:470:12 | ip | 0 | +| test.c:471:12:471:13 | ip | 0 | +| test.c:472:12:472:13 | ip | 0 | +| test.c:473:13:473:14 | ip | 0 | +| test.c:473:39:473:40 | ip | 0 | +| test.c:473:50:473:51 | ip | 0 | +| test.c:473:65:473:66 | ip | 0 | +| test.c:473:76:473:77 | ip | 0 | +| test.c:474:16:474:17 | ip | 0 | +| test.c:475:21:475:22 | ip | 0 | +| test.c:475:32:475:33 | ip | 0 | +| test.c:476:23:476:24 | ip | 0 | +| test.c:477:18:477:19 | ip | 0 | +| test.c:478:11:478:12 | ip | 0 | +| test.c:478:17:478:18 | ip | 0 | +| test.c:478:37:478:38 | ip | 0 | +| test.c:478:43:478:44 | ip | 0 | +| test.c:479:14:479:15 | ip | 0 | +| test.c:480:14:480:15 | ip | 0 | +| test.c:481:14:481:15 | ip | 0 | +| test.c:482:15:482:16 | ip | 0 | +| test.c:482:41:482:42 | ip | 0 | +| test.c:482:52:482:53 | ip | 0 | +| test.c:482:67:482:68 | ip | 0 | +| test.c:482:78:482:79 | ip | 0 | +| test.c:483:18:483:19 | ip | 0 | +| test.c:484:23:484:24 | ip | 0 | +| test.c:484:34:484:35 | ip | 0 | +| test.c:485:25:485:26 | ip | 0 | +| test.c:486:20:486:21 | ip | 0 | +| test.c:487:14:487:15 | ip | 0 | +| test.c:487:20:487:21 | ip | 0 | +| test.c:488:16:488:17 | ip | 0 | +| test.c:489:12:489:13 | ip | 0 | +| test.c:490:14:490:15 | ip | 0 | +| test.c:491:15:491:16 | ip | 0 | +| test.c:492:16:492:17 | ip | 0 | +| test.c:493:16:493:17 | ip | 0 | +| test.c:494:17:494:18 | ip | 0 | +| test.c:495:22:495:23 | ip | 0 | +| test.c:495:33:495:34 | ip | 0 | +| test.c:495:48:495:49 | ip | 0 | +| test.c:495:59:495:60 | ip | 0 | +| test.c:496:20:496:21 | ip | 0 | +| test.c:497:25:497:26 | ip | 0 | +| test.c:497:36:497:37 | ip | 0 | +| test.c:498:27:498:28 | ip | 0 | +| test.c:499:22:499:23 | ip | 0 | +| test.c:500:13:500:14 | ip | 0 | +| test.c:500:28:500:29 | ip | 0 | +| test.c:501:18:501:19 | ip | 0 | +| test.c:502:18:502:19 | ip | 0 | +| test.c:503:18:503:19 | ip | 0 | +| test.c:504:19:504:20 | ip | 0 | +| test.c:505:24:505:25 | ip | 0 | +| test.c:505:35:505:36 | ip | 0 | +| test.c:505:50:505:51 | ip | 0 | +| test.c:505:61:505:62 | ip | 0 | +| test.c:506:22:506:23 | ip | 0 | +| test.c:507:27:507:28 | ip | 0 | +| test.c:507:38:507:39 | ip | 0 | +| test.c:508:29:508:30 | ip | 0 | +| test.c:509:24:509:25 | ip | 0 | +| test.c:510:17:510:18 | ip | 0 | +| test.c:510:32:510:33 | ip | 0 | +| test.c:511:14:511:15 | ip | 0 | +| test.c:512:18:512:19 | ip | 0 | +| test.c:513:18:513:19 | ip | 0 | +| test.c:514:19:514:20 | ip | 0 | +| test.c:515:24:515:25 | ip | 0 | +| test.c:515:35:515:36 | ip | 0 | +| test.c:515:50:515:51 | ip | 0 | +| test.c:515:61:515:62 | ip | 0 | +| test.c:516:22:516:23 | ip | 0 | +| test.c:517:27:517:28 | ip | 0 | +| test.c:517:38:517:39 | ip | 0 | +| test.c:518:29:518:30 | ip | 0 | +| test.c:519:24:519:25 | ip | 0 | +| test.c:520:17:520:18 | ip | 0 | +| test.c:520:23:520:24 | ip | 0 | +| test.c:520:43:520:44 | ip | 0 | +| test.c:520:49:520:50 | ip | 0 | +| test.c:521:16:521:17 | ip | 0 | +| test.c:522:16:522:17 | ip | 0 | +| test.c:523:16:523:17 | ip | 0 | +| test.c:524:17:524:18 | ip | 0 | +| test.c:525:22:525:23 | ip | 0 | +| test.c:525:33:525:34 | ip | 0 | +| test.c:525:48:525:49 | ip | 0 | +| test.c:525:59:525:60 | ip | 0 | +| test.c:526:20:526:21 | ip | 0 | +| test.c:527:25:527:26 | ip | 0 | +| test.c:527:36:527:37 | ip | 0 | +| test.c:528:27:528:28 | ip | 0 | +| test.c:529:22:529:23 | ip | 0 | +| test.c:530:16:530:17 | ip | 0 | +| test.c:530:22:530:23 | ip | 0 | +| test.c:531:18:531:19 | ip | 0 | +| test.c:532:14:532:15 | ip | 0 | +| test.c:533:14:533:15 | ip | 0 | +| test.c:533:24:533:25 | ip | 0 | +| test.c:533:44:533:45 | ip | 0 | +| test.c:534:16:534:17 | ip | 1 | +| test.c:535:16:535:17 | ip | 0 | +| test.c:535:36:535:37 | ip | 0 | +| test.c:536:14:536:15 | ip | 0 | +| test.c:537:19:537:20 | ip | 0 | +| test.c:538:20:538:21 | ip | 0 | +| test.c:539:20:539:21 | ip | 0 | +| test.c:540:21:540:22 | ip | 0 | +| test.c:541:26:541:27 | ip | 0 | +| test.c:541:37:541:38 | ip | 0 | +| test.c:541:52:541:53 | ip | 0 | +| test.c:541:63:541:64 | ip | 0 | +| test.c:542:24:542:25 | ip | 0 | +| test.c:543:29:543:30 | ip | 0 | +| test.c:543:40:543:41 | ip | 0 | +| test.c:544:31:544:32 | ip | 0 | +| test.c:545:26:545:27 | ip | 0 | +| test.c:546:17:546:18 | ip | 0 | +| test.c:546:32:546:33 | ip | 0 | +| test.c:547:22:547:23 | ip | 0 | +| test.c:548:22:548:23 | ip | 0 | +| test.c:549:22:549:23 | ip | 0 | +| test.c:550:23:550:24 | ip | 0 | +| test.c:551:28:551:29 | ip | 0 | +| test.c:551:39:551:40 | ip | 0 | +| test.c:551:54:551:55 | ip | 0 | +| test.c:551:65:551:66 | ip | 0 | +| test.c:552:26:552:27 | ip | 0 | +| test.c:553:31:553:32 | ip | 0 | +| test.c:553:42:553:43 | ip | 0 | +| test.c:554:33:554:34 | ip | 0 | +| test.c:555:28:555:29 | ip | 0 | +| test.c:556:21:556:22 | ip | 0 | +| test.c:556:36:556:37 | ip | 0 | +| test.c:557:17:557:18 | ip | 0 | +| test.c:558:18:558:19 | ip | 0 | +| test.c:559:18:559:19 | ip | 0 | +| test.c:560:19:560:20 | ip | 0 | +| test.c:561:24:561:25 | ip | 0 | +| test.c:561:35:561:36 | ip | 0 | +| test.c:561:50:561:51 | ip | 0 | +| test.c:561:61:561:62 | ip | 0 | +| test.c:562:22:562:23 | ip | 0 | +| test.c:563:27:563:28 | ip | 0 | +| test.c:563:38:563:39 | ip | 0 | +| test.c:564:29:564:30 | ip | 0 | +| test.c:565:24:565:25 | ip | 0 | +| test.c:566:17:566:18 | ip | 0 | +| test.c:566:23:566:24 | ip | 0 | +| test.c:566:43:566:44 | ip | 0 | +| test.c:566:49:566:50 | ip | 0 | +| test.c:567:20:567:21 | ip | 0 | +| test.c:568:20:568:21 | ip | 0 | +| test.c:569:20:569:21 | ip | 0 | +| test.c:570:21:570:22 | ip | 0 | +| test.c:571:26:571:27 | ip | 0 | +| test.c:571:37:571:38 | ip | 0 | +| test.c:571:52:571:53 | ip | 0 | +| test.c:571:63:571:64 | ip | 0 | +| test.c:572:24:572:25 | ip | 0 | +| test.c:573:29:573:30 | ip | 0 | +| test.c:573:40:573:41 | ip | 0 | +| test.c:574:31:574:32 | ip | 0 | +| test.c:575:26:575:27 | ip | 0 | +| test.c:576:20:576:21 | ip | 0 | +| test.c:576:26:576:27 | ip | 0 | +| test.c:577:22:577:23 | ip | 0 | +| test.c:578:18:578:19 | ip | 0 | +| test.c:579:16:579:17 | ip | 0 | +| test.c:580:17:580:18 | ip | 0 | +| test.c:581:18:581:19 | ip | 0 | +| test.c:582:18:582:19 | ip | 0 | +| test.c:583:19:583:20 | ip | 0 | +| test.c:584:24:584:25 | ip | 0 | +| test.c:584:35:584:36 | ip | 0 | +| test.c:584:50:584:51 | ip | 0 | +| test.c:584:61:584:62 | ip | 0 | +| test.c:585:22:585:23 | ip | 0 | +| test.c:586:27:586:28 | ip | 0 | +| test.c:586:38:586:39 | ip | 0 | +| test.c:587:29:587:30 | ip | 0 | +| test.c:588:24:588:25 | ip | 0 | +| test.c:589:15:589:16 | ip | 0 | +| test.c:589:30:589:31 | ip | 0 | +| test.c:590:20:590:21 | ip | 0 | +| test.c:591:20:591:21 | ip | 0 | +| test.c:592:20:592:21 | ip | 0 | +| test.c:593:21:593:22 | ip | 0 | +| test.c:594:26:594:27 | ip | 0 | +| test.c:594:37:594:38 | ip | 0 | +| test.c:594:52:594:53 | ip | 0 | +| test.c:594:63:594:64 | ip | 0 | +| test.c:595:24:595:25 | ip | 0 | +| test.c:596:29:596:30 | ip | 0 | +| test.c:596:40:596:41 | ip | 0 | +| test.c:597:31:597:32 | ip | 0 | +| test.c:598:26:598:27 | ip | 0 | +| test.c:599:19:599:20 | ip | 0 | +| test.c:599:34:599:35 | ip | 0 | +| test.c:600:16:600:17 | ip | 0 | +| test.c:601:20:601:21 | ip | 0 | +| test.c:602:20:602:21 | ip | 0 | +| test.c:603:21:603:22 | ip | 0 | +| test.c:604:26:604:27 | ip | 0 | +| test.c:604:37:604:38 | ip | 0 | +| test.c:604:52:604:53 | ip | 0 | +| test.c:604:63:604:64 | ip | 0 | +| test.c:605:24:605:25 | ip | 0 | +| test.c:606:29:606:30 | ip | 0 | +| test.c:606:40:606:41 | ip | 0 | +| test.c:607:31:607:32 | ip | 0 | +| test.c:608:26:608:27 | ip | 0 | +| test.c:609:19:609:20 | ip | 0 | +| test.c:609:25:609:26 | ip | 0 | +| test.c:609:45:609:46 | ip | 0 | +| test.c:609:51:609:52 | ip | 0 | +| test.c:610:18:610:19 | ip | 0 | +| test.c:611:18:611:19 | ip | 0 | +| test.c:612:18:612:19 | ip | 0 | +| test.c:613:19:613:20 | ip | 0 | +| test.c:614:24:614:25 | ip | 0 | +| test.c:614:35:614:36 | ip | 0 | +| test.c:614:50:614:51 | ip | 0 | +| test.c:614:61:614:62 | ip | 0 | +| test.c:615:22:615:23 | ip | 0 | +| test.c:616:27:616:28 | ip | 0 | +| test.c:616:38:616:39 | ip | 0 | +| test.c:617:29:617:30 | ip | 0 | +| test.c:618:24:618:25 | ip | 0 | +| test.c:619:18:619:19 | ip | 0 | +| test.c:619:24:619:25 | ip | 0 | +| test.c:620:20:620:21 | ip | 0 | +| test.c:621:16:621:17 | ip | 0 | +| test.c:622:10:622:23 | special_number | 0 | +| test.c:630:7:630:8 | c1 | -2147483648 | +| test.c:630:13:630:13 | x | 0 | +| test.c:631:7:631:8 | c2 | -2147483648 | +| test.c:631:13:631:13 | x | 0 | +| test.c:632:7:632:8 | c3 | -2147483648 | +| test.c:632:13:632:13 | x | 0 | +| test.c:633:7:633:8 | c4 | -2147483648 | +| test.c:633:13:633:13 | x | 0 | +| test.c:634:7:634:8 | c5 | -2147483648 | +| test.c:634:13:634:13 | x | 0 | +| test.c:635:7:635:8 | c1 | -2147483648 | +| test.c:635:13:635:14 | c2 | -2147483648 | +| test.c:635:19:635:19 | x | 0 | +| test.c:636:7:636:8 | c1 | -2147483648 | +| test.c:636:13:636:14 | c3 | -2147483648 | +| test.c:636:19:636:19 | x | 0 | +| test.c:637:7:637:8 | c1 | -2147483648 | +| test.c:637:13:637:14 | c4 | -2147483648 | +| test.c:637:19:637:19 | x | 0 | +| test.c:638:7:638:8 | c1 | -2147483648 | +| test.c:638:13:638:14 | c5 | -2147483648 | +| test.c:638:19:638:19 | x | 0 | +| test.c:639:7:639:8 | c2 | -2147483648 | +| test.c:639:13:639:14 | c3 | -2147483648 | +| test.c:639:19:639:19 | x | 0 | +| test.c:641:11:641:11 | x | 0 | +| test.c:641:15:641:15 | x | 0 | +| test.c:641:19:641:19 | x | 0 | +| test.c:641:23:641:23 | x | 0 | +| test.c:641:27:641:27 | x | 0 | +| test.c:641:31:641:31 | x | 0 | +| test.c:641:35:641:35 | x | 0 | +| test.c:641:39:641:39 | x | 0 | +| test.c:641:43:641:43 | x | 0 | +| test.c:641:47:641:47 | x | 0 | +| test.c:641:51:641:51 | x | 0 | +| test.c:641:55:641:55 | x | 0 | +| test.c:642:10:642:10 | y | -2147483648 | +| test.c:647:20:647:20 | x | 0 | +| test.c:647:30:647:30 | x | 0 | +| test.c:650:3:650:4 | y1 | 0 | +| test.c:650:11:650:11 | y | 0 | +| test.c:650:14:650:14 | y | 1 | +| test.c:651:3:651:4 | y2 | 0 | +| test.c:651:9:651:9 | y | 1 | +| test.c:651:14:651:14 | y | 2 | +| test.c:651:22:651:22 | y | 5 | +| test.c:652:10:652:11 | y1 | 1 | +| test.c:652:15:652:16 | y2 | 5 | +| test.c:660:3:660:3 | i | -2147483648 | +| test.c:661:7:661:7 | i | 10 | +| test.c:663:3:663:3 | i | -2147483648 | +| test.c:664:3:664:3 | i | 10 | +| test.c:665:7:665:7 | i | 20 | +| test.c:667:3:667:3 | i | -2147483648 | +| test.c:668:3:668:3 | i | 40 | +| test.c:669:7:669:7 | i | 30 | +| test.c:671:3:671:3 | i | -2147483648 | +| test.c:671:7:671:7 | j | -2147483648 | +| test.c:672:7:672:7 | i | 40 | +| test.c:674:3:674:3 | i | -2147483648 | +| test.c:674:8:674:8 | j | 40 | +| test.c:675:7:675:7 | i | 50 | +| test.c:677:3:677:3 | i | -2147483648 | +| test.c:677:13:677:13 | j | 50 | +| test.c:678:7:678:7 | i | 60 | +| test.c:685:12:685:12 | a | 0 | +| test.c:685:17:685:17 | a | 3 | +| test.c:685:33:685:33 | b | 0 | +| test.c:685:38:685:38 | b | 5 | +| test.c:686:13:686:13 | a | 3 | +| test.c:686:15:686:15 | b | 5 | +| test.c:687:5:687:9 | total | 0 | +| test.c:687:14:687:14 | r | 15 | +| test.c:689:12:689:12 | a | 0 | +| test.c:689:17:689:17 | a | 3 | +| test.c:689:33:689:33 | b | 0 | +| test.c:689:38:689:38 | b | 0 | +| test.c:690:13:690:13 | a | 3 | +| test.c:690:15:690:15 | b | 0 | +| test.c:691:5:691:9 | total | 0 | +| test.c:691:14:691:14 | r | 0 | +| test.c:693:12:693:12 | a | 0 | +| test.c:693:17:693:17 | a | 3 | +| test.c:693:34:693:34 | b | 0 | +| test.c:693:39:693:39 | b | 13 | +| test.c:694:13:694:13 | a | 3 | +| test.c:694:15:694:15 | b | 13 | +| test.c:695:5:695:9 | total | 0 | +| test.c:695:14:695:14 | r | 39 | +| test.c:698:10:698:14 | total | 0 | +| test.c:704:12:704:12 | b | 0 | +| test.c:704:17:704:17 | b | 5 | +| test.c:705:16:705:16 | b | 5 | +| test.c:706:5:706:9 | total | 0 | +| test.c:706:14:706:14 | r | 55 | +| test.c:708:12:708:12 | b | 0 | +| test.c:708:17:708:17 | b | 0 | +| test.c:709:16:709:16 | b | 0 | +| test.c:710:5:710:9 | total | 0 | +| test.c:710:14:710:14 | r | 0 | +| test.c:712:13:712:13 | b | 0 | +| test.c:712:18:712:18 | b | 13 | +| test.c:713:16:713:16 | b | 13 | +| test.c:714:5:714:9 | total | 0 | +| test.c:714:14:714:14 | r | 143 | +| test.c:717:10:717:14 | total | 0 | +| test.c:722:3:722:3 | x | 0 | +| test.c:722:7:722:7 | y | 0 | +| test.c:723:3:723:4 | xy | 0 | +| test.c:723:8:723:8 | x | 1000000003 | +| test.c:723:12:723:12 | y | 1000000003 | +| test.c:724:10:724:11 | xy | 1000000006000000000 | +| test.c:729:3:729:3 | x | 0 | +| test.c:730:3:730:3 | y | 0 | +| test.c:731:3:731:4 | xy | 0 | +| test.c:731:8:731:8 | x | 274177 | +| test.c:731:12:731:12 | y | 67280421310721 | +| test.c:732:10:732:11 | xy | 18446744073709551616 | +| test.c:736:7:736:8 | ui | 0 | +| test.c:737:43:737:44 | ui | 10 | +| test.c:737:48:737:49 | ui | 10 | +| test.c:738:12:738:17 | result | 100 | +| test.c:740:7:740:8 | ul | 0 | +| test.c:741:28:741:29 | ul | 10 | +| test.c:741:33:741:34 | ul | 10 | +| test.c:742:12:742:17 | result | 0 | +| test.c:748:7:748:8 | ui | 0 | +| test.c:748:19:748:20 | ui | 0 | +| test.c:749:5:749:6 | ui | 2 | +| test.c:749:11:749:12 | ui | 2 | +| test.c:750:12:750:13 | ui | 4 | +| test.c:754:3:754:9 | uiconst | 10 | +| test.c:757:3:757:9 | ulconst | 10 | +| test.c:758:10:758:16 | uiconst | 40 | +| test.c:758:20:758:26 | ulconst | 40 | +| test.c:762:7:762:7 | i | -2147483648 | +| test.c:762:18:762:18 | i | -1 | +| test.c:763:5:763:5 | i | -2147483648 | +| test.c:763:13:763:13 | i | -1 | +| test.c:764:9:764:9 | i | -5 | +| test.c:766:5:766:5 | i | -2147483648 | +| test.c:766:9:766:9 | i | -5 | +| test.c:767:9:767:9 | i | -30 | +| test.c:769:5:769:5 | i | -30 | +| test.c:770:9:770:9 | i | -210 | +| test.c:772:5:772:5 | i | -210 | +| test.c:773:9:773:9 | i | -1155 | +| test.c:775:7:775:7 | i | -2147483648 | +| test.c:776:5:776:5 | i | -2147483648 | +| test.c:776:9:776:9 | i | -1 | +| test.c:777:9:777:9 | i | 1 | +| test.c:779:3:779:3 | i | -2147483648 | +| test.c:779:7:779:7 | i | -2147483648 | +| test.c:780:10:780:10 | i | -2147483648 | +| test.c:783:3:783:3 | i | -2147483648 | +| test.c:783:10:783:11 | sc | 1 | +| test.c:785:7:785:7 | i | -128 | +| test.c:792:7:792:7 | n | 0 | +| test.c:794:7:794:7 | n | 0 | +| test.c:795:9:795:9 | n | 1 | +| test.c:798:7:798:7 | n | 0 | +| test.c:799:9:799:9 | n | 1 | +| test.c:801:9:801:9 | n | 0 | +| test.c:804:8:804:8 | n | 0 | +| test.c:805:9:805:9 | n | 0 | +| test.c:807:9:807:9 | n | 1 | +| test.c:810:10:810:10 | n | 0 | +| test.c:811:5:811:5 | n | 1 | +| test.c:814:7:814:7 | n | 0 | +| test.c:818:7:818:7 | n | -32768 | +| test.c:821:7:821:7 | n | 0 | +| test.c:822:9:822:9 | n | 0 | +| test.c:824:9:824:9 | n | 1 | +| test.c:827:7:827:7 | n | 0 | +| test.c:828:9:828:9 | n | 1 | +| test.c:830:9:830:9 | n | 0 | +| test.c:833:10:833:10 | n | 0 | +| test.c:834:5:834:5 | n | 1 | +| test.c:837:7:837:7 | n | 0 | +| test.c:841:7:841:7 | n | -32768 | +| test.c:842:9:842:9 | n | -32768 | +| test.c:843:11:843:11 | n | 0 | +| test.c:847:7:847:7 | n | -32768 | +| test.c:848:13:848:13 | n | 5 | +| test.c:851:9:851:9 | n | 6 | +| test.c:854:7:854:7 | n | -32768 | +| test.c:854:22:854:22 | n | -32767 | +| test.c:855:9:855:9 | n | -32766 | +| test.c:858:7:858:7 | n | -32768 | +| test.c:859:5:859:5 | n | 0 | +| test.c:859:10:859:10 | n | 1 | +| test.c:859:14:859:14 | n | 0 | +| test.c:860:6:860:6 | n | 0 | +| test.c:860:10:860:10 | n | 0 | +| test.c:860:14:860:14 | n | 1 | +| test.c:871:7:871:8 | ss | -32768 | +| test.c:872:9:872:10 | ss | 0 | +| test.c:875:7:875:8 | ss | -32768 | +| test.c:876:9:876:10 | ss | -32768 | +| test.c:879:14:879:15 | us | 0 | +| test.c:880:9:880:10 | us | 0 | +| test.c:883:14:883:15 | us | 0 | +| test.c:884:9:884:10 | us | 0 | +| test.c:887:7:887:8 | ss | -32768 | +| test.c:888:9:888:10 | ss | -32768 | +| test.c:891:7:891:8 | ss | -32768 | +| test.c:892:9:892:10 | ss | -1 | +| test.c:898:8:898:8 | s | -2147483648 | +| test.c:898:15:898:15 | s | 0 | +| test.c:898:23:898:23 | s | 0 | +| test.c:899:18:899:18 | s | 0 | +| test.c:899:22:899:22 | s | 0 | +| test.c:900:9:900:14 | result | 0 | +| test.c:906:7:906:7 | i | 0 | +| test.c:907:9:907:9 | i | -2147483648 | +| test.c:911:7:911:7 | u | 0 | +| test.c:912:9:912:9 | u | 0 | +| test.c:917:12:917:12 | s | -2147483648 | +| test.c:918:7:918:8 | s2 | -4 | +| test.c:923:7:923:7 | x | -2147483648 | +| test.c:924:9:924:9 | y | -2147483648 | +| test.c:928:7:928:7 | y | -2147483648 | +| test.c:937:7:937:7 | x | -2147483648 | +| test.c:942:7:942:7 | x | -2147483648 | +| test.c:949:8:949:8 | x | 2147483647 | +| test.c:949:12:949:12 | y | 256 | +| test.c:950:9:950:9 | x | 2147483647 | +| test.c:951:9:951:9 | y | 256 | | test.cpp:10:7:10:7 | b | -2147483648 | | test.cpp:11:5:11:5 | x | -2147483648 | | test.cpp:13:10:13:10 | x | -2147483648 | diff --git a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/nrOfBounds.expected b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/nrOfBounds.expected new file mode 100644 index 00000000000..0d30eb30f75 --- /dev/null +++ b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/nrOfBounds.expected @@ -0,0 +1,4628 @@ +testFailures +estimateNrOfBounds +| inline_assembly.c:9:20:9:20 | 0 | 1.0 | +| inline_assembly.c:9:20:9:20 | (unsigned int)... | 1.0 | +| inline_assembly.c:10:3:10:3 | y | 1.0 | +| inline_assembly.c:10:3:10:7 | ... = ... | 1.0 | +| inline_assembly.c:10:7:10:7 | 1 | 1.0 | +| inline_assembly.c:10:7:10:7 | (unsigned int)... | 1.0 | +| inline_assembly.c:12:3:12:8 | call to printf | 1.0 | +| inline_assembly.c:12:29:12:29 | x | 1.0 | +| inline_assembly.c:12:32:12:32 | y | 1.0 | +| inline_assembly.c:16:25:16:25 | x | 1.0 | +| inline_assembly.c:16:35:16:35 | y | 1.0 | +| inline_assembly.c:21:3:21:8 | call to printf | 1.0 | +| inline_assembly.c:21:29:21:29 | x | 1.0 | +| inline_assembly.c:21:32:21:32 | y | 1.0 | +| inline_assembly.c:23:10:23:10 | 0 | 1.0 | +| minmax.c:16:9:16:10 | 1 | 1.0 | +| minmax.c:16:16:16:17 | 2 | 1.0 | +| minmax.c:16:23:16:24 | 3 | 1.0 | +| minmax.c:18:2:18:7 | call to printf | 1.0 | +| minmax.c:18:37:18:37 | x | 1.0 | +| minmax.c:18:40:18:40 | y | 1.0 | +| minmax.c:18:43:18:43 | z | 1.0 | +| minmax.c:20:2:20:2 | z | 1.0 | +| minmax.c:20:2:24:3 | ... = ... | 2.0 | +| minmax.c:20:6:24:3 | (statement expression) | 2.0 | +| minmax.c:21:10:21:11 | 0 | 1.0 | +| minmax.c:22:7:22:14 | ... != ... | 1.0 | +| minmax.c:22:8:22:8 | x | 1.0 | +| minmax.c:22:14:22:14 | y | 1.0 | +| minmax.c:22:18:22:18 | t | 1.0 | +| minmax.c:22:18:22:22 | ... = ... | 1.0 | +| minmax.c:22:22:22:22 | x | 1.0 | +| minmax.c:23:3:23:3 | t | 2.0 | +| minmax.c:26:2:26:7 | call to printf | 1.0 | +| minmax.c:26:37:26:37 | x | 1.0 | +| minmax.c:26:40:26:40 | y | 1.0 | +| minmax.c:26:43:26:43 | z | 2.0 | +| test.c:6:14:6:15 | 0 | 1.0 | +| test.c:8:5:8:9 | count | 1.0 | +| test.c:8:5:8:19 | ... = ... | 13.0 | +| test.c:8:13:8:17 | count | 13.0 | +| test.c:8:13:8:19 | ... + ... | 13.0 | +| test.c:8:19:8:19 | 1 | 1.0 | +| test.c:10:10:10:14 | count | 13.0 | +| test.c:14:14:14:15 | 0 | 1.0 | +| test.c:16:5:16:9 | count | 1.0 | +| test.c:16:5:16:26 | ... = ... | 13.0 | +| test.c:16:13:16:21 | (...) | 13.0 | +| test.c:16:13:16:26 | ... % ... | 13.0 | +| test.c:16:14:16:18 | count | 13.0 | +| test.c:16:14:16:20 | ... + ... | 13.0 | +| test.c:16:20:16:20 | 1 | 1.0 | +| test.c:16:25:16:26 | 10 | 1.0 | +| test.c:18:10:18:14 | count | 13.0 | +| test.c:22:14:22:15 | 0 | 1.0 | +| test.c:24:5:24:9 | count | 13.0 | +| test.c:24:5:24:11 | ... ++ | 13.0 | +| test.c:25:5:25:9 | count | 1.0 | +| test.c:25:5:25:22 | ... = ... | 13.0 | +| test.c:25:13:25:17 | count | 13.0 | +| test.c:25:13:25:22 | ... % ... | 13.0 | +| test.c:25:21:25:22 | 10 | 1.0 | +| test.c:27:10:27:14 | count | 13.0 | +| test.c:31:10:31:11 | 0 | 1.0 | +| test.c:32:14:32:15 | 0 | 1.0 | +| test.c:33:8:33:8 | i | 1.0 | +| test.c:33:8:33:12 | ... = ... | 1.0 | +| test.c:33:12:33:12 | 0 | 1.0 | +| test.c:33:15:33:15 | i | 13.0 | +| test.c:33:15:33:19 | ... < ... | 1.0 | +| test.c:33:19:33:19 | 2 | 1.0 | +| test.c:33:22:33:22 | i | 1.0 | +| test.c:33:22:33:28 | ... = ... | 13.0 | +| test.c:33:26:33:26 | i | 13.0 | +| test.c:33:26:33:28 | ... + ... | 13.0 | +| test.c:33:28:33:28 | 1 | 1.0 | +| test.c:34:5:34:9 | total | 13.0 | +| test.c:34:5:34:14 | ... += ... | 13.0 | +| test.c:34:14:34:14 | i | 13.0 | +| test.c:36:10:36:14 | total | 13.0 | +| test.c:36:10:36:18 | ... + ... | 13.0 | +| test.c:36:18:36:18 | i | 13.0 | +| test.c:40:10:40:11 | 0 | 1.0 | +| test.c:41:14:41:15 | 0 | 1.0 | +| test.c:42:8:42:8 | i | 1.0 | +| test.c:42:8:42:12 | ... = ... | 1.0 | +| test.c:42:12:42:12 | 0 | 1.0 | +| test.c:42:15:42:15 | i | 13.0 | +| test.c:42:15:42:19 | ... < ... | 1.0 | +| test.c:42:19:42:19 | 2 | 1.0 | +| test.c:42:22:42:22 | i | 13.0 | +| test.c:42:22:42:24 | ... ++ | 13.0 | +| test.c:43:5:43:9 | total | 13.0 | +| test.c:43:5:43:14 | ... += ... | 13.0 | +| test.c:43:14:43:14 | i | 13.0 | +| test.c:45:10:45:14 | total | 13.0 | +| test.c:45:10:45:18 | ... + ... | 13.0 | +| test.c:45:18:45:18 | i | 13.0 | +| test.c:49:10:49:11 | 0 | 1.0 | +| test.c:50:14:50:15 | 0 | 1.0 | +| test.c:51:8:51:8 | i | 1.0 | +| test.c:51:8:51:12 | ... = ... | 1.0 | +| test.c:51:12:51:12 | 0 | 1.0 | +| test.c:51:15:51:15 | i | 13.0 | +| test.c:51:15:51:17 | ... + ... | 13.0 | +| test.c:51:15:51:21 | ... < ... | 1.0 | +| test.c:51:17:51:17 | 2 | 1.0 | +| test.c:51:21:51:21 | 4 | 1.0 | +| test.c:51:24:51:24 | i | 1.0 | +| test.c:51:24:51:30 | ... = ... | 13.0 | +| test.c:51:28:51:28 | i | 13.0 | +| test.c:51:28:51:30 | ... + ... | 13.0 | +| test.c:51:30:51:30 | 1 | 1.0 | +| test.c:52:5:52:9 | total | 13.0 | +| test.c:52:5:52:14 | ... += ... | 13.0 | +| test.c:52:14:52:14 | i | 13.0 | +| test.c:54:10:54:14 | total | 13.0 | +| test.c:54:10:54:18 | ... + ... | 13.0 | +| test.c:54:18:54:18 | i | 13.0 | +| test.c:58:7:58:7 | i | 1.0 | +| test.c:58:7:58:11 | ... < ... | 1.0 | +| test.c:58:11:58:11 | 4 | 1.0 | +| test.c:59:9:59:9 | i | 1.0 | +| test.c:59:9:59:13 | ... < ... | 1.0 | +| test.c:59:13:59:13 | 5 | 1.0 | +| test.c:60:14:60:14 | i | 1.0 | +| test.c:63:10:63:10 | 1 | 1.0 | +| test.c:67:7:67:11 | - ... | 1.0 | +| test.c:67:7:67:15 | ... < ... | 1.0 | +| test.c:67:7:67:25 | ... && ... | 1.0 | +| test.c:67:8:67:11 | 1000 | 1.0 | +| test.c:67:15:67:15 | y | 1.0 | +| test.c:67:20:67:20 | y | 1.0 | +| test.c:67:20:67:25 | ... < ... | 1.0 | +| test.c:67:24:67:25 | 10 | 1.0 | +| test.c:68:9:68:9 | x | 1.0 | +| test.c:68:9:68:15 | ... < ... | 1.0 | +| test.c:68:13:68:13 | y | 1.0 | +| test.c:68:13:68:15 | ... - ... | 1.0 | +| test.c:68:15:68:15 | 2 | 1.0 | +| test.c:69:14:69:14 | x | 1.0 | +| test.c:72:10:72:10 | y | 1.0 | +| test.c:76:7:76:7 | y | 1.0 | +| test.c:76:7:76:12 | ... == ... | 1.0 | +| test.c:76:12:76:12 | 0 | 1.0 | +| test.c:77:9:77:9 | x | 1.0 | +| test.c:77:9:77:13 | ... < ... | 1.0 | +| test.c:77:13:77:13 | 4 | 1.0 | +| test.c:78:14:78:14 | 0 | 1.0 | +| test.c:81:9:81:9 | x | 1.0 | +| test.c:81:9:81:13 | ... < ... | 1.0 | +| test.c:81:13:81:13 | 4 | 1.0 | +| test.c:82:14:82:14 | 1 | 1.0 | +| test.c:85:10:85:10 | x | 1.0 | +| test.c:89:7:89:7 | y | 1.0 | +| test.c:89:7:89:11 | ... > ... | 1.0 | +| test.c:89:11:89:11 | 7 | 1.0 | +| test.c:90:9:90:9 | x | 1.0 | +| test.c:90:9:90:13 | ... < ... | 1.0 | +| test.c:90:13:90:13 | y | 1.0 | +| test.c:91:14:91:14 | 0 | 1.0 | +| test.c:93:12:93:12 | x | 1.0 | +| test.c:95:10:95:10 | 1 | 1.0 | +| test.c:100:3:100:3 | c | 1.0 | +| test.c:100:3:100:8 | ... = ... | 1.0 | +| test.c:100:7:100:8 | * ... | 1.0 | +| test.c:101:7:101:7 | (int)... | 1.0 | +| test.c:101:7:101:7 | c | 1.0 | +| test.c:101:7:101:15 | ... != ... | 1.0 | +| test.c:101:12:101:15 | 0 | 1.0 | +| test.c:102:5:102:8 | * ... | 1.0 | +| test.c:102:5:102:15 | ... = ... | 1.0 | +| test.c:102:12:102:15 | 0 | 1.0 | +| test.c:102:12:102:15 | (char)... | 1.0 | +| test.c:104:7:104:7 | (int)... | 2.0 | +| test.c:104:7:104:7 | c | 2.0 | +| test.c:104:7:104:14 | ... == ... | 1.0 | +| test.c:104:12:104:14 | 58 | 1.0 | +| test.c:105:5:105:5 | c | 1.0 | +| test.c:105:5:105:10 | ... = ... | 1.0 | +| test.c:105:9:105:10 | * ... | 1.0 | +| test.c:106:9:106:9 | (int)... | 1.0 | +| test.c:106:9:106:9 | c | 1.0 | +| test.c:106:9:106:17 | ... != ... | 1.0 | +| test.c:106:14:106:17 | 0 | 1.0 | +| test.c:107:7:107:10 | * ... | 1.0 | +| test.c:107:7:107:17 | ... = ... | 1.0 | +| test.c:107:14:107:17 | 0 | 1.0 | +| test.c:107:14:107:17 | (char)... | 1.0 | +| test.c:109:9:109:9 | (int)... | 2.0 | +| test.c:109:9:109:9 | c | 2.0 | +| test.c:109:9:109:16 | ... != ... | 1.0 | +| test.c:109:14:109:16 | 44 | 1.0 | +| test.c:110:14:110:14 | 1 | 1.0 | +| test.c:112:10:112:10 | 0 | 1.0 | +| test.c:118:24:118:24 | 0 | 1.0 | +| test.c:118:24:118:24 | (size_type)... | 1.0 | +| test.c:119:10:119:10 | n | 1.0 | +| test.c:119:10:119:12 | ... ++ | 1.0 | +| test.c:123:22:123:22 | 0 | 1.0 | +| test.c:123:22:123:22 | (size_type)... | 1.0 | +| test.c:124:11:124:15 | Start | 13.0 | +| test.c:124:11:124:36 | ... <= ... | 1.0 | +| test.c:124:20:124:32 | call to test12_helper | 1.0 | +| test.c:124:20:124:36 | ... - ... | 1.0 | +| test.c:124:36:124:36 | 1 | 1.0 | +| test.c:124:36:124:36 | (unsigned long long)... | 1.0 | +| test.c:126:31:126:43 | call to test12_helper | 1.0 | +| test.c:127:6:127:10 | Start | 13.0 | +| test.c:127:6:127:24 | ... += ... | 13.0 | +| test.c:127:15:127:20 | Length | 1.0 | +| test.c:127:15:127:24 | ... + ... | 1.0 | +| test.c:127:24:127:24 | 1 | 1.0 | +| test.c:127:24:127:24 | (unsigned long long)... | 1.0 | +| test.c:130:11:130:11 | 1 | 1.0 | +| test.c:135:22:135:22 | (unsigned char)... | 1.0 | +| test.c:135:22:135:22 | c | 1.0 | +| test.c:136:20:136:20 | 0 | 1.0 | +| test.c:136:20:136:20 | (unsigned int)... | 1.0 | +| test.c:137:20:137:20 | x | 1.0 | +| test.c:137:20:137:22 | ... - ... | 1.0 | +| test.c:137:22:137:22 | 1 | 1.0 | +| test.c:137:22:137:22 | (unsigned int)... | 1.0 | +| test.c:138:11:138:11 | i | 1.0 | +| test.c:138:11:138:13 | ... + ... | 1.0 | +| test.c:138:13:138:13 | 1 | 1.0 | +| test.c:139:10:139:41 | (double)... | 1.0 | +| test.c:139:10:139:41 | (int)... | 1.0 | +| test.c:139:18:139:41 | (...) | 1.0 | +| test.c:139:19:139:19 | (int)... | 1.0 | +| test.c:139:19:139:19 | c | 1.0 | +| test.c:139:19:139:23 | ... + ... | 1.0 | +| test.c:139:19:139:28 | (unsigned int)... | 1.0 | +| test.c:139:19:139:28 | ... + ... | 1.0 | +| test.c:139:19:139:32 | ... + ... | 1.0 | +| test.c:139:19:139:36 | ... + ... | 1.0 | +| test.c:139:19:139:40 | ... + ... | 1.0 | +| test.c:139:23:139:23 | i | 1.0 | +| test.c:139:27:139:28 | (int)... | 1.0 | +| test.c:139:27:139:28 | uc | 1.0 | +| test.c:139:32:139:32 | x | 1.0 | +| test.c:139:36:139:36 | y | 1.0 | +| test.c:139:40:139:40 | (unsigned int)... | 1.0 | +| test.c:139:40:139:40 | z | 1.0 | +| test.c:144:12:144:23 | (int)... | 1.0 | +| test.c:144:17:144:23 | (char)... | 1.0 | +| test.c:144:23:144:23 | x | 1.0 | +| test.c:145:12:145:32 | (int)... | 1.0 | +| test.c:145:17:145:32 | (unsigned char)... | 1.0 | +| test.c:145:32:145:32 | x | 1.0 | +| test.c:146:12:146:33 | (int)... | 1.0 | +| test.c:146:17:146:33 | (unsigned short)... | 1.0 | +| test.c:146:33:146:33 | x | 1.0 | +| test.c:147:12:147:31 | (int)... | 1.0 | +| test.c:147:17:147:31 | (unsigned int)... | 1.0 | +| test.c:147:31:147:31 | x | 1.0 | +| test.c:148:13:148:13 | (char)... | 1.0 | +| test.c:148:13:148:13 | x | 1.0 | +| test.c:149:23:149:23 | (unsigned short)... | 1.0 | +| test.c:149:23:149:23 | x | 1.0 | +| test.c:150:10:150:11 | x0 | 1.0 | +| test.c:150:10:150:16 | ... + ... | 1.0 | +| test.c:150:10:150:21 | ... + ... | 1.0 | +| test.c:150:10:150:26 | ... + ... | 1.0 | +| test.c:150:10:150:31 | ... + ... | 1.0 | +| test.c:150:10:150:36 | ... + ... | 1.0 | +| test.c:150:15:150:16 | x1 | 1.0 | +| test.c:150:20:150:21 | x2 | 1.0 | +| test.c:150:25:150:26 | x3 | 1.0 | +| test.c:150:30:150:31 | (int)... | 1.0 | +| test.c:150:30:150:31 | c0 | 1.0 | +| test.c:150:35:150:36 | (int)... | 1.0 | +| test.c:150:35:150:36 | s0 | 1.0 | +| test.c:154:10:154:31 | (...) | 1.0 | +| test.c:154:10:154:40 | ... ? ... : ... | 1.0 | +| test.c:154:11:154:11 | x | 1.0 | +| test.c:154:11:154:15 | ... > ... | 1.0 | +| test.c:154:11:154:30 | ... && ... | 1.0 | +| test.c:154:15:154:15 | 0 | 1.0 | +| test.c:154:15:154:15 | (long long)... | 1.0 | +| test.c:154:20:154:20 | x | 1.0 | +| test.c:154:20:154:30 | ... == ... | 1.0 | +| test.c:154:25:154:30 | (int)... | 1.0 | +| test.c:154:25:154:30 | (long long)... | 1.0 | +| test.c:154:30:154:30 | x | 1.0 | +| test.c:154:35:154:35 | x | 1.0 | +| test.c:154:39:154:40 | (long long)... | 1.0 | +| test.c:154:39:154:40 | - ... | 1.0 | +| test.c:154:40:154:40 | 1 | 1.0 | +| test.c:159:14:159:15 | 0 | 1.0 | +| test.c:161:7:161:7 | 3 | 1.0 | +| test.c:161:7:161:12 | ... <= ... | 1.0 | +| test.c:161:7:161:23 | ... && ... | 1.0 | +| test.c:161:12:161:12 | a | 1.0 | +| test.c:161:17:161:17 | a | 1.0 | +| test.c:161:17:161:23 | ... <= ... | 1.0 | +| test.c:161:22:161:23 | 11 | 1.0 | +| test.c:162:13:162:14 | + ... | 1.0 | +| test.c:162:14:162:14 | a | 1.0 | +| test.c:163:13:163:14 | - ... | 1.0 | +| test.c:163:14:163:14 | a | 1.0 | +| test.c:164:5:164:9 | total | 1.0 | +| test.c:164:5:164:16 | ... += ... | 1.0 | +| test.c:164:14:164:14 | b | 1.0 | +| test.c:164:14:164:16 | ... + ... | 1.0 | +| test.c:164:16:164:16 | c | 1.0 | +| test.c:166:7:166:7 | 0 | 1.0 | +| test.c:166:7:166:12 | ... <= ... | 1.0 | +| test.c:166:7:166:23 | ... && ... | 1.0 | +| test.c:166:12:166:12 | a | 2.0 | +| test.c:166:17:166:17 | a | 2.0 | +| test.c:166:17:166:23 | ... <= ... | 1.0 | +| test.c:166:22:166:23 | 11 | 1.0 | +| test.c:167:13:167:14 | + ... | 2.0 | +| test.c:167:14:167:14 | a | 2.0 | +| test.c:168:13:168:14 | - ... | 2.0 | +| test.c:168:14:168:14 | a | 2.0 | +| test.c:169:5:169:9 | total | 2.0 | +| test.c:169:5:169:16 | ... += ... | 8.0 | +| test.c:169:14:169:14 | b | 2.0 | +| test.c:169:14:169:16 | ... + ... | 4.0 | +| test.c:169:16:169:16 | c | 2.0 | +| test.c:171:7:171:8 | - ... | 1.0 | +| test.c:171:7:171:13 | ... <= ... | 1.0 | +| test.c:171:7:171:24 | ... && ... | 1.0 | +| test.c:171:8:171:8 | 7 | 1.0 | +| test.c:171:13:171:13 | a | 3.0 | +| test.c:171:18:171:18 | a | 3.0 | +| test.c:171:18:171:24 | ... <= ... | 1.0 | +| test.c:171:23:171:24 | 11 | 1.0 | +| test.c:172:13:172:14 | + ... | 3.0 | +| test.c:172:14:172:14 | a | 3.0 | +| test.c:173:13:173:14 | - ... | 3.0 | +| test.c:173:14:173:14 | a | 3.0 | +| test.c:174:5:174:9 | total | 10.0 | +| test.c:174:5:174:16 | ... += ... | 90.0 | +| test.c:174:14:174:14 | b | 3.0 | +| test.c:174:14:174:16 | ... + ... | 9.0 | +| test.c:174:16:174:16 | c | 3.0 | +| test.c:176:7:176:8 | - ... | 1.0 | +| test.c:176:7:176:13 | ... <= ... | 1.0 | +| test.c:176:7:176:23 | ... && ... | 1.0 | +| test.c:176:8:176:8 | 7 | 1.0 | +| test.c:176:13:176:13 | a | 4.0 | +| test.c:176:18:176:18 | a | 4.0 | +| test.c:176:18:176:23 | ... <= ... | 1.0 | +| test.c:176:23:176:23 | 1 | 1.0 | +| test.c:177:13:177:14 | + ... | 4.0 | +| test.c:177:14:177:14 | a | 4.0 | +| test.c:178:13:178:14 | - ... | 4.0 | +| test.c:178:14:178:14 | a | 4.0 | +| test.c:179:5:179:9 | total | 100.0 | +| test.c:179:5:179:16 | ... += ... | 1600.0 | +| test.c:179:14:179:14 | b | 4.0 | +| test.c:179:14:179:16 | ... + ... | 16.0 | +| test.c:179:16:179:16 | c | 4.0 | +| test.c:181:7:181:8 | - ... | 1.0 | +| test.c:181:7:181:13 | ... <= ... | 1.0 | +| test.c:181:7:181:23 | ... && ... | 1.0 | +| test.c:181:8:181:8 | 7 | 1.0 | +| test.c:181:13:181:13 | a | 5.0 | +| test.c:181:18:181:18 | a | 5.0 | +| test.c:181:18:181:23 | ... <= ... | 1.0 | +| test.c:181:23:181:23 | 0 | 1.0 | +| test.c:182:13:182:14 | + ... | 5.0 | +| test.c:182:14:182:14 | a | 5.0 | +| test.c:183:13:183:14 | - ... | 5.0 | +| test.c:183:14:183:14 | a | 5.0 | +| test.c:184:5:184:9 | total | 1700.0 | +| test.c:184:5:184:16 | ... += ... | 42500.0 | +| test.c:184:14:184:14 | b | 5.0 | +| test.c:184:14:184:16 | ... + ... | 25.0 | +| test.c:184:16:184:16 | c | 5.0 | +| test.c:186:7:186:8 | - ... | 1.0 | +| test.c:186:7:186:13 | ... <= ... | 1.0 | +| test.c:186:7:186:24 | ... && ... | 1.0 | +| test.c:186:8:186:8 | 7 | 1.0 | +| test.c:186:13:186:13 | a | 6.0 | +| test.c:186:18:186:18 | a | 6.0 | +| test.c:186:18:186:24 | ... <= ... | 1.0 | +| test.c:186:23:186:24 | - ... | 1.0 | +| test.c:186:24:186:24 | 2 | 1.0 | +| test.c:187:13:187:14 | + ... | 6.0 | +| test.c:187:14:187:14 | a | 6.0 | +| test.c:188:13:188:14 | - ... | 6.0 | +| test.c:188:14:188:14 | a | 6.0 | +| test.c:189:5:189:9 | total | 44200.0 | +| test.c:189:5:189:16 | ... += ... | 1591200.0 | +| test.c:189:14:189:14 | b | 6.0 | +| test.c:189:14:189:16 | ... + ... | 36.0 | +| test.c:189:16:189:16 | c | 6.0 | +| test.c:192:10:192:14 | total | 1635400.0 | +| test.c:198:14:198:15 | 0 | 1.0 | +| test.c:200:7:200:7 | 3 | 1.0 | +| test.c:200:7:200:12 | ... <= ... | 1.0 | +| test.c:200:7:200:23 | ... && ... | 1.0 | +| test.c:200:7:200:33 | ... && ... | 1.0 | +| test.c:200:7:200:44 | ... && ... | 1.0 | +| test.c:200:12:200:12 | a | 1.0 | +| test.c:200:17:200:17 | a | 1.0 | +| test.c:200:17:200:23 | ... <= ... | 1.0 | +| test.c:200:22:200:23 | 11 | 1.0 | +| test.c:200:28:200:28 | 5 | 1.0 | +| test.c:200:28:200:33 | ... <= ... | 1.0 | +| test.c:200:33:200:33 | b | 1.0 | +| test.c:200:38:200:38 | b | 1.0 | +| test.c:200:38:200:44 | ... <= ... | 1.0 | +| test.c:200:43:200:44 | 23 | 1.0 | +| test.c:201:13:201:13 | a | 1.0 | +| test.c:201:13:201:15 | ... * ... | 1.0 | +| test.c:201:15:201:15 | b | 1.0 | +| test.c:202:5:202:9 | total | 1.0 | +| test.c:202:5:202:14 | ... += ... | 1.0 | +| test.c:202:14:202:14 | r | 1.0 | +| test.c:204:7:204:7 | 3 | 1.0 | +| test.c:204:7:204:12 | ... <= ... | 1.0 | +| test.c:204:7:204:23 | ... && ... | 1.0 | +| test.c:204:7:204:33 | ... && ... | 1.0 | +| test.c:204:7:204:44 | ... && ... | 1.0 | +| test.c:204:12:204:12 | a | 2.0 | +| test.c:204:17:204:17 | a | 2.0 | +| test.c:204:17:204:23 | ... <= ... | 1.0 | +| test.c:204:22:204:23 | 11 | 1.0 | +| test.c:204:28:204:28 | 0 | 1.0 | +| test.c:204:28:204:33 | ... <= ... | 1.0 | +| test.c:204:33:204:33 | b | 3.0 | +| test.c:204:38:204:38 | b | 3.0 | +| test.c:204:38:204:44 | ... <= ... | 1.0 | +| test.c:204:43:204:44 | 23 | 1.0 | +| test.c:205:13:205:13 | a | 2.0 | +| test.c:205:13:205:15 | ... * ... | 1.0 | +| test.c:205:15:205:15 | b | 3.0 | +| test.c:206:5:206:9 | total | 2.0 | +| test.c:206:5:206:14 | ... += ... | 2.0 | +| test.c:206:14:206:14 | r | 1.0 | +| test.c:208:7:208:7 | 3 | 1.0 | +| test.c:208:7:208:12 | ... <= ... | 1.0 | +| test.c:208:7:208:23 | ... && ... | 1.0 | +| test.c:208:7:208:35 | ... && ... | 1.0 | +| test.c:208:7:208:46 | ... && ... | 1.0 | +| test.c:208:12:208:12 | a | 3.0 | +| test.c:208:17:208:17 | a | 3.0 | +| test.c:208:17:208:23 | ... <= ... | 1.0 | +| test.c:208:22:208:23 | 11 | 1.0 | +| test.c:208:28:208:30 | - ... | 1.0 | +| test.c:208:28:208:35 | ... <= ... | 1.0 | +| test.c:208:29:208:30 | 13 | 1.0 | +| test.c:208:35:208:35 | b | 7.0 | +| test.c:208:40:208:40 | b | 7.0 | +| test.c:208:40:208:46 | ... <= ... | 1.0 | +| test.c:208:45:208:46 | 23 | 1.0 | +| test.c:209:13:209:13 | a | 3.0 | +| test.c:209:13:209:15 | ... * ... | 1.0 | +| test.c:209:15:209:15 | b | 7.0 | +| test.c:210:5:210:9 | total | 4.0 | +| test.c:210:5:210:14 | ... += ... | 4.0 | +| test.c:210:14:210:14 | r | 1.0 | +| test.c:212:7:212:7 | 3 | 1.0 | +| test.c:212:7:212:12 | ... <= ... | 1.0 | +| test.c:212:7:212:23 | ... && ... | 1.0 | +| test.c:212:7:212:35 | ... && ... | 1.0 | +| test.c:212:7:212:45 | ... && ... | 1.0 | +| test.c:212:12:212:12 | a | 4.0 | +| test.c:212:17:212:17 | a | 4.0 | +| test.c:212:17:212:23 | ... <= ... | 1.0 | +| test.c:212:22:212:23 | 11 | 1.0 | +| test.c:212:28:212:30 | - ... | 1.0 | +| test.c:212:28:212:35 | ... <= ... | 1.0 | +| test.c:212:29:212:30 | 13 | 1.0 | +| test.c:212:35:212:35 | b | 15.0 | +| test.c:212:40:212:40 | b | 15.0 | +| test.c:212:40:212:45 | ... <= ... | 1.0 | +| test.c:212:45:212:45 | 0 | 1.0 | +| test.c:213:13:213:13 | a | 4.0 | +| test.c:213:13:213:15 | ... * ... | 1.0 | +| test.c:213:15:213:15 | b | 15.0 | +| test.c:214:5:214:9 | total | 8.0 | +| test.c:214:5:214:14 | ... += ... | 8.0 | +| test.c:214:14:214:14 | r | 1.0 | +| test.c:216:7:216:7 | 3 | 1.0 | +| test.c:216:7:216:12 | ... <= ... | 1.0 | +| test.c:216:7:216:23 | ... && ... | 1.0 | +| test.c:216:7:216:35 | ... && ... | 1.0 | +| test.c:216:7:216:46 | ... && ... | 1.0 | +| test.c:216:12:216:12 | a | 5.0 | +| test.c:216:17:216:17 | a | 5.0 | +| test.c:216:17:216:23 | ... <= ... | 1.0 | +| test.c:216:22:216:23 | 11 | 1.0 | +| test.c:216:28:216:30 | - ... | 1.0 | +| test.c:216:28:216:35 | ... <= ... | 1.0 | +| test.c:216:29:216:30 | 13 | 1.0 | +| test.c:216:35:216:35 | b | 31.0 | +| test.c:216:40:216:40 | b | 31.0 | +| test.c:216:40:216:46 | ... <= ... | 1.0 | +| test.c:216:45:216:46 | - ... | 1.0 | +| test.c:216:46:216:46 | 7 | 1.0 | +| test.c:217:13:217:13 | a | 5.0 | +| test.c:217:13:217:15 | ... * ... | 1.0 | +| test.c:217:15:217:15 | b | 31.0 | +| test.c:218:5:218:9 | total | 16.0 | +| test.c:218:5:218:14 | ... += ... | 16.0 | +| test.c:218:14:218:14 | r | 1.0 | +| test.c:221:10:221:14 | total | 32.0 | +| test.c:226:14:226:15 | 0 | 1.0 | +| test.c:228:7:228:7 | 0 | 1.0 | +| test.c:228:7:228:12 | ... <= ... | 1.0 | +| test.c:228:7:228:23 | ... && ... | 1.0 | +| test.c:228:7:228:33 | ... && ... | 1.0 | +| test.c:228:7:228:44 | ... && ... | 1.0 | +| test.c:228:12:228:12 | a | 1.0 | +| test.c:228:17:228:17 | a | 1.0 | +| test.c:228:17:228:23 | ... <= ... | 1.0 | +| test.c:228:22:228:23 | 11 | 1.0 | +| test.c:228:28:228:28 | 5 | 1.0 | +| test.c:228:28:228:33 | ... <= ... | 1.0 | +| test.c:228:33:228:33 | b | 1.0 | +| test.c:228:38:228:38 | b | 1.0 | +| test.c:228:38:228:44 | ... <= ... | 1.0 | +| test.c:228:43:228:44 | 23 | 1.0 | +| test.c:229:13:229:13 | a | 1.0 | +| test.c:229:13:229:15 | ... * ... | 1.0 | +| test.c:229:15:229:15 | b | 1.0 | +| test.c:230:5:230:9 | total | 1.0 | +| test.c:230:5:230:14 | ... += ... | 1.0 | +| test.c:230:14:230:14 | r | 1.0 | +| test.c:232:7:232:7 | 0 | 1.0 | +| test.c:232:7:232:12 | ... <= ... | 1.0 | +| test.c:232:7:232:23 | ... && ... | 1.0 | +| test.c:232:7:232:33 | ... && ... | 1.0 | +| test.c:232:7:232:44 | ... && ... | 1.0 | +| test.c:232:12:232:12 | a | 2.0 | +| test.c:232:17:232:17 | a | 2.0 | +| test.c:232:17:232:23 | ... <= ... | 1.0 | +| test.c:232:22:232:23 | 11 | 1.0 | +| test.c:232:28:232:28 | 0 | 1.0 | +| test.c:232:28:232:33 | ... <= ... | 1.0 | +| test.c:232:33:232:33 | b | 3.0 | +| test.c:232:38:232:38 | b | 3.0 | +| test.c:232:38:232:44 | ... <= ... | 1.0 | +| test.c:232:43:232:44 | 23 | 1.0 | +| test.c:233:13:233:13 | a | 2.0 | +| test.c:233:13:233:15 | ... * ... | 1.0 | +| test.c:233:15:233:15 | b | 3.0 | +| test.c:234:5:234:9 | total | 2.0 | +| test.c:234:5:234:14 | ... += ... | 2.0 | +| test.c:234:14:234:14 | r | 1.0 | +| test.c:236:7:236:7 | 0 | 1.0 | +| test.c:236:7:236:12 | ... <= ... | 1.0 | +| test.c:236:7:236:23 | ... && ... | 1.0 | +| test.c:236:7:236:35 | ... && ... | 1.0 | +| test.c:236:7:236:46 | ... && ... | 1.0 | +| test.c:236:12:236:12 | a | 3.0 | +| test.c:236:17:236:17 | a | 3.0 | +| test.c:236:17:236:23 | ... <= ... | 1.0 | +| test.c:236:22:236:23 | 11 | 1.0 | +| test.c:236:28:236:30 | - ... | 1.0 | +| test.c:236:28:236:35 | ... <= ... | 1.0 | +| test.c:236:29:236:30 | 13 | 1.0 | +| test.c:236:35:236:35 | b | 7.0 | +| test.c:236:40:236:40 | b | 7.0 | +| test.c:236:40:236:46 | ... <= ... | 1.0 | +| test.c:236:45:236:46 | 23 | 1.0 | +| test.c:237:13:237:13 | a | 3.0 | +| test.c:237:13:237:15 | ... * ... | 1.0 | +| test.c:237:15:237:15 | b | 7.0 | +| test.c:238:5:238:9 | total | 4.0 | +| test.c:238:5:238:14 | ... += ... | 4.0 | +| test.c:238:14:238:14 | r | 1.0 | +| test.c:240:7:240:7 | 0 | 1.0 | +| test.c:240:7:240:12 | ... <= ... | 1.0 | +| test.c:240:7:240:23 | ... && ... | 1.0 | +| test.c:240:7:240:35 | ... && ... | 1.0 | +| test.c:240:7:240:45 | ... && ... | 1.0 | +| test.c:240:12:240:12 | a | 4.0 | +| test.c:240:17:240:17 | a | 4.0 | +| test.c:240:17:240:23 | ... <= ... | 1.0 | +| test.c:240:22:240:23 | 11 | 1.0 | +| test.c:240:28:240:30 | - ... | 1.0 | +| test.c:240:28:240:35 | ... <= ... | 1.0 | +| test.c:240:29:240:30 | 13 | 1.0 | +| test.c:240:35:240:35 | b | 15.0 | +| test.c:240:40:240:40 | b | 15.0 | +| test.c:240:40:240:45 | ... <= ... | 1.0 | +| test.c:240:45:240:45 | 0 | 1.0 | +| test.c:241:13:241:13 | a | 4.0 | +| test.c:241:13:241:15 | ... * ... | 1.0 | +| test.c:241:15:241:15 | b | 15.0 | +| test.c:242:5:242:9 | total | 8.0 | +| test.c:242:5:242:14 | ... += ... | 8.0 | +| test.c:242:14:242:14 | r | 1.0 | +| test.c:244:7:244:7 | 0 | 1.0 | +| test.c:244:7:244:12 | ... <= ... | 1.0 | +| test.c:244:7:244:23 | ... && ... | 1.0 | +| test.c:244:7:244:35 | ... && ... | 1.0 | +| test.c:244:7:244:46 | ... && ... | 1.0 | +| test.c:244:12:244:12 | a | 5.0 | +| test.c:244:17:244:17 | a | 5.0 | +| test.c:244:17:244:23 | ... <= ... | 1.0 | +| test.c:244:22:244:23 | 11 | 1.0 | +| test.c:244:28:244:30 | - ... | 1.0 | +| test.c:244:28:244:35 | ... <= ... | 1.0 | +| test.c:244:29:244:30 | 13 | 1.0 | +| test.c:244:35:244:35 | b | 31.0 | +| test.c:244:40:244:40 | b | 31.0 | +| test.c:244:40:244:46 | ... <= ... | 1.0 | +| test.c:244:45:244:46 | - ... | 1.0 | +| test.c:244:46:244:46 | 7 | 1.0 | +| test.c:245:13:245:13 | a | 5.0 | +| test.c:245:13:245:15 | ... * ... | 1.0 | +| test.c:245:15:245:15 | b | 31.0 | +| test.c:246:5:246:9 | total | 16.0 | +| test.c:246:5:246:14 | ... += ... | 16.0 | +| test.c:246:14:246:14 | r | 1.0 | +| test.c:249:10:249:14 | total | 32.0 | +| test.c:254:14:254:15 | 0 | 1.0 | +| test.c:256:7:256:9 | - ... | 1.0 | +| test.c:256:7:256:14 | ... <= ... | 1.0 | +| test.c:256:7:256:25 | ... && ... | 1.0 | +| test.c:256:7:256:35 | ... && ... | 1.0 | +| test.c:256:7:256:46 | ... && ... | 1.0 | +| test.c:256:8:256:9 | 17 | 1.0 | +| test.c:256:14:256:14 | a | 1.0 | +| test.c:256:19:256:19 | a | 1.0 | +| test.c:256:19:256:25 | ... <= ... | 1.0 | +| test.c:256:24:256:25 | 11 | 1.0 | +| test.c:256:30:256:30 | 5 | 1.0 | +| test.c:256:30:256:35 | ... <= ... | 1.0 | +| test.c:256:35:256:35 | b | 1.0 | +| test.c:256:40:256:40 | b | 1.0 | +| test.c:256:40:256:46 | ... <= ... | 1.0 | +| test.c:256:45:256:46 | 23 | 1.0 | +| test.c:257:13:257:13 | a | 1.0 | +| test.c:257:13:257:15 | ... * ... | 1.0 | +| test.c:257:15:257:15 | b | 1.0 | +| test.c:258:5:258:9 | total | 1.0 | +| test.c:258:5:258:14 | ... += ... | 1.0 | +| test.c:258:14:258:14 | r | 1.0 | +| test.c:260:7:260:9 | - ... | 1.0 | +| test.c:260:7:260:14 | ... <= ... | 1.0 | +| test.c:260:7:260:25 | ... && ... | 1.0 | +| test.c:260:7:260:35 | ... && ... | 1.0 | +| test.c:260:7:260:46 | ... && ... | 1.0 | +| test.c:260:8:260:9 | 17 | 1.0 | +| test.c:260:14:260:14 | a | 2.0 | +| test.c:260:19:260:19 | a | 2.0 | +| test.c:260:19:260:25 | ... <= ... | 1.0 | +| test.c:260:24:260:25 | 11 | 1.0 | +| test.c:260:30:260:30 | 0 | 1.0 | +| test.c:260:30:260:35 | ... <= ... | 1.0 | +| test.c:260:35:260:35 | b | 3.0 | +| test.c:260:40:260:40 | b | 3.0 | +| test.c:260:40:260:46 | ... <= ... | 1.0 | +| test.c:260:45:260:46 | 23 | 1.0 | +| test.c:261:13:261:13 | a | 2.0 | +| test.c:261:13:261:15 | ... * ... | 1.0 | +| test.c:261:15:261:15 | b | 3.0 | +| test.c:262:5:262:9 | total | 2.0 | +| test.c:262:5:262:14 | ... += ... | 2.0 | +| test.c:262:14:262:14 | r | 1.0 | +| test.c:264:7:264:9 | - ... | 1.0 | +| test.c:264:7:264:14 | ... <= ... | 1.0 | +| test.c:264:7:264:25 | ... && ... | 1.0 | +| test.c:264:7:264:37 | ... && ... | 1.0 | +| test.c:264:7:264:48 | ... && ... | 1.0 | +| test.c:264:8:264:9 | 17 | 1.0 | +| test.c:264:14:264:14 | a | 3.0 | +| test.c:264:19:264:19 | a | 3.0 | +| test.c:264:19:264:25 | ... <= ... | 1.0 | +| test.c:264:24:264:25 | 11 | 1.0 | +| test.c:264:30:264:32 | - ... | 1.0 | +| test.c:264:30:264:37 | ... <= ... | 1.0 | +| test.c:264:31:264:32 | 13 | 1.0 | +| test.c:264:37:264:37 | b | 7.0 | +| test.c:264:42:264:42 | b | 7.0 | +| test.c:264:42:264:48 | ... <= ... | 1.0 | +| test.c:264:47:264:48 | 23 | 1.0 | +| test.c:265:13:265:13 | a | 3.0 | +| test.c:265:13:265:15 | ... * ... | 1.0 | +| test.c:265:15:265:15 | b | 7.0 | +| test.c:266:5:266:9 | total | 4.0 | +| test.c:266:5:266:14 | ... += ... | 4.0 | +| test.c:266:14:266:14 | r | 1.0 | +| test.c:268:7:268:9 | - ... | 1.0 | +| test.c:268:7:268:14 | ... <= ... | 1.0 | +| test.c:268:7:268:25 | ... && ... | 1.0 | +| test.c:268:7:268:37 | ... && ... | 1.0 | +| test.c:268:7:268:47 | ... && ... | 1.0 | +| test.c:268:8:268:9 | 17 | 1.0 | +| test.c:268:14:268:14 | a | 4.0 | +| test.c:268:19:268:19 | a | 4.0 | +| test.c:268:19:268:25 | ... <= ... | 1.0 | +| test.c:268:24:268:25 | 11 | 1.0 | +| test.c:268:30:268:32 | - ... | 1.0 | +| test.c:268:30:268:37 | ... <= ... | 1.0 | +| test.c:268:31:268:32 | 13 | 1.0 | +| test.c:268:37:268:37 | b | 15.0 | +| test.c:268:42:268:42 | b | 15.0 | +| test.c:268:42:268:47 | ... <= ... | 1.0 | +| test.c:268:47:268:47 | 0 | 1.0 | +| test.c:269:13:269:13 | a | 4.0 | +| test.c:269:13:269:15 | ... * ... | 1.0 | +| test.c:269:15:269:15 | b | 15.0 | +| test.c:270:5:270:9 | total | 8.0 | +| test.c:270:5:270:14 | ... += ... | 8.0 | +| test.c:270:14:270:14 | r | 1.0 | +| test.c:272:7:272:9 | - ... | 1.0 | +| test.c:272:7:272:14 | ... <= ... | 1.0 | +| test.c:272:7:272:25 | ... && ... | 1.0 | +| test.c:272:7:272:37 | ... && ... | 1.0 | +| test.c:272:7:272:48 | ... && ... | 1.0 | +| test.c:272:8:272:9 | 17 | 1.0 | +| test.c:272:14:272:14 | a | 5.0 | +| test.c:272:19:272:19 | a | 5.0 | +| test.c:272:19:272:25 | ... <= ... | 1.0 | +| test.c:272:24:272:25 | 11 | 1.0 | +| test.c:272:30:272:32 | - ... | 1.0 | +| test.c:272:30:272:37 | ... <= ... | 1.0 | +| test.c:272:31:272:32 | 13 | 1.0 | +| test.c:272:37:272:37 | b | 31.0 | +| test.c:272:42:272:42 | b | 31.0 | +| test.c:272:42:272:48 | ... <= ... | 1.0 | +| test.c:272:47:272:48 | - ... | 1.0 | +| test.c:272:48:272:48 | 7 | 1.0 | +| test.c:273:13:273:13 | a | 5.0 | +| test.c:273:13:273:15 | ... * ... | 1.0 | +| test.c:273:15:273:15 | b | 31.0 | +| test.c:274:5:274:9 | total | 16.0 | +| test.c:274:5:274:14 | ... += ... | 16.0 | +| test.c:274:14:274:14 | r | 1.0 | +| test.c:277:10:277:14 | total | 32.0 | +| test.c:282:14:282:15 | 0 | 1.0 | +| test.c:284:7:284:9 | - ... | 1.0 | +| test.c:284:7:284:14 | ... <= ... | 1.0 | +| test.c:284:7:284:24 | ... && ... | 1.0 | +| test.c:284:7:284:34 | ... && ... | 1.0 | +| test.c:284:7:284:45 | ... && ... | 1.0 | +| test.c:284:8:284:9 | 17 | 1.0 | +| test.c:284:14:284:14 | a | 1.0 | +| test.c:284:19:284:19 | a | 1.0 | +| test.c:284:19:284:24 | ... <= ... | 1.0 | +| test.c:284:24:284:24 | 0 | 1.0 | +| test.c:284:29:284:29 | 5 | 1.0 | +| test.c:284:29:284:34 | ... <= ... | 1.0 | +| test.c:284:34:284:34 | b | 1.0 | +| test.c:284:39:284:39 | b | 1.0 | +| test.c:284:39:284:45 | ... <= ... | 1.0 | +| test.c:284:44:284:45 | 23 | 1.0 | +| test.c:285:13:285:13 | a | 1.0 | +| test.c:285:13:285:15 | ... * ... | 1.0 | +| test.c:285:15:285:15 | b | 1.0 | +| test.c:286:5:286:9 | total | 1.0 | +| test.c:286:5:286:14 | ... += ... | 1.0 | +| test.c:286:14:286:14 | r | 1.0 | +| test.c:288:7:288:9 | - ... | 1.0 | +| test.c:288:7:288:14 | ... <= ... | 1.0 | +| test.c:288:7:288:24 | ... && ... | 1.0 | +| test.c:288:7:288:34 | ... && ... | 1.0 | +| test.c:288:7:288:45 | ... && ... | 1.0 | +| test.c:288:8:288:9 | 17 | 1.0 | +| test.c:288:14:288:14 | a | 2.0 | +| test.c:288:19:288:19 | a | 2.0 | +| test.c:288:19:288:24 | ... <= ... | 1.0 | +| test.c:288:24:288:24 | 0 | 1.0 | +| test.c:288:29:288:29 | 0 | 1.0 | +| test.c:288:29:288:34 | ... <= ... | 1.0 | +| test.c:288:34:288:34 | b | 3.0 | +| test.c:288:39:288:39 | b | 3.0 | +| test.c:288:39:288:45 | ... <= ... | 1.0 | +| test.c:288:44:288:45 | 23 | 1.0 | +| test.c:289:13:289:13 | a | 2.0 | +| test.c:289:13:289:15 | ... * ... | 1.0 | +| test.c:289:15:289:15 | b | 3.0 | +| test.c:290:5:290:9 | total | 2.0 | +| test.c:290:5:290:14 | ... += ... | 2.0 | +| test.c:290:14:290:14 | r | 1.0 | +| test.c:292:7:292:9 | - ... | 1.0 | +| test.c:292:7:292:14 | ... <= ... | 1.0 | +| test.c:292:7:292:24 | ... && ... | 1.0 | +| test.c:292:7:292:36 | ... && ... | 1.0 | +| test.c:292:7:292:47 | ... && ... | 1.0 | +| test.c:292:8:292:9 | 17 | 1.0 | +| test.c:292:14:292:14 | a | 3.0 | +| test.c:292:19:292:19 | a | 3.0 | +| test.c:292:19:292:24 | ... <= ... | 1.0 | +| test.c:292:24:292:24 | 0 | 1.0 | +| test.c:292:29:292:31 | - ... | 1.0 | +| test.c:292:29:292:36 | ... <= ... | 1.0 | +| test.c:292:30:292:31 | 13 | 1.0 | +| test.c:292:36:292:36 | b | 7.0 | +| test.c:292:41:292:41 | b | 7.0 | +| test.c:292:41:292:47 | ... <= ... | 1.0 | +| test.c:292:46:292:47 | 23 | 1.0 | +| test.c:293:13:293:13 | a | 3.0 | +| test.c:293:13:293:15 | ... * ... | 1.0 | +| test.c:293:15:293:15 | b | 7.0 | +| test.c:294:5:294:9 | total | 4.0 | +| test.c:294:5:294:14 | ... += ... | 4.0 | +| test.c:294:14:294:14 | r | 1.0 | +| test.c:296:7:296:9 | - ... | 1.0 | +| test.c:296:7:296:14 | ... <= ... | 1.0 | +| test.c:296:7:296:24 | ... && ... | 1.0 | +| test.c:296:7:296:36 | ... && ... | 1.0 | +| test.c:296:7:296:46 | ... && ... | 1.0 | +| test.c:296:8:296:9 | 17 | 1.0 | +| test.c:296:14:296:14 | a | 4.0 | +| test.c:296:19:296:19 | a | 4.0 | +| test.c:296:19:296:24 | ... <= ... | 1.0 | +| test.c:296:24:296:24 | 0 | 1.0 | +| test.c:296:29:296:31 | - ... | 1.0 | +| test.c:296:29:296:36 | ... <= ... | 1.0 | +| test.c:296:30:296:31 | 13 | 1.0 | +| test.c:296:36:296:36 | b | 15.0 | +| test.c:296:41:296:41 | b | 15.0 | +| test.c:296:41:296:46 | ... <= ... | 1.0 | +| test.c:296:46:296:46 | 0 | 1.0 | +| test.c:297:13:297:13 | a | 4.0 | +| test.c:297:13:297:15 | ... * ... | 1.0 | +| test.c:297:15:297:15 | b | 15.0 | +| test.c:298:5:298:9 | total | 8.0 | +| test.c:298:5:298:14 | ... += ... | 8.0 | +| test.c:298:14:298:14 | r | 1.0 | +| test.c:300:7:300:9 | - ... | 1.0 | +| test.c:300:7:300:14 | ... <= ... | 1.0 | +| test.c:300:7:300:24 | ... && ... | 1.0 | +| test.c:300:7:300:36 | ... && ... | 1.0 | +| test.c:300:7:300:47 | ... && ... | 1.0 | +| test.c:300:8:300:9 | 17 | 1.0 | +| test.c:300:14:300:14 | a | 5.0 | +| test.c:300:19:300:19 | a | 5.0 | +| test.c:300:19:300:24 | ... <= ... | 1.0 | +| test.c:300:24:300:24 | 0 | 1.0 | +| test.c:300:29:300:31 | - ... | 1.0 | +| test.c:300:29:300:36 | ... <= ... | 1.0 | +| test.c:300:30:300:31 | 13 | 1.0 | +| test.c:300:36:300:36 | b | 31.0 | +| test.c:300:41:300:41 | b | 31.0 | +| test.c:300:41:300:47 | ... <= ... | 1.0 | +| test.c:300:46:300:47 | - ... | 1.0 | +| test.c:300:47:300:47 | 7 | 1.0 | +| test.c:301:13:301:13 | a | 5.0 | +| test.c:301:13:301:15 | ... * ... | 1.0 | +| test.c:301:15:301:15 | b | 31.0 | +| test.c:302:5:302:9 | total | 16.0 | +| test.c:302:5:302:14 | ... += ... | 16.0 | +| test.c:302:14:302:14 | r | 1.0 | +| test.c:305:10:305:14 | total | 32.0 | +| test.c:310:14:310:15 | 0 | 1.0 | +| test.c:312:7:312:9 | - ... | 1.0 | +| test.c:312:7:312:14 | ... <= ... | 1.0 | +| test.c:312:7:312:25 | ... && ... | 1.0 | +| test.c:312:7:312:35 | ... && ... | 1.0 | +| test.c:312:7:312:46 | ... && ... | 1.0 | +| test.c:312:8:312:9 | 17 | 1.0 | +| test.c:312:14:312:14 | a | 1.0 | +| test.c:312:19:312:19 | a | 1.0 | +| test.c:312:19:312:25 | ... <= ... | 1.0 | +| test.c:312:24:312:25 | - ... | 1.0 | +| test.c:312:25:312:25 | 2 | 1.0 | +| test.c:312:30:312:30 | 5 | 1.0 | +| test.c:312:30:312:35 | ... <= ... | 1.0 | +| test.c:312:35:312:35 | b | 1.0 | +| test.c:312:40:312:40 | b | 1.0 | +| test.c:312:40:312:46 | ... <= ... | 1.0 | +| test.c:312:45:312:46 | 23 | 1.0 | +| test.c:313:13:313:13 | a | 1.0 | +| test.c:313:13:313:15 | ... * ... | 1.0 | +| test.c:313:15:313:15 | b | 1.0 | +| test.c:314:5:314:9 | total | 1.0 | +| test.c:314:5:314:14 | ... += ... | 1.0 | +| test.c:314:14:314:14 | r | 1.0 | +| test.c:316:7:316:9 | - ... | 1.0 | +| test.c:316:7:316:14 | ... <= ... | 1.0 | +| test.c:316:7:316:25 | ... && ... | 1.0 | +| test.c:316:7:316:35 | ... && ... | 1.0 | +| test.c:316:7:316:46 | ... && ... | 1.0 | +| test.c:316:8:316:9 | 17 | 1.0 | +| test.c:316:14:316:14 | a | 2.0 | +| test.c:316:19:316:19 | a | 2.0 | +| test.c:316:19:316:25 | ... <= ... | 1.0 | +| test.c:316:24:316:25 | - ... | 1.0 | +| test.c:316:25:316:25 | 2 | 1.0 | +| test.c:316:30:316:30 | 0 | 1.0 | +| test.c:316:30:316:35 | ... <= ... | 1.0 | +| test.c:316:35:316:35 | b | 3.0 | +| test.c:316:40:316:40 | b | 3.0 | +| test.c:316:40:316:46 | ... <= ... | 1.0 | +| test.c:316:45:316:46 | 23 | 1.0 | +| test.c:317:13:317:13 | a | 2.0 | +| test.c:317:13:317:15 | ... * ... | 1.0 | +| test.c:317:15:317:15 | b | 3.0 | +| test.c:318:5:318:9 | total | 2.0 | +| test.c:318:5:318:14 | ... += ... | 2.0 | +| test.c:318:14:318:14 | r | 1.0 | +| test.c:320:7:320:9 | - ... | 1.0 | +| test.c:320:7:320:14 | ... <= ... | 1.0 | +| test.c:320:7:320:25 | ... && ... | 1.0 | +| test.c:320:7:320:37 | ... && ... | 1.0 | +| test.c:320:7:320:48 | ... && ... | 1.0 | +| test.c:320:8:320:9 | 17 | 1.0 | +| test.c:320:14:320:14 | a | 3.0 | +| test.c:320:19:320:19 | a | 3.0 | +| test.c:320:19:320:25 | ... <= ... | 1.0 | +| test.c:320:24:320:25 | - ... | 1.0 | +| test.c:320:25:320:25 | 2 | 1.0 | +| test.c:320:30:320:32 | - ... | 1.0 | +| test.c:320:30:320:37 | ... <= ... | 1.0 | +| test.c:320:31:320:32 | 13 | 1.0 | +| test.c:320:37:320:37 | b | 7.0 | +| test.c:320:42:320:42 | b | 7.0 | +| test.c:320:42:320:48 | ... <= ... | 1.0 | +| test.c:320:47:320:48 | 23 | 1.0 | +| test.c:321:13:321:13 | a | 3.0 | +| test.c:321:13:321:15 | ... * ... | 1.0 | +| test.c:321:15:321:15 | b | 7.0 | +| test.c:322:5:322:9 | total | 4.0 | +| test.c:322:5:322:14 | ... += ... | 4.0 | +| test.c:322:14:322:14 | r | 1.0 | +| test.c:324:7:324:9 | - ... | 1.0 | +| test.c:324:7:324:14 | ... <= ... | 1.0 | +| test.c:324:7:324:25 | ... && ... | 1.0 | +| test.c:324:7:324:37 | ... && ... | 1.0 | +| test.c:324:7:324:47 | ... && ... | 1.0 | +| test.c:324:8:324:9 | 17 | 1.0 | +| test.c:324:14:324:14 | a | 4.0 | +| test.c:324:19:324:19 | a | 4.0 | +| test.c:324:19:324:25 | ... <= ... | 1.0 | +| test.c:324:24:324:25 | - ... | 1.0 | +| test.c:324:25:324:25 | 2 | 1.0 | +| test.c:324:30:324:32 | - ... | 1.0 | +| test.c:324:30:324:37 | ... <= ... | 1.0 | +| test.c:324:31:324:32 | 13 | 1.0 | +| test.c:324:37:324:37 | b | 15.0 | +| test.c:324:42:324:42 | b | 15.0 | +| test.c:324:42:324:47 | ... <= ... | 1.0 | +| test.c:324:47:324:47 | 0 | 1.0 | +| test.c:325:13:325:13 | a | 4.0 | +| test.c:325:13:325:15 | ... * ... | 1.0 | +| test.c:325:15:325:15 | b | 15.0 | +| test.c:326:5:326:9 | total | 8.0 | +| test.c:326:5:326:14 | ... += ... | 8.0 | +| test.c:326:14:326:14 | r | 1.0 | +| test.c:328:7:328:9 | - ... | 1.0 | +| test.c:328:7:328:14 | ... <= ... | 1.0 | +| test.c:328:7:328:25 | ... && ... | 1.0 | +| test.c:328:7:328:37 | ... && ... | 1.0 | +| test.c:328:7:328:48 | ... && ... | 1.0 | +| test.c:328:8:328:9 | 17 | 1.0 | +| test.c:328:14:328:14 | a | 5.0 | +| test.c:328:19:328:19 | a | 5.0 | +| test.c:328:19:328:25 | ... <= ... | 1.0 | +| test.c:328:24:328:25 | - ... | 1.0 | +| test.c:328:25:328:25 | 2 | 1.0 | +| test.c:328:30:328:32 | - ... | 1.0 | +| test.c:328:30:328:37 | ... <= ... | 1.0 | +| test.c:328:31:328:32 | 13 | 1.0 | +| test.c:328:37:328:37 | b | 31.0 | +| test.c:328:42:328:42 | b | 31.0 | +| test.c:328:42:328:48 | ... <= ... | 1.0 | +| test.c:328:47:328:48 | - ... | 1.0 | +| test.c:328:48:328:48 | 7 | 1.0 | +| test.c:329:13:329:13 | a | 5.0 | +| test.c:329:13:329:15 | ... * ... | 1.0 | +| test.c:329:15:329:15 | b | 31.0 | +| test.c:330:5:330:9 | total | 16.0 | +| test.c:330:5:330:14 | ... += ... | 16.0 | +| test.c:330:14:330:14 | r | 1.0 | +| test.c:333:10:333:14 | total | 32.0 | +| test.c:337:13:337:14 | 0 | 1.0 | +| test.c:338:7:338:7 | x | 1.0 | +| test.c:338:7:338:11 | ... < ... | 1.0 | +| test.c:338:11:338:11 | 0 | 1.0 | +| test.c:339:12:339:13 | - ... | 1.0 | +| test.c:339:13:339:13 | 1 | 1.0 | +| test.c:342:10:342:10 | i | 13.0 | +| test.c:342:10:342:14 | ... < ... | 1.0 | +| test.c:342:14:342:14 | 3 | 1.0 | +| test.c:343:5:343:5 | i | 13.0 | +| test.c:343:5:343:7 | ... ++ | 13.0 | +| test.c:345:3:345:3 | d | 1.0 | +| test.c:345:3:345:7 | ... = ... | 13.0 | +| test.c:345:7:345:7 | i | 13.0 | +| test.c:346:7:346:7 | x | 1.0 | +| test.c:346:7:346:11 | ... < ... | 1.0 | +| test.c:346:11:346:11 | 0 | 1.0 | +| test.c:347:9:347:9 | d | 13.0 | +| test.c:347:9:347:14 | ... > ... | 1.0 | +| test.c:347:13:347:14 | - ... | 1.0 | +| test.c:347:14:347:14 | x | 1.0 | +| test.c:348:14:348:14 | 1 | 1.0 | +| test.c:351:10:351:10 | 0 | 1.0 | +| test.c:357:3:357:4 | y1 | 1.0 | +| test.c:357:3:357:23 | ... = ... | 1.0 | +| test.c:357:8:357:8 | x | 1.0 | +| test.c:357:8:357:14 | ... < ... | 1.0 | +| test.c:357:8:357:23 | ... ? ... : ... | 1.0 | +| test.c:357:12:357:14 | 100 | 1.0 | +| test.c:357:12:357:14 | (unsigned int)... | 1.0 | +| test.c:357:18:357:18 | x | 1.0 | +| test.c:357:22:357:23 | 10 | 1.0 | +| test.c:357:22:357:23 | (unsigned int)... | 1.0 | +| test.c:358:3:358:4 | y2 | 1.0 | +| test.c:358:3:358:24 | ... = ... | 2.0 | +| test.c:358:8:358:8 | x | 2.0 | +| test.c:358:8:358:15 | ... >= ... | 1.0 | +| test.c:358:8:358:24 | ... ? ... : ... | 2.0 | +| test.c:358:13:358:15 | 100 | 1.0 | +| test.c:358:13:358:15 | (unsigned int)... | 1.0 | +| test.c:358:19:358:20 | 10 | 1.0 | +| test.c:358:19:358:20 | (unsigned int)... | 1.0 | +| test.c:358:24:358:24 | x | 2.0 | +| test.c:359:3:359:4 | y3 | 1.0 | +| test.c:359:3:359:8 | ... = ... | 1.0 | +| test.c:359:8:359:8 | 0 | 1.0 | +| test.c:359:8:359:8 | (unsigned int)... | 1.0 | +| test.c:360:3:360:4 | y4 | 1.0 | +| test.c:360:3:360:8 | ... = ... | 1.0 | +| test.c:360:8:360:8 | 0 | 1.0 | +| test.c:360:8:360:8 | (unsigned int)... | 1.0 | +| test.c:361:3:361:4 | y5 | 1.0 | +| test.c:361:3:361:8 | ... = ... | 1.0 | +| test.c:361:8:361:8 | 0 | 1.0 | +| test.c:361:8:361:8 | (unsigned int)... | 1.0 | +| test.c:362:3:362:4 | y6 | 1.0 | +| test.c:362:3:362:8 | ... = ... | 1.0 | +| test.c:362:8:362:8 | 0 | 1.0 | +| test.c:362:8:362:8 | (unsigned int)... | 1.0 | +| test.c:363:3:363:4 | y7 | 1.0 | +| test.c:363:3:363:8 | ... = ... | 1.0 | +| test.c:363:8:363:8 | 0 | 1.0 | +| test.c:363:8:363:8 | (unsigned int)... | 1.0 | +| test.c:364:3:364:4 | y8 | 1.0 | +| test.c:364:3:364:8 | ... = ... | 1.0 | +| test.c:364:8:364:8 | 0 | 1.0 | +| test.c:364:8:364:8 | (unsigned int)... | 1.0 | +| test.c:365:7:365:7 | x | 4.0 | +| test.c:365:7:365:13 | ... < ... | 1.0 | +| test.c:365:11:365:13 | 300 | 1.0 | +| test.c:365:11:365:13 | (unsigned int)... | 1.0 | +| test.c:366:5:366:6 | y3 | 1.0 | +| test.c:366:5:366:15 | ... = ... | 4.0 | +| test.c:366:10:366:10 | x | 4.0 | +| test.c:366:10:366:15 | ... ? ... : ... | 4.0 | +| test.c:366:15:366:15 | 5 | 1.0 | +| test.c:366:15:366:15 | (unsigned int)... | 1.0 | +| test.c:367:5:367:6 | y4 | 1.0 | +| test.c:367:5:367:17 | ... = ... | 4.0 | +| test.c:367:10:367:10 | x | 4.0 | +| test.c:367:10:367:17 | ... ? ... : ... | 4.0 | +| test.c:367:15:367:17 | 500 | 1.0 | +| test.c:367:15:367:17 | (unsigned int)... | 1.0 | +| test.c:368:5:368:6 | y5 | 1.0 | +| test.c:368:5:368:21 | ... = ... | 4.0 | +| test.c:368:10:368:14 | (...) | 4.0 | +| test.c:368:10:368:21 | ... ? ... : ... | 4.0 | +| test.c:368:11:368:11 | x | 4.0 | +| test.c:368:11:368:13 | ... + ... | 4.0 | +| test.c:368:13:368:13 | 1 | 1.0 | +| test.c:368:13:368:13 | (unsigned int)... | 1.0 | +| test.c:368:19:368:21 | 500 | 1.0 | +| test.c:368:19:368:21 | (unsigned int)... | 1.0 | +| test.c:369:5:369:6 | y6 | 1.0 | +| test.c:369:5:369:36 | ... = ... | 4.0 | +| test.c:369:10:369:31 | (...) | 4.0 | +| test.c:369:10:369:36 | (unsigned int)... | 4.0 | +| test.c:369:10:369:36 | ... ? ... : ... | 4.0 | +| test.c:369:11:369:30 | (unsigned char)... | 4.0 | +| test.c:369:26:369:30 | (...) | 4.0 | +| test.c:369:27:369:27 | x | 4.0 | +| test.c:369:27:369:29 | ... + ... | 4.0 | +| test.c:369:29:369:29 | 1 | 1.0 | +| test.c:369:29:369:29 | (unsigned int)... | 1.0 | +| test.c:369:36:369:36 | 5 | 1.0 | +| test.c:370:5:370:6 | y7 | 1.0 | +| test.c:370:5:370:38 | ... = ... | 4.0 | +| test.c:370:10:370:31 | (...) | 4.0 | +| test.c:370:10:370:38 | (unsigned int)... | 4.0 | +| test.c:370:10:370:38 | ... ? ... : ... | 4.0 | +| test.c:370:11:370:30 | (unsigned char)... | 4.0 | +| test.c:370:26:370:30 | (...) | 4.0 | +| test.c:370:27:370:27 | x | 4.0 | +| test.c:370:27:370:29 | ... + ... | 4.0 | +| test.c:370:29:370:29 | 1 | 1.0 | +| test.c:370:29:370:29 | (unsigned int)... | 1.0 | +| test.c:370:36:370:38 | 500 | 1.0 | +| test.c:371:5:371:6 | y8 | 1.0 | +| test.c:371:5:371:39 | ... = ... | 4.0 | +| test.c:371:10:371:32 | (...) | 4.0 | +| test.c:371:10:371:39 | (unsigned int)... | 4.0 | +| test.c:371:10:371:39 | ... ? ... : ... | 4.0 | +| test.c:371:11:371:31 | (unsigned short)... | 4.0 | +| test.c:371:27:371:31 | (...) | 4.0 | +| test.c:371:28:371:28 | x | 4.0 | +| test.c:371:28:371:30 | ... + ... | 4.0 | +| test.c:371:30:371:30 | 1 | 1.0 | +| test.c:371:30:371:30 | (unsigned int)... | 1.0 | +| test.c:371:37:371:39 | 500 | 1.0 | +| test.c:373:10:373:11 | y1 | 1.0 | +| test.c:373:10:373:16 | ... + ... | 2.0 | +| test.c:373:10:373:21 | ... + ... | 10.0 | +| test.c:373:10:373:26 | ... + ... | 50.0 | +| test.c:373:10:373:31 | ... + ... | 250.0 | +| test.c:373:10:373:36 | ... + ... | 1250.0 | +| test.c:373:10:373:41 | ... + ... | 6250.0 | +| test.c:373:10:373:46 | ... + ... | 31250.0 | +| test.c:373:15:373:16 | y2 | 2.0 | +| test.c:373:20:373:21 | y3 | 5.0 | +| test.c:373:25:373:26 | y4 | 5.0 | +| test.c:373:30:373:31 | y5 | 5.0 | +| test.c:373:35:373:36 | y6 | 5.0 | +| test.c:373:40:373:41 | y7 | 5.0 | +| test.c:373:45:373:46 | y8 | 5.0 | +| test.c:379:3:379:4 | y1 | 1.0 | +| test.c:379:3:379:24 | ... = ... | 1.0 | +| test.c:379:8:379:8 | x | 1.0 | +| test.c:379:8:379:14 | ... > ... | 1.0 | +| test.c:379:8:379:24 | ... ? ... : ... | 1.0 | +| test.c:379:12:379:14 | 100 | 1.0 | +| test.c:379:12:379:14 | (unsigned int)... | 1.0 | +| test.c:379:18:379:18 | x | 1.0 | +| test.c:379:22:379:24 | 110 | 1.0 | +| test.c:379:22:379:24 | (unsigned int)... | 1.0 | +| test.c:380:3:380:4 | y2 | 1.0 | +| test.c:380:3:380:25 | ... = ... | 2.0 | +| test.c:380:8:380:8 | x | 2.0 | +| test.c:380:8:380:15 | ... <= ... | 1.0 | +| test.c:380:8:380:25 | ... ? ... : ... | 2.0 | +| test.c:380:13:380:15 | 100 | 1.0 | +| test.c:380:13:380:15 | (unsigned int)... | 1.0 | +| test.c:380:19:380:21 | 110 | 1.0 | +| test.c:380:19:380:21 | (unsigned int)... | 1.0 | +| test.c:380:25:380:25 | x | 2.0 | +| test.c:381:3:381:4 | y3 | 1.0 | +| test.c:381:3:381:11 | ... = ... | 1.0 | +| test.c:381:8:381:11 | 1000 | 1.0 | +| test.c:381:8:381:11 | (unsigned int)... | 1.0 | +| test.c:382:3:382:4 | y4 | 1.0 | +| test.c:382:3:382:11 | ... = ... | 1.0 | +| test.c:382:8:382:11 | 1000 | 1.0 | +| test.c:382:8:382:11 | (unsigned int)... | 1.0 | +| test.c:383:3:383:4 | y5 | 1.0 | +| test.c:383:3:383:11 | ... = ... | 1.0 | +| test.c:383:8:383:11 | 1000 | 1.0 | +| test.c:383:8:383:11 | (unsigned int)... | 1.0 | +| test.c:384:7:384:7 | x | 4.0 | +| test.c:384:7:384:14 | ... >= ... | 1.0 | +| test.c:384:12:384:14 | 300 | 1.0 | +| test.c:384:12:384:14 | (unsigned int)... | 1.0 | +| test.c:385:5:385:6 | y3 | 1.0 | +| test.c:385:5:385:21 | ... = ... | 4.0 | +| test.c:385:10:385:16 | (...) | 4.0 | +| test.c:385:10:385:21 | ... ? ... : ... | 4.0 | +| test.c:385:11:385:11 | x | 4.0 | +| test.c:385:11:385:15 | ... - ... | 4.0 | +| test.c:385:13:385:15 | 300 | 1.0 | +| test.c:385:13:385:15 | (unsigned int)... | 1.0 | +| test.c:385:21:385:21 | 5 | 1.0 | +| test.c:385:21:385:21 | (unsigned int)... | 1.0 | +| test.c:386:5:386:6 | y4 | 1.0 | +| test.c:386:5:386:21 | ... = ... | 4.0 | +| test.c:386:10:386:16 | (...) | 4.0 | +| test.c:386:10:386:21 | ... ? ... : ... | 4.0 | +| test.c:386:11:386:11 | x | 4.0 | +| test.c:386:11:386:15 | ... - ... | 4.0 | +| test.c:386:13:386:15 | 200 | 1.0 | +| test.c:386:13:386:15 | (unsigned int)... | 1.0 | +| test.c:386:21:386:21 | 5 | 1.0 | +| test.c:386:21:386:21 | (unsigned int)... | 1.0 | +| test.c:387:5:387:6 | y5 | 1.0 | +| test.c:387:5:387:38 | ... = ... | 4.0 | +| test.c:387:10:387:33 | (...) | 4.0 | +| test.c:387:10:387:38 | (unsigned int)... | 4.0 | +| test.c:387:10:387:38 | ... ? ... : ... | 4.0 | +| test.c:387:11:387:32 | (unsigned char)... | 4.0 | +| test.c:387:26:387:32 | (...) | 4.0 | +| test.c:387:27:387:27 | x | 4.0 | +| test.c:387:27:387:31 | ... - ... | 4.0 | +| test.c:387:29:387:31 | 200 | 1.0 | +| test.c:387:29:387:31 | (unsigned int)... | 1.0 | +| test.c:387:38:387:38 | 5 | 1.0 | +| test.c:389:10:389:11 | y1 | 1.0 | +| test.c:389:10:389:16 | ... + ... | 2.0 | +| test.c:389:10:389:21 | ... + ... | 10.0 | +| test.c:389:10:389:26 | ... + ... | 50.0 | +| test.c:389:10:389:31 | ... + ... | 250.0 | +| test.c:389:15:389:16 | y2 | 2.0 | +| test.c:389:20:389:21 | y3 | 5.0 | +| test.c:389:25:389:26 | y4 | 5.0 | +| test.c:389:30:389:31 | y5 | 5.0 | +| test.c:394:14:394:14 | m | 1.0 | +| test.c:394:14:394:108 | ... ? ... : ... | 1.0 | +| test.c:394:18:394:18 | n | 1.0 | +| test.c:394:18:394:95 | ... ? ... : ... | 1.0 | +| test.c:394:22:394:22 | o | 1.0 | +| test.c:394:22:394:82 | ... ? ... : ... | 1.0 | +| test.c:394:26:394:26 | p | 1.0 | +| test.c:394:26:394:69 | ... ? ... : ... | 1.0 | +| test.c:394:30:394:30 | q | 1.0 | +| test.c:394:30:394:56 | ... ? ... : ... | 1.0 | +| test.c:394:34:394:43 | 0.4743882700000000008 | 1.0 | +| test.c:394:47:394:56 | 0.1433388700000000071 | 1.0 | +| test.c:394:60:394:69 | 0.3527920299999999787 | 1.0 | +| test.c:394:73:394:82 | 0.3920645799999999959 | 1.0 | +| test.c:394:86:394:95 | 0.2154022499999999896 | 1.0 | +| test.c:394:99:394:108 | 0.4049680500000000238 | 1.0 | +| test.c:395:14:395:14 | m | 2.0 | +| test.c:395:14:395:108 | ... ? ... : ... | 1.0 | +| test.c:395:18:395:18 | n | 3.0 | +| test.c:395:18:395:95 | ... ? ... : ... | 1.0 | +| test.c:395:22:395:22 | o | 3.0 | +| test.c:395:22:395:82 | ... ? ... : ... | 1.0 | +| test.c:395:26:395:26 | p | 3.0 | +| test.c:395:26:395:69 | ... ? ... : ... | 1.0 | +| test.c:395:30:395:30 | q | 3.0 | +| test.c:395:30:395:56 | ... ? ... : ... | 1.0 | +| test.c:395:34:395:43 | 0.3418334800000000229 | 1.0 | +| test.c:395:47:395:56 | 0.3533464000000000049 | 1.0 | +| test.c:395:60:395:69 | 0.2224785300000000077 | 1.0 | +| test.c:395:73:395:82 | 0.326618929999999974 | 1.0 | +| test.c:395:86:395:95 | 0.5927046500000000551 | 1.0 | +| test.c:395:99:395:108 | 0.5297741000000000255 | 1.0 | +| test.c:396:14:396:14 | m | 4.0 | +| test.c:396:14:396:108 | ... ? ... : ... | 1.0 | +| test.c:396:18:396:18 | n | 9.0 | +| test.c:396:18:396:95 | ... ? ... : ... | 1.0 | +| test.c:396:22:396:22 | o | 9.0 | +| test.c:396:22:396:82 | ... ? ... : ... | 1.0 | +| test.c:396:26:396:26 | p | 9.0 | +| test.c:396:26:396:69 | ... ? ... : ... | 1.0 | +| test.c:396:30:396:30 | q | 9.0 | +| test.c:396:30:396:56 | ... ? ... : ... | 1.0 | +| test.c:396:34:396:43 | 0.774296030000000024 | 1.0 | +| test.c:396:47:396:56 | 0.3147808400000000062 | 1.0 | +| test.c:396:60:396:69 | 0.3123551399999999756 | 1.0 | +| test.c:396:73:396:82 | 0.05121255999999999725 | 1.0 | +| test.c:396:86:396:95 | 0.7931074500000000471 | 1.0 | +| test.c:396:99:396:108 | 0.6798145100000000385 | 1.0 | +| test.c:397:14:397:14 | m | 8.0 | +| test.c:397:14:397:108 | ... ? ... : ... | 1.0 | +| test.c:397:18:397:18 | n | 27.0 | +| test.c:397:18:397:95 | ... ? ... : ... | 1.0 | +| test.c:397:22:397:22 | o | 27.0 | +| test.c:397:22:397:82 | ... ? ... : ... | 1.0 | +| test.c:397:26:397:26 | p | 27.0 | +| test.c:397:26:397:69 | ... ? ... : ... | 1.0 | +| test.c:397:30:397:30 | q | 27.0 | +| test.c:397:30:397:56 | ... ? ... : ... | 1.0 | +| test.c:397:34:397:43 | 0.4472955599999999809 | 1.0 | +| test.c:397:47:397:56 | 0.8059920200000000312 | 1.0 | +| test.c:397:60:397:69 | 0.9899726199999999698 | 1.0 | +| test.c:397:73:397:82 | 0.5995273199999999747 | 1.0 | +| test.c:397:86:397:95 | 0.3697694799999999837 | 1.0 | +| test.c:397:99:397:108 | 0.8386683499999999514 | 1.0 | +| test.c:398:14:398:14 | m | 16.0 | +| test.c:398:14:398:108 | ... ? ... : ... | 1.0 | +| test.c:398:18:398:18 | n | 81.0 | +| test.c:398:18:398:95 | ... ? ... : ... | 1.0 | +| test.c:398:22:398:22 | o | 81.0 | +| test.c:398:22:398:82 | ... ? ... : ... | 1.0 | +| test.c:398:26:398:26 | p | 81.0 | +| test.c:398:26:398:69 | ... ? ... : ... | 1.0 | +| test.c:398:30:398:30 | q | 81.0 | +| test.c:398:30:398:56 | ... ? ... : ... | 1.0 | +| test.c:398:34:398:43 | 0.4931182800000000199 | 1.0 | +| test.c:398:47:398:56 | 0.9038991100000000056 | 1.0 | +| test.c:398:60:398:69 | 0.1059771199999999941 | 1.0 | +| test.c:398:73:398:82 | 0.2177842600000000073 | 1.0 | +| test.c:398:86:398:95 | 0.7248596600000000167 | 1.0 | +| test.c:398:99:398:108 | 0.6873487400000000136 | 1.0 | +| test.c:399:14:399:14 | m | 32.0 | +| test.c:399:14:399:108 | ... ? ... : ... | 1.0 | +| test.c:399:18:399:18 | n | 243.0 | +| test.c:399:18:399:95 | ... ? ... : ... | 1.0 | +| test.c:399:22:399:22 | o | 243.0 | +| test.c:399:22:399:82 | ... ? ... : ... | 1.0 | +| test.c:399:26:399:26 | p | 243.0 | +| test.c:399:26:399:69 | ... ? ... : ... | 1.0 | +| test.c:399:30:399:30 | q | 243.0 | +| test.c:399:30:399:56 | ... ? ... : ... | 1.0 | +| test.c:399:34:399:43 | 0.4745284799999999747 | 1.0 | +| test.c:399:47:399:56 | 0.107866500000000004 | 1.0 | +| test.c:399:60:399:69 | 0.1188457599999999947 | 1.0 | +| test.c:399:73:399:82 | 0.7616405200000000431 | 1.0 | +| test.c:399:86:399:95 | 0.3480889200000000239 | 1.0 | +| test.c:399:99:399:108 | 0.584408649999999974 | 1.0 | +| test.c:400:14:400:14 | m | 64.0 | +| test.c:400:14:400:108 | ... ? ... : ... | 1.0 | +| test.c:400:18:400:18 | n | 729.0 | +| test.c:400:18:400:95 | ... ? ... : ... | 1.0 | +| test.c:400:22:400:22 | o | 729.0 | +| test.c:400:22:400:82 | ... ? ... : ... | 1.0 | +| test.c:400:26:400:26 | p | 729.0 | +| test.c:400:26:400:69 | ... ? ... : ... | 1.0 | +| test.c:400:30:400:30 | q | 729.0 | +| test.c:400:30:400:56 | ... ? ... : ... | 1.0 | +| test.c:400:34:400:43 | 0.02524326 | 1.0 | +| test.c:400:47:400:56 | 0.8290504600000000446 | 1.0 | +| test.c:400:60:400:69 | 0.95823075000000002 | 1.0 | +| test.c:400:73:400:82 | 0.1251655799999999985 | 1.0 | +| test.c:400:86:400:95 | 0.8523517900000000536 | 1.0 | +| test.c:400:99:400:108 | 0.3623238400000000081 | 1.0 | +| test.c:401:14:401:14 | m | 128.0 | +| test.c:401:14:401:108 | ... ? ... : ... | 1.0 | +| test.c:401:18:401:18 | n | 2187.0 | +| test.c:401:18:401:95 | ... ? ... : ... | 1.0 | +| test.c:401:22:401:22 | o | 2187.0 | +| test.c:401:22:401:82 | ... ? ... : ... | 1.0 | +| test.c:401:26:401:26 | p | 2187.0 | +| test.c:401:26:401:69 | ... ? ... : ... | 1.0 | +| test.c:401:30:401:30 | q | 2187.0 | +| test.c:401:30:401:56 | ... ? ... : ... | 1.0 | +| test.c:401:34:401:43 | 0.3870862600000000153 | 1.0 | +| test.c:401:47:401:56 | 0.3287604399999999871 | 1.0 | +| test.c:401:60:401:69 | 0.1496348500000000137 | 1.0 | +| test.c:401:73:401:82 | 0.4504110800000000192 | 1.0 | +| test.c:401:86:401:95 | 0.4864090899999999884 | 1.0 | +| test.c:401:99:401:108 | 0.8433127200000000157 | 1.0 | +| test.c:402:14:402:14 | m | 256.0 | +| test.c:402:14:402:108 | ... ? ... : ... | 1.0 | +| test.c:402:18:402:18 | n | 6561.0 | +| test.c:402:18:402:95 | ... ? ... : ... | 1.0 | +| test.c:402:22:402:22 | o | 6561.0 | +| test.c:402:22:402:82 | ... ? ... : ... | 1.0 | +| test.c:402:26:402:26 | p | 6561.0 | +| test.c:402:26:402:69 | ... ? ... : ... | 1.0 | +| test.c:402:30:402:30 | q | 6561.0 | +| test.c:402:30:402:56 | ... ? ... : ... | 1.0 | +| test.c:402:34:402:43 | 0.1575506299999999971 | 1.0 | +| test.c:402:47:402:56 | 0.7708683299999999905 | 1.0 | +| test.c:402:60:402:69 | 0.2642848099999999811 | 1.0 | +| test.c:402:73:402:82 | 0.1480050800000000111 | 1.0 | +| test.c:402:86:402:95 | 0.374281430000000026 | 1.0 | +| test.c:402:99:402:108 | 0.05328182000000000057 | 1.0 | +| test.c:403:14:403:14 | m | 512.0 | +| test.c:403:14:403:108 | ... ? ... : ... | 1.0 | +| test.c:403:18:403:18 | n | 19683.0 | +| test.c:403:18:403:95 | ... ? ... : ... | 1.0 | +| test.c:403:22:403:22 | o | 19683.0 | +| test.c:403:22:403:82 | ... ? ... : ... | 1.0 | +| test.c:403:26:403:26 | p | 19683.0 | +| test.c:403:26:403:69 | ... ? ... : ... | 1.0 | +| test.c:403:30:403:30 | q | 19683.0 | +| test.c:403:30:403:56 | ... ? ... : ... | 1.0 | +| test.c:403:34:403:43 | 0.4173653600000000186 | 1.0 | +| test.c:403:47:403:56 | 0.7682662799999999681 | 1.0 | +| test.c:403:60:403:69 | 0.2764323799999999776 | 1.0 | +| test.c:403:73:403:82 | 0.5567927400000000082 | 1.0 | +| test.c:403:86:403:95 | 0.3946885700000000163 | 1.0 | +| test.c:403:99:403:108 | 0.6907214400000000198 | 1.0 | +| test.c:404:14:404:14 | m | 1024.0 | +| test.c:404:14:404:108 | ... ? ... : ... | 1.0 | +| test.c:404:18:404:18 | n | 59049.0 | +| test.c:404:18:404:95 | ... ? ... : ... | 1.0 | +| test.c:404:22:404:22 | o | 59049.0 | +| test.c:404:22:404:82 | ... ? ... : ... | 1.0 | +| test.c:404:26:404:26 | p | 59049.0 | +| test.c:404:26:404:69 | ... ? ... : ... | 1.0 | +| test.c:404:30:404:30 | q | 59049.0 | +| test.c:404:30:404:56 | ... ? ... : ... | 1.0 | +| test.c:404:34:404:43 | 0.8895534499999999678 | 1.0 | +| test.c:404:47:404:56 | 0.2990482400000000207 | 1.0 | +| test.c:404:60:404:69 | 0.7624258299999999711 | 1.0 | +| test.c:404:73:404:82 | 0.2051910999999999874 | 1.0 | +| test.c:404:86:404:95 | 0.8874555899999999609 | 1.0 | +| test.c:404:99:404:108 | 0.8137279800000000174 | 1.0 | +| test.c:405:14:405:14 | m | 2048.0 | +| test.c:405:14:405:108 | ... ? ... : ... | 1.0 | +| test.c:405:18:405:18 | n | 177147.0 | +| test.c:405:18:405:95 | ... ? ... : ... | 1.0 | +| test.c:405:22:405:22 | o | 177147.0 | +| test.c:405:22:405:82 | ... ? ... : ... | 1.0 | +| test.c:405:26:405:26 | p | 177147.0 | +| test.c:405:26:405:69 | ... ? ... : ... | 1.0 | +| test.c:405:30:405:30 | q | 177147.0 | +| test.c:405:30:405:56 | ... ? ... : ... | 1.0 | +| test.c:405:34:405:43 | 0.4218627600000000033 | 1.0 | +| test.c:405:47:405:56 | 0.5384335799999999672 | 1.0 | +| test.c:405:60:405:69 | 0.4499667900000000054 | 1.0 | +| test.c:405:73:405:82 | 0.1320411400000000013 | 1.0 | +| test.c:405:86:405:95 | 0.5203124099999999475 | 1.0 | +| test.c:405:99:405:108 | 0.4276264699999999808 | 1.0 | +| test.c:411:19:411:19 | a | 1.0 | +| test.c:411:19:411:23 | ... + ... | 1.0 | +| test.c:411:19:411:27 | ... + ... | 1.0 | +| test.c:411:19:411:31 | ... + ... | 1.0 | +| test.c:411:19:411:35 | ... + ... | 1.0 | +| test.c:411:19:411:39 | ... + ... | 1.0 | +| test.c:411:19:411:43 | ... + ... | 1.0 | +| test.c:411:19:411:47 | ... + ... | 1.0 | +| test.c:411:19:411:51 | ... + ... | 1.0 | +| test.c:411:19:411:55 | ... + ... | 1.0 | +| test.c:411:19:411:59 | ... + ... | 1.0 | +| test.c:411:19:411:63 | ... + ... | 1.0 | +| test.c:411:23:411:23 | b | 1.0 | +| test.c:411:27:411:27 | c | 1.0 | +| test.c:411:31:411:31 | d | 1.0 | +| test.c:411:35:411:35 | e | 1.0 | +| test.c:411:39:411:39 | f | 1.0 | +| test.c:411:43:411:43 | g | 1.0 | +| test.c:411:47:411:47 | h | 1.0 | +| test.c:411:51:411:51 | i | 1.0 | +| test.c:411:55:411:55 | j | 1.0 | +| test.c:411:59:411:59 | k | 1.0 | +| test.c:411:63:411:63 | l | 1.0 | +| test.c:413:10:413:15 | output | 1.0 | +| test.c:420:7:420:9 | rhs | 1.0 | +| test.c:420:7:420:14 | ... < ... | 1.0 | +| test.c:420:13:420:14 | 12 | 1.0 | +| test.c:420:13:420:14 | (unsigned int)... | 1.0 | +| test.c:420:19:420:21 | rhs | 1.0 | +| test.c:420:19:420:26 | ... << ... | 1.0 | +| test.c:420:26:420:26 | 1 | 1.0 | +| test.c:421:7:421:9 | rhs | 2.0 | +| test.c:421:7:421:14 | ... < ... | 1.0 | +| test.c:421:13:421:14 | 13 | 1.0 | +| test.c:421:13:421:14 | (unsigned int)... | 1.0 | +| test.c:421:19:421:21 | rhs | 2.0 | +| test.c:421:19:421:26 | ... << ... | 1.0 | +| test.c:421:26:421:26 | 1 | 1.0 | +| test.c:422:7:422:9 | rhs | 3.0 | +| test.c:422:7:422:14 | ... < ... | 1.0 | +| test.c:422:13:422:14 | 14 | 1.0 | +| test.c:422:13:422:14 | (unsigned int)... | 1.0 | +| test.c:422:19:422:21 | rhs | 3.0 | +| test.c:422:19:422:26 | ... << ... | 1.0 | +| test.c:422:26:422:26 | 1 | 1.0 | +| test.c:423:7:423:9 | rhs | 4.0 | +| test.c:423:7:423:14 | ... < ... | 1.0 | +| test.c:423:13:423:14 | 15 | 1.0 | +| test.c:423:13:423:14 | (unsigned int)... | 1.0 | +| test.c:423:19:423:21 | rhs | 4.0 | +| test.c:423:19:423:26 | ... << ... | 1.0 | +| test.c:423:26:423:26 | 1 | 1.0 | +| test.c:424:7:424:9 | rhs | 5.0 | +| test.c:424:7:424:14 | ... < ... | 1.0 | +| test.c:424:13:424:14 | 16 | 1.0 | +| test.c:424:13:424:14 | (unsigned int)... | 1.0 | +| test.c:424:19:424:21 | rhs | 5.0 | +| test.c:424:19:424:26 | ... << ... | 1.0 | +| test.c:424:26:424:26 | 1 | 1.0 | +| test.c:425:10:425:12 | (int)... | 6.0 | +| test.c:425:10:425:12 | rhs | 6.0 | +| test.c:429:7:429:7 | a | 1.0 | +| test.c:429:7:429:13 | ... == ... | 1.0 | +| test.c:429:12:429:13 | 17 | 1.0 | +| test.c:430:9:430:9 | b | 1.0 | +| test.c:430:9:430:15 | ... == ... | 1.0 | +| test.c:430:14:430:15 | 23 | 1.0 | +| test.c:431:7:431:7 | a | 1.0 | +| test.c:431:7:431:12 | ... += ... | 1.0 | +| test.c:431:12:431:12 | b | 1.0 | +| test.c:433:9:433:9 | a | 2.0 | +| test.c:433:9:433:15 | ... == ... | 1.0 | +| test.c:433:14:433:15 | 18 | 1.0 | +| test.c:434:7:434:7 | b | 1.0 | +| test.c:434:7:434:12 | ... = ... | 1.0 | +| test.c:434:11:434:12 | 10 | 1.0 | +| test.c:439:11:439:11 | a | 4.0 | +| test.c:439:11:439:15 | ... + ... | 16.0 | +| test.c:439:15:439:15 | b | 4.0 | +| test.c:440:10:440:10 | a | 4.0 | +| test.c:440:10:440:14 | ... + ... | 16.0 | +| test.c:440:14:440:14 | b | 4.0 | +| test.c:447:4:449:50 | (...) | 1.0 | +| test.c:447:4:532:26 | ... > ... | 1.0 | +| test.c:447:4:621:27 | ... ? ... : ... | 1.297918419127476E201 | +| test.c:447:5:447:6 | 14 | 1.0 | +| test.c:447:5:447:6 | (unsigned int)... | 1.0 | +| test.c:447:5:447:11 | ... * ... | 1.0 | +| test.c:447:5:447:55 | ... > ... | 1.0 | +| test.c:447:5:449:49 | ... ? ... : ... | 1.0 | +| test.c:447:10:447:11 | ip | 1.0 | +| test.c:447:15:447:26 | (...) | 1.0 | +| test.c:447:15:447:31 | ... * ... | 1.0 | +| test.c:447:15:447:55 | ... + ... | 1.0 | +| test.c:447:16:447:16 | 2 | 1.0 | +| test.c:447:16:447:16 | (unsigned int)... | 1.0 | +| test.c:447:16:447:21 | ... * ... | 1.0 | +| test.c:447:16:447:25 | ... + ... | 1.0 | +| test.c:447:20:447:21 | ip | 1.0 | +| test.c:447:25:447:25 | 1 | 1.0 | +| test.c:447:25:447:25 | (unsigned int)... | 1.0 | +| test.c:447:30:447:31 | 17 | 1.0 | +| test.c:447:30:447:31 | (unsigned int)... | 1.0 | +| test.c:447:35:447:50 | (...) | 1.0 | +| test.c:447:35:447:55 | ... * ... | 1.0 | +| test.c:447:36:447:36 | 2 | 1.0 | +| test.c:447:36:447:36 | (unsigned int)... | 1.0 | +| test.c:447:36:447:41 | ... * ... | 1.0 | +| test.c:447:36:447:45 | ... + ... | 1.0 | +| test.c:447:36:447:49 | ... + ... | 1.0 | +| test.c:447:40:447:41 | ip | 1.0 | +| test.c:447:45:447:45 | 1 | 1.0 | +| test.c:447:45:447:45 | (unsigned int)... | 1.0 | +| test.c:447:49:447:49 | 1 | 1.0 | +| test.c:447:49:447:49 | (unsigned int)... | 1.0 | +| test.c:447:54:447:55 | 17 | 1.0 | +| test.c:447:54:447:55 | (unsigned int)... | 1.0 | +| test.c:448:9:448:10 | 14 | 1.0 | +| test.c:448:9:448:10 | (unsigned int)... | 1.0 | +| test.c:448:9:448:15 | ... * ... | 1.0 | +| test.c:448:14:448:15 | ip | 1.0 | +| test.c:449:9:449:20 | (...) | 1.0 | +| test.c:449:9:449:25 | ... * ... | 1.0 | +| test.c:449:9:449:49 | ... + ... | 1.0 | +| test.c:449:10:449:10 | 2 | 1.0 | +| test.c:449:10:449:10 | (unsigned int)... | 1.0 | +| test.c:449:10:449:15 | ... * ... | 1.0 | +| test.c:449:10:449:19 | ... + ... | 1.0 | +| test.c:449:14:449:15 | ip | 1.0 | +| test.c:449:19:449:19 | 1 | 1.0 | +| test.c:449:19:449:19 | (unsigned int)... | 1.0 | +| test.c:449:24:449:25 | 14 | 1.0 | +| test.c:449:24:449:25 | (unsigned int)... | 1.0 | +| test.c:449:29:449:44 | (...) | 1.0 | +| test.c:449:29:449:49 | ... * ... | 1.0 | +| test.c:449:30:449:30 | 2 | 1.0 | +| test.c:449:30:449:30 | (unsigned int)... | 1.0 | +| test.c:449:30:449:35 | ... * ... | 1.0 | +| test.c:449:30:449:39 | ... + ... | 1.0 | +| test.c:449:30:449:43 | ... + ... | 1.0 | +| test.c:449:34:449:35 | ip | 1.0 | +| test.c:449:39:449:39 | 1 | 1.0 | +| test.c:449:39:449:39 | (unsigned int)... | 1.0 | +| test.c:449:43:449:43 | 1 | 1.0 | +| test.c:449:43:449:43 | (unsigned int)... | 1.0 | +| test.c:449:48:449:49 | 17 | 1.0 | +| test.c:449:48:449:49 | (unsigned int)... | 1.0 | +| test.c:450:5:532:26 | (...) | 9.29462083211502E84 | +| test.c:450:6:450:6 | 2 | 1.0 | +| test.c:450:6:450:6 | (unsigned int)... | 1.0 | +| test.c:450:6:450:23 | ... * ... | 2.0 | +| test.c:450:6:469:42 | ... + ... | 4.524508125E10 | +| test.c:450:6:489:24 | ... > ... | 1.0 | +| test.c:450:6:532:25 | ... ? ... : ... | 9.29462083211502E84 | +| test.c:450:10:450:23 | (...) | 2.0 | +| test.c:450:11:450:12 | ip | 2.0 | +| test.c:450:11:450:17 | ... * ... | 2.0 | +| test.c:450:11:450:22 | ... + ... | 2.0 | +| test.c:450:16:450:17 | 14 | 1.0 | +| test.c:450:16:450:17 | (unsigned int)... | 1.0 | +| test.c:450:21:450:22 | 32 | 1.0 | +| test.c:450:21:450:22 | (unsigned int)... | 1.0 | +| test.c:451:7:469:42 | (...) | 2.2622540625E10 | +| test.c:451:8:451:8 | 4 | 1.0 | +| test.c:451:8:451:8 | (unsigned int)... | 1.0 | +| test.c:451:8:451:25 | ... * ... | 2.0 | +| test.c:451:8:452:26 | ... + ... | 4.0 | +| test.c:451:8:453:26 | ... + ... | 8.0 | +| test.c:451:8:458:22 | ... + ... | 1000.0 | +| test.c:451:8:459:37 | ... > ... | 1.0 | +| test.c:451:8:469:41 | ... ? ... : ... | 2.2622540625E10 | +| test.c:451:12:451:25 | (...) | 2.0 | +| test.c:451:13:451:14 | ip | 2.0 | +| test.c:451:13:451:19 | ... * ... | 2.0 | +| test.c:451:13:451:24 | ... + ... | 2.0 | +| test.c:451:18:451:19 | 14 | 1.0 | +| test.c:451:18:451:19 | (unsigned int)... | 1.0 | +| test.c:451:23:451:24 | 32 | 1.0 | +| test.c:451:23:451:24 | (unsigned int)... | 1.0 | +| test.c:452:9:452:26 | (...) | 2.0 | +| test.c:452:10:452:10 | 2 | 1.0 | +| test.c:452:10:452:10 | (unsigned int)... | 1.0 | +| test.c:452:10:452:15 | ... * ... | 2.0 | +| test.c:452:10:452:20 | ... * ... | 2.0 | +| test.c:452:10:452:25 | ... + ... | 2.0 | +| test.c:452:14:452:15 | ip | 2.0 | +| test.c:452:19:452:20 | 14 | 1.0 | +| test.c:452:19:452:20 | (unsigned int)... | 1.0 | +| test.c:452:24:452:25 | 32 | 1.0 | +| test.c:452:24:452:25 | (unsigned int)... | 1.0 | +| test.c:453:9:453:9 | 2 | 1.0 | +| test.c:453:9:453:9 | (unsigned int)... | 1.0 | +| test.c:453:9:453:26 | ... * ... | 2.0 | +| test.c:453:13:453:26 | (...) | 2.0 | +| test.c:453:14:453:15 | ip | 2.0 | +| test.c:453:14:453:20 | ... * ... | 2.0 | +| test.c:453:14:453:25 | ... + ... | 2.0 | +| test.c:453:19:453:20 | 14 | 1.0 | +| test.c:453:19:453:20 | (unsigned int)... | 1.0 | +| test.c:453:24:453:25 | 64 | 1.0 | +| test.c:453:24:453:25 | (unsigned int)... | 1.0 | +| test.c:454:9:458:22 | (...) | 125.0 | +| test.c:454:10:454:21 | (...) | 2.0 | +| test.c:454:10:454:26 | ... * ... | 2.0 | +| test.c:454:10:454:80 | ... > ... | 1.0 | +| test.c:454:10:458:21 | ... ? ... : ... | 125.0 | +| test.c:454:11:454:11 | 2 | 1.0 | +| test.c:454:11:454:11 | (unsigned int)... | 1.0 | +| test.c:454:11:454:16 | ... * ... | 2.0 | +| test.c:454:11:454:20 | ... + ... | 2.0 | +| test.c:454:15:454:16 | ip | 2.0 | +| test.c:454:20:454:20 | 1 | 1.0 | +| test.c:454:20:454:20 | (unsigned int)... | 1.0 | +| test.c:454:25:454:26 | 14 | 1.0 | +| test.c:454:25:454:26 | (unsigned int)... | 1.0 | +| test.c:454:30:454:80 | (...) | 4.0 | +| test.c:454:31:454:32 | 17 | 1.0 | +| test.c:454:31:454:32 | (unsigned int)... | 1.0 | +| test.c:454:31:454:43 | ... * ... | 2.0 | +| test.c:454:31:454:53 | ... > ... | 1.0 | +| test.c:454:31:454:79 | ... ? ... : ... | 4.0 | +| test.c:454:36:454:43 | (...) | 2.0 | +| test.c:454:37:454:37 | 2 | 1.0 | +| test.c:454:37:454:37 | (unsigned int)... | 1.0 | +| test.c:454:37:454:42 | ... * ... | 2.0 | +| test.c:454:41:454:42 | ip | 2.0 | +| test.c:454:47:454:48 | 17 | 1.0 | +| test.c:454:47:454:48 | (unsigned int)... | 1.0 | +| test.c:454:47:454:53 | ... * ... | 2.0 | +| test.c:454:52:454:53 | ip | 2.0 | +| test.c:454:57:454:58 | 17 | 1.0 | +| test.c:454:57:454:58 | (unsigned int)... | 1.0 | +| test.c:454:57:454:69 | ... * ... | 2.0 | +| test.c:454:62:454:69 | (...) | 2.0 | +| test.c:454:63:454:63 | 2 | 1.0 | +| test.c:454:63:454:63 | (unsigned int)... | 1.0 | +| test.c:454:63:454:68 | ... * ... | 2.0 | +| test.c:454:67:454:68 | ip | 2.0 | +| test.c:454:73:454:74 | 17 | 1.0 | +| test.c:454:73:454:74 | (unsigned int)... | 1.0 | +| test.c:454:73:454:79 | ... * ... | 2.0 | +| test.c:454:78:454:79 | ip | 2.0 | +| test.c:455:13:455:24 | (...) | 5.0 | +| test.c:455:13:455:29 | ... * ... | 5.0 | +| test.c:455:14:455:14 | 2 | 1.0 | +| test.c:455:14:455:14 | (unsigned int)... | 1.0 | +| test.c:455:14:455:19 | ... * ... | 5.0 | +| test.c:455:14:455:23 | ... + ... | 5.0 | +| test.c:455:18:455:19 | ip | 5.0 | +| test.c:455:23:455:23 | 1 | 1.0 | +| test.c:455:23:455:23 | (unsigned int)... | 1.0 | +| test.c:455:28:455:29 | 14 | 1.0 | +| test.c:455:28:455:29 | (unsigned int)... | 1.0 | +| test.c:456:13:456:14 | 14 | 1.0 | +| test.c:456:13:456:14 | (unsigned int)... | 1.0 | +| test.c:456:13:456:25 | ... * ... | 5.0 | +| test.c:456:13:456:35 | ... > ... | 1.0 | +| test.c:456:13:458:21 | ... ? ... : ... | 25.0 | +| test.c:456:18:456:25 | (...) | 5.0 | +| test.c:456:19:456:19 | 2 | 1.0 | +| test.c:456:19:456:19 | (unsigned int)... | 1.0 | +| test.c:456:19:456:24 | ... * ... | 5.0 | +| test.c:456:23:456:24 | ip | 5.0 | +| test.c:456:29:456:30 | 17 | 1.0 | +| test.c:456:29:456:30 | (unsigned int)... | 1.0 | +| test.c:456:29:456:35 | ... * ... | 5.0 | +| test.c:456:34:456:35 | ip | 5.0 | +| test.c:457:15:457:16 | 14 | 1.0 | +| test.c:457:15:457:16 | (unsigned int)... | 1.0 | +| test.c:457:15:457:27 | ... * ... | 5.0 | +| test.c:457:20:457:27 | (...) | 5.0 | +| test.c:457:21:457:21 | 2 | 1.0 | +| test.c:457:21:457:21 | (unsigned int)... | 1.0 | +| test.c:457:21:457:26 | ... * ... | 5.0 | +| test.c:457:25:457:26 | ip | 5.0 | +| test.c:458:15:458:16 | 14 | 1.0 | +| test.c:458:15:458:16 | (unsigned int)... | 1.0 | +| test.c:458:15:458:21 | ... * ... | 5.0 | +| test.c:458:20:458:21 | ip | 5.0 | +| test.c:459:7:459:7 | 2 | 1.0 | +| test.c:459:7:459:7 | (unsigned int)... | 1.0 | +| test.c:459:7:459:12 | ... * ... | 15.0 | +| test.c:459:7:459:17 | ... * ... | 15.0 | +| test.c:459:7:459:37 | ... + ... | 225.0 | +| test.c:459:11:459:12 | ip | 15.0 | +| test.c:459:16:459:17 | 14 | 1.0 | +| test.c:459:16:459:17 | (unsigned int)... | 1.0 | +| test.c:459:21:459:32 | (...) | 15.0 | +| test.c:459:21:459:37 | ... * ... | 15.0 | +| test.c:459:22:459:22 | 2 | 1.0 | +| test.c:459:22:459:22 | (unsigned int)... | 1.0 | +| test.c:459:22:459:27 | ... * ... | 15.0 | +| test.c:459:22:459:31 | ... + ... | 15.0 | +| test.c:459:26:459:27 | ip | 15.0 | +| test.c:459:31:459:31 | 1 | 1.0 | +| test.c:459:31:459:31 | (unsigned int)... | 1.0 | +| test.c:459:36:459:37 | 17 | 1.0 | +| test.c:459:36:459:37 | (unsigned int)... | 1.0 | +| test.c:460:11:460:11 | 4 | 1.0 | +| test.c:460:11:460:11 | (unsigned int)... | 1.0 | +| test.c:460:11:460:28 | ... * ... | 15.0 | +| test.c:460:11:461:28 | ... + ... | 225.0 | +| test.c:460:11:462:28 | ... + ... | 3375.0 | +| test.c:460:11:468:24 | ... + ... | 1.00544625E8 | +| test.c:460:15:460:28 | (...) | 15.0 | +| test.c:460:16:460:17 | ip | 15.0 | +| test.c:460:16:460:22 | ... * ... | 15.0 | +| test.c:460:16:460:27 | ... + ... | 15.0 | +| test.c:460:21:460:22 | 14 | 1.0 | +| test.c:460:21:460:22 | (unsigned int)... | 1.0 | +| test.c:460:26:460:27 | 32 | 1.0 | +| test.c:460:26:460:27 | (unsigned int)... | 1.0 | +| test.c:461:11:461:28 | (...) | 15.0 | +| test.c:461:12:461:12 | 2 | 1.0 | +| test.c:461:12:461:12 | (unsigned int)... | 1.0 | +| test.c:461:12:461:17 | ... * ... | 15.0 | +| test.c:461:12:461:22 | ... * ... | 15.0 | +| test.c:461:12:461:27 | ... + ... | 15.0 | +| test.c:461:16:461:17 | ip | 15.0 | +| test.c:461:21:461:22 | 14 | 1.0 | +| test.c:461:21:461:22 | (unsigned int)... | 1.0 | +| test.c:461:26:461:27 | 32 | 1.0 | +| test.c:461:26:461:27 | (unsigned int)... | 1.0 | +| test.c:462:11:462:11 | 2 | 1.0 | +| test.c:462:11:462:11 | (unsigned int)... | 1.0 | +| test.c:462:11:462:28 | ... * ... | 15.0 | +| test.c:462:15:462:28 | (...) | 15.0 | +| test.c:462:16:462:17 | ip | 15.0 | +| test.c:462:16:462:22 | ... * ... | 15.0 | +| test.c:462:16:462:27 | ... + ... | 15.0 | +| test.c:462:21:462:22 | 14 | 1.0 | +| test.c:462:21:462:22 | (unsigned int)... | 1.0 | +| test.c:462:26:462:27 | 64 | 1.0 | +| test.c:462:26:462:27 | (unsigned int)... | 1.0 | +| test.c:463:11:468:24 | (...) | 29791.0 | +| test.c:463:12:463:23 | (...) | 15.0 | +| test.c:463:12:463:28 | ... * ... | 15.0 | +| test.c:463:12:464:61 | ... > ... | 1.0 | +| test.c:463:12:468:23 | ... ? ... : ... | 29791.0 | +| test.c:463:13:463:13 | 2 | 1.0 | +| test.c:463:13:463:13 | (unsigned int)... | 1.0 | +| test.c:463:13:463:18 | ... * ... | 15.0 | +| test.c:463:13:463:22 | ... + ... | 15.0 | +| test.c:463:17:463:18 | ip | 15.0 | +| test.c:463:22:463:22 | 1 | 1.0 | +| test.c:463:22:463:22 | (unsigned int)... | 1.0 | +| test.c:463:27:463:28 | 14 | 1.0 | +| test.c:463:27:463:28 | (unsigned int)... | 1.0 | +| test.c:464:11:464:61 | (...) | 225.0 | +| test.c:464:12:464:13 | 14 | 1.0 | +| test.c:464:12:464:13 | (unsigned int)... | 1.0 | +| test.c:464:12:464:24 | ... * ... | 15.0 | +| test.c:464:12:464:34 | ... > ... | 1.0 | +| test.c:464:12:464:60 | ... ? ... : ... | 225.0 | +| test.c:464:17:464:24 | (...) | 15.0 | +| test.c:464:18:464:18 | 2 | 1.0 | +| test.c:464:18:464:18 | (unsigned int)... | 1.0 | +| test.c:464:18:464:23 | ... * ... | 15.0 | +| test.c:464:22:464:23 | ip | 15.0 | +| test.c:464:28:464:29 | 17 | 1.0 | +| test.c:464:28:464:29 | (unsigned int)... | 1.0 | +| test.c:464:28:464:34 | ... * ... | 15.0 | +| test.c:464:33:464:34 | ip | 15.0 | +| test.c:464:38:464:39 | 17 | 1.0 | +| test.c:464:38:464:39 | (unsigned int)... | 1.0 | +| test.c:464:38:464:50 | ... * ... | 15.0 | +| test.c:464:43:464:50 | (...) | 15.0 | +| test.c:464:44:464:44 | 2 | 1.0 | +| test.c:464:44:464:44 | (unsigned int)... | 1.0 | +| test.c:464:44:464:49 | ... * ... | 15.0 | +| test.c:464:48:464:49 | ip | 15.0 | +| test.c:464:54:464:55 | 17 | 1.0 | +| test.c:464:54:464:55 | (unsigned int)... | 1.0 | +| test.c:464:54:464:60 | ... * ... | 15.0 | +| test.c:464:59:464:60 | ip | 15.0 | +| test.c:465:15:465:26 | (...) | 31.0 | +| test.c:465:15:465:31 | ... * ... | 31.0 | +| test.c:465:16:465:16 | 2 | 1.0 | +| test.c:465:16:465:16 | (unsigned int)... | 1.0 | +| test.c:465:16:465:21 | ... * ... | 31.0 | +| test.c:465:16:465:25 | ... + ... | 31.0 | +| test.c:465:20:465:21 | ip | 31.0 | +| test.c:465:25:465:25 | 1 | 1.0 | +| test.c:465:25:465:25 | (unsigned int)... | 1.0 | +| test.c:465:30:465:31 | 14 | 1.0 | +| test.c:465:30:465:31 | (unsigned int)... | 1.0 | +| test.c:466:15:466:16 | 14 | 1.0 | +| test.c:466:15:466:16 | (unsigned int)... | 1.0 | +| test.c:466:15:466:27 | ... * ... | 31.0 | +| test.c:466:15:466:37 | ... > ... | 1.0 | +| test.c:466:15:468:23 | ... ? ... : ... | 961.0 | +| test.c:466:20:466:27 | (...) | 31.0 | +| test.c:466:21:466:21 | 2 | 1.0 | +| test.c:466:21:466:21 | (unsigned int)... | 1.0 | +| test.c:466:21:466:26 | ... * ... | 31.0 | +| test.c:466:25:466:26 | ip | 31.0 | +| test.c:466:31:466:32 | 17 | 1.0 | +| test.c:466:31:466:32 | (unsigned int)... | 1.0 | +| test.c:466:31:466:37 | ... * ... | 31.0 | +| test.c:466:36:466:37 | ip | 31.0 | +| test.c:467:17:467:18 | 14 | 1.0 | +| test.c:467:17:467:18 | (unsigned int)... | 1.0 | +| test.c:467:17:467:29 | ... * ... | 31.0 | +| test.c:467:22:467:29 | (...) | 31.0 | +| test.c:467:23:467:23 | 2 | 1.0 | +| test.c:467:23:467:23 | (unsigned int)... | 1.0 | +| test.c:467:23:467:28 | ... * ... | 31.0 | +| test.c:467:27:467:28 | ip | 31.0 | +| test.c:468:17:468:18 | 14 | 1.0 | +| test.c:468:17:468:18 | (unsigned int)... | 1.0 | +| test.c:468:17:468:23 | ... * ... | 31.0 | +| test.c:468:22:468:23 | ip | 31.0 | +| test.c:469:11:469:11 | 2 | 1.0 | +| test.c:469:11:469:11 | (unsigned int)... | 1.0 | +| test.c:469:11:469:16 | ... * ... | 15.0 | +| test.c:469:11:469:21 | ... * ... | 15.0 | +| test.c:469:11:469:41 | ... + ... | 225.0 | +| test.c:469:15:469:16 | ip | 15.0 | +| test.c:469:20:469:21 | 14 | 1.0 | +| test.c:469:20:469:21 | (unsigned int)... | 1.0 | +| test.c:469:25:469:36 | (...) | 15.0 | +| test.c:469:25:469:41 | ... * ... | 15.0 | +| test.c:469:26:469:26 | 2 | 1.0 | +| test.c:469:26:469:26 | (unsigned int)... | 1.0 | +| test.c:469:26:469:31 | ... * ... | 15.0 | +| test.c:469:26:469:35 | ... + ... | 15.0 | +| test.c:469:30:469:31 | ip | 15.0 | +| test.c:469:35:469:35 | 1 | 1.0 | +| test.c:469:35:469:35 | (unsigned int)... | 1.0 | +| test.c:469:40:469:41 | 17 | 1.0 | +| test.c:469:40:469:41 | (unsigned int)... | 1.0 | +| test.c:470:5:489:24 | (...) | 6.6142118960740864E25 | +| test.c:470:6:470:6 | 4 | 1.0 | +| test.c:470:6:470:6 | (unsigned int)... | 1.0 | +| test.c:470:6:470:23 | ... * ... | 108.0 | +| test.c:470:6:471:24 | ... + ... | 11664.0 | +| test.c:470:6:472:24 | ... + ... | 1259712.0 | +| test.c:470:6:477:20 | ... + ... | 1.2872131505856E13 | +| test.c:470:6:478:55 | ... > ... | 1.0 | +| test.c:470:6:489:23 | ... ? ... : ... | 6.6142118960740864E25 | +| test.c:470:10:470:23 | (...) | 108.0 | +| test.c:470:11:470:12 | ip | 108.0 | +| test.c:470:11:470:17 | ... * ... | 108.0 | +| test.c:470:11:470:22 | ... + ... | 108.0 | +| test.c:470:16:470:17 | 14 | 1.0 | +| test.c:470:16:470:17 | (unsigned int)... | 1.0 | +| test.c:470:21:470:22 | 32 | 1.0 | +| test.c:470:21:470:22 | (unsigned int)... | 1.0 | +| test.c:471:7:471:24 | (...) | 108.0 | +| test.c:471:8:471:8 | 2 | 1.0 | +| test.c:471:8:471:8 | (unsigned int)... | 1.0 | +| test.c:471:8:471:13 | ... * ... | 108.0 | +| test.c:471:8:471:18 | ... * ... | 108.0 | +| test.c:471:8:471:23 | ... + ... | 108.0 | +| test.c:471:12:471:13 | ip | 108.0 | +| test.c:471:17:471:18 | 14 | 1.0 | +| test.c:471:17:471:18 | (unsigned int)... | 1.0 | +| test.c:471:22:471:23 | 32 | 1.0 | +| test.c:471:22:471:23 | (unsigned int)... | 1.0 | +| test.c:472:7:472:7 | 2 | 1.0 | +| test.c:472:7:472:7 | (unsigned int)... | 1.0 | +| test.c:472:7:472:24 | ... * ... | 108.0 | +| test.c:472:11:472:24 | (...) | 108.0 | +| test.c:472:12:472:13 | ip | 108.0 | +| test.c:472:12:472:18 | ... * ... | 108.0 | +| test.c:472:12:472:23 | ... + ... | 108.0 | +| test.c:472:17:472:18 | 14 | 1.0 | +| test.c:472:17:472:18 | (unsigned int)... | 1.0 | +| test.c:472:22:472:23 | 64 | 1.0 | +| test.c:472:22:472:23 | (unsigned int)... | 1.0 | +| test.c:473:7:477:20 | (...) | 1.0218313E7 | +| test.c:473:8:473:19 | (...) | 108.0 | +| test.c:473:8:473:24 | ... * ... | 108.0 | +| test.c:473:8:473:78 | ... > ... | 1.0 | +| test.c:473:8:477:19 | ... ? ... : ... | 1.0218313E7 | +| test.c:473:9:473:9 | 2 | 1.0 | +| test.c:473:9:473:9 | (unsigned int)... | 1.0 | +| test.c:473:9:473:14 | ... * ... | 108.0 | +| test.c:473:9:473:18 | ... + ... | 108.0 | +| test.c:473:13:473:14 | ip | 108.0 | +| test.c:473:18:473:18 | 1 | 1.0 | +| test.c:473:18:473:18 | (unsigned int)... | 1.0 | +| test.c:473:23:473:24 | 14 | 1.0 | +| test.c:473:23:473:24 | (unsigned int)... | 1.0 | +| test.c:473:28:473:78 | (...) | 11664.0 | +| test.c:473:29:473:30 | 17 | 1.0 | +| test.c:473:29:473:30 | (unsigned int)... | 1.0 | +| test.c:473:29:473:41 | ... * ... | 108.0 | +| test.c:473:29:473:51 | ... > ... | 1.0 | +| test.c:473:29:473:77 | ... ? ... : ... | 11664.0 | +| test.c:473:34:473:41 | (...) | 108.0 | +| test.c:473:35:473:35 | 2 | 1.0 | +| test.c:473:35:473:35 | (unsigned int)... | 1.0 | +| test.c:473:35:473:40 | ... * ... | 108.0 | +| test.c:473:39:473:40 | ip | 108.0 | +| test.c:473:45:473:46 | 17 | 1.0 | +| test.c:473:45:473:46 | (unsigned int)... | 1.0 | +| test.c:473:45:473:51 | ... * ... | 108.0 | +| test.c:473:50:473:51 | ip | 108.0 | +| test.c:473:55:473:56 | 17 | 1.0 | +| test.c:473:55:473:56 | (unsigned int)... | 1.0 | +| test.c:473:55:473:67 | ... * ... | 108.0 | +| test.c:473:60:473:67 | (...) | 108.0 | +| test.c:473:61:473:61 | 2 | 1.0 | +| test.c:473:61:473:61 | (unsigned int)... | 1.0 | +| test.c:473:61:473:66 | ... * ... | 108.0 | +| test.c:473:65:473:66 | ip | 108.0 | +| test.c:473:71:473:72 | 17 | 1.0 | +| test.c:473:71:473:72 | (unsigned int)... | 1.0 | +| test.c:473:71:473:77 | ... * ... | 108.0 | +| test.c:473:76:473:77 | ip | 108.0 | +| test.c:474:11:474:22 | (...) | 217.0 | +| test.c:474:11:474:27 | ... * ... | 217.0 | +| test.c:474:12:474:12 | 2 | 1.0 | +| test.c:474:12:474:12 | (unsigned int)... | 1.0 | +| test.c:474:12:474:17 | ... * ... | 217.0 | +| test.c:474:12:474:21 | ... + ... | 217.0 | +| test.c:474:16:474:17 | ip | 217.0 | +| test.c:474:21:474:21 | 1 | 1.0 | +| test.c:474:21:474:21 | (unsigned int)... | 1.0 | +| test.c:474:26:474:27 | 14 | 1.0 | +| test.c:474:26:474:27 | (unsigned int)... | 1.0 | +| test.c:475:11:475:12 | 14 | 1.0 | +| test.c:475:11:475:12 | (unsigned int)... | 1.0 | +| test.c:475:11:475:23 | ... * ... | 217.0 | +| test.c:475:11:475:33 | ... > ... | 1.0 | +| test.c:475:11:477:19 | ... ? ... : ... | 47089.0 | +| test.c:475:16:475:23 | (...) | 217.0 | +| test.c:475:17:475:17 | 2 | 1.0 | +| test.c:475:17:475:17 | (unsigned int)... | 1.0 | +| test.c:475:17:475:22 | ... * ... | 217.0 | +| test.c:475:21:475:22 | ip | 217.0 | +| test.c:475:27:475:28 | 17 | 1.0 | +| test.c:475:27:475:28 | (unsigned int)... | 1.0 | +| test.c:475:27:475:33 | ... * ... | 217.0 | +| test.c:475:32:475:33 | ip | 217.0 | +| test.c:476:13:476:14 | 14 | 1.0 | +| test.c:476:13:476:14 | (unsigned int)... | 1.0 | +| test.c:476:13:476:25 | ... * ... | 217.0 | +| test.c:476:18:476:25 | (...) | 217.0 | +| test.c:476:19:476:19 | 2 | 1.0 | +| test.c:476:19:476:19 | (unsigned int)... | 1.0 | +| test.c:476:19:476:24 | ... * ... | 217.0 | +| test.c:476:23:476:24 | ip | 217.0 | +| test.c:477:13:477:14 | 14 | 1.0 | +| test.c:477:13:477:14 | (unsigned int)... | 1.0 | +| test.c:477:13:477:19 | ... * ... | 217.0 | +| test.c:477:18:477:19 | ip | 217.0 | +| test.c:478:5:478:55 | (...) | 423801.0 | +| test.c:478:6:478:7 | 14 | 1.0 | +| test.c:478:6:478:7 | (unsigned int)... | 1.0 | +| test.c:478:6:478:12 | ... * ... | 651.0 | +| test.c:478:6:478:28 | ... > ... | 1.0 | +| test.c:478:6:478:54 | ... ? ... : ... | 423801.0 | +| test.c:478:11:478:12 | ip | 651.0 | +| test.c:478:16:478:23 | (...) | 651.0 | +| test.c:478:16:478:28 | ... * ... | 651.0 | +| test.c:478:17:478:18 | ip | 651.0 | +| test.c:478:17:478:22 | ... + ... | 651.0 | +| test.c:478:22:478:22 | 1 | 1.0 | +| test.c:478:22:478:22 | (unsigned int)... | 1.0 | +| test.c:478:27:478:28 | 17 | 1.0 | +| test.c:478:27:478:28 | (unsigned int)... | 1.0 | +| test.c:478:32:478:33 | 17 | 1.0 | +| test.c:478:32:478:33 | (unsigned int)... | 1.0 | +| test.c:478:32:478:38 | ... * ... | 651.0 | +| test.c:478:37:478:38 | ip | 651.0 | +| test.c:478:42:478:49 | (...) | 651.0 | +| test.c:478:42:478:54 | ... * ... | 651.0 | +| test.c:478:43:478:44 | ip | 651.0 | +| test.c:478:43:478:48 | ... + ... | 651.0 | +| test.c:478:48:478:48 | 1 | 1.0 | +| test.c:478:48:478:48 | (unsigned int)... | 1.0 | +| test.c:478:53:478:54 | 17 | 1.0 | +| test.c:478:53:478:54 | (unsigned int)... | 1.0 | +| test.c:479:9:479:9 | 4 | 1.0 | +| test.c:479:9:479:9 | (unsigned int)... | 1.0 | +| test.c:479:9:479:26 | ... * ... | 1302.0 | +| test.c:479:9:480:26 | ... + ... | 1695204.0 | +| test.c:479:9:481:26 | ... + ... | 2.207155608E9 | +| test.c:479:9:486:22 | ... + ... | 3.9017203216097214E19 | +| test.c:479:13:479:26 | (...) | 1302.0 | +| test.c:479:14:479:15 | ip | 1302.0 | +| test.c:479:14:479:20 | ... * ... | 1302.0 | +| test.c:479:14:479:25 | ... + ... | 1302.0 | +| test.c:479:19:479:20 | 14 | 1.0 | +| test.c:479:19:479:20 | (unsigned int)... | 1.0 | +| test.c:479:24:479:25 | 32 | 1.0 | +| test.c:479:24:479:25 | (unsigned int)... | 1.0 | +| test.c:480:9:480:26 | (...) | 1302.0 | +| test.c:480:10:480:10 | 2 | 1.0 | +| test.c:480:10:480:10 | (unsigned int)... | 1.0 | +| test.c:480:10:480:15 | ... * ... | 1302.0 | +| test.c:480:10:480:20 | ... * ... | 1302.0 | +| test.c:480:10:480:25 | ... + ... | 1302.0 | +| test.c:480:14:480:15 | ip | 1302.0 | +| test.c:480:19:480:20 | 14 | 1.0 | +| test.c:480:19:480:20 | (unsigned int)... | 1.0 | +| test.c:480:24:480:25 | 32 | 1.0 | +| test.c:480:24:480:25 | (unsigned int)... | 1.0 | +| test.c:481:9:481:9 | 2 | 1.0 | +| test.c:481:9:481:9 | (unsigned int)... | 1.0 | +| test.c:481:9:481:26 | ... * ... | 1302.0 | +| test.c:481:13:481:26 | (...) | 1302.0 | +| test.c:481:14:481:15 | ip | 1302.0 | +| test.c:481:14:481:20 | ... * ... | 1302.0 | +| test.c:481:14:481:25 | ... + ... | 1302.0 | +| test.c:481:19:481:20 | 14 | 1.0 | +| test.c:481:19:481:20 | (unsigned int)... | 1.0 | +| test.c:481:24:481:25 | 64 | 1.0 | +| test.c:481:24:481:25 | (unsigned int)... | 1.0 | +| test.c:482:9:486:22 | (...) | 1.7677595125E10 | +| test.c:482:10:482:21 | (...) | 1302.0 | +| test.c:482:10:482:26 | ... * ... | 1302.0 | +| test.c:482:10:482:80 | ... > ... | 1.0 | +| test.c:482:10:486:21 | ... ? ... : ... | 1.7677595125E10 | +| test.c:482:11:482:11 | 2 | 1.0 | +| test.c:482:11:482:11 | (unsigned int)... | 1.0 | +| test.c:482:11:482:16 | ... * ... | 1302.0 | +| test.c:482:11:482:20 | ... + ... | 1302.0 | +| test.c:482:15:482:16 | ip | 1302.0 | +| test.c:482:20:482:20 | 1 | 1.0 | +| test.c:482:20:482:20 | (unsigned int)... | 1.0 | +| test.c:482:25:482:26 | 14 | 1.0 | +| test.c:482:25:482:26 | (unsigned int)... | 1.0 | +| test.c:482:30:482:80 | (...) | 1695204.0 | +| test.c:482:31:482:32 | 17 | 1.0 | +| test.c:482:31:482:32 | (unsigned int)... | 1.0 | +| test.c:482:31:482:43 | ... * ... | 1302.0 | +| test.c:482:31:482:53 | ... > ... | 1.0 | +| test.c:482:31:482:79 | ... ? ... : ... | 1695204.0 | +| test.c:482:36:482:43 | (...) | 1302.0 | +| test.c:482:37:482:37 | 2 | 1.0 | +| test.c:482:37:482:37 | (unsigned int)... | 1.0 | +| test.c:482:37:482:42 | ... * ... | 1302.0 | +| test.c:482:41:482:42 | ip | 1302.0 | +| test.c:482:47:482:48 | 17 | 1.0 | +| test.c:482:47:482:48 | (unsigned int)... | 1.0 | +| test.c:482:47:482:53 | ... * ... | 1302.0 | +| test.c:482:52:482:53 | ip | 1302.0 | +| test.c:482:57:482:58 | 17 | 1.0 | +| test.c:482:57:482:58 | (unsigned int)... | 1.0 | +| test.c:482:57:482:69 | ... * ... | 1302.0 | +| test.c:482:62:482:69 | (...) | 1302.0 | +| test.c:482:63:482:63 | 2 | 1.0 | +| test.c:482:63:482:63 | (unsigned int)... | 1.0 | +| test.c:482:63:482:68 | ... * ... | 1302.0 | +| test.c:482:67:482:68 | ip | 1302.0 | +| test.c:482:73:482:74 | 17 | 1.0 | +| test.c:482:73:482:74 | (unsigned int)... | 1.0 | +| test.c:482:73:482:79 | ... * ... | 1302.0 | +| test.c:482:78:482:79 | ip | 1302.0 | +| test.c:483:13:483:24 | (...) | 2605.0 | +| test.c:483:13:483:29 | ... * ... | 2605.0 | +| test.c:483:14:483:14 | 2 | 1.0 | +| test.c:483:14:483:14 | (unsigned int)... | 1.0 | +| test.c:483:14:483:19 | ... * ... | 2605.0 | +| test.c:483:14:483:23 | ... + ... | 2605.0 | +| test.c:483:18:483:19 | ip | 2605.0 | +| test.c:483:23:483:23 | 1 | 1.0 | +| test.c:483:23:483:23 | (unsigned int)... | 1.0 | +| test.c:483:28:483:29 | 14 | 1.0 | +| test.c:483:28:483:29 | (unsigned int)... | 1.0 | +| test.c:484:13:484:14 | 14 | 1.0 | +| test.c:484:13:484:14 | (unsigned int)... | 1.0 | +| test.c:484:13:484:25 | ... * ... | 2605.0 | +| test.c:484:13:484:35 | ... > ... | 1.0 | +| test.c:484:13:486:21 | ... ? ... : ... | 6786025.0 | +| test.c:484:18:484:25 | (...) | 2605.0 | +| test.c:484:19:484:19 | 2 | 1.0 | +| test.c:484:19:484:19 | (unsigned int)... | 1.0 | +| test.c:484:19:484:24 | ... * ... | 2605.0 | +| test.c:484:23:484:24 | ip | 2605.0 | +| test.c:484:29:484:30 | 17 | 1.0 | +| test.c:484:29:484:30 | (unsigned int)... | 1.0 | +| test.c:484:29:484:35 | ... * ... | 2605.0 | +| test.c:484:34:484:35 | ip | 2605.0 | +| test.c:485:15:485:16 | 14 | 1.0 | +| test.c:485:15:485:16 | (unsigned int)... | 1.0 | +| test.c:485:15:485:27 | ... * ... | 2605.0 | +| test.c:485:20:485:27 | (...) | 2605.0 | +| test.c:485:21:485:21 | 2 | 1.0 | +| test.c:485:21:485:21 | (unsigned int)... | 1.0 | +| test.c:485:21:485:26 | ... * ... | 2605.0 | +| test.c:485:25:485:26 | ip | 2605.0 | +| test.c:486:15:486:16 | 14 | 1.0 | +| test.c:486:15:486:16 | (unsigned int)... | 1.0 | +| test.c:486:15:486:21 | ... * ... | 2605.0 | +| test.c:486:20:486:21 | ip | 2605.0 | +| test.c:487:9:487:10 | 14 | 1.0 | +| test.c:487:9:487:10 | (unsigned int)... | 1.0 | +| test.c:487:9:487:15 | ... * ... | 1302.0 | +| test.c:487:9:487:31 | ... > ... | 1.0 | +| test.c:487:9:489:23 | ... ? ... : ... | 1695204.0 | +| test.c:487:14:487:15 | ip | 1302.0 | +| test.c:487:19:487:26 | (...) | 1302.0 | +| test.c:487:19:487:31 | ... * ... | 1302.0 | +| test.c:487:20:487:21 | ip | 1302.0 | +| test.c:487:20:487:25 | ... + ... | 1302.0 | +| test.c:487:25:487:25 | 1 | 1.0 | +| test.c:487:25:487:25 | (unsigned int)... | 1.0 | +| test.c:487:30:487:31 | 17 | 1.0 | +| test.c:487:30:487:31 | (unsigned int)... | 1.0 | +| test.c:488:11:488:12 | 14 | 1.0 | +| test.c:488:11:488:12 | (unsigned int)... | 1.0 | +| test.c:488:11:488:17 | ... * ... | 1302.0 | +| test.c:488:16:488:17 | ip | 1302.0 | +| test.c:489:11:489:18 | (...) | 1302.0 | +| test.c:489:11:489:23 | ... * ... | 1302.0 | +| test.c:489:12:489:13 | ip | 1302.0 | +| test.c:489:12:489:17 | ... + ... | 1302.0 | +| test.c:489:17:489:17 | 1 | 1.0 | +| test.c:489:17:489:17 | (unsigned int)... | 1.0 | +| test.c:489:22:489:23 | 14 | 1.0 | +| test.c:489:22:489:23 | (unsigned int)... | 1.0 | +| test.c:490:9:490:9 | 2 | 1.0 | +| test.c:490:9:490:9 | (unsigned int)... | 1.0 | +| test.c:490:9:490:26 | ... * ... | 10419.0 | +| test.c:490:9:510:44 | ... + ... | 1.9449636104972528E43 | +| test.c:490:13:490:26 | (...) | 10419.0 | +| test.c:490:14:490:15 | ip | 10419.0 | +| test.c:490:14:490:20 | ... * ... | 10419.0 | +| test.c:490:14:490:25 | ... + ... | 10419.0 | +| test.c:490:19:490:20 | 14 | 1.0 | +| test.c:490:19:490:20 | (unsigned int)... | 1.0 | +| test.c:490:24:490:25 | 32 | 1.0 | +| test.c:490:24:490:25 | (unsigned int)... | 1.0 | +| test.c:491:9:510:44 | (...) | 1.8667469147684545E39 | +| test.c:491:10:491:10 | 4 | 1.0 | +| test.c:491:10:491:10 | (unsigned int)... | 1.0 | +| test.c:491:10:491:27 | ... * ... | 10419.0 | +| test.c:491:10:492:28 | ... + ... | 1.08555561E8 | +| test.c:491:10:493:28 | ... + ... | 1.131040390059E12 | +| test.c:491:10:499:24 | ... + ... | 1.0235492350954187E25 | +| test.c:491:10:500:39 | ... > ... | 1.0 | +| test.c:491:10:510:43 | ... ? ... : ... | 1.8667469147684545E39 | +| test.c:491:14:491:27 | (...) | 10419.0 | +| test.c:491:15:491:16 | ip | 10419.0 | +| test.c:491:15:491:21 | ... * ... | 10419.0 | +| test.c:491:15:491:26 | ... + ... | 10419.0 | +| test.c:491:20:491:21 | 14 | 1.0 | +| test.c:491:20:491:21 | (unsigned int)... | 1.0 | +| test.c:491:25:491:26 | 32 | 1.0 | +| test.c:491:25:491:26 | (unsigned int)... | 1.0 | +| test.c:492:11:492:28 | (...) | 10419.0 | +| test.c:492:12:492:12 | 2 | 1.0 | +| test.c:492:12:492:12 | (unsigned int)... | 1.0 | +| test.c:492:12:492:17 | ... * ... | 10419.0 | +| test.c:492:12:492:22 | ... * ... | 10419.0 | +| test.c:492:12:492:27 | ... + ... | 10419.0 | +| test.c:492:16:492:17 | ip | 10419.0 | +| test.c:492:21:492:22 | 14 | 1.0 | +| test.c:492:21:492:22 | (unsigned int)... | 1.0 | +| test.c:492:26:492:27 | 32 | 1.0 | +| test.c:492:26:492:27 | (unsigned int)... | 1.0 | +| test.c:493:11:493:11 | 2 | 1.0 | +| test.c:493:11:493:11 | (unsigned int)... | 1.0 | +| test.c:493:11:493:28 | ... * ... | 10419.0 | +| test.c:493:15:493:28 | (...) | 10419.0 | +| test.c:493:16:493:17 | ip | 10419.0 | +| test.c:493:16:493:22 | ... * ... | 10419.0 | +| test.c:493:16:493:27 | ... + ... | 10419.0 | +| test.c:493:21:493:22 | 14 | 1.0 | +| test.c:493:21:493:22 | (unsigned int)... | 1.0 | +| test.c:493:26:493:27 | 64 | 1.0 | +| test.c:493:26:493:27 | (unsigned int)... | 1.0 | +| test.c:494:11:499:24 | (...) | 9.049625849719E12 | +| test.c:494:12:494:23 | (...) | 10419.0 | +| test.c:494:12:494:28 | ... * ... | 10419.0 | +| test.c:494:12:495:61 | ... > ... | 1.0 | +| test.c:494:12:499:23 | ... ? ... : ... | 9.049625849719E12 | +| test.c:494:13:494:13 | 2 | 1.0 | +| test.c:494:13:494:13 | (unsigned int)... | 1.0 | +| test.c:494:13:494:18 | ... * ... | 10419.0 | +| test.c:494:13:494:22 | ... + ... | 10419.0 | +| test.c:494:17:494:18 | ip | 10419.0 | +| test.c:494:22:494:22 | 1 | 1.0 | +| test.c:494:22:494:22 | (unsigned int)... | 1.0 | +| test.c:494:27:494:28 | 14 | 1.0 | +| test.c:494:27:494:28 | (unsigned int)... | 1.0 | +| test.c:495:11:495:61 | (...) | 1.08555561E8 | +| test.c:495:12:495:13 | 14 | 1.0 | +| test.c:495:12:495:13 | (unsigned int)... | 1.0 | +| test.c:495:12:495:24 | ... * ... | 10419.0 | +| test.c:495:12:495:34 | ... > ... | 1.0 | +| test.c:495:12:495:60 | ... ? ... : ... | 1.08555561E8 | +| test.c:495:17:495:24 | (...) | 10419.0 | +| test.c:495:18:495:18 | 2 | 1.0 | +| test.c:495:18:495:18 | (unsigned int)... | 1.0 | +| test.c:495:18:495:23 | ... * ... | 10419.0 | +| test.c:495:22:495:23 | ip | 10419.0 | +| test.c:495:28:495:29 | 17 | 1.0 | +| test.c:495:28:495:29 | (unsigned int)... | 1.0 | +| test.c:495:28:495:34 | ... * ... | 10419.0 | +| test.c:495:33:495:34 | ip | 10419.0 | +| test.c:495:38:495:39 | 17 | 1.0 | +| test.c:495:38:495:39 | (unsigned int)... | 1.0 | +| test.c:495:38:495:50 | ... * ... | 10419.0 | +| test.c:495:43:495:50 | (...) | 10419.0 | +| test.c:495:44:495:44 | 2 | 1.0 | +| test.c:495:44:495:44 | (unsigned int)... | 1.0 | +| test.c:495:44:495:49 | ... * ... | 10419.0 | +| test.c:495:48:495:49 | ip | 10419.0 | +| test.c:495:54:495:55 | 17 | 1.0 | +| test.c:495:54:495:55 | (unsigned int)... | 1.0 | +| test.c:495:54:495:60 | ... * ... | 10419.0 | +| test.c:495:59:495:60 | ip | 10419.0 | +| test.c:496:15:496:26 | (...) | 20839.0 | +| test.c:496:15:496:31 | ... * ... | 20839.0 | +| test.c:496:16:496:16 | 2 | 1.0 | +| test.c:496:16:496:16 | (unsigned int)... | 1.0 | +| test.c:496:16:496:21 | ... * ... | 20839.0 | +| test.c:496:16:496:25 | ... + ... | 20839.0 | +| test.c:496:20:496:21 | ip | 20839.0 | +| test.c:496:25:496:25 | 1 | 1.0 | +| test.c:496:25:496:25 | (unsigned int)... | 1.0 | +| test.c:496:30:496:31 | 14 | 1.0 | +| test.c:496:30:496:31 | (unsigned int)... | 1.0 | +| test.c:497:15:497:16 | 14 | 1.0 | +| test.c:497:15:497:16 | (unsigned int)... | 1.0 | +| test.c:497:15:497:27 | ... * ... | 20839.0 | +| test.c:497:15:497:37 | ... > ... | 1.0 | +| test.c:497:15:499:23 | ... ? ... : ... | 4.34263921E8 | +| test.c:497:20:497:27 | (...) | 20839.0 | +| test.c:497:21:497:21 | 2 | 1.0 | +| test.c:497:21:497:21 | (unsigned int)... | 1.0 | +| test.c:497:21:497:26 | ... * ... | 20839.0 | +| test.c:497:25:497:26 | ip | 20839.0 | +| test.c:497:31:497:32 | 17 | 1.0 | +| test.c:497:31:497:32 | (unsigned int)... | 1.0 | +| test.c:497:31:497:37 | ... * ... | 20839.0 | +| test.c:497:36:497:37 | ip | 20839.0 | +| test.c:498:17:498:18 | 14 | 1.0 | +| test.c:498:17:498:18 | (unsigned int)... | 1.0 | +| test.c:498:17:498:29 | ... * ... | 20839.0 | +| test.c:498:22:498:29 | (...) | 20839.0 | +| test.c:498:23:498:23 | 2 | 1.0 | +| test.c:498:23:498:23 | (unsigned int)... | 1.0 | +| test.c:498:23:498:28 | ... * ... | 20839.0 | +| test.c:498:27:498:28 | ip | 20839.0 | +| test.c:499:17:499:18 | 14 | 1.0 | +| test.c:499:17:499:18 | (unsigned int)... | 1.0 | +| test.c:499:17:499:23 | ... * ... | 20839.0 | +| test.c:499:22:499:23 | ip | 20839.0 | +| test.c:500:9:500:9 | 2 | 1.0 | +| test.c:500:9:500:9 | (unsigned int)... | 1.0 | +| test.c:500:9:500:14 | ... * ... | 62517.0 | +| test.c:500:9:500:19 | ... * ... | 62517.0 | +| test.c:500:9:500:39 | ... + ... | 3.908375289E9 | +| test.c:500:13:500:14 | ip | 62517.0 | +| test.c:500:18:500:19 | 14 | 1.0 | +| test.c:500:18:500:19 | (unsigned int)... | 1.0 | +| test.c:500:23:500:34 | (...) | 62517.0 | +| test.c:500:23:500:39 | ... * ... | 62517.0 | +| test.c:500:24:500:24 | 2 | 1.0 | +| test.c:500:24:500:24 | (unsigned int)... | 1.0 | +| test.c:500:24:500:29 | ... * ... | 62517.0 | +| test.c:500:24:500:33 | ... + ... | 62517.0 | +| test.c:500:28:500:29 | ip | 62517.0 | +| test.c:500:33:500:33 | 1 | 1.0 | +| test.c:500:33:500:33 | (unsigned int)... | 1.0 | +| test.c:500:38:500:39 | 17 | 1.0 | +| test.c:500:38:500:39 | (unsigned int)... | 1.0 | +| test.c:501:13:501:13 | 4 | 1.0 | +| test.c:501:13:501:13 | (unsigned int)... | 1.0 | +| test.c:501:13:501:30 | ... * ... | 62517.0 | +| test.c:501:13:502:30 | ... + ... | 3.908375289E9 | +| test.c:501:13:503:30 | ... + ... | 2.44339897942413E14 | +| test.c:501:13:509:26 | ... + ... | 4.7762734556795386E29 | +| test.c:501:17:501:30 | (...) | 62517.0 | +| test.c:501:18:501:19 | ip | 62517.0 | +| test.c:501:18:501:24 | ... * ... | 62517.0 | +| test.c:501:18:501:29 | ... + ... | 62517.0 | +| test.c:501:23:501:24 | 14 | 1.0 | +| test.c:501:23:501:24 | (unsigned int)... | 1.0 | +| test.c:501:28:501:29 | 32 | 1.0 | +| test.c:501:28:501:29 | (unsigned int)... | 1.0 | +| test.c:502:13:502:30 | (...) | 62517.0 | +| test.c:502:14:502:14 | 2 | 1.0 | +| test.c:502:14:502:14 | (unsigned int)... | 1.0 | +| test.c:502:14:502:19 | ... * ... | 62517.0 | +| test.c:502:14:502:24 | ... * ... | 62517.0 | +| test.c:502:14:502:29 | ... + ... | 62517.0 | +| test.c:502:18:502:19 | ip | 62517.0 | +| test.c:502:23:502:24 | 14 | 1.0 | +| test.c:502:23:502:24 | (unsigned int)... | 1.0 | +| test.c:502:28:502:29 | 32 | 1.0 | +| test.c:502:28:502:29 | (unsigned int)... | 1.0 | +| test.c:503:13:503:13 | 2 | 1.0 | +| test.c:503:13:503:13 | (unsigned int)... | 1.0 | +| test.c:503:13:503:30 | ... * ... | 62517.0 | +| test.c:503:17:503:30 | (...) | 62517.0 | +| test.c:503:18:503:19 | ip | 62517.0 | +| test.c:503:18:503:24 | ... * ... | 62517.0 | +| test.c:503:18:503:29 | ... + ... | 62517.0 | +| test.c:503:23:503:24 | 14 | 1.0 | +| test.c:503:23:503:24 | (unsigned int)... | 1.0 | +| test.c:503:28:503:29 | 64 | 1.0 | +| test.c:503:28:503:29 | (unsigned int)... | 1.0 | +| test.c:504:13:509:26 | (...) | 1.954766084417875E15 | +| test.c:504:14:504:25 | (...) | 62517.0 | +| test.c:504:14:504:30 | ... * ... | 62517.0 | +| test.c:504:14:505:63 | ... > ... | 1.0 | +| test.c:504:14:509:25 | ... ? ... : ... | 1.954766084417875E15 | +| test.c:504:15:504:15 | 2 | 1.0 | +| test.c:504:15:504:15 | (unsigned int)... | 1.0 | +| test.c:504:15:504:20 | ... * ... | 62517.0 | +| test.c:504:15:504:24 | ... + ... | 62517.0 | +| test.c:504:19:504:20 | ip | 62517.0 | +| test.c:504:24:504:24 | 1 | 1.0 | +| test.c:504:24:504:24 | (unsigned int)... | 1.0 | +| test.c:504:29:504:30 | 14 | 1.0 | +| test.c:504:29:504:30 | (unsigned int)... | 1.0 | +| test.c:505:13:505:63 | (...) | 3.908375289E9 | +| test.c:505:14:505:15 | 14 | 1.0 | +| test.c:505:14:505:15 | (unsigned int)... | 1.0 | +| test.c:505:14:505:26 | ... * ... | 62517.0 | +| test.c:505:14:505:36 | ... > ... | 1.0 | +| test.c:505:14:505:62 | ... ? ... : ... | 3.908375289E9 | +| test.c:505:19:505:26 | (...) | 62517.0 | +| test.c:505:20:505:20 | 2 | 1.0 | +| test.c:505:20:505:20 | (unsigned int)... | 1.0 | +| test.c:505:20:505:25 | ... * ... | 62517.0 | +| test.c:505:24:505:25 | ip | 62517.0 | +| test.c:505:30:505:31 | 17 | 1.0 | +| test.c:505:30:505:31 | (unsigned int)... | 1.0 | +| test.c:505:30:505:36 | ... * ... | 62517.0 | +| test.c:505:35:505:36 | ip | 62517.0 | +| test.c:505:40:505:41 | 17 | 1.0 | +| test.c:505:40:505:41 | (unsigned int)... | 1.0 | +| test.c:505:40:505:52 | ... * ... | 62517.0 | +| test.c:505:45:505:52 | (...) | 62517.0 | +| test.c:505:46:505:46 | 2 | 1.0 | +| test.c:505:46:505:46 | (unsigned int)... | 1.0 | +| test.c:505:46:505:51 | ... * ... | 62517.0 | +| test.c:505:50:505:51 | ip | 62517.0 | +| test.c:505:56:505:57 | 17 | 1.0 | +| test.c:505:56:505:57 | (unsigned int)... | 1.0 | +| test.c:505:56:505:62 | ... * ... | 62517.0 | +| test.c:505:61:505:62 | ip | 62517.0 | +| test.c:506:17:506:28 | (...) | 125035.0 | +| test.c:506:17:506:33 | ... * ... | 125035.0 | +| test.c:506:18:506:18 | 2 | 1.0 | +| test.c:506:18:506:18 | (unsigned int)... | 1.0 | +| test.c:506:18:506:23 | ... * ... | 125035.0 | +| test.c:506:18:506:27 | ... + ... | 125035.0 | +| test.c:506:22:506:23 | ip | 125035.0 | +| test.c:506:27:506:27 | 1 | 1.0 | +| test.c:506:27:506:27 | (unsigned int)... | 1.0 | +| test.c:506:32:506:33 | 14 | 1.0 | +| test.c:506:32:506:33 | (unsigned int)... | 1.0 | +| test.c:507:17:507:18 | 14 | 1.0 | +| test.c:507:17:507:18 | (unsigned int)... | 1.0 | +| test.c:507:17:507:29 | ... * ... | 125035.0 | +| test.c:507:17:507:39 | ... > ... | 1.0 | +| test.c:507:17:509:25 | ... ? ... : ... | 1.5633751225E10 | +| test.c:507:22:507:29 | (...) | 125035.0 | +| test.c:507:23:507:23 | 2 | 1.0 | +| test.c:507:23:507:23 | (unsigned int)... | 1.0 | +| test.c:507:23:507:28 | ... * ... | 125035.0 | +| test.c:507:27:507:28 | ip | 125035.0 | +| test.c:507:33:507:34 | 17 | 1.0 | +| test.c:507:33:507:34 | (unsigned int)... | 1.0 | +| test.c:507:33:507:39 | ... * ... | 125035.0 | +| test.c:507:38:507:39 | ip | 125035.0 | +| test.c:508:19:508:20 | 14 | 1.0 | +| test.c:508:19:508:20 | (unsigned int)... | 1.0 | +| test.c:508:19:508:31 | ... * ... | 125035.0 | +| test.c:508:24:508:31 | (...) | 125035.0 | +| test.c:508:25:508:25 | 2 | 1.0 | +| test.c:508:25:508:25 | (unsigned int)... | 1.0 | +| test.c:508:25:508:30 | ... * ... | 125035.0 | +| test.c:508:29:508:30 | ip | 125035.0 | +| test.c:509:19:509:20 | 14 | 1.0 | +| test.c:509:19:509:20 | (unsigned int)... | 1.0 | +| test.c:509:19:509:25 | ... * ... | 125035.0 | +| test.c:509:24:509:25 | ip | 125035.0 | +| test.c:510:13:510:13 | 2 | 1.0 | +| test.c:510:13:510:13 | (unsigned int)... | 1.0 | +| test.c:510:13:510:18 | ... * ... | 62517.0 | +| test.c:510:13:510:23 | ... * ... | 62517.0 | +| test.c:510:13:510:43 | ... + ... | 3.908375289E9 | +| test.c:510:17:510:18 | ip | 62517.0 | +| test.c:510:22:510:23 | 14 | 1.0 | +| test.c:510:22:510:23 | (unsigned int)... | 1.0 | +| test.c:510:27:510:38 | (...) | 62517.0 | +| test.c:510:27:510:43 | ... * ... | 62517.0 | +| test.c:510:28:510:28 | 2 | 1.0 | +| test.c:510:28:510:28 | (unsigned int)... | 1.0 | +| test.c:510:28:510:33 | ... * ... | 62517.0 | +| test.c:510:28:510:37 | ... + ... | 62517.0 | +| test.c:510:32:510:33 | ip | 62517.0 | +| test.c:510:37:510:37 | 1 | 1.0 | +| test.c:510:37:510:37 | (unsigned int)... | 1.0 | +| test.c:510:42:510:43 | 17 | 1.0 | +| test.c:510:42:510:43 | (unsigned int)... | 1.0 | +| test.c:511:9:511:9 | 4 | 1.0 | +| test.c:511:9:511:9 | (unsigned int)... | 1.0 | +| test.c:511:9:511:26 | ... * ... | 10419.0 | +| test.c:511:9:512:30 | ... + ... | 1.08555561E8 | +| test.c:511:9:513:30 | ... + ... | 1.131040390059E12 | +| test.c:511:9:519:26 | ... + ... | 1.0235492350954187E25 | +| test.c:511:9:520:61 | ... > ... | 1.0 | +| test.c:511:9:532:25 | ... ? ... : ... | 4.778814771623795E41 | +| test.c:511:13:511:26 | (...) | 10419.0 | +| test.c:511:14:511:15 | ip | 10419.0 | +| test.c:511:14:511:20 | ... * ... | 10419.0 | +| test.c:511:14:511:25 | ... + ... | 10419.0 | +| test.c:511:19:511:20 | 14 | 1.0 | +| test.c:511:19:511:20 | (unsigned int)... | 1.0 | +| test.c:511:24:511:25 | 32 | 1.0 | +| test.c:511:24:511:25 | (unsigned int)... | 1.0 | +| test.c:512:13:512:30 | (...) | 10419.0 | +| test.c:512:14:512:14 | 2 | 1.0 | +| test.c:512:14:512:14 | (unsigned int)... | 1.0 | +| test.c:512:14:512:19 | ... * ... | 10419.0 | +| test.c:512:14:512:24 | ... * ... | 10419.0 | +| test.c:512:14:512:29 | ... + ... | 10419.0 | +| test.c:512:18:512:19 | ip | 10419.0 | +| test.c:512:23:512:24 | 14 | 1.0 | +| test.c:512:23:512:24 | (unsigned int)... | 1.0 | +| test.c:512:28:512:29 | 32 | 1.0 | +| test.c:512:28:512:29 | (unsigned int)... | 1.0 | +| test.c:513:13:513:13 | 2 | 1.0 | +| test.c:513:13:513:13 | (unsigned int)... | 1.0 | +| test.c:513:13:513:30 | ... * ... | 10419.0 | +| test.c:513:17:513:30 | (...) | 10419.0 | +| test.c:513:18:513:19 | ip | 10419.0 | +| test.c:513:18:513:24 | ... * ... | 10419.0 | +| test.c:513:18:513:29 | ... + ... | 10419.0 | +| test.c:513:23:513:24 | 14 | 1.0 | +| test.c:513:23:513:24 | (unsigned int)... | 1.0 | +| test.c:513:28:513:29 | 64 | 1.0 | +| test.c:513:28:513:29 | (unsigned int)... | 1.0 | +| test.c:514:13:519:26 | (...) | 9.049625849719E12 | +| test.c:514:14:514:25 | (...) | 10419.0 | +| test.c:514:14:514:30 | ... * ... | 10419.0 | +| test.c:514:14:515:63 | ... > ... | 1.0 | +| test.c:514:14:519:25 | ... ? ... : ... | 9.049625849719E12 | +| test.c:514:15:514:15 | 2 | 1.0 | +| test.c:514:15:514:15 | (unsigned int)... | 1.0 | +| test.c:514:15:514:20 | ... * ... | 10419.0 | +| test.c:514:15:514:24 | ... + ... | 10419.0 | +| test.c:514:19:514:20 | ip | 10419.0 | +| test.c:514:24:514:24 | 1 | 1.0 | +| test.c:514:24:514:24 | (unsigned int)... | 1.0 | +| test.c:514:29:514:30 | 14 | 1.0 | +| test.c:514:29:514:30 | (unsigned int)... | 1.0 | +| test.c:515:13:515:63 | (...) | 1.08555561E8 | +| test.c:515:14:515:15 | 14 | 1.0 | +| test.c:515:14:515:15 | (unsigned int)... | 1.0 | +| test.c:515:14:515:26 | ... * ... | 10419.0 | +| test.c:515:14:515:36 | ... > ... | 1.0 | +| test.c:515:14:515:62 | ... ? ... : ... | 1.08555561E8 | +| test.c:515:19:515:26 | (...) | 10419.0 | +| test.c:515:20:515:20 | 2 | 1.0 | +| test.c:515:20:515:20 | (unsigned int)... | 1.0 | +| test.c:515:20:515:25 | ... * ... | 10419.0 | +| test.c:515:24:515:25 | ip | 10419.0 | +| test.c:515:30:515:31 | 17 | 1.0 | +| test.c:515:30:515:31 | (unsigned int)... | 1.0 | +| test.c:515:30:515:36 | ... * ... | 10419.0 | +| test.c:515:35:515:36 | ip | 10419.0 | +| test.c:515:40:515:41 | 17 | 1.0 | +| test.c:515:40:515:41 | (unsigned int)... | 1.0 | +| test.c:515:40:515:52 | ... * ... | 10419.0 | +| test.c:515:45:515:52 | (...) | 10419.0 | +| test.c:515:46:515:46 | 2 | 1.0 | +| test.c:515:46:515:46 | (unsigned int)... | 1.0 | +| test.c:515:46:515:51 | ... * ... | 10419.0 | +| test.c:515:50:515:51 | ip | 10419.0 | +| test.c:515:56:515:57 | 17 | 1.0 | +| test.c:515:56:515:57 | (unsigned int)... | 1.0 | +| test.c:515:56:515:62 | ... * ... | 10419.0 | +| test.c:515:61:515:62 | ip | 10419.0 | +| test.c:516:17:516:28 | (...) | 20839.0 | +| test.c:516:17:516:33 | ... * ... | 20839.0 | +| test.c:516:18:516:18 | 2 | 1.0 | +| test.c:516:18:516:18 | (unsigned int)... | 1.0 | +| test.c:516:18:516:23 | ... * ... | 20839.0 | +| test.c:516:18:516:27 | ... + ... | 20839.0 | +| test.c:516:22:516:23 | ip | 20839.0 | +| test.c:516:27:516:27 | 1 | 1.0 | +| test.c:516:27:516:27 | (unsigned int)... | 1.0 | +| test.c:516:32:516:33 | 14 | 1.0 | +| test.c:516:32:516:33 | (unsigned int)... | 1.0 | +| test.c:517:17:517:18 | 14 | 1.0 | +| test.c:517:17:517:18 | (unsigned int)... | 1.0 | +| test.c:517:17:517:29 | ... * ... | 20839.0 | +| test.c:517:17:517:39 | ... > ... | 1.0 | +| test.c:517:17:519:25 | ... ? ... : ... | 4.34263921E8 | +| test.c:517:22:517:29 | (...) | 20839.0 | +| test.c:517:23:517:23 | 2 | 1.0 | +| test.c:517:23:517:23 | (unsigned int)... | 1.0 | +| test.c:517:23:517:28 | ... * ... | 20839.0 | +| test.c:517:27:517:28 | ip | 20839.0 | +| test.c:517:33:517:34 | 17 | 1.0 | +| test.c:517:33:517:34 | (unsigned int)... | 1.0 | +| test.c:517:33:517:39 | ... * ... | 20839.0 | +| test.c:517:38:517:39 | ip | 20839.0 | +| test.c:518:19:518:20 | 14 | 1.0 | +| test.c:518:19:518:20 | (unsigned int)... | 1.0 | +| test.c:518:19:518:31 | ... * ... | 20839.0 | +| test.c:518:24:518:31 | (...) | 20839.0 | +| test.c:518:25:518:25 | 2 | 1.0 | +| test.c:518:25:518:25 | (unsigned int)... | 1.0 | +| test.c:518:25:518:30 | ... * ... | 20839.0 | +| test.c:518:29:518:30 | ip | 20839.0 | +| test.c:519:19:519:20 | 14 | 1.0 | +| test.c:519:19:519:20 | (unsigned int)... | 1.0 | +| test.c:519:19:519:25 | ... * ... | 20839.0 | +| test.c:519:24:519:25 | ip | 20839.0 | +| test.c:520:11:520:61 | (...) | 3.908375289E9 | +| test.c:520:12:520:13 | 14 | 1.0 | +| test.c:520:12:520:13 | (unsigned int)... | 1.0 | +| test.c:520:12:520:18 | ... * ... | 62517.0 | +| test.c:520:12:520:34 | ... > ... | 1.0 | +| test.c:520:12:520:60 | ... ? ... : ... | 3.908375289E9 | +| test.c:520:17:520:18 | ip | 62517.0 | +| test.c:520:22:520:29 | (...) | 62517.0 | +| test.c:520:22:520:34 | ... * ... | 62517.0 | +| test.c:520:23:520:24 | ip | 62517.0 | +| test.c:520:23:520:28 | ... + ... | 62517.0 | +| test.c:520:28:520:28 | 1 | 1.0 | +| test.c:520:28:520:28 | (unsigned int)... | 1.0 | +| test.c:520:33:520:34 | 17 | 1.0 | +| test.c:520:33:520:34 | (unsigned int)... | 1.0 | +| test.c:520:38:520:39 | 17 | 1.0 | +| test.c:520:38:520:39 | (unsigned int)... | 1.0 | +| test.c:520:38:520:44 | ... * ... | 62517.0 | +| test.c:520:43:520:44 | ip | 62517.0 | +| test.c:520:48:520:55 | (...) | 62517.0 | +| test.c:520:48:520:60 | ... * ... | 62517.0 | +| test.c:520:49:520:50 | ip | 62517.0 | +| test.c:520:49:520:54 | ... + ... | 62517.0 | +| test.c:520:54:520:54 | 1 | 1.0 | +| test.c:520:54:520:54 | (unsigned int)... | 1.0 | +| test.c:520:59:520:60 | 17 | 1.0 | +| test.c:520:59:520:60 | (unsigned int)... | 1.0 | +| test.c:521:11:521:11 | 4 | 1.0 | +| test.c:521:11:521:11 | (unsigned int)... | 1.0 | +| test.c:521:11:521:28 | ... * ... | 125034.0 | +| test.c:521:11:522:28 | ... + ... | 1.5633501156E10 | +| test.c:521:11:523:28 | ... + ... | 1.954719183539304E15 | +| test.c:521:11:529:24 | ... + ... | 3.056778340269433E31 | +| test.c:521:15:521:28 | (...) | 125034.0 | +| test.c:521:16:521:17 | ip | 125034.0 | +| test.c:521:16:521:22 | ... * ... | 125034.0 | +| test.c:521:16:521:27 | ... + ... | 125034.0 | +| test.c:521:21:521:22 | 14 | 1.0 | +| test.c:521:21:521:22 | (unsigned int)... | 1.0 | +| test.c:521:26:521:27 | 32 | 1.0 | +| test.c:521:26:521:27 | (unsigned int)... | 1.0 | +| test.c:522:11:522:28 | (...) | 125034.0 | +| test.c:522:12:522:12 | 2 | 1.0 | +| test.c:522:12:522:12 | (unsigned int)... | 1.0 | +| test.c:522:12:522:17 | ... * ... | 125034.0 | +| test.c:522:12:522:22 | ... * ... | 125034.0 | +| test.c:522:12:522:27 | ... + ... | 125034.0 | +| test.c:522:16:522:17 | ip | 125034.0 | +| test.c:522:21:522:22 | 14 | 1.0 | +| test.c:522:21:522:22 | (unsigned int)... | 1.0 | +| test.c:522:26:522:27 | 32 | 1.0 | +| test.c:522:26:522:27 | (unsigned int)... | 1.0 | +| test.c:523:11:523:11 | 2 | 1.0 | +| test.c:523:11:523:11 | (unsigned int)... | 1.0 | +| test.c:523:11:523:28 | ... * ... | 125034.0 | +| test.c:523:15:523:28 | (...) | 125034.0 | +| test.c:523:16:523:17 | ip | 125034.0 | +| test.c:523:16:523:22 | ... * ... | 125034.0 | +| test.c:523:16:523:27 | ... + ... | 125034.0 | +| test.c:523:21:523:22 | 14 | 1.0 | +| test.c:523:21:523:22 | (unsigned int)... | 1.0 | +| test.c:523:26:523:27 | 64 | 1.0 | +| test.c:523:26:523:27 | (unsigned int)... | 1.0 | +| test.c:524:11:529:24 | (...) | 1.5637941071078508E16 | +| test.c:524:12:524:23 | (...) | 125034.0 | +| test.c:524:12:524:28 | ... * ... | 125034.0 | +| test.c:524:12:525:61 | ... > ... | 1.0 | +| test.c:524:12:529:23 | ... ? ... : ... | 1.5637941071078508E16 | +| test.c:524:13:524:13 | 2 | 1.0 | +| test.c:524:13:524:13 | (unsigned int)... | 1.0 | +| test.c:524:13:524:18 | ... * ... | 125034.0 | +| test.c:524:13:524:22 | ... + ... | 125034.0 | +| test.c:524:17:524:18 | ip | 125034.0 | +| test.c:524:22:524:22 | 1 | 1.0 | +| test.c:524:22:524:22 | (unsigned int)... | 1.0 | +| test.c:524:27:524:28 | 14 | 1.0 | +| test.c:524:27:524:28 | (unsigned int)... | 1.0 | +| test.c:525:11:525:61 | (...) | 1.5633501156E10 | +| test.c:525:12:525:13 | 14 | 1.0 | +| test.c:525:12:525:13 | (unsigned int)... | 1.0 | +| test.c:525:12:525:24 | ... * ... | 125034.0 | +| test.c:525:12:525:34 | ... > ... | 1.0 | +| test.c:525:12:525:60 | ... ? ... : ... | 1.5633501156E10 | +| test.c:525:17:525:24 | (...) | 125034.0 | +| test.c:525:18:525:18 | 2 | 1.0 | +| test.c:525:18:525:18 | (unsigned int)... | 1.0 | +| test.c:525:18:525:23 | ... * ... | 125034.0 | +| test.c:525:22:525:23 | ip | 125034.0 | +| test.c:525:28:525:29 | 17 | 1.0 | +| test.c:525:28:525:29 | (unsigned int)... | 1.0 | +| test.c:525:28:525:34 | ... * ... | 125034.0 | +| test.c:525:33:525:34 | ip | 125034.0 | +| test.c:525:38:525:39 | 17 | 1.0 | +| test.c:525:38:525:39 | (unsigned int)... | 1.0 | +| test.c:525:38:525:50 | ... * ... | 125034.0 | +| test.c:525:43:525:50 | (...) | 125034.0 | +| test.c:525:44:525:44 | 2 | 1.0 | +| test.c:525:44:525:44 | (unsigned int)... | 1.0 | +| test.c:525:44:525:49 | ... * ... | 125034.0 | +| test.c:525:48:525:49 | ip | 125034.0 | +| test.c:525:54:525:55 | 17 | 1.0 | +| test.c:525:54:525:55 | (unsigned int)... | 1.0 | +| test.c:525:54:525:60 | ... * ... | 125034.0 | +| test.c:525:59:525:60 | ip | 125034.0 | +| test.c:526:15:526:26 | (...) | 250069.0 | +| test.c:526:15:526:31 | ... * ... | 250069.0 | +| test.c:526:16:526:16 | 2 | 1.0 | +| test.c:526:16:526:16 | (unsigned int)... | 1.0 | +| test.c:526:16:526:21 | ... * ... | 250069.0 | +| test.c:526:16:526:25 | ... + ... | 250069.0 | +| test.c:526:20:526:21 | ip | 250069.0 | +| test.c:526:25:526:25 | 1 | 1.0 | +| test.c:526:25:526:25 | (unsigned int)... | 1.0 | +| test.c:526:30:526:31 | 14 | 1.0 | +| test.c:526:30:526:31 | (unsigned int)... | 1.0 | +| test.c:527:15:527:16 | 14 | 1.0 | +| test.c:527:15:527:16 | (unsigned int)... | 1.0 | +| test.c:527:15:527:27 | ... * ... | 250069.0 | +| test.c:527:15:527:37 | ... > ... | 1.0 | +| test.c:527:15:529:23 | ... ? ... : ... | 6.2534504761E10 | +| test.c:527:20:527:27 | (...) | 250069.0 | +| test.c:527:21:527:21 | 2 | 1.0 | +| test.c:527:21:527:21 | (unsigned int)... | 1.0 | +| test.c:527:21:527:26 | ... * ... | 250069.0 | +| test.c:527:25:527:26 | ip | 250069.0 | +| test.c:527:31:527:32 | 17 | 1.0 | +| test.c:527:31:527:32 | (unsigned int)... | 1.0 | +| test.c:527:31:527:37 | ... * ... | 250069.0 | +| test.c:527:36:527:37 | ip | 250069.0 | +| test.c:528:17:528:18 | 14 | 1.0 | +| test.c:528:17:528:18 | (unsigned int)... | 1.0 | +| test.c:528:17:528:29 | ... * ... | 250069.0 | +| test.c:528:22:528:29 | (...) | 250069.0 | +| test.c:528:23:528:23 | 2 | 1.0 | +| test.c:528:23:528:23 | (unsigned int)... | 1.0 | +| test.c:528:23:528:28 | ... * ... | 250069.0 | +| test.c:528:27:528:28 | ip | 250069.0 | +| test.c:529:17:529:18 | 14 | 1.0 | +| test.c:529:17:529:18 | (unsigned int)... | 1.0 | +| test.c:529:17:529:23 | ... * ... | 250069.0 | +| test.c:529:22:529:23 | ip | 250069.0 | +| test.c:530:11:530:12 | 14 | 1.0 | +| test.c:530:11:530:12 | (unsigned int)... | 1.0 | +| test.c:530:11:530:17 | ... * ... | 125034.0 | +| test.c:530:11:530:33 | ... > ... | 1.0 | +| test.c:530:11:532:25 | ... ? ... : ... | 1.5633501156E10 | +| test.c:530:16:530:17 | ip | 125034.0 | +| test.c:530:21:530:28 | (...) | 125034.0 | +| test.c:530:21:530:33 | ... * ... | 125034.0 | +| test.c:530:22:530:23 | ip | 125034.0 | +| test.c:530:22:530:27 | ... + ... | 125034.0 | +| test.c:530:27:530:27 | 1 | 1.0 | +| test.c:530:27:530:27 | (unsigned int)... | 1.0 | +| test.c:530:32:530:33 | 17 | 1.0 | +| test.c:530:32:530:33 | (unsigned int)... | 1.0 | +| test.c:531:13:531:14 | 14 | 1.0 | +| test.c:531:13:531:14 | (unsigned int)... | 1.0 | +| test.c:531:13:531:19 | ... * ... | 125034.0 | +| test.c:531:18:531:19 | ip | 125034.0 | +| test.c:532:13:532:20 | (...) | 125034.0 | +| test.c:532:13:532:25 | ... * ... | 125034.0 | +| test.c:532:14:532:15 | ip | 125034.0 | +| test.c:532:14:532:19 | ... + ... | 125034.0 | +| test.c:532:19:532:19 | 1 | 1.0 | +| test.c:532:19:532:19 | (unsigned int)... | 1.0 | +| test.c:532:24:532:25 | 14 | 1.0 | +| test.c:532:24:532:25 | (unsigned int)... | 1.0 | +| test.c:533:9:533:10 | 14 | 1.0 | +| test.c:533:9:533:10 | (unsigned int)... | 1.0 | +| test.c:533:9:533:15 | ... * ... | 1437897.0 | +| test.c:533:9:533:59 | ... > ... | 1.0 | +| test.c:533:9:535:51 | ... ? ... : ... | 2.9729207539701335E18 | +| test.c:533:14:533:15 | ip | 1437897.0 | +| test.c:533:19:533:30 | (...) | 1437897.0 | +| test.c:533:19:533:35 | ... * ... | 1437897.0 | +| test.c:533:19:533:59 | ... + ... | 2.067547782609E12 | +| test.c:533:20:533:20 | 2 | 1.0 | +| test.c:533:20:533:20 | (unsigned int)... | 1.0 | +| test.c:533:20:533:25 | ... * ... | 1437897.0 | +| test.c:533:20:533:29 | ... + ... | 1437897.0 | +| test.c:533:24:533:25 | ip | 1437897.0 | +| test.c:533:29:533:29 | 1 | 1.0 | +| test.c:533:29:533:29 | (unsigned int)... | 1.0 | +| test.c:533:34:533:35 | 17 | 1.0 | +| test.c:533:34:533:35 | (unsigned int)... | 1.0 | +| test.c:533:39:533:54 | (...) | 1437897.0 | +| test.c:533:39:533:59 | ... * ... | 1437897.0 | +| test.c:533:40:533:40 | 2 | 1.0 | +| test.c:533:40:533:40 | (unsigned int)... | 1.0 | +| test.c:533:40:533:45 | ... * ... | 1437897.0 | +| test.c:533:40:533:49 | ... + ... | 1437897.0 | +| test.c:533:40:533:53 | ... + ... | 1437897.0 | +| test.c:533:44:533:45 | ip | 1437897.0 | +| test.c:533:49:533:49 | 1 | 1.0 | +| test.c:533:49:533:49 | (unsigned int)... | 1.0 | +| test.c:533:53:533:53 | 1 | 1.0 | +| test.c:533:53:533:53 | (unsigned int)... | 1.0 | +| test.c:533:58:533:59 | 17 | 1.0 | +| test.c:533:58:533:59 | (unsigned int)... | 1.0 | +| test.c:534:11:534:12 | 14 | 1.0 | +| test.c:534:11:534:12 | (unsigned int)... | 1.0 | +| test.c:534:11:534:17 | ... * ... | 1437897.0 | +| test.c:534:16:534:17 | ip | 1437897.0 | +| test.c:535:11:535:22 | (...) | 1437897.0 | +| test.c:535:11:535:27 | ... * ... | 1437897.0 | +| test.c:535:11:535:51 | ... + ... | 2.067547782609E12 | +| test.c:535:12:535:12 | 2 | 1.0 | +| test.c:535:12:535:12 | (unsigned int)... | 1.0 | +| test.c:535:12:535:17 | ... * ... | 1437897.0 | +| test.c:535:12:535:21 | ... + ... | 1437897.0 | +| test.c:535:16:535:17 | ip | 1437897.0 | +| test.c:535:21:535:21 | 1 | 1.0 | +| test.c:535:21:535:21 | (unsigned int)... | 1.0 | +| test.c:535:26:535:27 | 14 | 1.0 | +| test.c:535:26:535:27 | (unsigned int)... | 1.0 | +| test.c:535:31:535:46 | (...) | 1437897.0 | +| test.c:535:31:535:51 | ... * ... | 1437897.0 | +| test.c:535:32:535:32 | 2 | 1.0 | +| test.c:535:32:535:32 | (unsigned int)... | 1.0 | +| test.c:535:32:535:37 | ... * ... | 1437897.0 | +| test.c:535:32:535:41 | ... + ... | 1437897.0 | +| test.c:535:32:535:45 | ... + ... | 1437897.0 | +| test.c:535:36:535:37 | ip | 1437897.0 | +| test.c:535:41:535:41 | 1 | 1.0 | +| test.c:535:41:535:41 | (unsigned int)... | 1.0 | +| test.c:535:45:535:45 | 1 | 1.0 | +| test.c:535:45:535:45 | (unsigned int)... | 1.0 | +| test.c:535:50:535:51 | 17 | 1.0 | +| test.c:535:50:535:51 | (unsigned int)... | 1.0 | +| test.c:536:9:536:9 | 2 | 1.0 | +| test.c:536:9:536:9 | (unsigned int)... | 1.0 | +| test.c:536:9:536:26 | ... * ... | 1437897.0 | +| test.c:536:9:556:48 | ... + ... | 3.5306223994138077E62 | +| test.c:536:9:578:30 | ... > ... | 1.0 | +| test.c:536:9:621:27 | ... ? ... : ... | 4.3658022750663434E182 | +| test.c:536:13:536:26 | (...) | 1437897.0 | +| test.c:536:14:536:15 | ip | 1437897.0 | +| test.c:536:14:536:20 | ... * ... | 1437897.0 | +| test.c:536:14:536:25 | ... + ... | 1437897.0 | +| test.c:536:19:536:20 | 14 | 1.0 | +| test.c:536:19:536:20 | (unsigned int)... | 1.0 | +| test.c:536:24:536:25 | 32 | 1.0 | +| test.c:536:24:536:25 | (unsigned int)... | 1.0 | +| test.c:537:13:556:48 | (...) | 2.4554070280512497E56 | +| test.c:537:14:537:14 | 4 | 1.0 | +| test.c:537:14:537:14 | (unsigned int)... | 1.0 | +| test.c:537:14:537:31 | ... * ... | 1437897.0 | +| test.c:537:14:538:32 | ... + ... | 2.067547782609E12 | +| test.c:537:14:539:32 | ... + ... | 2.9729207539701335E18 | +| test.c:537:14:545:28 | ... + ... | 7.070613623498497E37 | +| test.c:537:14:546:43 | ... > ... | 1.0 | +| test.c:537:14:556:47 | ... ? ... : ... | 2.4554070280512497E56 | +| test.c:537:18:537:31 | (...) | 1437897.0 | +| test.c:537:19:537:20 | ip | 1437897.0 | +| test.c:537:19:537:25 | ... * ... | 1437897.0 | +| test.c:537:19:537:30 | ... + ... | 1437897.0 | +| test.c:537:24:537:25 | 14 | 1.0 | +| test.c:537:24:537:25 | (unsigned int)... | 1.0 | +| test.c:537:29:537:30 | 32 | 1.0 | +| test.c:537:29:537:30 | (unsigned int)... | 1.0 | +| test.c:538:15:538:32 | (...) | 1437897.0 | +| test.c:538:16:538:16 | 2 | 1.0 | +| test.c:538:16:538:16 | (unsigned int)... | 1.0 | +| test.c:538:16:538:21 | ... * ... | 1437897.0 | +| test.c:538:16:538:26 | ... * ... | 1437897.0 | +| test.c:538:16:538:31 | ... + ... | 1437897.0 | +| test.c:538:20:538:21 | ip | 1437897.0 | +| test.c:538:25:538:26 | 14 | 1.0 | +| test.c:538:25:538:26 | (unsigned int)... | 1.0 | +| test.c:538:30:538:31 | 32 | 1.0 | +| test.c:538:30:538:31 | (unsigned int)... | 1.0 | +| test.c:539:15:539:15 | 2 | 1.0 | +| test.c:539:15:539:15 | (unsigned int)... | 1.0 | +| test.c:539:15:539:32 | ... * ... | 1437897.0 | +| test.c:539:19:539:32 | (...) | 1437897.0 | +| test.c:539:20:539:21 | ip | 1437897.0 | +| test.c:539:20:539:26 | ... * ... | 1437897.0 | +| test.c:539:20:539:31 | ... + ... | 1437897.0 | +| test.c:539:25:539:26 | 14 | 1.0 | +| test.c:539:25:539:26 | (unsigned int)... | 1.0 | +| test.c:539:30:539:31 | 64 | 1.0 | +| test.c:539:30:539:31 | (unsigned int)... | 1.0 | +| test.c:540:15:545:28 | (...) | 2.3783390842343084E19 | +| test.c:540:16:540:27 | (...) | 1437897.0 | +| test.c:540:16:540:32 | ... * ... | 1437897.0 | +| test.c:540:16:541:65 | ... > ... | 1.0 | +| test.c:540:16:545:27 | ... ? ... : ... | 2.3783390842343084E19 | +| test.c:540:17:540:17 | 2 | 1.0 | +| test.c:540:17:540:17 | (unsigned int)... | 1.0 | +| test.c:540:17:540:22 | ... * ... | 1437897.0 | +| test.c:540:17:540:26 | ... + ... | 1437897.0 | +| test.c:540:21:540:22 | ip | 1437897.0 | +| test.c:540:26:540:26 | 1 | 1.0 | +| test.c:540:26:540:26 | (unsigned int)... | 1.0 | +| test.c:540:31:540:32 | 14 | 1.0 | +| test.c:540:31:540:32 | (unsigned int)... | 1.0 | +| test.c:541:15:541:65 | (...) | 2.067547782609E12 | +| test.c:541:16:541:17 | 14 | 1.0 | +| test.c:541:16:541:17 | (unsigned int)... | 1.0 | +| test.c:541:16:541:28 | ... * ... | 1437897.0 | +| test.c:541:16:541:38 | ... > ... | 1.0 | +| test.c:541:16:541:64 | ... ? ... : ... | 2.067547782609E12 | +| test.c:541:21:541:28 | (...) | 1437897.0 | +| test.c:541:22:541:22 | 2 | 1.0 | +| test.c:541:22:541:22 | (unsigned int)... | 1.0 | +| test.c:541:22:541:27 | ... * ... | 1437897.0 | +| test.c:541:26:541:27 | ip | 1437897.0 | +| test.c:541:32:541:33 | 17 | 1.0 | +| test.c:541:32:541:33 | (unsigned int)... | 1.0 | +| test.c:541:32:541:38 | ... * ... | 1437897.0 | +| test.c:541:37:541:38 | ip | 1437897.0 | +| test.c:541:42:541:43 | 17 | 1.0 | +| test.c:541:42:541:43 | (unsigned int)... | 1.0 | +| test.c:541:42:541:54 | ... * ... | 1437897.0 | +| test.c:541:47:541:54 | (...) | 1437897.0 | +| test.c:541:48:541:48 | 2 | 1.0 | +| test.c:541:48:541:48 | (unsigned int)... | 1.0 | +| test.c:541:48:541:53 | ... * ... | 1437897.0 | +| test.c:541:52:541:53 | ip | 1437897.0 | +| test.c:541:58:541:59 | 17 | 1.0 | +| test.c:541:58:541:59 | (unsigned int)... | 1.0 | +| test.c:541:58:541:64 | ... * ... | 1437897.0 | +| test.c:541:63:541:64 | ip | 1437897.0 | +| test.c:542:19:542:30 | (...) | 2875795.0 | +| test.c:542:19:542:35 | ... * ... | 2875795.0 | +| test.c:542:20:542:20 | 2 | 1.0 | +| test.c:542:20:542:20 | (unsigned int)... | 1.0 | +| test.c:542:20:542:25 | ... * ... | 2875795.0 | +| test.c:542:20:542:29 | ... + ... | 2875795.0 | +| test.c:542:24:542:25 | ip | 2875795.0 | +| test.c:542:29:542:29 | 1 | 1.0 | +| test.c:542:29:542:29 | (unsigned int)... | 1.0 | +| test.c:542:34:542:35 | 14 | 1.0 | +| test.c:542:34:542:35 | (unsigned int)... | 1.0 | +| test.c:543:19:543:20 | 14 | 1.0 | +| test.c:543:19:543:20 | (unsigned int)... | 1.0 | +| test.c:543:19:543:31 | ... * ... | 2875795.0 | +| test.c:543:19:543:41 | ... > ... | 1.0 | +| test.c:543:19:545:27 | ... ? ... : ... | 8.270196882025E12 | +| test.c:543:24:543:31 | (...) | 2875795.0 | +| test.c:543:25:543:25 | 2 | 1.0 | +| test.c:543:25:543:25 | (unsigned int)... | 1.0 | +| test.c:543:25:543:30 | ... * ... | 2875795.0 | +| test.c:543:29:543:30 | ip | 2875795.0 | +| test.c:543:35:543:36 | 17 | 1.0 | +| test.c:543:35:543:36 | (unsigned int)... | 1.0 | +| test.c:543:35:543:41 | ... * ... | 2875795.0 | +| test.c:543:40:543:41 | ip | 2875795.0 | +| test.c:544:21:544:22 | 14 | 1.0 | +| test.c:544:21:544:22 | (unsigned int)... | 1.0 | +| test.c:544:21:544:33 | ... * ... | 2875795.0 | +| test.c:544:26:544:33 | (...) | 2875795.0 | +| test.c:544:27:544:27 | 2 | 1.0 | +| test.c:544:27:544:27 | (unsigned int)... | 1.0 | +| test.c:544:27:544:32 | ... * ... | 2875795.0 | +| test.c:544:31:544:32 | ip | 2875795.0 | +| test.c:545:21:545:22 | 14 | 1.0 | +| test.c:545:21:545:22 | (unsigned int)... | 1.0 | +| test.c:545:21:545:27 | ... * ... | 2875795.0 | +| test.c:545:26:545:27 | ip | 2875795.0 | +| test.c:546:13:546:13 | 2 | 1.0 | +| test.c:546:13:546:13 | (unsigned int)... | 1.0 | +| test.c:546:13:546:18 | ... * ... | 8627385.0 | +| test.c:546:13:546:23 | ... * ... | 8627385.0 | +| test.c:546:13:546:43 | ... + ... | 7.4431771938225E13 | +| test.c:546:17:546:18 | ip | 8627385.0 | +| test.c:546:22:546:23 | 14 | 1.0 | +| test.c:546:22:546:23 | (unsigned int)... | 1.0 | +| test.c:546:27:546:38 | (...) | 8627385.0 | +| test.c:546:27:546:43 | ... * ... | 8627385.0 | +| test.c:546:28:546:28 | 2 | 1.0 | +| test.c:546:28:546:28 | (unsigned int)... | 1.0 | +| test.c:546:28:546:33 | ... * ... | 8627385.0 | +| test.c:546:28:546:37 | ... + ... | 8627385.0 | +| test.c:546:32:546:33 | ip | 8627385.0 | +| test.c:546:37:546:37 | 1 | 1.0 | +| test.c:546:37:546:37 | (unsigned int)... | 1.0 | +| test.c:546:42:546:43 | 17 | 1.0 | +| test.c:546:42:546:43 | (unsigned int)... | 1.0 | +| test.c:547:17:547:17 | 4 | 1.0 | +| test.c:547:17:547:17 | (unsigned int)... | 1.0 | +| test.c:547:17:547:34 | ... * ... | 8627385.0 | +| test.c:547:17:548:34 | ... + ... | 7.4431771938225E13 | +| test.c:547:17:549:34 | ... + ... | 6.421515527432633E20 | +| test.c:547:17:555:30 | ... + ... | 3.298869507082441E42 | +| test.c:547:21:547:34 | (...) | 8627385.0 | +| test.c:547:22:547:23 | ip | 8627385.0 | +| test.c:547:22:547:28 | ... * ... | 8627385.0 | +| test.c:547:22:547:33 | ... + ... | 8627385.0 | +| test.c:547:27:547:28 | 14 | 1.0 | +| test.c:547:27:547:28 | (unsigned int)... | 1.0 | +| test.c:547:32:547:33 | 32 | 1.0 | +| test.c:547:32:547:33 | (unsigned int)... | 1.0 | +| test.c:548:17:548:34 | (...) | 8627385.0 | +| test.c:548:18:548:18 | 2 | 1.0 | +| test.c:548:18:548:18 | (unsigned int)... | 1.0 | +| test.c:548:18:548:23 | ... * ... | 8627385.0 | +| test.c:548:18:548:28 | ... * ... | 8627385.0 | +| test.c:548:18:548:33 | ... + ... | 8627385.0 | +| test.c:548:22:548:23 | ip | 8627385.0 | +| test.c:548:27:548:28 | 14 | 1.0 | +| test.c:548:27:548:28 | (unsigned int)... | 1.0 | +| test.c:548:32:548:33 | 32 | 1.0 | +| test.c:548:32:548:33 | (unsigned int)... | 1.0 | +| test.c:549:17:549:17 | 2 | 1.0 | +| test.c:549:17:549:17 | (unsigned int)... | 1.0 | +| test.c:549:17:549:34 | ... * ... | 8627385.0 | +| test.c:549:21:549:34 | (...) | 8627385.0 | +| test.c:549:22:549:23 | ip | 8627385.0 | +| test.c:549:22:549:28 | ... * ... | 8627385.0 | +| test.c:549:22:549:33 | ... + ... | 8627385.0 | +| test.c:549:27:549:28 | 14 | 1.0 | +| test.c:549:27:549:28 | (unsigned int)... | 1.0 | +| test.c:549:32:549:33 | 64 | 1.0 | +| test.c:549:32:549:33 | (unsigned int)... | 1.0 | +| test.c:550:17:555:30 | (...) | 5.137213315127421E21 | +| test.c:550:18:550:29 | (...) | 8627385.0 | +| test.c:550:18:550:34 | ... * ... | 8627385.0 | +| test.c:550:18:551:67 | ... > ... | 1.0 | +| test.c:550:18:555:29 | ... ? ... : ... | 5.137213315127421E21 | +| test.c:550:19:550:19 | 2 | 1.0 | +| test.c:550:19:550:19 | (unsigned int)... | 1.0 | +| test.c:550:19:550:24 | ... * ... | 8627385.0 | +| test.c:550:19:550:28 | ... + ... | 8627385.0 | +| test.c:550:23:550:24 | ip | 8627385.0 | +| test.c:550:28:550:28 | 1 | 1.0 | +| test.c:550:28:550:28 | (unsigned int)... | 1.0 | +| test.c:550:33:550:34 | 14 | 1.0 | +| test.c:550:33:550:34 | (unsigned int)... | 1.0 | +| test.c:551:17:551:67 | (...) | 7.4431771938225E13 | +| test.c:551:18:551:19 | 14 | 1.0 | +| test.c:551:18:551:19 | (unsigned int)... | 1.0 | +| test.c:551:18:551:30 | ... * ... | 8627385.0 | +| test.c:551:18:551:40 | ... > ... | 1.0 | +| test.c:551:18:551:66 | ... ? ... : ... | 7.4431771938225E13 | +| test.c:551:23:551:30 | (...) | 8627385.0 | +| test.c:551:24:551:24 | 2 | 1.0 | +| test.c:551:24:551:24 | (unsigned int)... | 1.0 | +| test.c:551:24:551:29 | ... * ... | 8627385.0 | +| test.c:551:28:551:29 | ip | 8627385.0 | +| test.c:551:34:551:35 | 17 | 1.0 | +| test.c:551:34:551:35 | (unsigned int)... | 1.0 | +| test.c:551:34:551:40 | ... * ... | 8627385.0 | +| test.c:551:39:551:40 | ip | 8627385.0 | +| test.c:551:44:551:45 | 17 | 1.0 | +| test.c:551:44:551:45 | (unsigned int)... | 1.0 | +| test.c:551:44:551:56 | ... * ... | 8627385.0 | +| test.c:551:49:551:56 | (...) | 8627385.0 | +| test.c:551:50:551:50 | 2 | 1.0 | +| test.c:551:50:551:50 | (unsigned int)... | 1.0 | +| test.c:551:50:551:55 | ... * ... | 8627385.0 | +| test.c:551:54:551:55 | ip | 8627385.0 | +| test.c:551:60:551:61 | 17 | 1.0 | +| test.c:551:60:551:61 | (unsigned int)... | 1.0 | +| test.c:551:60:551:66 | ... * ... | 8627385.0 | +| test.c:551:65:551:66 | ip | 8627385.0 | +| test.c:552:21:552:32 | (...) | 1.7254771E7 | +| test.c:552:21:552:37 | ... * ... | 1.7254771E7 | +| test.c:552:22:552:22 | 2 | 1.0 | +| test.c:552:22:552:22 | (unsigned int)... | 1.0 | +| test.c:552:22:552:27 | ... * ... | 1.7254771E7 | +| test.c:552:22:552:31 | ... + ... | 1.7254771E7 | +| test.c:552:26:552:27 | ip | 1.7254771E7 | +| test.c:552:31:552:31 | 1 | 1.0 | +| test.c:552:31:552:31 | (unsigned int)... | 1.0 | +| test.c:552:36:552:37 | 14 | 1.0 | +| test.c:552:36:552:37 | (unsigned int)... | 1.0 | +| test.c:553:21:553:22 | 14 | 1.0 | +| test.c:553:21:553:22 | (unsigned int)... | 1.0 | +| test.c:553:21:553:33 | ... * ... | 1.7254771E7 | +| test.c:553:21:553:43 | ... > ... | 1.0 | +| test.c:553:21:555:29 | ... ? ... : ... | 2.97727122262441E14 | +| test.c:553:26:553:33 | (...) | 1.7254771E7 | +| test.c:553:27:553:27 | 2 | 1.0 | +| test.c:553:27:553:27 | (unsigned int)... | 1.0 | +| test.c:553:27:553:32 | ... * ... | 1.7254771E7 | +| test.c:553:31:553:32 | ip | 1.7254771E7 | +| test.c:553:37:553:38 | 17 | 1.0 | +| test.c:553:37:553:38 | (unsigned int)... | 1.0 | +| test.c:553:37:553:43 | ... * ... | 1.7254771E7 | +| test.c:553:42:553:43 | ip | 1.7254771E7 | +| test.c:554:23:554:24 | 14 | 1.0 | +| test.c:554:23:554:24 | (unsigned int)... | 1.0 | +| test.c:554:23:554:35 | ... * ... | 1.7254771E7 | +| test.c:554:28:554:35 | (...) | 1.7254771E7 | +| test.c:554:29:554:29 | 2 | 1.0 | +| test.c:554:29:554:29 | (unsigned int)... | 1.0 | +| test.c:554:29:554:34 | ... * ... | 1.7254771E7 | +| test.c:554:33:554:34 | ip | 1.7254771E7 | +| test.c:555:23:555:24 | 14 | 1.0 | +| test.c:555:23:555:24 | (unsigned int)... | 1.0 | +| test.c:555:23:555:29 | ... * ... | 1.7254771E7 | +| test.c:555:28:555:29 | ip | 1.7254771E7 | +| test.c:556:17:556:17 | 2 | 1.0 | +| test.c:556:17:556:17 | (unsigned int)... | 1.0 | +| test.c:556:17:556:22 | ... * ... | 8627385.0 | +| test.c:556:17:556:27 | ... * ... | 8627385.0 | +| test.c:556:17:556:47 | ... + ... | 7.4431771938225E13 | +| test.c:556:21:556:22 | ip | 8627385.0 | +| test.c:556:26:556:27 | 14 | 1.0 | +| test.c:556:26:556:27 | (unsigned int)... | 1.0 | +| test.c:556:31:556:42 | (...) | 8627385.0 | +| test.c:556:31:556:47 | ... * ... | 8627385.0 | +| test.c:556:32:556:32 | 2 | 1.0 | +| test.c:556:32:556:32 | (unsigned int)... | 1.0 | +| test.c:556:32:556:37 | ... * ... | 8627385.0 | +| test.c:556:32:556:41 | ... + ... | 8627385.0 | +| test.c:556:36:556:37 | ip | 8627385.0 | +| test.c:556:41:556:41 | 1 | 1.0 | +| test.c:556:41:556:41 | (unsigned int)... | 1.0 | +| test.c:556:46:556:47 | 17 | 1.0 | +| test.c:556:46:556:47 | (unsigned int)... | 1.0 | +| test.c:557:11:578:30 | (...) | 6.08636382738973E71 | +| test.c:557:12:557:12 | 4 | 1.0 | +| test.c:557:12:557:12 | (unsigned int)... | 1.0 | +| test.c:557:12:557:29 | ... * ... | 6.0391698E7 | +| test.c:557:12:558:30 | ... + ... | 3.647157187323204E15 | +| test.c:557:12:559:30 | ... + ... | 2.2025801541535236E23 | +| test.c:557:12:565:26 | ... + ... | 3.881087564774641E47 | +| test.c:557:12:566:61 | ... > ... | 1.0 | +| test.c:557:12:578:29 | ... ? ... : ... | 6.08636382738973E71 | +| test.c:557:16:557:29 | (...) | 6.0391698E7 | +| test.c:557:17:557:18 | ip | 6.0391698E7 | +| test.c:557:17:557:23 | ... * ... | 6.0391698E7 | +| test.c:557:17:557:28 | ... + ... | 6.0391698E7 | +| test.c:557:22:557:23 | 14 | 1.0 | +| test.c:557:22:557:23 | (unsigned int)... | 1.0 | +| test.c:557:27:557:28 | 32 | 1.0 | +| test.c:557:27:557:28 | (unsigned int)... | 1.0 | +| test.c:558:13:558:30 | (...) | 6.0391698E7 | +| test.c:558:14:558:14 | 2 | 1.0 | +| test.c:558:14:558:14 | (unsigned int)... | 1.0 | +| test.c:558:14:558:19 | ... * ... | 6.0391698E7 | +| test.c:558:14:558:24 | ... * ... | 6.0391698E7 | +| test.c:558:14:558:29 | ... + ... | 6.0391698E7 | +| test.c:558:18:558:19 | ip | 6.0391698E7 | +| test.c:558:23:558:24 | 14 | 1.0 | +| test.c:558:23:558:24 | (unsigned int)... | 1.0 | +| test.c:558:28:558:29 | 32 | 1.0 | +| test.c:558:28:558:29 | (unsigned int)... | 1.0 | +| test.c:559:13:559:13 | 2 | 1.0 | +| test.c:559:13:559:13 | (unsigned int)... | 1.0 | +| test.c:559:13:559:30 | ... * ... | 6.0391698E7 | +| test.c:559:17:559:30 | (...) | 6.0391698E7 | +| test.c:559:18:559:19 | ip | 6.0391698E7 | +| test.c:559:18:559:24 | ... * ... | 6.0391698E7 | +| test.c:559:18:559:29 | ... + ... | 6.0391698E7 | +| test.c:559:23:559:24 | 14 | 1.0 | +| test.c:559:23:559:24 | (unsigned int)... | 1.0 | +| test.c:559:28:559:29 | 64 | 1.0 | +| test.c:559:28:559:29 | (unsigned int)... | 1.0 | +| test.c:560:13:565:26 | (...) | 1.7620641670887053E24 | +| test.c:560:14:560:25 | (...) | 6.0391698E7 | +| test.c:560:14:560:30 | ... * ... | 6.0391698E7 | +| test.c:560:14:561:63 | ... > ... | 1.0 | +| test.c:560:14:565:25 | ... ? ... : ... | 1.7620641670887053E24 | +| test.c:560:15:560:15 | 2 | 1.0 | +| test.c:560:15:560:15 | (unsigned int)... | 1.0 | +| test.c:560:15:560:20 | ... * ... | 6.0391698E7 | +| test.c:560:15:560:24 | ... + ... | 6.0391698E7 | +| test.c:560:19:560:20 | ip | 6.0391698E7 | +| test.c:560:24:560:24 | 1 | 1.0 | +| test.c:560:24:560:24 | (unsigned int)... | 1.0 | +| test.c:560:29:560:30 | 14 | 1.0 | +| test.c:560:29:560:30 | (unsigned int)... | 1.0 | +| test.c:561:13:561:63 | (...) | 3.647157187323204E15 | +| test.c:561:14:561:15 | 14 | 1.0 | +| test.c:561:14:561:15 | (unsigned int)... | 1.0 | +| test.c:561:14:561:26 | ... * ... | 6.0391698E7 | +| test.c:561:14:561:36 | ... > ... | 1.0 | +| test.c:561:14:561:62 | ... ? ... : ... | 3.647157187323204E15 | +| test.c:561:19:561:26 | (...) | 6.0391698E7 | +| test.c:561:20:561:20 | 2 | 1.0 | +| test.c:561:20:561:20 | (unsigned int)... | 1.0 | +| test.c:561:20:561:25 | ... * ... | 6.0391698E7 | +| test.c:561:24:561:25 | ip | 6.0391698E7 | +| test.c:561:30:561:31 | 17 | 1.0 | +| test.c:561:30:561:31 | (unsigned int)... | 1.0 | +| test.c:561:30:561:36 | ... * ... | 6.0391698E7 | +| test.c:561:35:561:36 | ip | 6.0391698E7 | +| test.c:561:40:561:41 | 17 | 1.0 | +| test.c:561:40:561:41 | (unsigned int)... | 1.0 | +| test.c:561:40:561:52 | ... * ... | 6.0391698E7 | +| test.c:561:45:561:52 | (...) | 6.0391698E7 | +| test.c:561:46:561:46 | 2 | 1.0 | +| test.c:561:46:561:46 | (unsigned int)... | 1.0 | +| test.c:561:46:561:51 | ... * ... | 6.0391698E7 | +| test.c:561:50:561:51 | ip | 6.0391698E7 | +| test.c:561:56:561:57 | 17 | 1.0 | +| test.c:561:56:561:57 | (unsigned int)... | 1.0 | +| test.c:561:56:561:62 | ... * ... | 6.0391698E7 | +| test.c:561:61:561:62 | ip | 6.0391698E7 | +| test.c:562:17:562:28 | (...) | 1.20783397E8 | +| test.c:562:17:562:33 | ... * ... | 1.20783397E8 | +| test.c:562:18:562:18 | 2 | 1.0 | +| test.c:562:18:562:18 | (unsigned int)... | 1.0 | +| test.c:562:18:562:23 | ... * ... | 1.20783397E8 | +| test.c:562:18:562:27 | ... + ... | 1.20783397E8 | +| test.c:562:22:562:23 | ip | 1.20783397E8 | +| test.c:562:27:562:27 | 1 | 1.0 | +| test.c:562:27:562:27 | (unsigned int)... | 1.0 | +| test.c:562:32:562:33 | 14 | 1.0 | +| test.c:562:32:562:33 | (unsigned int)... | 1.0 | +| test.c:563:17:563:18 | 14 | 1.0 | +| test.c:563:17:563:18 | (unsigned int)... | 1.0 | +| test.c:563:17:563:29 | ... * ... | 1.20783397E8 | +| test.c:563:17:563:39 | ... > ... | 1.0 | +| test.c:563:17:565:25 | ... ? ... : ... | 1.4588628990859608E16 | +| test.c:563:22:563:29 | (...) | 1.20783397E8 | +| test.c:563:23:563:23 | 2 | 1.0 | +| test.c:563:23:563:23 | (unsigned int)... | 1.0 | +| test.c:563:23:563:28 | ... * ... | 1.20783397E8 | +| test.c:563:27:563:28 | ip | 1.20783397E8 | +| test.c:563:33:563:34 | 17 | 1.0 | +| test.c:563:33:563:34 | (unsigned int)... | 1.0 | +| test.c:563:33:563:39 | ... * ... | 1.20783397E8 | +| test.c:563:38:563:39 | ip | 1.20783397E8 | +| test.c:564:19:564:20 | 14 | 1.0 | +| test.c:564:19:564:20 | (unsigned int)... | 1.0 | +| test.c:564:19:564:31 | ... * ... | 1.20783397E8 | +| test.c:564:24:564:31 | (...) | 1.20783397E8 | +| test.c:564:25:564:25 | 2 | 1.0 | +| test.c:564:25:564:25 | (unsigned int)... | 1.0 | +| test.c:564:25:564:30 | ... * ... | 1.20783397E8 | +| test.c:564:29:564:30 | ip | 1.20783397E8 | +| test.c:565:19:565:20 | 14 | 1.0 | +| test.c:565:19:565:20 | (unsigned int)... | 1.0 | +| test.c:565:19:565:25 | ... * ... | 1.20783397E8 | +| test.c:565:24:565:25 | ip | 1.20783397E8 | +| test.c:566:11:566:61 | (...) | 1.3129766091773648E17 | +| test.c:566:12:566:13 | 14 | 1.0 | +| test.c:566:12:566:13 | (unsigned int)... | 1.0 | +| test.c:566:12:566:18 | ... * ... | 3.62350191E8 | +| test.c:566:12:566:34 | ... > ... | 1.0 | +| test.c:566:12:566:60 | ... ? ... : ... | 1.3129766091773648E17 | +| test.c:566:17:566:18 | ip | 3.62350191E8 | +| test.c:566:22:566:29 | (...) | 3.62350191E8 | +| test.c:566:22:566:34 | ... * ... | 3.62350191E8 | +| test.c:566:23:566:24 | ip | 3.62350191E8 | +| test.c:566:23:566:28 | ... + ... | 3.62350191E8 | +| test.c:566:28:566:28 | 1 | 1.0 | +| test.c:566:28:566:28 | (unsigned int)... | 1.0 | +| test.c:566:33:566:34 | 17 | 1.0 | +| test.c:566:33:566:34 | (unsigned int)... | 1.0 | +| test.c:566:38:566:39 | 17 | 1.0 | +| test.c:566:38:566:39 | (unsigned int)... | 1.0 | +| test.c:566:38:566:44 | ... * ... | 3.62350191E8 | +| test.c:566:43:566:44 | ip | 3.62350191E8 | +| test.c:566:48:566:55 | (...) | 3.62350191E8 | +| test.c:566:48:566:60 | ... * ... | 3.62350191E8 | +| test.c:566:49:566:50 | ip | 3.62350191E8 | +| test.c:566:49:566:54 | ... + ... | 3.62350191E8 | +| test.c:566:54:566:54 | 1 | 1.0 | +| test.c:566:54:566:54 | (unsigned int)... | 1.0 | +| test.c:566:59:566:60 | 17 | 1.0 | +| test.c:566:59:566:60 | (unsigned int)... | 1.0 | +| test.c:567:15:567:15 | 4 | 1.0 | +| test.c:567:15:567:15 | (unsigned int)... | 1.0 | +| test.c:567:15:567:32 | ... * ... | 7.24700382E8 | +| test.c:567:15:568:32 | ... + ... | 5.251906436709459E17 | +| test.c:567:15:569:32 | ... + ... | 3.806058600911604E26 | +| test.c:567:15:575:28 | ... + ... | 1.1588865682845433E54 | +| test.c:567:19:567:32 | (...) | 7.24700382E8 | +| test.c:567:20:567:21 | ip | 7.24700382E8 | +| test.c:567:20:567:26 | ... * ... | 7.24700382E8 | +| test.c:567:20:567:31 | ... + ... | 7.24700382E8 | +| test.c:567:25:567:26 | 14 | 1.0 | +| test.c:567:25:567:26 | (unsigned int)... | 1.0 | +| test.c:567:30:567:31 | 32 | 1.0 | +| test.c:567:30:567:31 | (unsigned int)... | 1.0 | +| test.c:568:15:568:32 | (...) | 7.24700382E8 | +| test.c:568:16:568:16 | 2 | 1.0 | +| test.c:568:16:568:16 | (unsigned int)... | 1.0 | +| test.c:568:16:568:21 | ... * ... | 7.24700382E8 | +| test.c:568:16:568:26 | ... * ... | 7.24700382E8 | +| test.c:568:16:568:31 | ... + ... | 7.24700382E8 | +| test.c:568:20:568:21 | ip | 7.24700382E8 | +| test.c:568:25:568:26 | 14 | 1.0 | +| test.c:568:25:568:26 | (unsigned int)... | 1.0 | +| test.c:568:30:568:31 | 32 | 1.0 | +| test.c:568:30:568:31 | (unsigned int)... | 1.0 | +| test.c:569:15:569:15 | 2 | 1.0 | +| test.c:569:15:569:15 | (unsigned int)... | 1.0 | +| test.c:569:15:569:32 | ... * ... | 7.24700382E8 | +| test.c:569:19:569:32 | (...) | 7.24700382E8 | +| test.c:569:20:569:21 | ip | 7.24700382E8 | +| test.c:569:20:569:26 | ... * ... | 7.24700382E8 | +| test.c:569:20:569:31 | ... + ... | 7.24700382E8 | +| test.c:569:25:569:26 | 14 | 1.0 | +| test.c:569:25:569:26 | (unsigned int)... | 1.0 | +| test.c:569:30:569:31 | 64 | 1.0 | +| test.c:569:30:569:31 | (unsigned int)... | 1.0 | +| test.c:570:15:575:28 | (...) | 3.044846887031571E27 | +| test.c:570:16:570:27 | (...) | 7.24700382E8 | +| test.c:570:16:570:32 | ... * ... | 7.24700382E8 | +| test.c:570:16:571:65 | ... > ... | 1.0 | +| test.c:570:16:575:27 | ... ? ... : ... | 3.044846887031571E27 | +| test.c:570:17:570:17 | 2 | 1.0 | +| test.c:570:17:570:17 | (unsigned int)... | 1.0 | +| test.c:570:17:570:22 | ... * ... | 7.24700382E8 | +| test.c:570:17:570:26 | ... + ... | 7.24700382E8 | +| test.c:570:21:570:22 | ip | 7.24700382E8 | +| test.c:570:26:570:26 | 1 | 1.0 | +| test.c:570:26:570:26 | (unsigned int)... | 1.0 | +| test.c:570:31:570:32 | 14 | 1.0 | +| test.c:570:31:570:32 | (unsigned int)... | 1.0 | +| test.c:571:15:571:65 | (...) | 5.251906436709459E17 | +| test.c:571:16:571:17 | 14 | 1.0 | +| test.c:571:16:571:17 | (unsigned int)... | 1.0 | +| test.c:571:16:571:28 | ... * ... | 7.24700382E8 | +| test.c:571:16:571:38 | ... > ... | 1.0 | +| test.c:571:16:571:64 | ... ? ... : ... | 5.251906436709459E17 | +| test.c:571:21:571:28 | (...) | 7.24700382E8 | +| test.c:571:22:571:22 | 2 | 1.0 | +| test.c:571:22:571:22 | (unsigned int)... | 1.0 | +| test.c:571:22:571:27 | ... * ... | 7.24700382E8 | +| test.c:571:26:571:27 | ip | 7.24700382E8 | +| test.c:571:32:571:33 | 17 | 1.0 | +| test.c:571:32:571:33 | (unsigned int)... | 1.0 | +| test.c:571:32:571:38 | ... * ... | 7.24700382E8 | +| test.c:571:37:571:38 | ip | 7.24700382E8 | +| test.c:571:42:571:43 | 17 | 1.0 | +| test.c:571:42:571:43 | (unsigned int)... | 1.0 | +| test.c:571:42:571:54 | ... * ... | 7.24700382E8 | +| test.c:571:47:571:54 | (...) | 7.24700382E8 | +| test.c:571:48:571:48 | 2 | 1.0 | +| test.c:571:48:571:48 | (unsigned int)... | 1.0 | +| test.c:571:48:571:53 | ... * ... | 7.24700382E8 | +| test.c:571:52:571:53 | ip | 7.24700382E8 | +| test.c:571:58:571:59 | 17 | 1.0 | +| test.c:571:58:571:59 | (unsigned int)... | 1.0 | +| test.c:571:58:571:64 | ... * ... | 7.24700382E8 | +| test.c:571:63:571:64 | ip | 7.24700382E8 | +| test.c:572:19:572:30 | (...) | 1.449400765E9 | +| test.c:572:19:572:35 | ... * ... | 1.449400765E9 | +| test.c:572:20:572:20 | 2 | 1.0 | +| test.c:572:20:572:20 | (unsigned int)... | 1.0 | +| test.c:572:20:572:25 | ... * ... | 1.449400765E9 | +| test.c:572:20:572:29 | ... + ... | 1.449400765E9 | +| test.c:572:24:572:25 | ip | 1.449400765E9 | +| test.c:572:29:572:29 | 1 | 1.0 | +| test.c:572:29:572:29 | (unsigned int)... | 1.0 | +| test.c:572:34:572:35 | 14 | 1.0 | +| test.c:572:34:572:35 | (unsigned int)... | 1.0 | +| test.c:573:19:573:20 | 14 | 1.0 | +| test.c:573:19:573:20 | (unsigned int)... | 1.0 | +| test.c:573:19:573:31 | ... * ... | 1.449400765E9 | +| test.c:573:19:573:41 | ... > ... | 1.0 | +| test.c:573:19:575:27 | ... ? ... : ... | 2.1007625775825853E18 | +| test.c:573:24:573:31 | (...) | 1.449400765E9 | +| test.c:573:25:573:25 | 2 | 1.0 | +| test.c:573:25:573:25 | (unsigned int)... | 1.0 | +| test.c:573:25:573:30 | ... * ... | 1.449400765E9 | +| test.c:573:29:573:30 | ip | 1.449400765E9 | +| test.c:573:35:573:36 | 17 | 1.0 | +| test.c:573:35:573:36 | (unsigned int)... | 1.0 | +| test.c:573:35:573:41 | ... * ... | 1.449400765E9 | +| test.c:573:40:573:41 | ip | 1.449400765E9 | +| test.c:574:21:574:22 | 14 | 1.0 | +| test.c:574:21:574:22 | (unsigned int)... | 1.0 | +| test.c:574:21:574:33 | ... * ... | 1.449400765E9 | +| test.c:574:26:574:33 | (...) | 1.449400765E9 | +| test.c:574:27:574:27 | 2 | 1.0 | +| test.c:574:27:574:27 | (unsigned int)... | 1.0 | +| test.c:574:27:574:32 | ... * ... | 1.449400765E9 | +| test.c:574:31:574:32 | ip | 1.449400765E9 | +| test.c:575:21:575:22 | 14 | 1.0 | +| test.c:575:21:575:22 | (unsigned int)... | 1.0 | +| test.c:575:21:575:27 | ... * ... | 1.449400765E9 | +| test.c:575:26:575:27 | ip | 1.449400765E9 | +| test.c:576:15:576:16 | 14 | 1.0 | +| test.c:576:15:576:16 | (unsigned int)... | 1.0 | +| test.c:576:15:576:21 | ... * ... | 7.24700382E8 | +| test.c:576:15:576:37 | ... > ... | 1.0 | +| test.c:576:15:578:29 | ... ? ... : ... | 5.251906436709459E17 | +| test.c:576:20:576:21 | ip | 7.24700382E8 | +| test.c:576:25:576:32 | (...) | 7.24700382E8 | +| test.c:576:25:576:37 | ... * ... | 7.24700382E8 | +| test.c:576:26:576:27 | ip | 7.24700382E8 | +| test.c:576:26:576:31 | ... + ... | 7.24700382E8 | +| test.c:576:31:576:31 | 1 | 1.0 | +| test.c:576:31:576:31 | (unsigned int)... | 1.0 | +| test.c:576:36:576:37 | 17 | 1.0 | +| test.c:576:36:576:37 | (unsigned int)... | 1.0 | +| test.c:577:17:577:18 | 14 | 1.0 | +| test.c:577:17:577:18 | (unsigned int)... | 1.0 | +| test.c:577:17:577:23 | ... * ... | 7.24700382E8 | +| test.c:577:22:577:23 | ip | 7.24700382E8 | +| test.c:578:17:578:24 | (...) | 7.24700382E8 | +| test.c:578:17:578:29 | ... * ... | 7.24700382E8 | +| test.c:578:18:578:19 | ip | 7.24700382E8 | +| test.c:578:18:578:23 | ... + ... | 7.24700382E8 | +| test.c:578:23:578:23 | 1 | 1.0 | +| test.c:578:23:578:23 | (unsigned int)... | 1.0 | +| test.c:578:28:578:29 | 14 | 1.0 | +| test.c:578:28:578:29 | (unsigned int)... | 1.0 | +| test.c:579:11:579:11 | 2 | 1.0 | +| test.c:579:11:579:11 | (unsigned int)... | 1.0 | +| test.c:579:11:579:28 | ... * ... | 5.797603059E9 | +| test.c:579:11:599:46 | ... + ... | 9.943431528813442E94 | +| test.c:579:15:579:28 | (...) | 5.797603059E9 | +| test.c:579:16:579:17 | ip | 5.797603059E9 | +| test.c:579:16:579:22 | ... * ... | 5.797603059E9 | +| test.c:579:16:579:27 | ... + ... | 5.797603059E9 | +| test.c:579:21:579:22 | 14 | 1.0 | +| test.c:579:21:579:22 | (unsigned int)... | 1.0 | +| test.c:579:26:579:27 | 32 | 1.0 | +| test.c:579:26:579:27 | (unsigned int)... | 1.0 | +| test.c:580:11:599:46 | (...) | 1.715093535659983E85 | +| test.c:580:12:580:12 | 4 | 1.0 | +| test.c:580:12:580:12 | (unsigned int)... | 1.0 | +| test.c:580:12:580:29 | ... * ... | 5.797603059E9 | +| test.c:580:12:581:30 | ... + ... | 3.361220122972616E19 | +| test.c:580:12:582:30 | ... + ... | 1.9487020066918396E29 | +| test.c:580:12:588:26 | ... + ... | 3.0379516094938436E59 | +| test.c:580:12:589:41 | ... > ... | 1.0 | +| test.c:580:12:599:45 | ... ? ... : ... | 1.715093535659983E85 | +| test.c:580:16:580:29 | (...) | 5.797603059E9 | +| test.c:580:17:580:18 | ip | 5.797603059E9 | +| test.c:580:17:580:23 | ... * ... | 5.797603059E9 | +| test.c:580:17:580:28 | ... + ... | 5.797603059E9 | +| test.c:580:22:580:23 | 14 | 1.0 | +| test.c:580:22:580:23 | (unsigned int)... | 1.0 | +| test.c:580:27:580:28 | 32 | 1.0 | +| test.c:580:27:580:28 | (unsigned int)... | 1.0 | +| test.c:581:13:581:30 | (...) | 5.797603059E9 | +| test.c:581:14:581:14 | 2 | 1.0 | +| test.c:581:14:581:14 | (unsigned int)... | 1.0 | +| test.c:581:14:581:19 | ... * ... | 5.797603059E9 | +| test.c:581:14:581:24 | ... * ... | 5.797603059E9 | +| test.c:581:14:581:29 | ... + ... | 5.797603059E9 | +| test.c:581:18:581:19 | ip | 5.797603059E9 | +| test.c:581:23:581:24 | 14 | 1.0 | +| test.c:581:23:581:24 | (unsigned int)... | 1.0 | +| test.c:581:28:581:29 | 32 | 1.0 | +| test.c:581:28:581:29 | (unsigned int)... | 1.0 | +| test.c:582:13:582:13 | 2 | 1.0 | +| test.c:582:13:582:13 | (unsigned int)... | 1.0 | +| test.c:582:13:582:30 | ... * ... | 5.797603059E9 | +| test.c:582:17:582:30 | (...) | 5.797603059E9 | +| test.c:582:18:582:19 | ip | 5.797603059E9 | +| test.c:582:18:582:24 | ... * ... | 5.797603059E9 | +| test.c:582:18:582:29 | ... + ... | 5.797603059E9 | +| test.c:582:23:582:24 | 14 | 1.0 | +| test.c:582:23:582:24 | (unsigned int)... | 1.0 | +| test.c:582:28:582:29 | 64 | 1.0 | +| test.c:582:28:582:29 | (unsigned int)... | 1.0 | +| test.c:583:13:588:26 | (...) | 1.558961605756818E30 | +| test.c:583:14:583:25 | (...) | 5.797603059E9 | +| test.c:583:14:583:30 | ... * ... | 5.797603059E9 | +| test.c:583:14:584:63 | ... > ... | 1.0 | +| test.c:583:14:588:25 | ... ? ... : ... | 1.558961605756818E30 | +| test.c:583:15:583:15 | 2 | 1.0 | +| test.c:583:15:583:15 | (unsigned int)... | 1.0 | +| test.c:583:15:583:20 | ... * ... | 5.797603059E9 | +| test.c:583:15:583:24 | ... + ... | 5.797603059E9 | +| test.c:583:19:583:20 | ip | 5.797603059E9 | +| test.c:583:24:583:24 | 1 | 1.0 | +| test.c:583:24:583:24 | (unsigned int)... | 1.0 | +| test.c:583:29:583:30 | 14 | 1.0 | +| test.c:583:29:583:30 | (unsigned int)... | 1.0 | +| test.c:584:13:584:63 | (...) | 3.361220122972616E19 | +| test.c:584:14:584:15 | 14 | 1.0 | +| test.c:584:14:584:15 | (unsigned int)... | 1.0 | +| test.c:584:14:584:26 | ... * ... | 5.797603059E9 | +| test.c:584:14:584:36 | ... > ... | 1.0 | +| test.c:584:14:584:62 | ... ? ... : ... | 3.361220122972616E19 | +| test.c:584:19:584:26 | (...) | 5.797603059E9 | +| test.c:584:20:584:20 | 2 | 1.0 | +| test.c:584:20:584:20 | (unsigned int)... | 1.0 | +| test.c:584:20:584:25 | ... * ... | 5.797603059E9 | +| test.c:584:24:584:25 | ip | 5.797603059E9 | +| test.c:584:30:584:31 | 17 | 1.0 | +| test.c:584:30:584:31 | (unsigned int)... | 1.0 | +| test.c:584:30:584:36 | ... * ... | 5.797603059E9 | +| test.c:584:35:584:36 | ip | 5.797603059E9 | +| test.c:584:40:584:41 | 17 | 1.0 | +| test.c:584:40:584:41 | (unsigned int)... | 1.0 | +| test.c:584:40:584:52 | ... * ... | 5.797603059E9 | +| test.c:584:45:584:52 | (...) | 5.797603059E9 | +| test.c:584:46:584:46 | 2 | 1.0 | +| test.c:584:46:584:46 | (unsigned int)... | 1.0 | +| test.c:584:46:584:51 | ... * ... | 5.797603059E9 | +| test.c:584:50:584:51 | ip | 5.797603059E9 | +| test.c:584:56:584:57 | 17 | 1.0 | +| test.c:584:56:584:57 | (unsigned int)... | 1.0 | +| test.c:584:56:584:62 | ... * ... | 5.797603059E9 | +| test.c:584:61:584:62 | ip | 5.797603059E9 | +| test.c:585:17:585:28 | (...) | 1.1595206119E10 | +| test.c:585:17:585:33 | ... * ... | 1.1595206119E10 | +| test.c:585:18:585:18 | 2 | 1.0 | +| test.c:585:18:585:18 | (unsigned int)... | 1.0 | +| test.c:585:18:585:23 | ... * ... | 1.1595206119E10 | +| test.c:585:18:585:27 | ... + ... | 1.1595206119E10 | +| test.c:585:22:585:23 | ip | 1.1595206119E10 | +| test.c:585:27:585:27 | 1 | 1.0 | +| test.c:585:27:585:27 | (unsigned int)... | 1.0 | +| test.c:585:32:585:33 | 14 | 1.0 | +| test.c:585:32:585:33 | (unsigned int)... | 1.0 | +| test.c:586:17:586:18 | 14 | 1.0 | +| test.c:586:17:586:18 | (unsigned int)... | 1.0 | +| test.c:586:17:586:29 | ... * ... | 1.1595206119E10 | +| test.c:586:17:586:39 | ... > ... | 1.0 | +| test.c:586:17:588:25 | ... ? ... : ... | 1.3444880494209504E20 | +| test.c:586:22:586:29 | (...) | 1.1595206119E10 | +| test.c:586:23:586:23 | 2 | 1.0 | +| test.c:586:23:586:23 | (unsigned int)... | 1.0 | +| test.c:586:23:586:28 | ... * ... | 1.1595206119E10 | +| test.c:586:27:586:28 | ip | 1.1595206119E10 | +| test.c:586:33:586:34 | 17 | 1.0 | +| test.c:586:33:586:34 | (unsigned int)... | 1.0 | +| test.c:586:33:586:39 | ... * ... | 1.1595206119E10 | +| test.c:586:38:586:39 | ip | 1.1595206119E10 | +| test.c:587:19:587:20 | 14 | 1.0 | +| test.c:587:19:587:20 | (unsigned int)... | 1.0 | +| test.c:587:19:587:31 | ... * ... | 1.1595206119E10 | +| test.c:587:24:587:31 | (...) | 1.1595206119E10 | +| test.c:587:25:587:25 | 2 | 1.0 | +| test.c:587:25:587:25 | (unsigned int)... | 1.0 | +| test.c:587:25:587:30 | ... * ... | 1.1595206119E10 | +| test.c:587:29:587:30 | ip | 1.1595206119E10 | +| test.c:588:19:588:20 | 14 | 1.0 | +| test.c:588:19:588:20 | (unsigned int)... | 1.0 | +| test.c:588:19:588:25 | ... * ... | 1.1595206119E10 | +| test.c:588:24:588:25 | ip | 1.1595206119E10 | +| test.c:589:11:589:11 | 2 | 1.0 | +| test.c:589:11:589:11 | (unsigned int)... | 1.0 | +| test.c:589:11:589:16 | ... * ... | 3.4785618357E10 | +| test.c:589:11:589:21 | ... * ... | 3.4785618357E10 | +| test.c:589:11:589:41 | ... + ... | 1.2100392444788552E21 | +| test.c:589:15:589:16 | ip | 3.4785618357E10 | +| test.c:589:20:589:21 | 14 | 1.0 | +| test.c:589:20:589:21 | (unsigned int)... | 1.0 | +| test.c:589:25:589:36 | (...) | 3.4785618357E10 | +| test.c:589:25:589:41 | ... * ... | 3.4785618357E10 | +| test.c:589:26:589:26 | 2 | 1.0 | +| test.c:589:26:589:26 | (unsigned int)... | 1.0 | +| test.c:589:26:589:31 | ... * ... | 3.4785618357E10 | +| test.c:589:26:589:35 | ... + ... | 3.4785618357E10 | +| test.c:589:30:589:31 | ip | 3.4785618357E10 | +| test.c:589:35:589:35 | 1 | 1.0 | +| test.c:589:35:589:35 | (unsigned int)... | 1.0 | +| test.c:589:40:589:41 | 17 | 1.0 | +| test.c:589:40:589:41 | (unsigned int)... | 1.0 | +| test.c:590:15:590:15 | 4 | 1.0 | +| test.c:590:15:590:15 | (unsigned int)... | 1.0 | +| test.c:590:15:590:32 | ... * ... | 3.4785618357E10 | +| test.c:590:15:591:32 | ... + ... | 1.2100392444788552E21 | +| test.c:590:15:592:32 | ... + ... | 4.209196335543408E31 | +| test.c:590:15:598:28 | ... + ... | 1.417386703353284E64 | +| test.c:590:19:590:32 | (...) | 3.4785618357E10 | +| test.c:590:20:590:21 | ip | 3.4785618357E10 | +| test.c:590:20:590:26 | ... * ... | 3.4785618357E10 | +| test.c:590:20:590:31 | ... + ... | 3.4785618357E10 | +| test.c:590:25:590:26 | 14 | 1.0 | +| test.c:590:25:590:26 | (unsigned int)... | 1.0 | +| test.c:590:30:590:31 | 32 | 1.0 | +| test.c:590:30:590:31 | (unsigned int)... | 1.0 | +| test.c:591:15:591:32 | (...) | 3.4785618357E10 | +| test.c:591:16:591:16 | 2 | 1.0 | +| test.c:591:16:591:16 | (unsigned int)... | 1.0 | +| test.c:591:16:591:21 | ... * ... | 3.4785618357E10 | +| test.c:591:16:591:26 | ... * ... | 3.4785618357E10 | +| test.c:591:16:591:31 | ... + ... | 3.4785618357E10 | +| test.c:591:20:591:21 | ip | 3.4785618357E10 | +| test.c:591:25:591:26 | 14 | 1.0 | +| test.c:591:25:591:26 | (unsigned int)... | 1.0 | +| test.c:591:30:591:31 | 32 | 1.0 | +| test.c:591:30:591:31 | (unsigned int)... | 1.0 | +| test.c:592:15:592:15 | 2 | 1.0 | +| test.c:592:15:592:15 | (unsigned int)... | 1.0 | +| test.c:592:15:592:32 | ... * ... | 3.4785618357E10 | +| test.c:592:19:592:32 | (...) | 3.4785618357E10 | +| test.c:592:20:592:21 | ip | 3.4785618357E10 | +| test.c:592:20:592:26 | ... * ... | 3.4785618357E10 | +| test.c:592:20:592:31 | ... + ... | 3.4785618357E10 | +| test.c:592:25:592:26 | 14 | 1.0 | +| test.c:592:25:592:26 | (unsigned int)... | 1.0 | +| test.c:592:30:592:31 | 64 | 1.0 | +| test.c:592:30:592:31 | (unsigned int)... | 1.0 | +| test.c:593:15:598:28 | (...) | 3.367357068579931E32 | +| test.c:593:16:593:27 | (...) | 3.4785618357E10 | +| test.c:593:16:593:32 | ... * ... | 3.4785618357E10 | +| test.c:593:16:594:65 | ... > ... | 1.0 | +| test.c:593:16:598:27 | ... ? ... : ... | 3.367357068579931E32 | +| test.c:593:17:593:17 | 2 | 1.0 | +| test.c:593:17:593:17 | (unsigned int)... | 1.0 | +| test.c:593:17:593:22 | ... * ... | 3.4785618357E10 | +| test.c:593:17:593:26 | ... + ... | 3.4785618357E10 | +| test.c:593:21:593:22 | ip | 3.4785618357E10 | +| test.c:593:26:593:26 | 1 | 1.0 | +| test.c:593:26:593:26 | (unsigned int)... | 1.0 | +| test.c:593:31:593:32 | 14 | 1.0 | +| test.c:593:31:593:32 | (unsigned int)... | 1.0 | +| test.c:594:15:594:65 | (...) | 1.2100392444788552E21 | +| test.c:594:16:594:17 | 14 | 1.0 | +| test.c:594:16:594:17 | (unsigned int)... | 1.0 | +| test.c:594:16:594:28 | ... * ... | 3.4785618357E10 | +| test.c:594:16:594:38 | ... > ... | 1.0 | +| test.c:594:16:594:64 | ... ? ... : ... | 1.2100392444788552E21 | +| test.c:594:21:594:28 | (...) | 3.4785618357E10 | +| test.c:594:22:594:22 | 2 | 1.0 | +| test.c:594:22:594:22 | (unsigned int)... | 1.0 | +| test.c:594:22:594:27 | ... * ... | 3.4785618357E10 | +| test.c:594:26:594:27 | ip | 3.4785618357E10 | +| test.c:594:32:594:33 | 17 | 1.0 | +| test.c:594:32:594:33 | (unsigned int)... | 1.0 | +| test.c:594:32:594:38 | ... * ... | 3.4785618357E10 | +| test.c:594:37:594:38 | ip | 3.4785618357E10 | +| test.c:594:42:594:43 | 17 | 1.0 | +| test.c:594:42:594:43 | (unsigned int)... | 1.0 | +| test.c:594:42:594:54 | ... * ... | 3.4785618357E10 | +| test.c:594:47:594:54 | (...) | 3.4785618357E10 | +| test.c:594:48:594:48 | 2 | 1.0 | +| test.c:594:48:594:48 | (unsigned int)... | 1.0 | +| test.c:594:48:594:53 | ... * ... | 3.4785618357E10 | +| test.c:594:52:594:53 | ip | 3.4785618357E10 | +| test.c:594:58:594:59 | 17 | 1.0 | +| test.c:594:58:594:59 | (unsigned int)... | 1.0 | +| test.c:594:58:594:64 | ... * ... | 3.4785618357E10 | +| test.c:594:63:594:64 | ip | 3.4785618357E10 | +| test.c:595:19:595:30 | (...) | 6.9571236715E10 | +| test.c:595:19:595:35 | ... * ... | 6.9571236715E10 | +| test.c:595:20:595:20 | 2 | 1.0 | +| test.c:595:20:595:20 | (unsigned int)... | 1.0 | +| test.c:595:20:595:25 | ... * ... | 6.9571236715E10 | +| test.c:595:20:595:29 | ... + ... | 6.9571236715E10 | +| test.c:595:24:595:25 | ip | 6.9571236715E10 | +| test.c:595:29:595:29 | 1 | 1.0 | +| test.c:595:29:595:29 | (unsigned int)... | 1.0 | +| test.c:595:34:595:35 | 14 | 1.0 | +| test.c:595:34:595:35 | (unsigned int)... | 1.0 | +| test.c:596:19:596:20 | 14 | 1.0 | +| test.c:596:19:596:20 | (unsigned int)... | 1.0 | +| test.c:596:19:596:31 | ... * ... | 6.9571236715E10 | +| test.c:596:19:596:41 | ... > ... | 1.0 | +| test.c:596:19:598:27 | ... ? ... : ... | 4.840156978054564E21 | +| test.c:596:24:596:31 | (...) | 6.9571236715E10 | +| test.c:596:25:596:25 | 2 | 1.0 | +| test.c:596:25:596:25 | (unsigned int)... | 1.0 | +| test.c:596:25:596:30 | ... * ... | 6.9571236715E10 | +| test.c:596:29:596:30 | ip | 6.9571236715E10 | +| test.c:596:35:596:36 | 17 | 1.0 | +| test.c:596:35:596:36 | (unsigned int)... | 1.0 | +| test.c:596:35:596:41 | ... * ... | 6.9571236715E10 | +| test.c:596:40:596:41 | ip | 6.9571236715E10 | +| test.c:597:21:597:22 | 14 | 1.0 | +| test.c:597:21:597:22 | (unsigned int)... | 1.0 | +| test.c:597:21:597:33 | ... * ... | 6.9571236715E10 | +| test.c:597:26:597:33 | (...) | 6.9571236715E10 | +| test.c:597:27:597:27 | 2 | 1.0 | +| test.c:597:27:597:27 | (unsigned int)... | 1.0 | +| test.c:597:27:597:32 | ... * ... | 6.9571236715E10 | +| test.c:597:31:597:32 | ip | 6.9571236715E10 | +| test.c:598:21:598:22 | 14 | 1.0 | +| test.c:598:21:598:22 | (unsigned int)... | 1.0 | +| test.c:598:21:598:27 | ... * ... | 6.9571236715E10 | +| test.c:598:26:598:27 | ip | 6.9571236715E10 | +| test.c:599:15:599:15 | 2 | 1.0 | +| test.c:599:15:599:15 | (unsigned int)... | 1.0 | +| test.c:599:15:599:20 | ... * ... | 3.4785618357E10 | +| test.c:599:15:599:25 | ... * ... | 3.4785618357E10 | +| test.c:599:15:599:45 | ... + ... | 1.2100392444788552E21 | +| test.c:599:19:599:20 | ip | 3.4785618357E10 | +| test.c:599:24:599:25 | 14 | 1.0 | +| test.c:599:24:599:25 | (unsigned int)... | 1.0 | +| test.c:599:29:599:40 | (...) | 3.4785618357E10 | +| test.c:599:29:599:45 | ... * ... | 3.4785618357E10 | +| test.c:599:30:599:30 | 2 | 1.0 | +| test.c:599:30:599:30 | (unsigned int)... | 1.0 | +| test.c:599:30:599:35 | ... * ... | 3.4785618357E10 | +| test.c:599:30:599:39 | ... + ... | 3.4785618357E10 | +| test.c:599:34:599:35 | ip | 3.4785618357E10 | +| test.c:599:39:599:39 | 1 | 1.0 | +| test.c:599:39:599:39 | (unsigned int)... | 1.0 | +| test.c:599:44:599:45 | 17 | 1.0 | +| test.c:599:44:599:45 | (unsigned int)... | 1.0 | +| test.c:600:11:600:11 | 4 | 1.0 | +| test.c:600:11:600:11 | (unsigned int)... | 1.0 | +| test.c:600:11:600:28 | ... * ... | 5.797603059E9 | +| test.c:600:11:601:32 | ... + ... | 3.361220122972616E19 | +| test.c:600:11:602:32 | ... + ... | 1.9487020066918396E29 | +| test.c:600:11:608:28 | ... + ... | 3.0379516094938436E59 | +| test.c:600:11:609:63 | ... > ... | 1.0 | +| test.c:600:11:621:27 | ... ? ... : ... | 4.390639451194891E87 | +| test.c:600:15:600:28 | (...) | 5.797603059E9 | +| test.c:600:16:600:17 | ip | 5.797603059E9 | +| test.c:600:16:600:22 | ... * ... | 5.797603059E9 | +| test.c:600:16:600:27 | ... + ... | 5.797603059E9 | +| test.c:600:21:600:22 | 14 | 1.0 | +| test.c:600:21:600:22 | (unsigned int)... | 1.0 | +| test.c:600:26:600:27 | 32 | 1.0 | +| test.c:600:26:600:27 | (unsigned int)... | 1.0 | +| test.c:601:15:601:32 | (...) | 5.797603059E9 | +| test.c:601:16:601:16 | 2 | 1.0 | +| test.c:601:16:601:16 | (unsigned int)... | 1.0 | +| test.c:601:16:601:21 | ... * ... | 5.797603059E9 | +| test.c:601:16:601:26 | ... * ... | 5.797603059E9 | +| test.c:601:16:601:31 | ... + ... | 5.797603059E9 | +| test.c:601:20:601:21 | ip | 5.797603059E9 | +| test.c:601:25:601:26 | 14 | 1.0 | +| test.c:601:25:601:26 | (unsigned int)... | 1.0 | +| test.c:601:30:601:31 | 32 | 1.0 | +| test.c:601:30:601:31 | (unsigned int)... | 1.0 | +| test.c:602:15:602:15 | 2 | 1.0 | +| test.c:602:15:602:15 | (unsigned int)... | 1.0 | +| test.c:602:15:602:32 | ... * ... | 5.797603059E9 | +| test.c:602:19:602:32 | (...) | 5.797603059E9 | +| test.c:602:20:602:21 | ip | 5.797603059E9 | +| test.c:602:20:602:26 | ... * ... | 5.797603059E9 | +| test.c:602:20:602:31 | ... + ... | 5.797603059E9 | +| test.c:602:25:602:26 | 14 | 1.0 | +| test.c:602:25:602:26 | (unsigned int)... | 1.0 | +| test.c:602:30:602:31 | 64 | 1.0 | +| test.c:602:30:602:31 | (unsigned int)... | 1.0 | +| test.c:603:15:608:28 | (...) | 1.558961605756818E30 | +| test.c:603:16:603:27 | (...) | 5.797603059E9 | +| test.c:603:16:603:32 | ... * ... | 5.797603059E9 | +| test.c:603:16:604:65 | ... > ... | 1.0 | +| test.c:603:16:608:27 | ... ? ... : ... | 1.558961605756818E30 | +| test.c:603:17:603:17 | 2 | 1.0 | +| test.c:603:17:603:17 | (unsigned int)... | 1.0 | +| test.c:603:17:603:22 | ... * ... | 5.797603059E9 | +| test.c:603:17:603:26 | ... + ... | 5.797603059E9 | +| test.c:603:21:603:22 | ip | 5.797603059E9 | +| test.c:603:26:603:26 | 1 | 1.0 | +| test.c:603:26:603:26 | (unsigned int)... | 1.0 | +| test.c:603:31:603:32 | 14 | 1.0 | +| test.c:603:31:603:32 | (unsigned int)... | 1.0 | +| test.c:604:15:604:65 | (...) | 3.361220122972616E19 | +| test.c:604:16:604:17 | 14 | 1.0 | +| test.c:604:16:604:17 | (unsigned int)... | 1.0 | +| test.c:604:16:604:28 | ... * ... | 5.797603059E9 | +| test.c:604:16:604:38 | ... > ... | 1.0 | +| test.c:604:16:604:64 | ... ? ... : ... | 3.361220122972616E19 | +| test.c:604:21:604:28 | (...) | 5.797603059E9 | +| test.c:604:22:604:22 | 2 | 1.0 | +| test.c:604:22:604:22 | (unsigned int)... | 1.0 | +| test.c:604:22:604:27 | ... * ... | 5.797603059E9 | +| test.c:604:26:604:27 | ip | 5.797603059E9 | +| test.c:604:32:604:33 | 17 | 1.0 | +| test.c:604:32:604:33 | (unsigned int)... | 1.0 | +| test.c:604:32:604:38 | ... * ... | 5.797603059E9 | +| test.c:604:37:604:38 | ip | 5.797603059E9 | +| test.c:604:42:604:43 | 17 | 1.0 | +| test.c:604:42:604:43 | (unsigned int)... | 1.0 | +| test.c:604:42:604:54 | ... * ... | 5.797603059E9 | +| test.c:604:47:604:54 | (...) | 5.797603059E9 | +| test.c:604:48:604:48 | 2 | 1.0 | +| test.c:604:48:604:48 | (unsigned int)... | 1.0 | +| test.c:604:48:604:53 | ... * ... | 5.797603059E9 | +| test.c:604:52:604:53 | ip | 5.797603059E9 | +| test.c:604:58:604:59 | 17 | 1.0 | +| test.c:604:58:604:59 | (unsigned int)... | 1.0 | +| test.c:604:58:604:64 | ... * ... | 5.797603059E9 | +| test.c:604:63:604:64 | ip | 5.797603059E9 | +| test.c:605:19:605:30 | (...) | 1.1595206119E10 | +| test.c:605:19:605:35 | ... * ... | 1.1595206119E10 | +| test.c:605:20:605:20 | 2 | 1.0 | +| test.c:605:20:605:20 | (unsigned int)... | 1.0 | +| test.c:605:20:605:25 | ... * ... | 1.1595206119E10 | +| test.c:605:20:605:29 | ... + ... | 1.1595206119E10 | +| test.c:605:24:605:25 | ip | 1.1595206119E10 | +| test.c:605:29:605:29 | 1 | 1.0 | +| test.c:605:29:605:29 | (unsigned int)... | 1.0 | +| test.c:605:34:605:35 | 14 | 1.0 | +| test.c:605:34:605:35 | (unsigned int)... | 1.0 | +| test.c:606:19:606:20 | 14 | 1.0 | +| test.c:606:19:606:20 | (unsigned int)... | 1.0 | +| test.c:606:19:606:31 | ... * ... | 1.1595206119E10 | +| test.c:606:19:606:41 | ... > ... | 1.0 | +| test.c:606:19:608:27 | ... ? ... : ... | 1.3444880494209504E20 | +| test.c:606:24:606:31 | (...) | 1.1595206119E10 | +| test.c:606:25:606:25 | 2 | 1.0 | +| test.c:606:25:606:25 | (unsigned int)... | 1.0 | +| test.c:606:25:606:30 | ... * ... | 1.1595206119E10 | +| test.c:606:29:606:30 | ip | 1.1595206119E10 | +| test.c:606:35:606:36 | 17 | 1.0 | +| test.c:606:35:606:36 | (unsigned int)... | 1.0 | +| test.c:606:35:606:41 | ... * ... | 1.1595206119E10 | +| test.c:606:40:606:41 | ip | 1.1595206119E10 | +| test.c:607:21:607:22 | 14 | 1.0 | +| test.c:607:21:607:22 | (unsigned int)... | 1.0 | +| test.c:607:21:607:33 | ... * ... | 1.1595206119E10 | +| test.c:607:26:607:33 | (...) | 1.1595206119E10 | +| test.c:607:27:607:27 | 2 | 1.0 | +| test.c:607:27:607:27 | (unsigned int)... | 1.0 | +| test.c:607:27:607:32 | ... * ... | 1.1595206119E10 | +| test.c:607:31:607:32 | ip | 1.1595206119E10 | +| test.c:608:21:608:22 | 14 | 1.0 | +| test.c:608:21:608:22 | (unsigned int)... | 1.0 | +| test.c:608:21:608:27 | ... * ... | 1.1595206119E10 | +| test.c:608:26:608:27 | ip | 1.1595206119E10 | +| test.c:609:13:609:63 | (...) | 1.2100392444788552E21 | +| test.c:609:14:609:15 | 14 | 1.0 | +| test.c:609:14:609:15 | (unsigned int)... | 1.0 | +| test.c:609:14:609:20 | ... * ... | 3.4785618357E10 | +| test.c:609:14:609:36 | ... > ... | 1.0 | +| test.c:609:14:609:62 | ... ? ... : ... | 1.2100392444788552E21 | +| test.c:609:19:609:20 | ip | 3.4785618357E10 | +| test.c:609:24:609:31 | (...) | 3.4785618357E10 | +| test.c:609:24:609:36 | ... * ... | 3.4785618357E10 | +| test.c:609:25:609:26 | ip | 3.4785618357E10 | +| test.c:609:25:609:30 | ... + ... | 3.4785618357E10 | +| test.c:609:30:609:30 | 1 | 1.0 | +| test.c:609:30:609:30 | (unsigned int)... | 1.0 | +| test.c:609:35:609:36 | 17 | 1.0 | +| test.c:609:35:609:36 | (unsigned int)... | 1.0 | +| test.c:609:40:609:41 | 17 | 1.0 | +| test.c:609:40:609:41 | (unsigned int)... | 1.0 | +| test.c:609:40:609:46 | ... * ... | 3.4785618357E10 | +| test.c:609:45:609:46 | ip | 3.4785618357E10 | +| test.c:609:50:609:57 | (...) | 3.4785618357E10 | +| test.c:609:50:609:62 | ... * ... | 3.4785618357E10 | +| test.c:609:51:609:52 | ip | 3.4785618357E10 | +| test.c:609:51:609:56 | ... + ... | 3.4785618357E10 | +| test.c:609:56:609:56 | 1 | 1.0 | +| test.c:609:56:609:56 | (unsigned int)... | 1.0 | +| test.c:609:61:609:62 | 17 | 1.0 | +| test.c:609:61:609:62 | (unsigned int)... | 1.0 | +| test.c:610:13:610:13 | 4 | 1.0 | +| test.c:610:13:610:13 | (unsigned int)... | 1.0 | +| test.c:610:13:610:30 | ... * ... | 6.9571236714E10 | +| test.c:610:13:611:30 | ... + ... | 4.840156977915421E21 | +| test.c:610:13:612:30 | ... + ... | 3.3673570684347266E32 | +| test.c:610:13:618:26 | ... + ... | 9.071274901265435E65 | +| test.c:610:17:610:30 | (...) | 6.9571236714E10 | +| test.c:610:18:610:19 | ip | 6.9571236714E10 | +| test.c:610:18:610:24 | ... * ... | 6.9571236714E10 | +| test.c:610:18:610:29 | ... + ... | 6.9571236714E10 | +| test.c:610:23:610:24 | 14 | 1.0 | +| test.c:610:23:610:24 | (unsigned int)... | 1.0 | +| test.c:610:28:610:29 | 32 | 1.0 | +| test.c:610:28:610:29 | (unsigned int)... | 1.0 | +| test.c:611:13:611:30 | (...) | 6.9571236714E10 | +| test.c:611:14:611:14 | 2 | 1.0 | +| test.c:611:14:611:14 | (unsigned int)... | 1.0 | +| test.c:611:14:611:19 | ... * ... | 6.9571236714E10 | +| test.c:611:14:611:24 | ... * ... | 6.9571236714E10 | +| test.c:611:14:611:29 | ... + ... | 6.9571236714E10 | +| test.c:611:18:611:19 | ip | 6.9571236714E10 | +| test.c:611:23:611:24 | 14 | 1.0 | +| test.c:611:23:611:24 | (unsigned int)... | 1.0 | +| test.c:611:28:611:29 | 32 | 1.0 | +| test.c:611:28:611:29 | (unsigned int)... | 1.0 | +| test.c:612:13:612:13 | 2 | 1.0 | +| test.c:612:13:612:13 | (unsigned int)... | 1.0 | +| test.c:612:13:612:30 | ... * ... | 6.9571236714E10 | +| test.c:612:17:612:30 | (...) | 6.9571236714E10 | +| test.c:612:18:612:19 | ip | 6.9571236714E10 | +| test.c:612:18:612:24 | ... * ... | 6.9571236714E10 | +| test.c:612:18:612:29 | ... + ... | 6.9571236714E10 | +| test.c:612:23:612:24 | 14 | 1.0 | +| test.c:612:23:612:24 | (unsigned int)... | 1.0 | +| test.c:612:28:612:29 | 64 | 1.0 | +| test.c:612:28:612:29 | (unsigned int)... | 1.0 | +| test.c:613:13:618:26 | (...) | 2.693885654805863E33 | +| test.c:613:14:613:25 | (...) | 6.9571236714E10 | +| test.c:613:14:613:30 | ... * ... | 6.9571236714E10 | +| test.c:613:14:614:63 | ... > ... | 1.0 | +| test.c:613:14:618:25 | ... ? ... : ... | 2.693885654805863E33 | +| test.c:613:15:613:15 | 2 | 1.0 | +| test.c:613:15:613:15 | (unsigned int)... | 1.0 | +| test.c:613:15:613:20 | ... * ... | 6.9571236714E10 | +| test.c:613:15:613:24 | ... + ... | 6.9571236714E10 | +| test.c:613:19:613:20 | ip | 6.9571236714E10 | +| test.c:613:24:613:24 | 1 | 1.0 | +| test.c:613:24:613:24 | (unsigned int)... | 1.0 | +| test.c:613:29:613:30 | 14 | 1.0 | +| test.c:613:29:613:30 | (unsigned int)... | 1.0 | +| test.c:614:13:614:63 | (...) | 4.840156977915421E21 | +| test.c:614:14:614:15 | 14 | 1.0 | +| test.c:614:14:614:15 | (unsigned int)... | 1.0 | +| test.c:614:14:614:26 | ... * ... | 6.9571236714E10 | +| test.c:614:14:614:36 | ... > ... | 1.0 | +| test.c:614:14:614:62 | ... ? ... : ... | 4.840156977915421E21 | +| test.c:614:19:614:26 | (...) | 6.9571236714E10 | +| test.c:614:20:614:20 | 2 | 1.0 | +| test.c:614:20:614:20 | (unsigned int)... | 1.0 | +| test.c:614:20:614:25 | ... * ... | 6.9571236714E10 | +| test.c:614:24:614:25 | ip | 6.9571236714E10 | +| test.c:614:30:614:31 | 17 | 1.0 | +| test.c:614:30:614:31 | (unsigned int)... | 1.0 | +| test.c:614:30:614:36 | ... * ... | 6.9571236714E10 | +| test.c:614:35:614:36 | ip | 6.9571236714E10 | +| test.c:614:40:614:41 | 17 | 1.0 | +| test.c:614:40:614:41 | (unsigned int)... | 1.0 | +| test.c:614:40:614:52 | ... * ... | 6.9571236714E10 | +| test.c:614:45:614:52 | (...) | 6.9571236714E10 | +| test.c:614:46:614:46 | 2 | 1.0 | +| test.c:614:46:614:46 | (unsigned int)... | 1.0 | +| test.c:614:46:614:51 | ... * ... | 6.9571236714E10 | +| test.c:614:50:614:51 | ip | 6.9571236714E10 | +| test.c:614:56:614:57 | 17 | 1.0 | +| test.c:614:56:614:57 | (unsigned int)... | 1.0 | +| test.c:614:56:614:62 | ... * ... | 6.9571236714E10 | +| test.c:614:61:614:62 | ip | 6.9571236714E10 | +| test.c:615:17:615:28 | (...) | 1.39142473429E11 | +| test.c:615:17:615:33 | ... * ... | 1.39142473429E11 | +| test.c:615:18:615:18 | 2 | 1.0 | +| test.c:615:18:615:18 | (unsigned int)... | 1.0 | +| test.c:615:18:615:23 | ... * ... | 1.39142473429E11 | +| test.c:615:18:615:27 | ... + ... | 1.39142473429E11 | +| test.c:615:22:615:23 | ip | 1.39142473429E11 | +| test.c:615:27:615:27 | 1 | 1.0 | +| test.c:615:27:615:27 | (unsigned int)... | 1.0 | +| test.c:615:32:615:33 | 14 | 1.0 | +| test.c:615:32:615:33 | (unsigned int)... | 1.0 | +| test.c:616:17:616:18 | 14 | 1.0 | +| test.c:616:17:616:18 | (unsigned int)... | 1.0 | +| test.c:616:17:616:29 | ... * ... | 1.39142473429E11 | +| test.c:616:17:616:39 | ... > ... | 1.0 | +| test.c:616:17:618:25 | ... ? ... : ... | 1.936062791193997E22 | +| test.c:616:22:616:29 | (...) | 1.39142473429E11 | +| test.c:616:23:616:23 | 2 | 1.0 | +| test.c:616:23:616:23 | (unsigned int)... | 1.0 | +| test.c:616:23:616:28 | ... * ... | 1.39142473429E11 | +| test.c:616:27:616:28 | ip | 1.39142473429E11 | +| test.c:616:33:616:34 | 17 | 1.0 | +| test.c:616:33:616:34 | (unsigned int)... | 1.0 | +| test.c:616:33:616:39 | ... * ... | 1.39142473429E11 | +| test.c:616:38:616:39 | ip | 1.39142473429E11 | +| test.c:617:19:617:20 | 14 | 1.0 | +| test.c:617:19:617:20 | (unsigned int)... | 1.0 | +| test.c:617:19:617:31 | ... * ... | 1.39142473429E11 | +| test.c:617:24:617:31 | (...) | 1.39142473429E11 | +| test.c:617:25:617:25 | 2 | 1.0 | +| test.c:617:25:617:25 | (unsigned int)... | 1.0 | +| test.c:617:25:617:30 | ... * ... | 1.39142473429E11 | +| test.c:617:29:617:30 | ip | 1.39142473429E11 | +| test.c:618:19:618:20 | 14 | 1.0 | +| test.c:618:19:618:20 | (unsigned int)... | 1.0 | +| test.c:618:19:618:25 | ... * ... | 1.39142473429E11 | +| test.c:618:24:618:25 | ip | 1.39142473429E11 | +| test.c:619:13:619:14 | 14 | 1.0 | +| test.c:619:13:619:14 | (unsigned int)... | 1.0 | +| test.c:619:13:619:19 | ... * ... | 6.9571236714E10 | +| test.c:619:13:619:35 | ... > ... | 1.0 | +| test.c:619:13:621:27 | ... ? ... : ... | 4.840156977915421E21 | +| test.c:619:18:619:19 | ip | 6.9571236714E10 | +| test.c:619:23:619:30 | (...) | 6.9571236714E10 | +| test.c:619:23:619:35 | ... * ... | 6.9571236714E10 | +| test.c:619:24:619:25 | ip | 6.9571236714E10 | +| test.c:619:24:619:29 | ... + ... | 6.9571236714E10 | +| test.c:619:29:619:29 | 1 | 1.0 | +| test.c:619:29:619:29 | (unsigned int)... | 1.0 | +| test.c:619:34:619:35 | 17 | 1.0 | +| test.c:619:34:619:35 | (unsigned int)... | 1.0 | +| test.c:620:15:620:16 | 14 | 1.0 | +| test.c:620:15:620:16 | (unsigned int)... | 1.0 | +| test.c:620:15:620:21 | ... * ... | 6.9571236714E10 | +| test.c:620:20:620:21 | ip | 6.9571236714E10 | +| test.c:621:15:621:22 | (...) | 6.9571236714E10 | +| test.c:621:15:621:27 | ... * ... | 6.9571236714E10 | +| test.c:621:16:621:17 | ip | 6.9571236714E10 | +| test.c:621:16:621:21 | ... + ... | 6.9571236714E10 | +| test.c:621:21:621:21 | 1 | 1.0 | +| test.c:621:21:621:21 | (unsigned int)... | 1.0 | +| test.c:621:26:621:27 | 14 | 1.0 | +| test.c:621:26:621:27 | (unsigned int)... | 1.0 | +| test.c:622:10:622:23 | special_number | 1.297918419127476E201 | +| test.c:629:10:629:11 | 0 | 1.0 | +| test.c:630:7:630:8 | c1 | 1.0 | +| test.c:630:13:630:13 | x | 1.0 | +| test.c:630:13:630:23 | ... += ... | 1.0 | +| test.c:630:18:630:23 | 748596 | 1.0 | +| test.c:631:7:631:8 | c2 | 1.0 | +| test.c:631:13:631:13 | x | 2.0 | +| test.c:631:13:631:25 | ... += ... | 2.0 | +| test.c:631:18:631:25 | 84652395 | 1.0 | +| test.c:632:7:632:8 | c3 | 1.0 | +| test.c:632:13:632:13 | x | 4.0 | +| test.c:632:13:632:24 | ... += ... | 4.0 | +| test.c:632:18:632:24 | 3675895 | 1.0 | +| test.c:633:7:633:8 | c4 | 1.0 | +| test.c:633:13:633:13 | x | 8.0 | +| test.c:633:13:633:22 | ... += ... | 8.0 | +| test.c:633:18:633:22 | 98634 | 1.0 | +| test.c:634:7:634:8 | c5 | 1.0 | +| test.c:634:13:634:13 | x | 16.0 | +| test.c:634:13:634:24 | ... += ... | 16.0 | +| test.c:634:18:634:24 | 7834985 | 1.0 | +| test.c:635:7:635:8 | c1 | 2.0 | +| test.c:635:7:635:14 | ... && ... | 1.0 | +| test.c:635:13:635:14 | c2 | 2.0 | +| test.c:635:19:635:19 | x | 32.0 | +| test.c:635:19:635:32 | ... += ... | 32.0 | +| test.c:635:24:635:32 | 938457398 | 1.0 | +| test.c:636:7:636:8 | c1 | 3.0 | +| test.c:636:7:636:14 | ... && ... | 1.0 | +| test.c:636:13:636:14 | c3 | 2.0 | +| test.c:636:19:636:19 | x | 64.0 | +| test.c:636:19:636:31 | ... += ... | 64.0 | +| test.c:636:24:636:31 | 73895648 | 1.0 | +| test.c:637:7:637:8 | c1 | 4.0 | +| test.c:637:7:637:14 | ... && ... | 1.0 | +| test.c:637:13:637:14 | c4 | 2.0 | +| test.c:637:19:637:19 | x | 128.0 | +| test.c:637:19:637:31 | ... += ... | 128.0 | +| test.c:637:24:637:31 | 12345432 | 1.0 | +| test.c:638:7:638:8 | c1 | 5.0 | +| test.c:638:7:638:14 | ... && ... | 1.0 | +| test.c:638:13:638:14 | c5 | 2.0 | +| test.c:638:19:638:19 | x | 256.0 | +| test.c:638:19:638:28 | ... += ... | 256.0 | +| test.c:638:24:638:28 | 38847 | 1.0 | +| test.c:639:7:639:8 | c2 | 5.0 | +| test.c:639:7:639:14 | ... && ... | 1.0 | +| test.c:639:13:639:14 | c3 | 5.0 | +| test.c:639:19:639:19 | x | 512.0 | +| test.c:639:19:639:26 | ... += ... | 512.0 | +| test.c:639:24:639:26 | 234 | 1.0 | +| test.c:641:11:641:11 | x | 1024.0 | +| test.c:641:11:641:15 | ... + ... | 1048576.0 | +| test.c:641:11:641:19 | ... + ... | 1.073741824E9 | +| test.c:641:11:641:23 | ... + ... | 1.099511627776E12 | +| test.c:641:11:641:27 | ... + ... | 1.125899906842624E15 | +| test.c:641:11:641:31 | ... + ... | 1.152921504606847E18 | +| test.c:641:11:641:35 | ... + ... | 1.1805916207174113E21 | +| test.c:641:11:641:39 | ... + ... | 1.2089258196146292E24 | +| test.c:641:11:641:43 | ... + ... | 1.2379400392853803E27 | +| test.c:641:11:641:47 | ... + ... | 1.2676506002282294E30 | +| test.c:641:11:641:51 | ... + ... | 1.298074214633707E33 | +| test.c:641:11:641:55 | ... + ... | 1.329227995784916E36 | +| test.c:641:15:641:15 | x | 1024.0 | +| test.c:641:19:641:19 | x | 1024.0 | +| test.c:641:23:641:23 | x | 1024.0 | +| test.c:641:27:641:27 | x | 1024.0 | +| test.c:641:31:641:31 | x | 1024.0 | +| test.c:641:35:641:35 | x | 1024.0 | +| test.c:641:39:641:39 | x | 1024.0 | +| test.c:641:43:641:43 | x | 1024.0 | +| test.c:641:47:641:47 | x | 1024.0 | +| test.c:641:51:641:51 | x | 1024.0 | +| test.c:641:55:641:55 | x | 1024.0 | +| test.c:642:10:642:10 | y | 1.329227995784916E36 | +| test.c:647:20:647:20 | x | 1.0 | +| test.c:647:20:647:26 | ... < ... | 1.0 | +| test.c:647:20:647:36 | ... ? ... : ... | 1.0 | +| test.c:647:24:647:26 | 100 | 1.0 | +| test.c:647:24:647:26 | (unsigned int)... | 1.0 | +| test.c:647:30:647:30 | x | 1.0 | +| test.c:647:34:647:36 | 100 | 1.0 | +| test.c:647:34:647:36 | (unsigned int)... | 1.0 | +| test.c:650:3:650:4 | y1 | 1.0 | +| test.c:650:9:650:11 | ++ ... | 1.0 | +| test.c:650:11:650:11 | y | 1.0 | +| test.c:651:3:651:4 | y2 | 1.0 | +| test.c:651:19:651:19 | 3 | 1.0 | +| test.c:651:19:651:19 | (unsigned int)... | 1.0 | +| test.c:660:3:660:3 | i | 1.0 | +| test.c:660:3:660:8 | ... = ... | 1.0 | +| test.c:660:7:660:8 | 10 | 1.0 | +| test.c:661:7:661:7 | i | 1.0 | +| test.c:663:3:663:3 | i | 1.0 | +| test.c:663:3:663:8 | ... = ... | 1.0 | +| test.c:663:7:663:8 | 10 | 1.0 | +| test.c:664:3:664:3 | i | 1.0 | +| test.c:664:3:664:9 | ... += ... | 1.0 | +| test.c:664:8:664:9 | 10 | 1.0 | +| test.c:665:7:665:7 | i | 1.0 | +| test.c:667:3:667:3 | i | 1.0 | +| test.c:667:3:667:8 | ... = ... | 1.0 | +| test.c:667:7:667:8 | 40 | 1.0 | +| test.c:668:3:668:3 | i | 1.0 | +| test.c:668:3:668:9 | ... -= ... | 1.0 | +| test.c:668:8:668:9 | 10 | 1.0 | +| test.c:669:7:669:7 | i | 1.0 | +| test.c:671:3:671:3 | i | 1.0 | +| test.c:671:3:671:12 | ... = ... | 1.0 | +| test.c:671:7:671:7 | j | 1.0 | +| test.c:671:7:671:12 | ... = ... | 1.0 | +| test.c:671:11:671:12 | 40 | 1.0 | +| test.c:672:7:672:7 | i | 1.0 | +| test.c:674:3:674:3 | i | 1.0 | +| test.c:674:3:674:15 | ... = ... | 1.0 | +| test.c:674:7:674:15 | (...) | 1.0 | +| test.c:674:8:674:8 | j | 1.0 | +| test.c:674:8:674:14 | ... += ... | 1.0 | +| test.c:674:13:674:14 | 10 | 1.0 | +| test.c:675:7:675:7 | i | 1.0 | +| test.c:677:3:677:3 | i | 1.0 | +| test.c:677:3:677:20 | ... = ... | 1.0 | +| test.c:677:7:677:8 | 20 | 1.0 | +| test.c:677:7:677:20 | ... + ... | 1.0 | +| test.c:677:12:677:20 | (...) | 1.0 | +| test.c:677:13:677:13 | j | 1.0 | +| test.c:677:13:677:19 | ... -= ... | 1.0 | +| test.c:677:18:677:19 | 10 | 1.0 | +| test.c:678:7:678:7 | i | 1.0 | +| test.c:683:14:683:15 | 0 | 1.0 | +| test.c:685:7:685:7 | 3 | 1.0 | +| test.c:685:7:685:7 | (unsigned int)... | 1.0 | +| test.c:685:7:685:12 | ... <= ... | 1.0 | +| test.c:685:7:685:23 | ... && ... | 1.0 | +| test.c:685:7:685:33 | ... && ... | 1.0 | +| test.c:685:7:685:44 | ... && ... | 1.0 | +| test.c:685:12:685:12 | a | 1.0 | +| test.c:685:17:685:17 | a | 1.0 | +| test.c:685:17:685:23 | ... <= ... | 1.0 | +| test.c:685:22:685:23 | 11 | 1.0 | +| test.c:685:22:685:23 | (unsigned int)... | 1.0 | +| test.c:685:28:685:28 | 5 | 1.0 | +| test.c:685:28:685:28 | (unsigned int)... | 1.0 | +| test.c:685:28:685:33 | ... <= ... | 1.0 | +| test.c:685:33:685:33 | b | 1.0 | +| test.c:685:38:685:38 | b | 1.0 | +| test.c:685:38:685:44 | ... <= ... | 1.0 | +| test.c:685:43:685:44 | 23 | 1.0 | +| test.c:685:43:685:44 | (unsigned int)... | 1.0 | +| test.c:686:13:686:13 | a | 1.0 | +| test.c:686:13:686:15 | (int)... | 1.0 | +| test.c:686:13:686:15 | ... * ... | 1.0 | +| test.c:686:15:686:15 | b | 1.0 | +| test.c:687:5:687:9 | total | 1.0 | +| test.c:687:5:687:14 | ... += ... | 1.0 | +| test.c:687:14:687:14 | r | 1.0 | +| test.c:689:7:689:7 | 3 | 1.0 | +| test.c:689:7:689:7 | (unsigned int)... | 1.0 | +| test.c:689:7:689:12 | ... <= ... | 1.0 | +| test.c:689:7:689:23 | ... && ... | 1.0 | +| test.c:689:7:689:33 | ... && ... | 1.0 | +| test.c:689:7:689:44 | ... && ... | 1.0 | +| test.c:689:12:689:12 | a | 2.0 | +| test.c:689:17:689:17 | a | 2.0 | +| test.c:689:17:689:23 | ... <= ... | 1.0 | +| test.c:689:22:689:23 | 11 | 1.0 | +| test.c:689:22:689:23 | (unsigned int)... | 1.0 | +| test.c:689:28:689:28 | 0 | 1.0 | +| test.c:689:28:689:28 | (unsigned int)... | 1.0 | +| test.c:689:28:689:33 | ... <= ... | 1.0 | +| test.c:689:33:689:33 | b | 3.0 | +| test.c:689:38:689:38 | b | 3.0 | +| test.c:689:38:689:44 | ... <= ... | 1.0 | +| test.c:689:43:689:44 | 23 | 1.0 | +| test.c:689:43:689:44 | (unsigned int)... | 1.0 | +| test.c:690:13:690:13 | a | 2.0 | +| test.c:690:13:690:15 | (int)... | 6.0 | +| test.c:690:13:690:15 | ... * ... | 6.0 | +| test.c:690:15:690:15 | b | 3.0 | +| test.c:691:5:691:9 | total | 2.0 | +| test.c:691:5:691:14 | ... += ... | 12.0 | +| test.c:691:14:691:14 | r | 6.0 | +| test.c:693:7:693:7 | 3 | 1.0 | +| test.c:693:7:693:7 | (unsigned int)... | 1.0 | +| test.c:693:7:693:12 | ... <= ... | 1.0 | +| test.c:693:7:693:23 | ... && ... | 1.0 | +| test.c:693:7:693:34 | ... && ... | 1.0 | +| test.c:693:7:693:45 | ... && ... | 1.0 | +| test.c:693:12:693:12 | a | 3.0 | +| test.c:693:17:693:17 | a | 3.0 | +| test.c:693:17:693:23 | ... <= ... | 1.0 | +| test.c:693:22:693:23 | 11 | 1.0 | +| test.c:693:22:693:23 | (unsigned int)... | 1.0 | +| test.c:693:28:693:29 | 13 | 1.0 | +| test.c:693:28:693:29 | (unsigned int)... | 1.0 | +| test.c:693:28:693:34 | ... <= ... | 1.0 | +| test.c:693:34:693:34 | b | 7.0 | +| test.c:693:39:693:39 | b | 7.0 | +| test.c:693:39:693:45 | ... <= ... | 1.0 | +| test.c:693:44:693:45 | 23 | 1.0 | +| test.c:693:44:693:45 | (unsigned int)... | 1.0 | +| test.c:694:13:694:13 | a | 3.0 | +| test.c:694:13:694:15 | (int)... | 21.0 | +| test.c:694:13:694:15 | ... * ... | 21.0 | +| test.c:694:15:694:15 | b | 7.0 | +| test.c:695:5:695:9 | total | 14.0 | +| test.c:695:5:695:14 | ... += ... | 294.0 | +| test.c:695:14:695:14 | r | 21.0 | +| test.c:698:10:698:14 | total | 308.0 | +| test.c:702:14:702:15 | 0 | 1.0 | +| test.c:704:7:704:7 | 5 | 1.0 | +| test.c:704:7:704:7 | (unsigned int)... | 1.0 | +| test.c:704:7:704:12 | ... <= ... | 1.0 | +| test.c:704:7:704:23 | ... && ... | 1.0 | +| test.c:704:12:704:12 | b | 1.0 | +| test.c:704:17:704:17 | b | 1.0 | +| test.c:704:17:704:23 | ... <= ... | 1.0 | +| test.c:704:22:704:23 | 23 | 1.0 | +| test.c:704:22:704:23 | (unsigned int)... | 1.0 | +| test.c:705:13:705:14 | 11 | 1.0 | +| test.c:705:13:705:14 | (unsigned int)... | 1.0 | +| test.c:705:13:705:16 | (int)... | 1.0 | +| test.c:705:13:705:16 | ... * ... | 1.0 | +| test.c:705:16:705:16 | b | 1.0 | +| test.c:706:5:706:9 | total | 1.0 | +| test.c:706:5:706:14 | ... += ... | 1.0 | +| test.c:706:14:706:14 | r | 1.0 | +| test.c:708:7:708:7 | 0 | 1.0 | +| test.c:708:7:708:7 | (unsigned int)... | 1.0 | +| test.c:708:7:708:12 | ... <= ... | 1.0 | +| test.c:708:7:708:23 | ... && ... | 1.0 | +| test.c:708:12:708:12 | b | 2.0 | +| test.c:708:17:708:17 | b | 2.0 | +| test.c:708:17:708:23 | ... <= ... | 1.0 | +| test.c:708:22:708:23 | 23 | 1.0 | +| test.c:708:22:708:23 | (unsigned int)... | 1.0 | +| test.c:709:13:709:14 | 11 | 1.0 | +| test.c:709:13:709:14 | (unsigned int)... | 1.0 | +| test.c:709:13:709:16 | (int)... | 2.0 | +| test.c:709:13:709:16 | ... * ... | 2.0 | +| test.c:709:16:709:16 | b | 2.0 | +| test.c:710:5:710:9 | total | 2.0 | +| test.c:710:5:710:14 | ... += ... | 4.0 | +| test.c:710:14:710:14 | r | 2.0 | +| test.c:712:7:712:8 | 13 | 1.0 | +| test.c:712:7:712:8 | (unsigned int)... | 1.0 | +| test.c:712:7:712:13 | ... <= ... | 1.0 | +| test.c:712:7:712:24 | ... && ... | 1.0 | +| test.c:712:13:712:13 | b | 3.0 | +| test.c:712:18:712:18 | b | 3.0 | +| test.c:712:18:712:24 | ... <= ... | 1.0 | +| test.c:712:23:712:24 | 23 | 1.0 | +| test.c:712:23:712:24 | (unsigned int)... | 1.0 | +| test.c:713:13:713:14 | 11 | 1.0 | +| test.c:713:13:713:14 | (unsigned int)... | 1.0 | +| test.c:713:13:713:16 | (int)... | 3.0 | +| test.c:713:13:713:16 | ... * ... | 3.0 | +| test.c:713:16:713:16 | b | 3.0 | +| test.c:714:5:714:9 | total | 6.0 | +| test.c:714:5:714:14 | ... += ... | 18.0 | +| test.c:714:14:714:14 | r | 3.0 | +| test.c:717:10:717:14 | total | 24.0 | +| test.c:722:3:722:3 | x | 1.0 | +| test.c:722:3:722:22 | ... = ... | 1.0 | +| test.c:722:7:722:7 | y | 1.0 | +| test.c:722:7:722:22 | ... = ... | 1.0 | +| test.c:722:11:722:22 | 1000000003 | 1.0 | +| test.c:723:3:723:4 | xy | 1.0 | +| test.c:723:3:723:12 | ... = ... | 1.0 | +| test.c:723:8:723:8 | x | 1.0 | +| test.c:723:8:723:12 | ... * ... | 1.0 | +| test.c:723:12:723:12 | y | 1.0 | +| test.c:724:10:724:11 | xy | 1.0 | +| test.c:729:3:729:3 | x | 1.0 | +| test.c:729:3:729:14 | ... = ... | 1.0 | +| test.c:729:7:729:14 | 274177 | 1.0 | +| test.c:730:3:730:3 | y | 1.0 | +| test.c:730:3:730:22 | ... = ... | 1.0 | +| test.c:730:7:730:22 | 67280421310721 | 1.0 | +| test.c:731:3:731:4 | xy | 1.0 | +| test.c:731:3:731:12 | ... = ... | 1.0 | +| test.c:731:8:731:8 | x | 1.0 | +| test.c:731:8:731:12 | ... * ... | 1.0 | +| test.c:731:12:731:12 | y | 1.0 | +| test.c:732:10:732:11 | xy | 1.0 | +| test.c:736:7:736:8 | ui | 1.0 | +| test.c:736:7:736:14 | ... >= ... | 1.0 | +| test.c:736:13:736:14 | 10 | 1.0 | +| test.c:736:13:736:14 | (unsigned int)... | 1.0 | +| test.c:737:28:737:44 | (unsigned long)... | 1.0 | +| test.c:737:28:737:49 | ... * ... | 1.0 | +| test.c:737:43:737:44 | ui | 1.0 | +| test.c:737:48:737:49 | (unsigned long)... | 1.0 | +| test.c:737:48:737:49 | ui | 1.0 | +| test.c:738:12:738:17 | result | 1.0 | +| test.c:740:7:740:8 | ul | 1.0 | +| test.c:740:7:740:14 | ... >= ... | 1.0 | +| test.c:740:13:740:14 | 10 | 1.0 | +| test.c:740:13:740:14 | (unsigned long)... | 1.0 | +| test.c:741:28:741:29 | ul | 1.0 | +| test.c:741:28:741:34 | ... * ... | 1.0 | +| test.c:741:33:741:34 | ul | 1.0 | +| test.c:742:12:742:17 | result | 1.0 | +| test.c:744:10:744:10 | 0 | 1.0 | +| test.c:744:10:744:10 | (unsigned long)... | 1.0 | +| test.c:748:7:748:8 | ui | 1.0 | +| test.c:748:7:748:14 | ... <= ... | 1.0 | +| test.c:748:7:748:25 | ... && ... | 1.0 | +| test.c:748:13:748:14 | 10 | 1.0 | +| test.c:748:13:748:14 | (unsigned int)... | 1.0 | +| test.c:748:19:748:20 | ui | 1.0 | +| test.c:748:19:748:25 | ... >= ... | 1.0 | +| test.c:748:25:748:25 | 2 | 1.0 | +| test.c:748:25:748:25 | (unsigned int)... | 1.0 | +| test.c:749:5:749:6 | ui | 1.0 | +| test.c:749:5:749:16 | ... *= ... | 1.0 | +| test.c:749:11:749:12 | ui | 1.0 | +| test.c:749:11:749:16 | ... + ... | 1.0 | +| test.c:749:16:749:16 | 0 | 1.0 | +| test.c:749:16:749:16 | (unsigned int)... | 1.0 | +| test.c:750:12:750:13 | (unsigned long)... | 1.0 | +| test.c:750:12:750:13 | ui | 1.0 | +| test.c:753:26:753:27 | 10 | 1.0 | +| test.c:753:26:753:27 | (unsigned int)... | 1.0 | +| test.c:754:3:754:9 | uiconst | 1.0 | +| test.c:754:3:754:14 | ... *= ... | 1.0 | +| test.c:754:14:754:14 | 4 | 1.0 | +| test.c:754:14:754:14 | (unsigned int)... | 1.0 | +| test.c:756:27:756:28 | 10 | 1.0 | +| test.c:756:27:756:28 | (unsigned long)... | 1.0 | +| test.c:757:3:757:9 | ulconst | 1.0 | +| test.c:757:3:757:14 | ... *= ... | 1.0 | +| test.c:757:14:757:14 | 4 | 1.0 | +| test.c:757:14:757:14 | (unsigned long)... | 1.0 | +| test.c:758:10:758:16 | (unsigned long)... | 1.0 | +| test.c:758:10:758:16 | uiconst | 1.0 | +| test.c:758:10:758:26 | ... + ... | 1.0 | +| test.c:758:20:758:26 | ulconst | 1.0 | +| test.c:762:7:762:7 | i | 1.0 | +| test.c:762:7:762:13 | ... >= ... | 1.0 | +| test.c:762:7:762:23 | ... && ... | 1.0 | +| test.c:762:12:762:13 | - ... | 1.0 | +| test.c:762:13:762:13 | 1 | 1.0 | +| test.c:762:18:762:18 | i | 1.0 | +| test.c:762:18:762:23 | ... <= ... | 1.0 | +| test.c:762:23:762:23 | 2 | 1.0 | +| test.c:763:5:763:5 | i | 1.0 | +| test.c:763:5:763:13 | ... = ... | 1.0 | +| test.c:763:9:763:9 | 5 | 1.0 | +| test.c:763:9:763:13 | ... * ... | 1.0 | +| test.c:763:13:763:13 | i | 1.0 | +| test.c:764:9:764:9 | i | 1.0 | +| test.c:766:5:766:5 | i | 1.0 | +| test.c:766:5:766:14 | ... = ... | 1.0 | +| test.c:766:9:766:9 | i | 1.0 | +| test.c:766:9:766:14 | ... * ... | 1.0 | +| test.c:766:13:766:14 | - ... | 1.0 | +| test.c:766:14:766:14 | 3 | 1.0 | +| test.c:767:9:767:9 | i | 1.0 | +| test.c:769:5:769:5 | i | 1.0 | +| test.c:769:5:769:10 | ... *= ... | 1.0 | +| test.c:769:10:769:10 | 7 | 1.0 | +| test.c:770:9:770:9 | i | 1.0 | +| test.c:772:5:772:5 | i | 1.0 | +| test.c:772:5:772:12 | ... *= ... | 1.0 | +| test.c:772:10:772:12 | - ... | 1.0 | +| test.c:772:11:772:12 | 11 | 1.0 | +| test.c:773:9:773:9 | i | 1.0 | +| test.c:775:7:775:7 | i | 2.0 | +| test.c:775:7:775:13 | ... == ... | 1.0 | +| test.c:775:12:775:13 | - ... | 1.0 | +| test.c:775:13:775:13 | 1 | 1.0 | +| test.c:776:5:776:5 | i | 1.0 | +| test.c:776:5:776:27 | ... = ... | 2.0 | +| test.c:776:9:776:9 | i | 2.0 | +| test.c:776:9:776:27 | ... * ... | 2.0 | +| test.c:776:13:776:27 | (int)... | 1.0 | +| test.c:776:18:776:27 | 4294967295 | 1.0 | +| test.c:777:9:777:9 | i | 2.0 | +| test.c:779:3:779:3 | i | 1.0 | +| test.c:779:3:779:12 | ... = ... | 4.0 | +| test.c:779:7:779:7 | i | 4.0 | +| test.c:779:7:779:12 | ... * ... | 4.0 | +| test.c:779:11:779:12 | - ... | 1.0 | +| test.c:779:12:779:12 | 1 | 1.0 | +| test.c:780:10:780:10 | i | 4.0 | +| test.c:782:20:782:20 | 1 | 1.0 | +| test.c:782:20:782:20 | (signed char)... | 1.0 | +| test.c:783:3:783:3 | i | 1.0 | +| test.c:783:3:783:17 | ... = ... | 1.0 | +| test.c:783:7:783:17 | (...) | 1.0 | +| test.c:783:7:783:17 | (int)... | 1.0 | +| test.c:783:8:783:11 | * ... | 1.0 | +| test.c:783:8:783:16 | ... *= ... | 1.0 | +| test.c:783:10:783:11 | sc | 1.0 | +| test.c:783:16:783:16 | 2 | 1.0 | +| test.c:785:7:785:7 | i | 1.0 | +| test.c:787:10:787:10 | 0 | 1.0 | +| test.c:792:7:792:7 | (int)... | 1.0 | +| test.c:792:7:792:7 | n | 1.0 | +| test.c:794:7:794:7 | n | 1.0 | +| test.c:794:7:794:11 | ... > ... | 1.0 | +| test.c:794:11:794:11 | 0 | 1.0 | +| test.c:794:11:794:11 | (unsigned int)... | 1.0 | +| test.c:795:9:795:9 | (int)... | 1.0 | +| test.c:795:9:795:9 | n | 1.0 | +| test.c:798:7:798:7 | n | 2.0 | +| test.c:798:7:798:12 | ... != ... | 1.0 | +| test.c:798:12:798:12 | 0 | 1.0 | +| test.c:798:12:798:12 | (unsigned int)... | 1.0 | +| test.c:799:9:799:9 | (int)... | 2.0 | +| test.c:799:9:799:9 | n | 2.0 | +| test.c:801:9:801:9 | (int)... | 2.0 | +| test.c:801:9:801:9 | n | 2.0 | +| test.c:804:7:804:8 | ! ... | 1.0 | +| test.c:804:8:804:8 | n | 4.0 | +| test.c:805:9:805:9 | (int)... | 4.0 | +| test.c:805:9:805:9 | n | 4.0 | +| test.c:807:9:807:9 | (int)... | 4.0 | +| test.c:807:9:807:9 | n | 4.0 | +| test.c:810:10:810:10 | n | 13.0 | +| test.c:810:10:810:15 | ... != ... | 1.0 | +| test.c:810:15:810:15 | 0 | 1.0 | +| test.c:810:15:810:15 | (unsigned int)... | 1.0 | +| test.c:811:5:811:5 | n | 13.0 | +| test.c:811:5:811:7 | ... -- | 13.0 | +| test.c:814:7:814:7 | (int)... | 13.0 | +| test.c:814:7:814:7 | n | 13.0 | +| test.c:818:7:818:7 | (int)... | 1.0 | +| test.c:818:7:818:7 | n | 1.0 | +| test.c:818:7:818:11 | ... < ... | 1.0 | +| test.c:818:11:818:11 | 0 | 1.0 | +| test.c:821:7:821:7 | (int)... | 1.0 | +| test.c:821:7:821:7 | n | 1.0 | +| test.c:821:7:821:12 | ... == ... | 1.0 | +| test.c:821:12:821:12 | 0 | 1.0 | +| test.c:822:9:822:9 | (int)... | 1.0 | +| test.c:822:9:822:9 | n | 1.0 | +| test.c:824:9:824:9 | (int)... | 1.0 | +| test.c:824:9:824:9 | n | 1.0 | +| test.c:827:7:827:7 | n | 2.0 | +| test.c:828:9:828:9 | (int)... | 2.0 | +| test.c:828:9:828:9 | n | 2.0 | +| test.c:830:9:830:9 | (int)... | 2.0 | +| test.c:830:9:830:9 | n | 2.0 | +| test.c:833:10:833:10 | (int)... | 13.0 | +| test.c:833:10:833:10 | n | 12.0 | +| test.c:833:10:833:15 | ... != ... | 1.0 | +| test.c:833:15:833:15 | 0 | 1.0 | +| test.c:834:5:834:5 | n | 12.0 | +| test.c:834:5:834:7 | ... -- | 12.0 | +| test.c:837:7:837:7 | (int)... | 12.0 | +| test.c:837:7:837:7 | n | 12.0 | +| test.c:841:7:841:7 | (int)... | 1.0 | +| test.c:841:7:841:7 | n | 1.0 | +| test.c:841:7:841:12 | ... != ... | 1.0 | +| test.c:841:12:841:12 | 0 | 1.0 | +| test.c:842:9:842:9 | (int)... | 1.0 | +| test.c:842:9:842:9 | n | 1.0 | +| test.c:842:9:842:14 | ... >= ... | 1.0 | +| test.c:842:14:842:14 | 0 | 1.0 | +| test.c:843:11:843:11 | (int)... | 1.0 | +| test.c:843:11:843:11 | n | 1.0 | +| test.c:847:7:847:7 | (int)... | 2.0 | +| test.c:847:7:847:7 | n | 2.0 | +| test.c:847:7:847:12 | ... >= ... | 1.0 | +| test.c:847:12:847:12 | 5 | 1.0 | +| test.c:848:9:848:9 | 2 | 1.0 | +| test.c:848:9:848:13 | ... * ... | 2.0 | +| test.c:848:9:848:18 | ... - ... | 2.0 | +| test.c:848:9:848:23 | ... == ... | 1.0 | +| test.c:848:13:848:13 | (int)... | 2.0 | +| test.c:848:13:848:13 | n | 2.0 | +| test.c:848:17:848:18 | 10 | 1.0 | +| test.c:848:23:848:23 | 0 | 1.0 | +| test.c:851:9:851:9 | (int)... | 2.0 | +| test.c:851:9:851:9 | n | 2.0 | +| test.c:854:7:854:7 | (int)... | 3.0 | +| test.c:854:7:854:7 | n | 3.0 | +| test.c:854:7:854:17 | ... != ... | 1.0 | +| test.c:854:7:854:32 | ... && ... | 1.0 | +| test.c:854:12:854:17 | - ... | 1.0 | +| test.c:854:13:854:17 | 32768 | 1.0 | +| test.c:854:22:854:22 | (int)... | 3.0 | +| test.c:854:22:854:22 | n | 3.0 | +| test.c:854:22:854:32 | ... != ... | 1.0 | +| test.c:854:27:854:32 | - ... | 1.0 | +| test.c:854:28:854:32 | 32767 | 1.0 | +| test.c:855:9:855:9 | (int)... | 3.0 | +| test.c:855:9:855:9 | n | 3.0 | +| test.c:858:7:858:7 | (int)... | 4.0 | +| test.c:858:7:858:7 | n | 4.0 | +| test.c:858:7:858:12 | ... >= ... | 1.0 | +| test.c:858:12:858:12 | 0 | 1.0 | +| test.c:859:5:859:5 | n | 4.0 | +| test.c:859:5:859:14 | ... ? ... : ... | 16.0 | +| test.c:859:10:859:10 | (int)... | 4.0 | +| test.c:859:10:859:10 | n | 4.0 | +| test.c:859:14:859:14 | (int)... | 4.0 | +| test.c:859:14:859:14 | n | 4.0 | +| test.c:860:5:860:6 | ! ... | 1.0 | +| test.c:860:5:860:14 | ... ? ... : ... | 64.0 | +| test.c:860:6:860:6 | n | 8.0 | +| test.c:860:10:860:10 | (int)... | 8.0 | +| test.c:860:10:860:10 | n | 8.0 | +| test.c:860:14:860:14 | (int)... | 8.0 | +| test.c:860:14:860:14 | n | 8.0 | +| test.c:871:7:871:8 | (unsigned long)... | 1.0 | +| test.c:871:7:871:8 | ss | 1.0 | +| test.c:871:7:871:22 | ... < ... | 1.0 | +| test.c:871:12:871:22 | sizeof(int) | 1.0 | +| test.c:872:9:872:10 | (int)... | 1.0 | +| test.c:872:9:872:10 | ss | 1.0 | +| test.c:875:7:875:8 | (int)... | 2.0 | +| test.c:875:7:875:8 | ss | 2.0 | +| test.c:875:7:875:17 | ... < ... | 1.0 | +| test.c:875:12:875:17 | 32769 | 1.0 | +| test.c:876:9:876:10 | (int)... | 2.0 | +| test.c:876:9:876:10 | ss | 2.0 | +| test.c:879:7:879:15 | (int)... | 1.0 | +| test.c:879:7:879:15 | (short)... | 1.0 | +| test.c:879:7:879:20 | ... >= ... | 1.0 | +| test.c:879:14:879:15 | us | 1.0 | +| test.c:879:20:879:20 | 0 | 1.0 | +| test.c:880:9:880:10 | (int)... | 1.0 | +| test.c:880:9:880:10 | us | 1.0 | +| test.c:883:7:883:15 | (int)... | 2.0 | +| test.c:883:7:883:15 | (short)... | 2.0 | +| test.c:883:7:883:21 | ... >= ... | 1.0 | +| test.c:883:14:883:15 | us | 2.0 | +| test.c:883:20:883:21 | - ... | 1.0 | +| test.c:883:21:883:21 | 1 | 1.0 | +| test.c:884:9:884:10 | (int)... | 2.0 | +| test.c:884:9:884:10 | us | 2.0 | +| test.c:887:7:887:8 | (unsigned long)... | 3.0 | +| test.c:887:7:887:8 | ss | 3.0 | +| test.c:887:7:887:23 | ... >= ... | 1.0 | +| test.c:887:13:887:23 | sizeof(int) | 1.0 | +| test.c:888:9:888:10 | (int)... | 3.0 | +| test.c:888:9:888:10 | ss | 3.0 | +| test.c:891:7:891:8 | (int)... | 4.0 | +| test.c:891:7:891:8 | ss | 4.0 | +| test.c:891:7:891:12 | (unsigned long)... | 4.0 | +| test.c:891:7:891:12 | ... + ... | 4.0 | +| test.c:891:7:891:26 | ... < ... | 1.0 | +| test.c:891:12:891:12 | 1 | 1.0 | +| test.c:891:16:891:26 | sizeof(int) | 1.0 | +| test.c:892:9:892:10 | (int)... | 4.0 | +| test.c:892:9:892:10 | ss | 4.0 | +| test.c:898:8:898:8 | s | 1.0 | +| test.c:898:8:898:12 | ... = ... | 1.0 | +| test.c:898:12:898:12 | 0 | 1.0 | +| test.c:898:15:898:15 | s | 13.0 | +| test.c:898:15:898:20 | ... < ... | 1.0 | +| test.c:898:19:898:20 | 10 | 1.0 | +| test.c:898:23:898:23 | s | 13.0 | +| test.c:898:23:898:25 | ... ++ | 13.0 | +| test.c:899:18:899:18 | s | 13.0 | +| test.c:899:18:899:22 | ... + ... | 13.0 | +| test.c:899:22:899:22 | s | 13.0 | +| test.c:900:9:900:14 | result | 13.0 | +| test.c:905:10:905:11 | 0 | 1.0 | +| test.c:906:7:906:7 | i | 1.0 | +| test.c:906:7:906:11 | ... < ... | 1.0 | +| test.c:906:11:906:11 | 0 | 1.0 | +| test.c:907:9:907:9 | i | 1.0 | +| test.c:910:20:910:20 | 0 | 1.0 | +| test.c:910:20:910:20 | (unsigned int)... | 1.0 | +| test.c:911:7:911:7 | u | 1.0 | +| test.c:911:7:911:11 | ... < ... | 1.0 | +| test.c:911:11:911:11 | 0 | 1.0 | +| test.c:911:11:911:11 | (unsigned int)... | 1.0 | +| test.c:912:9:912:9 | (int)... | 1.0 | +| test.c:912:9:912:9 | u | 1.0 | +| test.c:917:12:917:12 | s | 1.0 | +| test.c:917:12:917:16 | ... % ... | 1.0 | +| test.c:917:16:917:16 | 5 | 1.0 | +| test.c:918:7:918:8 | s2 | 1.0 | +| test.c:923:7:923:7 | x | 1.0 | +| test.c:924:9:924:9 | y | 1.0 | +| test.c:924:9:924:14 | ... != ... | 1.0 | +| test.c:924:14:924:14 | 0 | 1.0 | +| test.c:925:12:925:12 | 0 | 1.0 | +| test.c:928:7:928:7 | y | 2.0 | +| test.c:937:7:937:7 | x | 1.0 | +| test.c:937:7:937:13 | ... >= ... | 1.0 | +| test.c:937:12:937:13 | 10 | 1.0 | +| test.c:942:7:942:7 | x | 13.0 | +| test.c:947:16:947:26 | 2147483647 | 1.0 | +| test.c:948:16:948:19 | 256 | 1.0 | +| test.c:949:7:949:13 | (...) | 1.0 | +| test.c:949:7:949:20 | ... <= ... | 1.0 | +| test.c:949:8:949:8 | x | 1.0 | +| test.c:949:8:949:12 | ... + ... | 1.0 | +| test.c:949:12:949:12 | y | 1.0 | +| test.c:949:18:949:20 | 512 | 1.0 | +| test.c:950:9:950:9 | x | 1.0 | +| test.c:951:9:951:9 | y | 1.0 | +| test.cpp:9:11:9:12 | - ... | 1.0 | +| test.cpp:9:12:9:12 | 1 | 1.0 | +| test.cpp:10:7:10:7 | (bool)... | 1.0 | +| test.cpp:10:7:10:7 | b | 1.0 | +| test.cpp:11:5:11:5 | x | 1.0 | +| test.cpp:11:5:11:14 | ... = ... | 1.0 | +| test.cpp:11:12:11:12 | call to operator[] | 1.0 | +| test.cpp:11:12:11:14 | (reference dereference) | 1.0 | +| test.cpp:11:13:11:13 | 3 | 1.0 | +| test.cpp:13:10:13:10 | x | 2.0 | +| test.cpp:18:12:18:31 | (int)... | 1.0 | +| test.cpp:18:12:18:31 | static_cast... | 1.0 | +| test.cpp:18:30:18:30 | x | 1.0 | +| test.cpp:19:10:19:11 | x0 | 1.0 | +| test.cpp:27:7:27:7 | y | 1.0 | +| test.cpp:27:7:27:12 | ... == ... | 1.0 | +| test.cpp:27:12:27:12 | 0 | 1.0 | +| test.cpp:28:5:28:5 | x | 1.0 | +| test.cpp:28:5:28:9 | ... = ... | 1.0 | +| test.cpp:28:9:28:9 | 0 | 1.0 | +| test.cpp:30:7:30:7 | y | 2.0 | +| test.cpp:30:7:30:13 | ... == ... | 1.0 | +| test.cpp:30:12:30:13 | - ... | 1.0 | +| test.cpp:30:13:30:13 | 1 | 1.0 | +| test.cpp:31:5:31:5 | x | 1.0 | +| test.cpp:31:5:31:10 | ... = ... | 1.0 | +| test.cpp:31:9:31:10 | - ... | 1.0 | +| test.cpp:31:10:31:10 | 1 | 1.0 | +| test.cpp:33:7:33:7 | y | 4.0 | +| test.cpp:33:7:33:12 | ... == ... | 1.0 | +| test.cpp:33:12:33:12 | 1 | 1.0 | +| test.cpp:34:5:34:5 | x | 1.0 | +| test.cpp:34:5:34:9 | ... = ... | 1.0 | +| test.cpp:34:9:34:9 | 1 | 1.0 | +| test.cpp:36:7:36:7 | y | 8.0 | +| test.cpp:36:7:36:15 | ... == ... | 1.0 | +| test.cpp:36:12:36:15 | - ... | 1.0 | +| test.cpp:36:13:36:15 | 128 | 1.0 | +| test.cpp:37:5:37:5 | x | 1.0 | +| test.cpp:37:5:37:12 | ... = ... | 1.0 | +| test.cpp:37:9:37:12 | - ... | 1.0 | +| test.cpp:37:10:37:12 | 128 | 1.0 | +| test.cpp:39:7:39:7 | y | 16.0 | +| test.cpp:39:7:39:14 | ... == ... | 1.0 | +| test.cpp:39:12:39:14 | 128 | 1.0 | +| test.cpp:40:5:40:5 | x | 1.0 | +| test.cpp:40:5:40:11 | ... = ... | 1.0 | +| test.cpp:40:9:40:11 | 128 | 1.0 | +| test.cpp:42:7:42:7 | y | 32.0 | +| test.cpp:42:7:42:16 | ... == ... | 1.0 | +| test.cpp:42:12:42:16 | - ... | 1.0 | +| test.cpp:42:13:42:16 | 1024 | 1.0 | +| test.cpp:43:5:43:5 | x | 1.0 | +| test.cpp:43:5:43:13 | ... = ... | 1.0 | +| test.cpp:43:9:43:13 | - ... | 1.0 | +| test.cpp:43:10:43:13 | 1024 | 1.0 | +| test.cpp:45:7:45:7 | y | 64.0 | +| test.cpp:45:7:45:15 | ... == ... | 1.0 | +| test.cpp:45:12:45:15 | 1024 | 1.0 | +| test.cpp:46:5:46:5 | x | 1.0 | +| test.cpp:46:5:46:12 | ... = ... | 1.0 | +| test.cpp:46:9:46:12 | 1024 | 1.0 | +| test.cpp:49:10:49:11 | 0 | 1.0 | +| test.cpp:51:7:51:7 | x | 8.0 | +| test.cpp:51:7:51:12 | ... == ... | 1.0 | +| test.cpp:51:12:51:12 | 0 | 1.0 | +| test.cpp:52:15:52:21 | (bool)... | 1.0 | +| test.cpp:52:21:52:21 | x | 8.0 | +| test.cpp:53:5:53:5 | t | 1.0 | +| test.cpp:53:5:53:16 | ... += ... | 8.0 | +| test.cpp:53:10:53:16 | (int)... | 8.0 | +| test.cpp:53:15:53:16 | xb | 8.0 | +| test.cpp:56:7:56:7 | x | 16.0 | +| test.cpp:56:7:56:11 | ... > ... | 1.0 | +| test.cpp:56:11:56:11 | 0 | 1.0 | +| test.cpp:57:15:57:21 | (bool)... | 1.0 | +| test.cpp:57:21:57:21 | x | 16.0 | +| test.cpp:58:5:58:5 | t | 9.0 | +| test.cpp:58:5:58:16 | ... += ... | 144.0 | +| test.cpp:58:10:58:16 | (int)... | 16.0 | +| test.cpp:58:15:58:16 | xb | 16.0 | +| test.cpp:61:7:61:7 | x | 17.0 | +| test.cpp:61:7:61:11 | ... < ... | 1.0 | +| test.cpp:61:11:61:11 | 0 | 1.0 | +| test.cpp:62:15:62:21 | (bool)... | 1.0 | +| test.cpp:62:21:62:21 | x | 17.0 | +| test.cpp:63:5:63:5 | t | 153.0 | +| test.cpp:63:5:63:16 | ... += ... | 2601.0 | +| test.cpp:63:10:63:16 | (int)... | 17.0 | +| test.cpp:63:15:63:16 | xb | 17.0 | +| test.cpp:66:13:66:19 | (bool)... | 1.0 | +| test.cpp:66:19:66:19 | x | 18.0 | +| test.cpp:67:3:67:3 | t | 2754.0 | +| test.cpp:67:3:67:14 | ... += ... | 49572.0 | +| test.cpp:67:8:67:14 | (int)... | 18.0 | +| test.cpp:67:13:67:14 | xb | 18.0 | +| test.cpp:69:10:69:10 | b | 1.0 | +| test.cpp:69:10:69:21 | ... \|\| ... | 1.0 | +| test.cpp:69:15:69:21 | (bool)... | 1.0 | +| test.cpp:69:21:69:21 | t | 49572.0 | +| test.cpp:74:30:74:30 | (int)... | 1.0 | +| test.cpp:74:30:74:30 | c | 1.0 | +| test.cpp:74:30:74:34 | (unsigned short)... | 1.0 | +| test.cpp:74:30:74:34 | ... + ... | 1.0 | +| test.cpp:74:34:74:34 | (int)... | 1.0 | +| test.cpp:74:34:74:34 | c | 1.0 | +| test.cpp:75:7:75:30 | (int)... | 1.0 | +| test.cpp:75:7:75:30 | (unsigned char)... | 1.0 | +| test.cpp:75:7:75:35 | ... == ... | 1.0 | +| test.cpp:75:22:75:30 | c_times_2 | 1.0 | +| test.cpp:75:35:75:35 | 0 | 1.0 | +| test.cpp:77:5:77:13 | c_times_2 | 1.0 | +| test.cpp:79:3:79:11 | c_times_2 | 1.0 | +| test.cpp:83:16:83:22 | (reference dereference) | 1.0 | +| test.cpp:83:16:83:22 | (reference to) | 1.0 | +| test.cpp:83:16:83:22 | aliased | 1.0 | +| test.cpp:85:7:85:7 | (reference dereference) | 1.0 | +| test.cpp:85:7:85:7 | i | 1.0 | +| test.cpp:85:7:85:12 | ... >= ... | 1.0 | +| test.cpp:85:12:85:12 | 2 | 1.0 | +| test.cpp:86:12:86:12 | (reference dereference) | 1.0 | +| test.cpp:86:12:86:12 | i | 1.0 | +| test.cpp:88:7:88:8 | (reference dereference) | 1.0 | +| test.cpp:88:7:88:8 | ci | 1.0 | +| test.cpp:88:7:88:13 | ... >= ... | 1.0 | +| test.cpp:88:13:88:13 | 2 | 1.0 | +| test.cpp:89:12:89:13 | (reference dereference) | 1.0 | +| test.cpp:89:12:89:13 | ci | 1.0 | +| test.cpp:91:7:91:13 | (reference dereference) | 1.0 | +| test.cpp:91:7:91:13 | aliased | 1.0 | +| test.cpp:91:7:91:18 | ... >= ... | 1.0 | +| test.cpp:91:18:91:18 | 2 | 1.0 | +| test.cpp:92:12:92:18 | (reference dereference) | 1.0 | +| test.cpp:92:12:92:18 | aliased | 1.0 | +| test.cpp:94:7:94:11 | (reference dereference) | 1.0 | +| test.cpp:94:7:94:11 | alias | 1.0 | +| test.cpp:94:7:94:16 | ... >= ... | 1.0 | +| test.cpp:94:16:94:16 | 2 | 1.0 | +| test.cpp:95:12:95:16 | (reference dereference) | 1.0 | +| test.cpp:95:12:95:16 | alias | 1.0 | +| test.cpp:97:10:97:10 | (reference dereference) | 13.0 | +| test.cpp:97:10:97:19 | ... <= ... | 1.0 | +| test.cpp:97:15:97:19 | 12345 | 1.0 | +| test.cpp:97:22:97:22 | (reference dereference) | 13.0 | +| test.cpp:97:22:97:24 | ... ++ | 13.0 | +| test.cpp:98:5:98:5 | (reference dereference) | 1.0 | +| test.cpp:98:5:98:5 | i | 1.0 | +| test.cpp:98:5:98:9 | ... = ... | 13.0 | +| test.cpp:98:9:98:9 | (reference dereference) | 13.0 | +| test.cpp:99:5:99:5 | (reference dereference) | 13.0 | +| test.cpp:102:10:102:10 | 0 | 1.0 | +| test.cpp:106:7:106:7 | (int)... | 1.0 | +| test.cpp:106:7:106:7 | n | 1.0 | +| test.cpp:106:7:106:11 | ... < ... | 1.0 | +| test.cpp:106:11:106:11 | 0 | 1.0 | +| test.cpp:109:7:109:7 | (bool)... | 1.0 | +| test.cpp:109:7:109:7 | n | 1.0 | +| test.cpp:110:5:110:5 | n | 1.0 | +| test.cpp:112:5:112:5 | n | 1.0 | +| test.cpp:115:7:115:8 | ! ... | 1.0 | +| test.cpp:115:8:115:8 | (bool)... | 1.0 | +| test.cpp:115:8:115:8 | n | 2.0 | +| test.cpp:116:5:116:5 | n | 2.0 | +| test.cpp:118:5:118:5 | n | 2.0 | +| test.cpp:121:3:121:3 | (bool)... | 1.0 | +| test.cpp:121:3:121:3 | n | 4.0 | +| test.cpp:121:3:121:12 | ... ? ... : ... | 16.0 | +| test.cpp:121:8:121:8 | n | 4.0 | +| test.cpp:121:12:121:12 | n | 4.0 | +| test.cpp:122:3:122:4 | ! ... | 1.0 | +| test.cpp:122:3:122:12 | ... ? ... : ... | 64.0 | +| test.cpp:122:4:122:4 | (bool)... | 1.0 | +| test.cpp:122:4:122:4 | n | 8.0 | +| test.cpp:122:8:122:8 | n | 8.0 | +| test.cpp:122:12:122:12 | n | 8.0 | diff --git a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/nrOfBounds.ql b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/nrOfBounds.ql new file mode 100644 index 00000000000..efafcf6e684 --- /dev/null +++ b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/nrOfBounds.ql @@ -0,0 +1,31 @@ +import cpp +import utils.test.InlineExpectationsTest +import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis + +query predicate estimateNrOfBounds(Expr e, float nrOfBounds) { + nrOfBounds = SimpleRangeAnalysisInternal::estimateNrOfBounds(e) +} + +/** + * Finds any expressions for which `nrOfBounds` is not functional. The result + * should be empty, so this predicate is useful to debug non-functional cases. + */ +private predicate nonFunctionalNrOfBounds(Expr e) { + strictcount(SimpleRangeAnalysisInternal::estimateNrOfBounds(e)) > 1 +} + +module FunctionalityTest implements TestSig { + string getARelevantTag() { result = "nonFunctionalNrOfBounds" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(Expr e | + nonFunctionalNrOfBounds(e) and + location = e.getLocation() and + element = e.toString() and + tag = "nonFunctionalNrOfBounds" and + value = "" + ) + } +} + +import MakeTest diff --git a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryLower.expected b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryLower.expected index 0cd2437e073..48925507106 100644 --- a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryLower.expected +++ b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryLower.expected @@ -72,8 +72,77 @@ | test.c:405:22:405:82 | ... ? ... : ... | 0.13204114 | 0.42186276 | 0.13204114 | | test.c:405:26:405:69 | ... ? ... : ... | 0.42186276 | 0.42186276 | 0.44996679 | | test.c:405:30:405:56 | ... ? ... : ... | 0.42186276 | 0.42186276 | 0.53843358 | -| test.c:418:20:418:36 | ... ? ... : ... | 0.0 | 0.0 | 100.0 | -| test.c:630:5:630:14 | ... ? ... : ... | 0.0 | 1.0 | 0.0 | -| test.c:631:5:631:14 | ... ? ... : ... | 0.0 | 0.0 | 1.0 | +| test.c:447:4:621:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:447:5:449:49 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:450:6:532:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:451:8:469:41 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:454:10:458:21 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:454:31:454:79 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:456:13:458:21 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:463:12:468:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:464:12:464:60 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:466:15:468:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:470:6:489:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:473:8:477:19 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:473:29:473:77 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:475:11:477:19 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:478:6:478:54 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:482:10:486:21 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:482:31:482:79 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:484:13:486:21 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:487:9:489:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:491:10:510:43 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:494:12:499:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:495:12:495:60 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:497:15:499:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:504:14:509:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:505:14:505:62 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:507:17:509:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:511:9:532:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:514:14:519:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:515:14:515:62 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:517:17:519:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:520:12:520:60 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:524:12:529:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:525:12:525:60 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:527:15:529:23 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:530:11:532:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:533:9:535:51 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:536:9:621:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:537:14:556:47 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:540:16:545:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:541:16:541:64 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:543:19:545:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:550:18:555:29 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:551:18:551:66 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:553:21:555:29 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:557:12:578:29 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:560:14:565:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:561:14:561:62 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:563:17:565:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:566:12:566:60 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:570:16:575:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:571:16:571:64 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:573:19:575:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:576:15:578:29 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:580:12:599:45 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:583:14:588:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:584:14:584:62 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:586:17:588:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:593:16:598:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:594:16:594:64 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:596:19:598:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:600:11:621:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:603:16:608:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:604:16:604:64 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:606:19:608:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:609:14:609:62 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:613:14:618:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:614:14:614:62 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:616:17:618:25 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:619:13:621:27 | ... ? ... : ... | 0.0 | 0.0 | 0.0 | +| test.c:647:20:647:36 | ... ? ... : ... | 0.0 | 0.0 | 100.0 | +| test.c:859:5:859:14 | ... ? ... : ... | 0.0 | 1.0 | 0.0 | +| test.c:860:5:860:14 | ... ? ... : ... | 0.0 | 0.0 | 1.0 | | test.cpp:121:3:121:12 | ... ? ... : ... | 0.0 | 1.0 | 0.0 | | test.cpp:122:3:122:12 | ... ? ... : ... | 0.0 | 0.0 | 1.0 | diff --git a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryUpper.expected b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryUpper.expected index b34beda10d4..9c5dec067a6 100644 --- a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryUpper.expected +++ b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/ternaryUpper.expected @@ -72,8 +72,77 @@ | test.c:405:22:405:82 | ... ? ... : ... | 0.53843358 | 0.53843358 | 0.13204114 | | test.c:405:26:405:69 | ... ? ... : ... | 0.53843358 | 0.53843358 | 0.44996679 | | test.c:405:30:405:56 | ... ? ... : ... | 0.53843358 | 0.42186276 | 0.53843358 | -| test.c:418:20:418:36 | ... ? ... : ... | 100.0 | 99.0 | 100.0 | -| test.c:630:5:630:14 | ... ? ... : ... | 32767.0 | 32767.0 | 0.0 | -| test.c:631:5:631:14 | ... ? ... : ... | 32767.0 | 0.0 | 32767.0 | +| test.c:447:4:621:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:447:5:449:49 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:450:6:532:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:451:8:469:41 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:454:10:458:21 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:454:31:454:79 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:456:13:458:21 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:463:12:468:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:464:12:464:60 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:466:15:468:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:470:6:489:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:473:8:477:19 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:473:29:473:77 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:475:11:477:19 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:478:6:478:54 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:482:10:486:21 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:482:31:482:79 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:484:13:486:21 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:487:9:489:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:491:10:510:43 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:494:12:499:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:495:12:495:60 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:497:15:499:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:504:14:509:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:505:14:505:62 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:507:17:509:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:511:9:532:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:514:14:519:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:515:14:515:62 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:517:17:519:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:520:12:520:60 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:524:12:529:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:525:12:525:60 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:527:15:529:23 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:530:11:532:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:533:9:535:51 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:536:9:621:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:537:14:556:47 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:540:16:545:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:541:16:541:64 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:543:19:545:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:550:18:555:29 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:551:18:551:66 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:553:21:555:29 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:557:12:578:29 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:560:14:565:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:561:14:561:62 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:563:17:565:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:566:12:566:60 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:570:16:575:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:571:16:571:64 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:573:19:575:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:576:15:578:29 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:580:12:599:45 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:583:14:588:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:584:14:584:62 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:586:17:588:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:593:16:598:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:594:16:594:64 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:596:19:598:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:600:11:621:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:603:16:608:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:604:16:604:64 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:606:19:608:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:609:14:609:62 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:613:14:618:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:614:14:614:62 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:616:17:618:25 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:619:13:621:27 | ... ? ... : ... | 4.294967295E9 | 4.294967295E9 | 4.294967295E9 | +| test.c:647:20:647:36 | ... ? ... : ... | 100.0 | 99.0 | 100.0 | +| test.c:859:5:859:14 | ... ? ... : ... | 32767.0 | 32767.0 | 0.0 | +| test.c:860:5:860:14 | ... ? ... : ... | 32767.0 | 0.0 | 32767.0 | | test.cpp:121:3:121:12 | ... ? ... : ... | 32767.0 | 32767.0 | 0.0 | | test.cpp:122:3:122:12 | ... ? ... : ... | 32767.0 | 0.0 | 32767.0 | diff --git a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/test.c b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/test.c index 26e6a49e6f6..3cb3c761f47 100644 --- a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/test.c +++ b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/test.c @@ -413,6 +413,235 @@ double test_ternary_nested_of_literals(double m, double n, double o, double p, d return output; } +int repeated_if_statements(unsigned int rhs) { + // Test how many bounds we estimate for `if` statements without `else` + // branches where the following node is both a normal phi node and a guard phi + // node. + if (rhs < 12) { rhs << 1; } + if (rhs < 13) { rhs << 1; } + if (rhs < 14) { rhs << 1; } + if (rhs < 15) { rhs << 1; } + if (rhs < 16) { rhs << 1; } + return rhs; // rhs has 6 bounds +} + +int ne_phi_nodes(int a, int b) { + if (a == 17) { + if (b == 23) { + a += b; + } + if (a == 18) { + b = 10; + } + } + // The statement below is an NE phi node for the access `a` in both `a == 17` + // and `a == 18`. + int c = a + b; + return a + b; +} + +unsigned int conditional_nested_guards(unsigned int ip) { + // This tests a combinatorial explosion that can happen from a large number of + // nested linear guards. + unsigned int special_number = + (14 * ip > (2 * ip + 1) * 17 + (2 * ip + 1 + 1) * 17 + ? 14 * ip + : (2 * ip + 1) * 14 + (2 * ip + 1 + 1) * 17) > + (2 * (ip * 14 + 32) + + (4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > (17 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + 2 * ip * 14 + (2 * ip + 1) * 17 + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 2 * ip * 14 + (2 * ip + 1) * 17) > + (4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > (17 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + (14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17) + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > (17 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 14 * ip > (ip + 1) * 17 + ? 14 * ip + : (ip + 1) * 14) + ? 2 * (ip * 14 + 32) + + (4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + 2 * ip * 14 + (2 * ip + 1) * 17 + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 2 * ip * 14 + (2 * ip + 1) * 17) + : 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + (14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17) + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 14 * ip > (ip + 1) * 17 + ? 14 * ip + : (ip + 1) * 14) + ? 14 * ip > (2 * ip + 1) * 17 + (2 * ip + 1 + 1) * 17 + ? 14 * ip + : (2 * ip + 1) * 14 + (2 * ip + 1 + 1) * 17 + : 2 * (ip * 14 + 32) + + (4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + 2 * ip * 14 + (2 * ip + 1) * 17 + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 2 * ip * 14 + (2 * ip + 1) * 17) > + (4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + (14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17) + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 14 * ip > (ip + 1) * 17 + ? 14 * ip + : (ip + 1) * 14) + ? 2 * (ip * 14 + 32) + + (4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + 2 * ip * 14 + (2 * ip + 1) * 17 + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 2 * ip * 14 + (2 * ip + 1) * 17) + : 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) > + (14 * ip > (ip + 1) * 17 ? 17 * ip : (ip + 1) * 17) + ? 4 * (ip * 14 + 32) + + (2 * ip * 14 + 32) + + 2 * (ip * 14 + 64) + + ((2 * ip + 1) * 14 > + (14 * (2 * ip) > 17 * ip ? 17 * (2 * ip) : 17 * ip) + ? (2 * ip + 1) * 14 + : 14 * (2 * ip) > 17 * ip + ? 14 * (2 * ip) + : 14 * ip) + : 14 * ip > (ip + 1) * 17 + ? 14 * ip + : (ip + 1) * 14; + return special_number; +} + +int many_conditional_assignments(int c1, int c2, int c3, int c4, int c5) { + // This tests a combinatorial explosion that can happen from many conditional + // assignments, since each conditional assignment doubles the number of + // bounds. + int x = 0; + if (c1) { x += 748596; } + if (c2) { x += 84652395; } + if (c3) { x += 3675895; } + if (c4) { x += 98634; } + if (c5) { x += 7834985; } + if (c1 && c2) { x += 938457398; } + if (c1 && c3) { x += 73895648; } + if (c1 && c4) { x += 12345432; } + if (c1 && c5) { x += 38847; } + if (c2 && c3) { x += 234; } + // x now has 2^10 bounds, the 10 additions below give (2^10)^10 bounds + int y = x + x + x + x + x + x + x + x + x + x + x + x; + return y; +} + // Test the comma expression. unsigned int test_comma01(unsigned int x) { unsigned int y = x < 100 ? x : 100; diff --git a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/upperBound.expected b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/upperBound.expected index 8696ecfe8d0..7b056a8a3ee 100644 --- a/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/upperBound.expected +++ b/cpp/ql/test/library-tests/rangeanalysis/SimpleRangeAnalysis/upperBound.expected @@ -485,197 +485,529 @@ | test.c:411:59:411:59 | k | 0.889553 | | test.c:411:63:411:63 | l | 0.538434 | | test.c:413:10:413:15 | output | 9.284378 | -| test.c:418:20:418:20 | x | 4294967295 | -| test.c:418:30:418:30 | x | 99 | -| test.c:421:3:421:4 | y1 | 4294967295 | -| test.c:421:11:421:11 | y | 100 | -| test.c:421:14:421:14 | y | 101 | -| test.c:422:3:422:4 | y2 | 4294967295 | -| test.c:422:9:422:9 | y | 101 | -| test.c:422:14:422:14 | y | 102 | -| test.c:422:22:422:22 | y | 105 | -| test.c:423:10:423:11 | y1 | 101 | -| test.c:423:15:423:16 | y2 | 105 | -| test.c:431:3:431:3 | i | 2147483647 | -| test.c:432:7:432:7 | i | 10 | -| test.c:434:3:434:3 | i | 2147483647 | -| test.c:435:3:435:3 | i | 10 | -| test.c:436:7:436:7 | i | 20 | -| test.c:438:3:438:3 | i | 2147483647 | -| test.c:439:3:439:3 | i | 40 | -| test.c:440:7:440:7 | i | 30 | -| test.c:442:3:442:3 | i | 2147483647 | -| test.c:442:7:442:7 | j | 2147483647 | -| test.c:443:7:443:7 | i | 40 | -| test.c:445:3:445:3 | i | 2147483647 | -| test.c:445:8:445:8 | j | 40 | -| test.c:446:7:446:7 | i | 50 | -| test.c:448:3:448:3 | i | 2147483647 | -| test.c:448:13:448:13 | j | 50 | -| test.c:449:7:449:7 | i | 60 | -| test.c:456:12:456:12 | a | 4294967295 | -| test.c:456:17:456:17 | a | 4294967295 | -| test.c:456:33:456:33 | b | 4294967295 | -| test.c:456:38:456:38 | b | 4294967295 | -| test.c:457:13:457:13 | a | 11 | -| test.c:457:15:457:15 | b | 23 | -| test.c:458:5:458:9 | total | 0 | -| test.c:458:14:458:14 | r | 253 | -| test.c:460:12:460:12 | a | 4294967295 | -| test.c:460:17:460:17 | a | 4294967295 | -| test.c:460:33:460:33 | b | 4294967295 | -| test.c:460:38:460:38 | b | 4294967295 | -| test.c:461:13:461:13 | a | 11 | -| test.c:461:15:461:15 | b | 23 | -| test.c:462:5:462:9 | total | 253 | -| test.c:462:14:462:14 | r | 253 | -| test.c:464:12:464:12 | a | 4294967295 | -| test.c:464:17:464:17 | a | 4294967295 | -| test.c:464:34:464:34 | b | 4294967295 | -| test.c:464:39:464:39 | b | 4294967295 | -| test.c:465:13:465:13 | a | 11 | -| test.c:465:15:465:15 | b | 23 | -| test.c:466:5:466:9 | total | 506 | -| test.c:466:14:466:14 | r | 253 | -| test.c:469:10:469:14 | total | 759 | -| test.c:475:12:475:12 | b | 4294967295 | -| test.c:475:17:475:17 | b | 4294967295 | -| test.c:476:16:476:16 | b | 23 | -| test.c:477:5:477:9 | total | 0 | -| test.c:477:14:477:14 | r | 253 | -| test.c:479:12:479:12 | b | 4294967295 | -| test.c:479:17:479:17 | b | 4294967295 | -| test.c:480:16:480:16 | b | 23 | -| test.c:481:5:481:9 | total | 253 | -| test.c:481:14:481:14 | r | 253 | -| test.c:483:13:483:13 | b | 4294967295 | -| test.c:483:18:483:18 | b | 4294967295 | -| test.c:484:16:484:16 | b | 23 | -| test.c:485:5:485:9 | total | 506 | -| test.c:485:14:485:14 | r | 253 | -| test.c:488:10:488:14 | total | 759 | -| test.c:493:3:493:3 | x | 18446744073709551616 | -| test.c:493:7:493:7 | y | 18446744073709551616 | -| test.c:494:3:494:4 | xy | 18446744073709551616 | -| test.c:494:8:494:8 | x | 1000000003 | -| test.c:494:12:494:12 | y | 1000000003 | -| test.c:495:10:495:11 | xy | 1000000006000000000 | -| test.c:500:3:500:3 | x | 18446744073709551616 | -| test.c:501:3:501:3 | y | 18446744073709551616 | -| test.c:502:3:502:4 | xy | 18446744073709551616 | -| test.c:502:8:502:8 | x | 274177 | -| test.c:502:12:502:12 | y | 67280421310721 | -| test.c:503:10:503:11 | xy | 18446744073709551616 | -| test.c:507:7:507:8 | ui | 4294967295 | -| test.c:508:43:508:44 | ui | 4294967295 | -| test.c:508:48:508:49 | ui | 4294967295 | -| test.c:509:12:509:17 | result | 18446744065119617024 | -| test.c:511:7:511:8 | ul | 18446744073709551616 | -| test.c:512:28:512:29 | ul | 18446744073709551616 | -| test.c:512:33:512:34 | ul | 18446744073709551616 | -| test.c:513:12:513:17 | result | 18446744073709551616 | -| test.c:519:7:519:8 | ui | 4294967295 | -| test.c:519:19:519:20 | ui | 10 | -| test.c:520:5:520:6 | ui | 10 | -| test.c:520:11:520:12 | ui | 10 | -| test.c:521:12:521:13 | ui | 100 | -| test.c:525:3:525:9 | uiconst | 10 | -| test.c:528:3:528:9 | ulconst | 10 | -| test.c:529:10:529:16 | uiconst | 40 | -| test.c:529:20:529:26 | ulconst | 40 | -| test.c:533:7:533:7 | i | 2147483647 | -| test.c:533:18:533:18 | i | 2147483647 | -| test.c:534:5:534:5 | i | 2147483647 | -| test.c:534:13:534:13 | i | 2 | -| test.c:535:9:535:9 | i | 10 | -| test.c:537:5:537:5 | i | 2147483647 | -| test.c:537:9:537:9 | i | 10 | -| test.c:538:9:538:9 | i | 15 | -| test.c:540:5:540:5 | i | 15 | -| test.c:541:9:541:9 | i | 105 | -| test.c:543:5:543:5 | i | 105 | -| test.c:544:9:544:9 | i | 2310 | -| test.c:546:7:546:7 | i | 2147483647 | -| test.c:547:5:547:5 | i | 2147483647 | -| test.c:547:9:547:9 | i | -1 | -| test.c:548:9:548:9 | i | 1 | -| test.c:550:3:550:3 | i | 2147483647 | -| test.c:550:7:550:7 | i | 2147483647 | -| test.c:551:10:551:10 | i | 2147483647 | -| test.c:554:3:554:3 | i | 2147483647 | -| test.c:554:10:554:11 | sc | 1 | -| test.c:556:7:556:7 | i | 127 | -| test.c:563:7:563:7 | n | 4294967295 | -| test.c:565:7:565:7 | n | 4294967295 | -| test.c:566:9:566:9 | n | 4294967295 | -| test.c:569:7:569:7 | n | 4294967295 | -| test.c:570:9:570:9 | n | 4294967295 | -| test.c:572:9:572:9 | n | 0 | -| test.c:575:8:575:8 | n | 4294967295 | -| test.c:576:9:576:9 | n | 0 | -| test.c:578:9:578:9 | n | 4294967295 | -| test.c:581:10:581:10 | n | 4294967295 | -| test.c:582:5:582:5 | n | 4294967295 | -| test.c:585:7:585:7 | n | 0 | -| test.c:589:7:589:7 | n | 32767 | -| test.c:592:7:592:7 | n | 32767 | -| test.c:593:9:593:9 | n | 0 | -| test.c:595:9:595:9 | n | 32767 | -| test.c:598:7:598:7 | n | 32767 | -| test.c:599:9:599:9 | n | 32767 | -| test.c:601:9:601:9 | n | 0 | -| test.c:604:10:604:10 | n | 32767 | -| test.c:605:5:605:5 | n | 32767 | -| test.c:608:7:608:7 | n | 0 | -| test.c:612:7:612:7 | n | 32767 | -| test.c:613:9:613:9 | n | 32767 | -| test.c:614:11:614:11 | n | 32767 | -| test.c:618:7:618:7 | n | 32767 | -| test.c:619:13:619:13 | n | 32767 | -| test.c:622:9:622:9 | n | 32767 | -| test.c:625:7:625:7 | n | 32767 | -| test.c:625:22:625:22 | n | 32767 | -| test.c:626:9:626:9 | n | 32767 | -| test.c:629:7:629:7 | n | 32767 | -| test.c:630:5:630:5 | n | 32767 | -| test.c:630:10:630:10 | n | 32767 | -| test.c:630:14:630:14 | n | 0 | -| test.c:631:6:631:6 | n | 32767 | -| test.c:631:10:631:10 | n | 0 | -| test.c:631:14:631:14 | n | 32767 | -| test.c:642:7:642:8 | ss | 32767 | -| test.c:643:9:643:10 | ss | 3 | -| test.c:646:7:646:8 | ss | 32767 | -| test.c:647:9:647:10 | ss | 32767 | -| test.c:650:14:650:15 | us | 65535 | -| test.c:651:9:651:10 | us | 32767 | -| test.c:654:14:654:15 | us | 65535 | -| test.c:655:9:655:10 | us | 65535 | -| test.c:658:7:658:8 | ss | 32767 | -| test.c:659:9:659:10 | ss | 32767 | -| test.c:662:7:662:8 | ss | 32767 | -| test.c:663:9:663:10 | ss | 2 | -| test.c:669:8:669:8 | s | 2147483647 | -| test.c:669:15:669:15 | s | 127 | -| test.c:669:23:669:23 | s | 9 | -| test.c:670:18:670:18 | s | 9 | -| test.c:670:22:670:22 | s | 9 | -| test.c:671:9:671:14 | result | 127 | -| test.c:677:7:677:7 | i | 0 | -| test.c:678:9:678:9 | i | 2147483647 | -| test.c:682:7:682:7 | u | 0 | -| test.c:683:9:683:9 | u | 4294967295 | -| test.c:688:12:688:12 | s | 2147483647 | -| test.c:689:7:689:8 | s2 | 4 | -| test.c:694:7:694:7 | x | 2147483647 | -| test.c:695:9:695:9 | y | 2147483647 | -| test.c:699:7:699:7 | y | 2147483647 | -| test.c:708:7:708:7 | x | 2147483647 | -| test.c:713:7:713:7 | x | 15 | -| test.c:720:8:720:8 | x | 2147483647 | -| test.c:720:12:720:12 | y | 256 | -| test.c:721:9:721:9 | x | 2147483647 | -| test.c:722:9:722:9 | y | 256 | +| test.c:420:7:420:9 | rhs | 4294967295 | +| test.c:420:19:420:21 | rhs | 11 | +| test.c:421:7:421:9 | rhs | 4294967295 | +| test.c:421:19:421:21 | rhs | 12 | +| test.c:422:7:422:9 | rhs | 4294967295 | +| test.c:422:19:422:21 | rhs | 13 | +| test.c:423:7:423:9 | rhs | 4294967295 | +| test.c:423:19:423:21 | rhs | 14 | +| test.c:424:7:424:9 | rhs | 4294967295 | +| test.c:424:19:424:21 | rhs | 15 | +| test.c:425:10:425:12 | rhs | 4294967295 | +| test.c:429:7:429:7 | a | 2147483647 | +| test.c:430:9:430:9 | b | 2147483647 | +| test.c:431:7:431:7 | a | 17 | +| test.c:431:12:431:12 | b | 23 | +| test.c:433:9:433:9 | a | 40 | +| test.c:434:7:434:7 | b | 2147483647 | +| test.c:439:11:439:11 | a | 2147483647 | +| test.c:439:15:439:15 | b | 2147483647 | +| test.c:440:10:440:10 | a | 2147483647 | +| test.c:440:14:440:14 | b | 2147483647 | +| test.c:447:10:447:11 | ip | 4294967295 | +| test.c:447:20:447:21 | ip | 4294967295 | +| test.c:447:40:447:41 | ip | 4294967295 | +| test.c:448:14:448:15 | ip | 4294967295 | +| test.c:449:14:449:15 | ip | 4294967295 | +| test.c:449:34:449:35 | ip | 4294967295 | +| test.c:450:11:450:12 | ip | 4294967295 | +| test.c:451:13:451:14 | ip | 4294967295 | +| test.c:452:14:452:15 | ip | 4294967295 | +| test.c:453:14:453:15 | ip | 4294967295 | +| test.c:454:15:454:16 | ip | 4294967295 | +| test.c:454:41:454:42 | ip | 4294967295 | +| test.c:454:52:454:53 | ip | 4294967295 | +| test.c:454:67:454:68 | ip | 4294967295 | +| test.c:454:78:454:79 | ip | 4294967295 | +| test.c:455:18:455:19 | ip | 4294967295 | +| test.c:456:23:456:24 | ip | 4294967295 | +| test.c:456:34:456:35 | ip | 4294967295 | +| test.c:457:25:457:26 | ip | 4294967295 | +| test.c:458:20:458:21 | ip | 4294967295 | +| test.c:459:11:459:12 | ip | 4294967295 | +| test.c:459:26:459:27 | ip | 4294967295 | +| test.c:460:16:460:17 | ip | 4294967295 | +| test.c:461:16:461:17 | ip | 4294967295 | +| test.c:462:16:462:17 | ip | 4294967295 | +| test.c:463:17:463:18 | ip | 4294967295 | +| test.c:464:22:464:23 | ip | 4294967295 | +| test.c:464:33:464:34 | ip | 4294967295 | +| test.c:464:48:464:49 | ip | 4294967295 | +| test.c:464:59:464:60 | ip | 4294967295 | +| test.c:465:20:465:21 | ip | 4294967295 | +| test.c:466:25:466:26 | ip | 4294967295 | +| test.c:466:36:466:37 | ip | 4294967295 | +| test.c:467:27:467:28 | ip | 4294967295 | +| test.c:468:22:468:23 | ip | 4294967295 | +| test.c:469:15:469:16 | ip | 4294967295 | +| test.c:469:30:469:31 | ip | 4294967295 | +| test.c:470:11:470:12 | ip | 4294967295 | +| test.c:471:12:471:13 | ip | 4294967295 | +| test.c:472:12:472:13 | ip | 4294967295 | +| test.c:473:13:473:14 | ip | 4294967295 | +| test.c:473:39:473:40 | ip | 4294967295 | +| test.c:473:50:473:51 | ip | 4294967295 | +| test.c:473:65:473:66 | ip | 4294967295 | +| test.c:473:76:473:77 | ip | 4294967295 | +| test.c:474:16:474:17 | ip | 4294967295 | +| test.c:475:21:475:22 | ip | 4294967295 | +| test.c:475:32:475:33 | ip | 4294967295 | +| test.c:476:23:476:24 | ip | 4294967295 | +| test.c:477:18:477:19 | ip | 4294967295 | +| test.c:478:11:478:12 | ip | 4294967295 | +| test.c:478:17:478:18 | ip | 4294967295 | +| test.c:478:37:478:38 | ip | 4294967295 | +| test.c:478:43:478:44 | ip | 4294967295 | +| test.c:479:14:479:15 | ip | 4294967295 | +| test.c:480:14:480:15 | ip | 4294967295 | +| test.c:481:14:481:15 | ip | 4294967295 | +| test.c:482:15:482:16 | ip | 4294967295 | +| test.c:482:41:482:42 | ip | 4294967295 | +| test.c:482:52:482:53 | ip | 4294967295 | +| test.c:482:67:482:68 | ip | 4294967295 | +| test.c:482:78:482:79 | ip | 4294967295 | +| test.c:483:18:483:19 | ip | 4294967295 | +| test.c:484:23:484:24 | ip | 4294967295 | +| test.c:484:34:484:35 | ip | 4294967295 | +| test.c:485:25:485:26 | ip | 4294967295 | +| test.c:486:20:486:21 | ip | 4294967295 | +| test.c:487:14:487:15 | ip | 4294967295 | +| test.c:487:20:487:21 | ip | 4294967295 | +| test.c:488:16:488:17 | ip | 4294967295 | +| test.c:489:12:489:13 | ip | 4294967295 | +| test.c:490:14:490:15 | ip | 4294967295 | +| test.c:491:15:491:16 | ip | 4294967295 | +| test.c:492:16:492:17 | ip | 4294967295 | +| test.c:493:16:493:17 | ip | 4294967295 | +| test.c:494:17:494:18 | ip | 4294967295 | +| test.c:495:22:495:23 | ip | 4294967295 | +| test.c:495:33:495:34 | ip | 4294967295 | +| test.c:495:48:495:49 | ip | 4294967295 | +| test.c:495:59:495:60 | ip | 4294967295 | +| test.c:496:20:496:21 | ip | 4294967295 | +| test.c:497:25:497:26 | ip | 4294967295 | +| test.c:497:36:497:37 | ip | 4294967295 | +| test.c:498:27:498:28 | ip | 4294967295 | +| test.c:499:22:499:23 | ip | 4294967295 | +| test.c:500:13:500:14 | ip | 4294967295 | +| test.c:500:28:500:29 | ip | 4294967295 | +| test.c:501:18:501:19 | ip | 4294967295 | +| test.c:502:18:502:19 | ip | 4294967295 | +| test.c:503:18:503:19 | ip | 4294967295 | +| test.c:504:19:504:20 | ip | 4294967295 | +| test.c:505:24:505:25 | ip | 4294967295 | +| test.c:505:35:505:36 | ip | 4294967295 | +| test.c:505:50:505:51 | ip | 4294967295 | +| test.c:505:61:505:62 | ip | 4294967295 | +| test.c:506:22:506:23 | ip | 4294967295 | +| test.c:507:27:507:28 | ip | 4294967295 | +| test.c:507:38:507:39 | ip | 4294967295 | +| test.c:508:29:508:30 | ip | 4294967295 | +| test.c:509:24:509:25 | ip | 4294967295 | +| test.c:510:17:510:18 | ip | 4294967295 | +| test.c:510:32:510:33 | ip | 4294967295 | +| test.c:511:14:511:15 | ip | 4294967295 | +| test.c:512:18:512:19 | ip | 4294967295 | +| test.c:513:18:513:19 | ip | 4294967295 | +| test.c:514:19:514:20 | ip | 4294967295 | +| test.c:515:24:515:25 | ip | 4294967295 | +| test.c:515:35:515:36 | ip | 4294967295 | +| test.c:515:50:515:51 | ip | 4294967295 | +| test.c:515:61:515:62 | ip | 4294967295 | +| test.c:516:22:516:23 | ip | 4294967295 | +| test.c:517:27:517:28 | ip | 4294967295 | +| test.c:517:38:517:39 | ip | 4294967295 | +| test.c:518:29:518:30 | ip | 4294967295 | +| test.c:519:24:519:25 | ip | 4294967295 | +| test.c:520:17:520:18 | ip | 4294967295 | +| test.c:520:23:520:24 | ip | 4294967295 | +| test.c:520:43:520:44 | ip | 4294967295 | +| test.c:520:49:520:50 | ip | 4294967295 | +| test.c:521:16:521:17 | ip | 4294967295 | +| test.c:522:16:522:17 | ip | 4294967295 | +| test.c:523:16:523:17 | ip | 4294967295 | +| test.c:524:17:524:18 | ip | 4294967295 | +| test.c:525:22:525:23 | ip | 4294967295 | +| test.c:525:33:525:34 | ip | 4294967295 | +| test.c:525:48:525:49 | ip | 4294967295 | +| test.c:525:59:525:60 | ip | 4294967295 | +| test.c:526:20:526:21 | ip | 4294967295 | +| test.c:527:25:527:26 | ip | 4294967295 | +| test.c:527:36:527:37 | ip | 4294967295 | +| test.c:528:27:528:28 | ip | 4294967295 | +| test.c:529:22:529:23 | ip | 4294967295 | +| test.c:530:16:530:17 | ip | 4294967295 | +| test.c:530:22:530:23 | ip | 4294967295 | +| test.c:531:18:531:19 | ip | 4294967295 | +| test.c:532:14:532:15 | ip | 4294967295 | +| test.c:533:14:533:15 | ip | 4294967295 | +| test.c:533:24:533:25 | ip | 4294967295 | +| test.c:533:44:533:45 | ip | 4294967295 | +| test.c:534:16:534:17 | ip | 4294967295 | +| test.c:535:16:535:17 | ip | 4294967295 | +| test.c:535:36:535:37 | ip | 4294967295 | +| test.c:536:14:536:15 | ip | 4294967295 | +| test.c:537:19:537:20 | ip | 4294967295 | +| test.c:538:20:538:21 | ip | 4294967295 | +| test.c:539:20:539:21 | ip | 4294967295 | +| test.c:540:21:540:22 | ip | 4294967295 | +| test.c:541:26:541:27 | ip | 4294967295 | +| test.c:541:37:541:38 | ip | 4294967295 | +| test.c:541:52:541:53 | ip | 4294967295 | +| test.c:541:63:541:64 | ip | 4294967295 | +| test.c:542:24:542:25 | ip | 4294967295 | +| test.c:543:29:543:30 | ip | 4294967295 | +| test.c:543:40:543:41 | ip | 4294967295 | +| test.c:544:31:544:32 | ip | 4294967295 | +| test.c:545:26:545:27 | ip | 4294967295 | +| test.c:546:17:546:18 | ip | 4294967295 | +| test.c:546:32:546:33 | ip | 4294967295 | +| test.c:547:22:547:23 | ip | 4294967295 | +| test.c:548:22:548:23 | ip | 4294967295 | +| test.c:549:22:549:23 | ip | 4294967295 | +| test.c:550:23:550:24 | ip | 4294967295 | +| test.c:551:28:551:29 | ip | 4294967295 | +| test.c:551:39:551:40 | ip | 4294967295 | +| test.c:551:54:551:55 | ip | 4294967295 | +| test.c:551:65:551:66 | ip | 4294967295 | +| test.c:552:26:552:27 | ip | 4294967295 | +| test.c:553:31:553:32 | ip | 4294967295 | +| test.c:553:42:553:43 | ip | 4294967295 | +| test.c:554:33:554:34 | ip | 4294967295 | +| test.c:555:28:555:29 | ip | 4294967295 | +| test.c:556:21:556:22 | ip | 4294967295 | +| test.c:556:36:556:37 | ip | 4294967295 | +| test.c:557:17:557:18 | ip | 4294967295 | +| test.c:558:18:558:19 | ip | 4294967295 | +| test.c:559:18:559:19 | ip | 4294967295 | +| test.c:560:19:560:20 | ip | 4294967295 | +| test.c:561:24:561:25 | ip | 4294967295 | +| test.c:561:35:561:36 | ip | 4294967295 | +| test.c:561:50:561:51 | ip | 4294967295 | +| test.c:561:61:561:62 | ip | 4294967295 | +| test.c:562:22:562:23 | ip | 4294967295 | +| test.c:563:27:563:28 | ip | 4294967295 | +| test.c:563:38:563:39 | ip | 4294967295 | +| test.c:564:29:564:30 | ip | 4294967295 | +| test.c:565:24:565:25 | ip | 4294967295 | +| test.c:566:17:566:18 | ip | 4294967295 | +| test.c:566:23:566:24 | ip | 4294967295 | +| test.c:566:43:566:44 | ip | 4294967295 | +| test.c:566:49:566:50 | ip | 4294967295 | +| test.c:567:20:567:21 | ip | 4294967295 | +| test.c:568:20:568:21 | ip | 4294967295 | +| test.c:569:20:569:21 | ip | 4294967295 | +| test.c:570:21:570:22 | ip | 4294967295 | +| test.c:571:26:571:27 | ip | 4294967295 | +| test.c:571:37:571:38 | ip | 4294967295 | +| test.c:571:52:571:53 | ip | 4294967295 | +| test.c:571:63:571:64 | ip | 4294967295 | +| test.c:572:24:572:25 | ip | 4294967295 | +| test.c:573:29:573:30 | ip | 4294967295 | +| test.c:573:40:573:41 | ip | 4294967295 | +| test.c:574:31:574:32 | ip | 4294967295 | +| test.c:575:26:575:27 | ip | 4294967295 | +| test.c:576:20:576:21 | ip | 4294967295 | +| test.c:576:26:576:27 | ip | 4294967295 | +| test.c:577:22:577:23 | ip | 4294967295 | +| test.c:578:18:578:19 | ip | 4294967295 | +| test.c:579:16:579:17 | ip | 4294967295 | +| test.c:580:17:580:18 | ip | 4294967295 | +| test.c:581:18:581:19 | ip | 4294967295 | +| test.c:582:18:582:19 | ip | 4294967295 | +| test.c:583:19:583:20 | ip | 4294967295 | +| test.c:584:24:584:25 | ip | 4294967295 | +| test.c:584:35:584:36 | ip | 4294967295 | +| test.c:584:50:584:51 | ip | 4294967295 | +| test.c:584:61:584:62 | ip | 4294967295 | +| test.c:585:22:585:23 | ip | 4294967295 | +| test.c:586:27:586:28 | ip | 4294967295 | +| test.c:586:38:586:39 | ip | 4294967295 | +| test.c:587:29:587:30 | ip | 4294967295 | +| test.c:588:24:588:25 | ip | 4294967295 | +| test.c:589:15:589:16 | ip | 4294967295 | +| test.c:589:30:589:31 | ip | 4294967295 | +| test.c:590:20:590:21 | ip | 4294967295 | +| test.c:591:20:591:21 | ip | 4294967295 | +| test.c:592:20:592:21 | ip | 4294967295 | +| test.c:593:21:593:22 | ip | 4294967295 | +| test.c:594:26:594:27 | ip | 4294967295 | +| test.c:594:37:594:38 | ip | 4294967295 | +| test.c:594:52:594:53 | ip | 4294967295 | +| test.c:594:63:594:64 | ip | 4294967295 | +| test.c:595:24:595:25 | ip | 4294967295 | +| test.c:596:29:596:30 | ip | 4294967295 | +| test.c:596:40:596:41 | ip | 4294967295 | +| test.c:597:31:597:32 | ip | 4294967295 | +| test.c:598:26:598:27 | ip | 4294967295 | +| test.c:599:19:599:20 | ip | 4294967295 | +| test.c:599:34:599:35 | ip | 4294967295 | +| test.c:600:16:600:17 | ip | 4294967295 | +| test.c:601:20:601:21 | ip | 4294967295 | +| test.c:602:20:602:21 | ip | 4294967295 | +| test.c:603:21:603:22 | ip | 4294967295 | +| test.c:604:26:604:27 | ip | 4294967295 | +| test.c:604:37:604:38 | ip | 4294967295 | +| test.c:604:52:604:53 | ip | 4294967295 | +| test.c:604:63:604:64 | ip | 4294967295 | +| test.c:605:24:605:25 | ip | 4294967295 | +| test.c:606:29:606:30 | ip | 4294967295 | +| test.c:606:40:606:41 | ip | 4294967295 | +| test.c:607:31:607:32 | ip | 4294967295 | +| test.c:608:26:608:27 | ip | 4294967295 | +| test.c:609:19:609:20 | ip | 4294967295 | +| test.c:609:25:609:26 | ip | 4294967295 | +| test.c:609:45:609:46 | ip | 4294967295 | +| test.c:609:51:609:52 | ip | 4294967295 | +| test.c:610:18:610:19 | ip | 4294967295 | +| test.c:611:18:611:19 | ip | 4294967295 | +| test.c:612:18:612:19 | ip | 4294967295 | +| test.c:613:19:613:20 | ip | 4294967295 | +| test.c:614:24:614:25 | ip | 4294967295 | +| test.c:614:35:614:36 | ip | 4294967295 | +| test.c:614:50:614:51 | ip | 4294967295 | +| test.c:614:61:614:62 | ip | 4294967295 | +| test.c:615:22:615:23 | ip | 4294967295 | +| test.c:616:27:616:28 | ip | 4294967295 | +| test.c:616:38:616:39 | ip | 4294967295 | +| test.c:617:29:617:30 | ip | 4294967295 | +| test.c:618:24:618:25 | ip | 4294967295 | +| test.c:619:18:619:19 | ip | 4294967295 | +| test.c:619:24:619:25 | ip | 4294967295 | +| test.c:620:20:620:21 | ip | 4294967295 | +| test.c:621:16:621:17 | ip | 4294967295 | +| test.c:622:10:622:23 | special_number | 4294967295 | +| test.c:630:7:630:8 | c1 | 2147483647 | +| test.c:630:13:630:13 | x | 0 | +| test.c:631:7:631:8 | c2 | 2147483647 | +| test.c:631:13:631:13 | x | 748596 | +| test.c:632:7:632:8 | c3 | 2147483647 | +| test.c:632:13:632:13 | x | 85400991 | +| test.c:633:7:633:8 | c4 | 2147483647 | +| test.c:633:13:633:13 | x | 89076886 | +| test.c:634:7:634:8 | c5 | 2147483647 | +| test.c:634:13:634:13 | x | 89175520 | +| test.c:635:7:635:8 | c1 | 2147483647 | +| test.c:635:13:635:14 | c2 | 2147483647 | +| test.c:635:19:635:19 | x | 97010505 | +| test.c:636:7:636:8 | c1 | 2147483647 | +| test.c:636:13:636:14 | c3 | 2147483647 | +| test.c:636:19:636:19 | x | 1035467903 | +| test.c:637:7:637:8 | c1 | 2147483647 | +| test.c:637:13:637:14 | c4 | 2147483647 | +| test.c:637:19:637:19 | x | 1109363551 | +| test.c:638:7:638:8 | c1 | 2147483647 | +| test.c:638:13:638:14 | c5 | 2147483647 | +| test.c:638:19:638:19 | x | 1121708983 | +| test.c:639:7:639:8 | c2 | 2147483647 | +| test.c:639:13:639:14 | c3 | 2147483647 | +| test.c:639:19:639:19 | x | 1121747830 | +| test.c:641:11:641:11 | x | 2147483647 | +| test.c:641:15:641:15 | x | 2147483647 | +| test.c:641:19:641:19 | x | 2147483647 | +| test.c:641:23:641:23 | x | 2147483647 | +| test.c:641:27:641:27 | x | 2147483647 | +| test.c:641:31:641:31 | x | 2147483647 | +| test.c:641:35:641:35 | x | 2147483647 | +| test.c:641:39:641:39 | x | 2147483647 | +| test.c:641:43:641:43 | x | 2147483647 | +| test.c:641:47:641:47 | x | 2147483647 | +| test.c:641:51:641:51 | x | 2147483647 | +| test.c:641:55:641:55 | x | 2147483647 | +| test.c:642:10:642:10 | y | 2147483647 | +| test.c:647:20:647:20 | x | 4294967295 | +| test.c:647:30:647:30 | x | 99 | +| test.c:650:3:650:4 | y1 | 4294967295 | +| test.c:650:11:650:11 | y | 100 | +| test.c:650:14:650:14 | y | 101 | +| test.c:651:3:651:4 | y2 | 4294967295 | +| test.c:651:9:651:9 | y | 101 | +| test.c:651:14:651:14 | y | 102 | +| test.c:651:22:651:22 | y | 105 | +| test.c:652:10:652:11 | y1 | 101 | +| test.c:652:15:652:16 | y2 | 105 | +| test.c:660:3:660:3 | i | 2147483647 | +| test.c:661:7:661:7 | i | 10 | +| test.c:663:3:663:3 | i | 2147483647 | +| test.c:664:3:664:3 | i | 10 | +| test.c:665:7:665:7 | i | 20 | +| test.c:667:3:667:3 | i | 2147483647 | +| test.c:668:3:668:3 | i | 40 | +| test.c:669:7:669:7 | i | 30 | +| test.c:671:3:671:3 | i | 2147483647 | +| test.c:671:7:671:7 | j | 2147483647 | +| test.c:672:7:672:7 | i | 40 | +| test.c:674:3:674:3 | i | 2147483647 | +| test.c:674:8:674:8 | j | 40 | +| test.c:675:7:675:7 | i | 50 | +| test.c:677:3:677:3 | i | 2147483647 | +| test.c:677:13:677:13 | j | 50 | +| test.c:678:7:678:7 | i | 60 | +| test.c:685:12:685:12 | a | 4294967295 | +| test.c:685:17:685:17 | a | 4294967295 | +| test.c:685:33:685:33 | b | 4294967295 | +| test.c:685:38:685:38 | b | 4294967295 | +| test.c:686:13:686:13 | a | 11 | +| test.c:686:15:686:15 | b | 23 | +| test.c:687:5:687:9 | total | 0 | +| test.c:687:14:687:14 | r | 253 | +| test.c:689:12:689:12 | a | 4294967295 | +| test.c:689:17:689:17 | a | 4294967295 | +| test.c:689:33:689:33 | b | 4294967295 | +| test.c:689:38:689:38 | b | 4294967295 | +| test.c:690:13:690:13 | a | 11 | +| test.c:690:15:690:15 | b | 23 | +| test.c:691:5:691:9 | total | 253 | +| test.c:691:14:691:14 | r | 253 | +| test.c:693:12:693:12 | a | 4294967295 | +| test.c:693:17:693:17 | a | 4294967295 | +| test.c:693:34:693:34 | b | 4294967295 | +| test.c:693:39:693:39 | b | 4294967295 | +| test.c:694:13:694:13 | a | 11 | +| test.c:694:15:694:15 | b | 23 | +| test.c:695:5:695:9 | total | 506 | +| test.c:695:14:695:14 | r | 253 | +| test.c:698:10:698:14 | total | 759 | +| test.c:704:12:704:12 | b | 4294967295 | +| test.c:704:17:704:17 | b | 4294967295 | +| test.c:705:16:705:16 | b | 23 | +| test.c:706:5:706:9 | total | 0 | +| test.c:706:14:706:14 | r | 253 | +| test.c:708:12:708:12 | b | 4294967295 | +| test.c:708:17:708:17 | b | 4294967295 | +| test.c:709:16:709:16 | b | 23 | +| test.c:710:5:710:9 | total | 253 | +| test.c:710:14:710:14 | r | 253 | +| test.c:712:13:712:13 | b | 4294967295 | +| test.c:712:18:712:18 | b | 4294967295 | +| test.c:713:16:713:16 | b | 23 | +| test.c:714:5:714:9 | total | 506 | +| test.c:714:14:714:14 | r | 253 | +| test.c:717:10:717:14 | total | 759 | +| test.c:722:3:722:3 | x | 18446744073709551616 | +| test.c:722:7:722:7 | y | 18446744073709551616 | +| test.c:723:3:723:4 | xy | 18446744073709551616 | +| test.c:723:8:723:8 | x | 1000000003 | +| test.c:723:12:723:12 | y | 1000000003 | +| test.c:724:10:724:11 | xy | 1000000006000000000 | +| test.c:729:3:729:3 | x | 18446744073709551616 | +| test.c:730:3:730:3 | y | 18446744073709551616 | +| test.c:731:3:731:4 | xy | 18446744073709551616 | +| test.c:731:8:731:8 | x | 274177 | +| test.c:731:12:731:12 | y | 67280421310721 | +| test.c:732:10:732:11 | xy | 18446744073709551616 | +| test.c:736:7:736:8 | ui | 4294967295 | +| test.c:737:43:737:44 | ui | 4294967295 | +| test.c:737:48:737:49 | ui | 4294967295 | +| test.c:738:12:738:17 | result | 18446744065119617024 | +| test.c:740:7:740:8 | ul | 18446744073709551616 | +| test.c:741:28:741:29 | ul | 18446744073709551616 | +| test.c:741:33:741:34 | ul | 18446744073709551616 | +| test.c:742:12:742:17 | result | 18446744073709551616 | +| test.c:748:7:748:8 | ui | 4294967295 | +| test.c:748:19:748:20 | ui | 10 | +| test.c:749:5:749:6 | ui | 10 | +| test.c:749:11:749:12 | ui | 10 | +| test.c:750:12:750:13 | ui | 100 | +| test.c:754:3:754:9 | uiconst | 10 | +| test.c:757:3:757:9 | ulconst | 10 | +| test.c:758:10:758:16 | uiconst | 40 | +| test.c:758:20:758:26 | ulconst | 40 | +| test.c:762:7:762:7 | i | 2147483647 | +| test.c:762:18:762:18 | i | 2147483647 | +| test.c:763:5:763:5 | i | 2147483647 | +| test.c:763:13:763:13 | i | 2 | +| test.c:764:9:764:9 | i | 10 | +| test.c:766:5:766:5 | i | 2147483647 | +| test.c:766:9:766:9 | i | 10 | +| test.c:767:9:767:9 | i | 15 | +| test.c:769:5:769:5 | i | 15 | +| test.c:770:9:770:9 | i | 105 | +| test.c:772:5:772:5 | i | 105 | +| test.c:773:9:773:9 | i | 2310 | +| test.c:775:7:775:7 | i | 2147483647 | +| test.c:776:5:776:5 | i | 2147483647 | +| test.c:776:9:776:9 | i | -1 | +| test.c:777:9:777:9 | i | 1 | +| test.c:779:3:779:3 | i | 2147483647 | +| test.c:779:7:779:7 | i | 2147483647 | +| test.c:780:10:780:10 | i | 2147483647 | +| test.c:783:3:783:3 | i | 2147483647 | +| test.c:783:10:783:11 | sc | 1 | +| test.c:785:7:785:7 | i | 127 | +| test.c:792:7:792:7 | n | 4294967295 | +| test.c:794:7:794:7 | n | 4294967295 | +| test.c:795:9:795:9 | n | 4294967295 | +| test.c:798:7:798:7 | n | 4294967295 | +| test.c:799:9:799:9 | n | 4294967295 | +| test.c:801:9:801:9 | n | 0 | +| test.c:804:8:804:8 | n | 4294967295 | +| test.c:805:9:805:9 | n | 0 | +| test.c:807:9:807:9 | n | 4294967295 | +| test.c:810:10:810:10 | n | 4294967295 | +| test.c:811:5:811:5 | n | 4294967295 | +| test.c:814:7:814:7 | n | 0 | +| test.c:818:7:818:7 | n | 32767 | +| test.c:821:7:821:7 | n | 32767 | +| test.c:822:9:822:9 | n | 0 | +| test.c:824:9:824:9 | n | 32767 | +| test.c:827:7:827:7 | n | 32767 | +| test.c:828:9:828:9 | n | 32767 | +| test.c:830:9:830:9 | n | 0 | +| test.c:833:10:833:10 | n | 32767 | +| test.c:834:5:834:5 | n | 32767 | +| test.c:837:7:837:7 | n | 0 | +| test.c:841:7:841:7 | n | 32767 | +| test.c:842:9:842:9 | n | 32767 | +| test.c:843:11:843:11 | n | 32767 | +| test.c:847:7:847:7 | n | 32767 | +| test.c:848:13:848:13 | n | 32767 | +| test.c:851:9:851:9 | n | 32767 | +| test.c:854:7:854:7 | n | 32767 | +| test.c:854:22:854:22 | n | 32767 | +| test.c:855:9:855:9 | n | 32767 | +| test.c:858:7:858:7 | n | 32767 | +| test.c:859:5:859:5 | n | 32767 | +| test.c:859:10:859:10 | n | 32767 | +| test.c:859:14:859:14 | n | 0 | +| test.c:860:6:860:6 | n | 32767 | +| test.c:860:10:860:10 | n | 0 | +| test.c:860:14:860:14 | n | 32767 | +| test.c:871:7:871:8 | ss | 32767 | +| test.c:872:9:872:10 | ss | 3 | +| test.c:875:7:875:8 | ss | 32767 | +| test.c:876:9:876:10 | ss | 32767 | +| test.c:879:14:879:15 | us | 65535 | +| test.c:880:9:880:10 | us | 32767 | +| test.c:883:14:883:15 | us | 65535 | +| test.c:884:9:884:10 | us | 65535 | +| test.c:887:7:887:8 | ss | 32767 | +| test.c:888:9:888:10 | ss | 32767 | +| test.c:891:7:891:8 | ss | 32767 | +| test.c:892:9:892:10 | ss | 2 | +| test.c:898:8:898:8 | s | 2147483647 | +| test.c:898:15:898:15 | s | 127 | +| test.c:898:23:898:23 | s | 9 | +| test.c:899:18:899:18 | s | 9 | +| test.c:899:22:899:22 | s | 9 | +| test.c:900:9:900:14 | result | 127 | +| test.c:906:7:906:7 | i | 0 | +| test.c:907:9:907:9 | i | 2147483647 | +| test.c:911:7:911:7 | u | 0 | +| test.c:912:9:912:9 | u | 4294967295 | +| test.c:917:12:917:12 | s | 2147483647 | +| test.c:918:7:918:8 | s2 | 4 | +| test.c:923:7:923:7 | x | 2147483647 | +| test.c:924:9:924:9 | y | 2147483647 | +| test.c:928:7:928:7 | y | 2147483647 | +| test.c:937:7:937:7 | x | 2147483647 | +| test.c:942:7:942:7 | x | 15 | +| test.c:949:8:949:8 | x | 2147483647 | +| test.c:949:12:949:12 | y | 256 | +| test.c:950:9:950:9 | x | 2147483647 | +| test.c:951:9:951:9 | y | 256 | | test.cpp:10:7:10:7 | b | 2147483647 | | test.cpp:11:5:11:5 | x | 2147483647 | | test.cpp:13:10:13:10 | x | 2147483647 | diff --git a/cpp/ql/test/library-tests/types/sizeof/sizeof.expected b/cpp/ql/test/library-tests/types/sizeof/sizeof.expected index c0d075126df..ac55caf5a02 100644 --- a/cpp/ql/test/library-tests/types/sizeof/sizeof.expected +++ b/cpp/ql/test/library-tests/types/sizeof/sizeof.expected @@ -1,10 +1,16 @@ -| sizeof.cpp:19:15:19:25 | sizeof(int) | 4 | SizeofTypeOperator.getTypeOperand() | file://:0:0:0:0 | int | -| sizeof.cpp:20:15:20:26 | sizeof(char) | 1 | SizeofTypeOperator.getTypeOperand() | file://:0:0:0:0 | char | -| sizeof.cpp:21:15:21:27 | sizeof(int *) | 8 | SizeofTypeOperator.getTypeOperand() | file://:0:0:0:0 | int * | -| sizeof.cpp:22:15:22:29 | sizeof(MyClass) | 16 | SizeofTypeOperator.getTypeOperand() | sizeof.cpp:4:7:4:13 | MyClass | +| sizeof.cpp:19:15:19:25 | sizeof(int) | 4 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int | +| sizeof.cpp:20:15:20:26 | sizeof(char) | 1 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | char | +| sizeof.cpp:21:15:21:27 | sizeof(int *) | 8 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int * | +| sizeof.cpp:22:15:22:29 | sizeof(MyClass) | 16 | SizeofOperator.getTypeOperand() | sizeof.cpp:4:7:4:13 | MyClass | | sizeof.cpp:23:15:23:23 | sizeof() | 4 | SizeofExprOperator.getExprOperand() | sizeof.cpp:23:22:23:22 | i | +| sizeof.cpp:23:15:23:23 | sizeof() | 4 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int | | sizeof.cpp:24:15:24:23 | sizeof() | 1 | SizeofExprOperator.getExprOperand() | sizeof.cpp:24:22:24:22 | c | +| sizeof.cpp:24:15:24:23 | sizeof() | 1 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | char | | sizeof.cpp:25:15:25:25 | sizeof() | 8 | SizeofExprOperator.getExprOperand() | sizeof.cpp:25:22:25:24 | ptr | +| sizeof.cpp:25:15:25:25 | sizeof() | 8 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int * | | sizeof.cpp:26:15:26:24 | sizeof() | 16 | SizeofExprOperator.getExprOperand() | sizeof.cpp:26:22:26:23 | mc | +| sizeof.cpp:26:15:26:24 | sizeof() | 16 | SizeofOperator.getTypeOperand() | sizeof.cpp:4:7:4:13 | MyClass | | sizeof.cpp:27:15:27:25 | sizeof() | 40 | SizeofExprOperator.getExprOperand() | sizeof.cpp:27:22:27:24 | arr | +| sizeof.cpp:27:15:27:25 | sizeof() | 40 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int[10] | | sizeof.cpp:28:16:28:29 | sizeof() | 4 | SizeofExprOperator.getExprOperand() | sizeof.cpp:28:23:28:28 | access to array | +| sizeof.cpp:28:16:28:29 | sizeof() | 4 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int | diff --git a/cpp/ql/test/library-tests/types/sizeof/sizeof.ql b/cpp/ql/test/library-tests/types/sizeof/sizeof.ql index 531f55ee45c..31834e0180f 100644 --- a/cpp/ql/test/library-tests/types/sizeof/sizeof.ql +++ b/cpp/ql/test/library-tests/types/sizeof/sizeof.ql @@ -2,8 +2,8 @@ import cpp from SizeofOperator sto, string elemDesc, Element e where - elemDesc = "SizeofTypeOperator.getTypeOperand()" and - e = sto.(SizeofTypeOperator).getTypeOperand() + elemDesc = "SizeofOperator.getTypeOperand()" and + e = sto.getTypeOperand() or elemDesc = "SizeofExprOperator.getExprOperand()" and e = sto.(SizeofExprOperator).getExprOperand() diff --git a/cpp/ql/test/library-tests/variables/variables/variable.expected b/cpp/ql/test/library-tests/variables/variables/variable.expected index 1ef5902a9a8..c6ada1f3615 100644 --- a/cpp/ql/test/library-tests/variables/variables/variable.expected +++ b/cpp/ql/test/library-tests/variables/variables/variable.expected @@ -2,10 +2,10 @@ | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | address && | SemanticStackVariable | | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | const __va_list_tag & | SemanticStackVariable | | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | const address & | SemanticStackVariable | | | -| file://:0:0:0:0 | fp_offset | file://:0:0:0:0 | unsigned int | Field | | | -| file://:0:0:0:0 | gp_offset | file://:0:0:0:0 | unsigned int | Field | | | -| file://:0:0:0:0 | overflow_arg_area | file://:0:0:0:0 | void * | Field | | | -| file://:0:0:0:0 | reg_save_area | file://:0:0:0:0 | void * | Field | | | +| file://:0:0:0:0 | fp_offset | file://:0:0:0:0 | unsigned int | NonLocalCanonicalField | | | +| file://:0:0:0:0 | gp_offset | file://:0:0:0:0 | unsigned int | NonLocalCanonicalField | | | +| file://:0:0:0:0 | overflow_arg_area | file://:0:0:0:0 | void * | NonLocalCanonicalField | | | +| file://:0:0:0:0 | reg_save_area | file://:0:0:0:0 | void * | NonLocalCanonicalField | | | | variables.cpp:1:12:1:12 | i | file://:0:0:0:0 | int | GlobalLikeVariable, GlobalVariable, StaticStorageDurationVariable | | | | variables.cpp:2:12:2:12 | i | file://:0:0:0:0 | int | GlobalLikeVariable, GlobalVariable, StaticStorageDurationVariable | | | | variables.cpp:3:12:3:12 | i | file://:0:0:0:0 | int | GlobalLikeVariable, GlobalVariable, StaticStorageDurationVariable | | | @@ -33,10 +33,10 @@ | variables.cpp:37:6:37:8 | ap3 | file://:0:0:0:0 | int * | GlobalLikeVariable, GlobalVariable, StaticStorageDurationVariable | | | | variables.cpp:41:7:41:11 | local | file://:0:0:0:0 | char[] | LocalVariable, SemanticStackVariable | | | | variables.cpp:43:14:43:18 | local | file://:0:0:0:0 | int | GlobalLikeVariable, StaticLocalVariable | | static | -| variables.cpp:48:9:48:12 | name | file://:0:0:0:0 | char * | Field | | | -| variables.cpp:49:12:49:17 | number | file://:0:0:0:0 | long | Field | | | -| variables.cpp:50:9:50:14 | street | file://:0:0:0:0 | char * | Field | | | -| variables.cpp:51:9:51:12 | town | file://:0:0:0:0 | char * | Field | | | +| variables.cpp:48:9:48:12 | name | file://:0:0:0:0 | char * | NonLocalCanonicalField | | | +| variables.cpp:49:12:49:17 | number | file://:0:0:0:0 | long | NonLocalCanonicalField | | | +| variables.cpp:50:9:50:14 | street | file://:0:0:0:0 | char * | NonLocalCanonicalField | | | +| variables.cpp:51:9:51:12 | town | file://:0:0:0:0 | char * | NonLocalCanonicalField | | | | variables.cpp:52:16:52:22 | country | file://:0:0:0:0 | char * | MemberVariable, StaticStorageDurationVariable | | static | | variables.cpp:56:14:56:29 | externInFunction | file://:0:0:0:0 | int | GlobalLikeVariable, GlobalVariable, StaticStorageDurationVariable | | | | variables.cpp:60:10:60:17 | __func__ | file://:0:0:0:0 | const char[9] | GlobalLikeVariable, StaticInitializedStaticLocalVariable | | static | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected index ac0e8d3a25a..f9f887b6409 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected @@ -1,6 +1,10 @@ | overflowdestination.cpp:46:2:46:7 | call to memcpy | This 'memcpy' operation accesses 128 bytes but the $@ is only 64 bytes. | overflowdestination.cpp:40:7:40:10 | dest | destination buffer | | tests.cpp:23:2:23:7 | call to memcpy | This 'memcpy' operation accesses 20 bytes but the $@ is only 10 bytes. | tests.cpp:19:7:19:17 | smallbuffer | source buffer | | tests.cpp:25:2:25:7 | call to memcpy | This 'memcpy' operation accesses 20 bytes but the $@ is only 10 bytes. | tests.cpp:19:7:19:17 | smallbuffer | destination buffer | +| tests.cpp:34:2:34:7 | call to memcpy | This 'memcpy' operation accesses 20 bytes but the $@ is only 10 bytes. | tests.cpp:30:30:30:35 | call to malloc | source buffer | +| tests.cpp:36:2:36:7 | call to memcpy | This 'memcpy' operation accesses 20 bytes but the $@ is only 10 bytes. | tests.cpp:30:30:30:35 | call to malloc | destination buffer | +| tests.cpp:50:2:50:7 | call to memcpy | This 'memcpy' operation accesses 20 bytes but the $@ is only 10 bytes. | tests.cpp:46:16:46:27 | new[] | source buffer | +| tests.cpp:52:2:52:7 | call to memcpy | This 'memcpy' operation accesses 20 bytes but the $@ is only 10 bytes. | tests.cpp:46:16:46:27 | new[] | destination buffer | | tests.cpp:172:23:172:31 | access to array | This array indexing operation accesses a negative index -1 on the $@. | tests.cpp:170:17:170:41 | {...} | array | | tests.cpp:176:23:176:30 | access to array | This array indexing operation accesses byte offset 31 but the $@ is only 24 bytes. | tests.cpp:170:17:170:41 | {...} | array | | tests.cpp:222:3:222:8 | call to memset | This 'memset' operation accesses 33 bytes but the $@ is only 32 bytes. | tests.cpp:214:8:214:14 | buffer1 | destination buffer | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp index 555c8e25fb5..603d868258a 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp @@ -30,10 +30,10 @@ void test2() char *smallbuffer = (char *)malloc(sizeof(char) * 10); char *bigbuffer = (char *)malloc(sizeof(char) * 20); - memcpy(bigbuffer, smallbuffer, sizeof(smallbuffer)); // GOOD - memcpy(bigbuffer, smallbuffer, sizeof(bigbuffer)); // BAD: over-read [NOT DETECTED] - memcpy(smallbuffer, bigbuffer, sizeof(smallbuffer)); // GOOD - memcpy(smallbuffer, bigbuffer, sizeof(bigbuffer)); // BAD: over-write [NOT DETECTED] + memcpy(bigbuffer, smallbuffer, sizeof(char) * 10); // GOOD + memcpy(bigbuffer, smallbuffer, sizeof(char) * 20); // BAD: over-read + memcpy(smallbuffer, bigbuffer, sizeof(char) * 10); // GOOD + memcpy(smallbuffer, bigbuffer, sizeof(char) * 20); // BAD: over-write free(bigbuffer); free(smallbuffer); @@ -46,10 +46,10 @@ void test3() smallbuffer = new char[10]; bigbuffer = new char[20]; - memcpy(bigbuffer, smallbuffer, sizeof(smallbuffer)); // GOOD - memcpy(bigbuffer, smallbuffer, sizeof(bigbuffer)); // BAD: over-read [NOT DETECTED] - memcpy(smallbuffer, bigbuffer, sizeof(smallbuffer)); // GOOD - memcpy(smallbuffer, bigbuffer, sizeof(bigbuffer)); // BAD: over-write [NOT DETECTED] + memcpy(bigbuffer, smallbuffer, sizeof(char[10])); // GOOD + memcpy(bigbuffer, smallbuffer, sizeof(char[20])); // BAD: over-read + memcpy(smallbuffer, bigbuffer, sizeof(char[10])); // GOOD + memcpy(smallbuffer, bigbuffer, sizeof(char[20])); // BAD: over-write delete [] bigbuffer; delete [] smallbuffer; diff --git a/csharp/.config/dotnet-tools.json b/csharp/.config/dotnet-tools.json index f6b7213de59..66126b691f4 100644 --- a/csharp/.config/dotnet-tools.json +++ b/csharp/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "paket": { - "version": "9.0.2", + "version": "10.0.0-alpha011", "commands": [ "paket" ] diff --git a/csharp/.vscode/launch.json b/csharp/.vscode/launch.json index 75d27e6708e..3bdd256da0c 100644 --- a/csharp/.vscode/launch.json +++ b/csharp/.vscode/launch.json @@ -6,7 +6,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "dotnet: build", - "program": "${workspaceFolder}/extractor/Semmle.Extraction.CSharp.Standalone/bin/Debug/net9.0/Semmle.Extraction.CSharp.Standalone.dll", + "program": "${workspaceFolder}/extractor/Semmle.Extraction.CSharp.Standalone/bin/Debug/net10.0/Semmle.Extraction.CSharp.Standalone.dll", "args": [], // Set the path to the folder that should be extracted: "cwd": "${workspaceFolder}/ql/test/library-tests/standalone/standalonemode", @@ -35,7 +35,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "dotnet: build", - "program": "${workspaceFolder}/autobuilder/Semmle.Autobuild.CSharp/bin/Debug/net9.0/Semmle.Autobuild.CSharp.dll", + "program": "${workspaceFolder}/autobuilder/Semmle.Autobuild.CSharp/bin/Debug/net10.0/Semmle.Autobuild.CSharp.dll", // Set the path to the folder that should be extracted: "cwd": "${workspaceFolder}/ql/integration-tests/all-platforms/autobuild", "stopAtEntry": true, @@ -53,7 +53,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "dotnet: build", - "program": "${workspaceFolder}/extractor/Semmle.Extraction.CSharp.Driver/bin/Debug/net9.0/Semmle.Extraction.CSharp.Driver.dll", + "program": "${workspaceFolder}/extractor/Semmle.Extraction.CSharp.Driver/bin/Debug/net10.0/Semmle.Extraction.CSharp.Driver.dll", "stopAtEntry": true, "args": [ "--binlog", @@ -66,7 +66,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "dotnet: build", - "program": "${workspaceFolder}/extractor/Semmle.Extraction.CSharp.Driver/bin/Debug/net9.0/Semmle.Extraction.CSharp.Driver.dll", + "program": "${workspaceFolder}/extractor/Semmle.Extraction.CSharp.Driver/bin/Debug/net10.0/Semmle.Extraction.CSharp.Driver.dll", // Set the path to the folder that should be extracted: "cwd": "${workspaceFolder}/ql/test/library-tests/dataflow/local", "args": [ diff --git a/csharp/.vscode/settings.json b/csharp/.vscode/settings.json index f41ad2872ff..559f9b16b98 100644 --- a/csharp/.vscode/settings.json +++ b/csharp/.vscode/settings.json @@ -10,5 +10,5 @@ "omnisharp.enableRoslynAnalyzers": true, "csharpFormatUsings.splitGroups": false, "csharpFormatUsings.sortOrder": "Xunit System Microsoft Semmle.Util Semmle", - "dotnet.defaultSolution": "CSharp.sln" -} \ No newline at end of file + "dotnet.defaultSolution": "CSharp.slnx" +} diff --git a/csharp/CSharp.sln b/csharp/CSharp.sln deleted file mode 100644 index f4cde4624d4..00000000000 --- a/csharp/CSharp.sln +++ /dev/null @@ -1,118 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Util", "extractor\Semmle.Util\Semmle.Util.csproj", "{CDD7AD69-0FD8-40F0-A9DA-F1077A2A85D6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Extraction.CSharp", "extractor\Semmle.Extraction.CSharp\Semmle.Extraction.CSharp.csproj", "{C4D62DA0-B64B-440B-86DC-AB52318CB8BF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Extraction.CSharp.DependencyFetching", "extractor\Semmle.Extraction.CSharp.DependencyFetching\Semmle.Extraction.CSharp.DependencyFetching.csproj", "{541D1AC5-E42C-4AB2-A1A4-C2355CE2A2EF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Extraction.CSharp.Standalone", "extractor\Semmle.Extraction.CSharp.Standalone\Semmle.Extraction.CSharp.Standalone.csproj", "{D00E7D25-0FA0-48EC-B048-CD60CE1B30D8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Extraction.CSharp.StubGenerator", "extractor\Semmle.Extraction.CSharp.StubGenerator\Semmle.Extraction.CSharp.StubGenerator.csproj", "{B7C9FD47-A78C-4C20-AC29-B0AE638ADE9D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Extraction.CSharp.Util", "extractor\Semmle.Extraction.CSharp.Util\Semmle.Extraction.CSharp.Util.csproj", "{998A0D4C-8BFC-4513-A28D-4816AFB89882}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Extraction.CSharp.Driver", "extractor\Semmle.Extraction.CSharp.Driver\Semmle.Extraction.CSharp.Driver.csproj", "{C36453BF-0C82-448A-B15D-26947503A2D3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Extraction.Tests", "extractor\Semmle.Extraction.Tests\Semmle.Extraction.Tests.csproj", "{CD8D3F90-AD2E-4BB5-8E82-B94AA293864A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semmle.Util.Tests", "extractor\Semmle.Util.Tests\Semmle.Util.Tests.csproj", "{55A620F0-23F6-440D-A5BA-0567613B3C0F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.Shared", "autobuilder\Semmle.Autobuild.Shared\Semmle.Autobuild.Shared.csproj", "{133F2B5B-FD25-4BD9-B34C-062CC6BB4178}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.CSharp", "autobuilder\Semmle.Autobuild.CSharp\Semmle.Autobuild.CSharp.csproj", "{F3C07863-3759-4A0B-B777-8A0E0FDB1A41}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.CSharp.Tests", "autobuilder\Semmle.Autobuild.CSharp.Tests\Semmle.Autobuild.CSharp.Tests.csproj", "{34256E8F-866A-46C1-800E-3DF69FD1DCB7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Extraction.CSharp.DependencyStubGenerator", "extractor\Semmle.Extraction.CSharp.DependencyStubGenerator\Semmle.Extraction.CSharp.DependencyStubGenerator.csproj", "{0EDA21A3-ADD8-4C10-B494-58B12B526B76}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.Cpp", "autobuilder\Semmle.Autobuild.Cpp\Semmle.Autobuild.Cpp.csproj", "{125C4FB7-34DA-442A-9095-3EA1514270CD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semmle.Autobuild.Cpp.Tests", "autobuilder\Semmle.Autobuild.Cpp.Tests\Semmle.Autobuild.Cpp.Tests.csproj", "{72F369B7-0707-401A-802F-D526F272F9EE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CDD7AD69-0FD8-40F0-A9DA-F1077A2A85D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDD7AD69-0FD8-40F0-A9DA-F1077A2A85D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDD7AD69-0FD8-40F0-A9DA-F1077A2A85D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDD7AD69-0FD8-40F0-A9DA-F1077A2A85D6}.Release|Any CPU.Build.0 = Release|Any CPU - {81EAAD75-4BE1-44E4-91DF-20778216DB64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {81EAAD75-4BE1-44E4-91DF-20778216DB64}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81EAAD75-4BE1-44E4-91DF-20778216DB64}.Release|Any CPU.ActiveCfg = Release|Any CPU - {81EAAD75-4BE1-44E4-91DF-20778216DB64}.Release|Any CPU.Build.0 = Release|Any CPU - {C4D62DA0-B64B-440B-86DC-AB52318CB8BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4D62DA0-B64B-440B-86DC-AB52318CB8BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4D62DA0-B64B-440B-86DC-AB52318CB8BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4D62DA0-B64B-440B-86DC-AB52318CB8BF}.Release|Any CPU.Build.0 = Release|Any CPU - {399A1579-68F0-40F4-9A23-F241BA697F9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {399A1579-68F0-40F4-9A23-F241BA697F9C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {399A1579-68F0-40F4-9A23-F241BA697F9C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {399A1579-68F0-40F4-9A23-F241BA697F9C}.Release|Any CPU.Build.0 = Release|Any CPU - {541D1AC5-E42C-4AB2-A1A4-C2355CE2A2EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {541D1AC5-E42C-4AB2-A1A4-C2355CE2A2EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {541D1AC5-E42C-4AB2-A1A4-C2355CE2A2EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {541D1AC5-E42C-4AB2-A1A4-C2355CE2A2EF}.Release|Any CPU.Build.0 = Release|Any CPU - {D00E7D25-0FA0-48EC-B048-CD60CE1B30D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D00E7D25-0FA0-48EC-B048-CD60CE1B30D8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D00E7D25-0FA0-48EC-B048-CD60CE1B30D8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D00E7D25-0FA0-48EC-B048-CD60CE1B30D8}.Release|Any CPU.Build.0 = Release|Any CPU - {EFA400B3-C1CE-446F-A4E2-8B44E61EF47C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFA400B3-C1CE-446F-A4E2-8B44E61EF47C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFA400B3-C1CE-446F-A4E2-8B44E61EF47C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFA400B3-C1CE-446F-A4E2-8B44E61EF47C}.Release|Any CPU.Build.0 = Release|Any CPU - {C36453BF-0C82-448A-B15D-26947503A2D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C36453BF-0C82-448A-B15D-26947503A2D3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C36453BF-0C82-448A-B15D-26947503A2D3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C36453BF-0C82-448A-B15D-26947503A2D3}.Release|Any CPU.Build.0 = Release|Any CPU - {CD8D3F90-AD2E-4BB5-8E82-B94AA293864A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CD8D3F90-AD2E-4BB5-8E82-B94AA293864A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CD8D3F90-AD2E-4BB5-8E82-B94AA293864A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {55A620F0-23F6-440D-A5BA-0567613B3C0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {55A620F0-23F6-440D-A5BA-0567613B3C0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {55A620F0-23F6-440D-A5BA-0567613B3C0F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {133F2B5B-FD25-4BD9-B34C-062CC6BB4178}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {133F2B5B-FD25-4BD9-B34C-062CC6BB4178}.Debug|Any CPU.Build.0 = Debug|Any CPU - {133F2B5B-FD25-4BD9-B34C-062CC6BB4178}.Release|Any CPU.ActiveCfg = Release|Any CPU - {133F2B5B-FD25-4BD9-B34C-062CC6BB4178}.Release|Any CPU.Build.0 = Release|Any CPU - {F3C07863-3759-4A0B-B777-8A0E0FDB1A41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3C07863-3759-4A0B-B777-8A0E0FDB1A41}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3C07863-3759-4A0B-B777-8A0E0FDB1A41}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3C07863-3759-4A0B-B777-8A0E0FDB1A41}.Release|Any CPU.Build.0 = Release|Any CPU - {34256E8F-866A-46C1-800E-3DF69FD1DCB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34256E8F-866A-46C1-800E-3DF69FD1DCB7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34256E8F-866A-46C1-800E-3DF69FD1DCB7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34256E8F-866A-46C1-800E-3DF69FD1DCB7}.Release|Any CPU.Build.0 = Release|Any CPU - {B7C9FD47-A78C-4C20-AC29-B0AE638ADE9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B7C9FD47-A78C-4C20-AC29-B0AE638ADE9D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B7C9FD47-A78C-4C20-AC29-B0AE638ADE9D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B7C9FD47-A78C-4C20-AC29-B0AE638ADE9D}.Release|Any CPU.Build.0 = Release|Any CPU - {998A0D4C-8BFC-4513-A28D-4816AFB89882}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {998A0D4C-8BFC-4513-A28D-4816AFB89882}.Debug|Any CPU.Build.0 = Debug|Any CPU - {998A0D4C-8BFC-4513-A28D-4816AFB89882}.Release|Any CPU.ActiveCfg = Release|Any CPU - {998A0D4C-8BFC-4513-A28D-4816AFB89882}.Release|Any CPU.Build.0 = Release|Any CPU - {0EDA21A3-ADD8-4C10-B494-58B12B526B76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0EDA21A3-ADD8-4C10-B494-58B12B526B76}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0EDA21A3-ADD8-4C10-B494-58B12B526B76}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0EDA21A3-ADD8-4C10-B494-58B12B526B76}.Release|Any CPU.Build.0 = Release|Any CPU - {125C4FB7-34DA-442A-9095-3EA1514270CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {125C4FB7-34DA-442A-9095-3EA1514270CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {125C4FB7-34DA-442A-9095-3EA1514270CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {125C4FB7-34DA-442A-9095-3EA1514270CD}.Release|Any CPU.Build.0 = Release|Any CPU - {72F369B7-0707-401A-802F-D526F272F9EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72F369B7-0707-401A-802F-D526F272F9EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72F369B7-0707-401A-802F-D526F272F9EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72F369B7-0707-401A-802F-D526F272F9EE}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E2B2BAC0-D55C-45DB-8CB3-8CEBA86FB547} - EndGlobalSection -EndGlobal diff --git a/csharp/CSharp.slnx b/csharp/CSharp.slnx new file mode 100644 index 00000000000..0291d720489 --- /dev/null +++ b/csharp/CSharp.slnx @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/csharp/Directory.Build.props b/csharp/Directory.Build.props index 0c8a2bc1526..8046ab10440 100644 --- a/csharp/Directory.Build.props +++ b/csharp/Directory.Build.props @@ -1,7 +1,7 @@ - net9.0 + net10.0 win-x64;linux-x64;osx-x64 enable true diff --git a/csharp/actions/create-extractor-pack/action.yml b/csharp/actions/create-extractor-pack/action.yml index b6737b45ad6..36f531f1b74 100644 --- a/csharp/actions/create-extractor-pack/action.yml +++ b/csharp/actions/create-extractor-pack/action.yml @@ -7,7 +7,7 @@ runs: - name: Setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.300 + dotnet-version: 10.0.100 - name: Build Extractor shell: bash run: scripts/create-extractor-pack.sh diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BUILD.bazel b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BUILD.bazel index 67f3470712d..9590f7f86ca 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BUILD.bazel +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BUILD.bazel @@ -13,6 +13,5 @@ codeql_xunit_test( "//csharp/autobuilder/Semmle.Autobuild.CSharp:bin/Semmle.Autobuild.CSharp", "//csharp/autobuilder/Semmle.Autobuild.Shared", "@paket.main//microsoft.net.test.sdk", - "@paket.main//system.io.filesystem", ], ) diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/paket.references b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/paket.references index 83bb87685b1..0582094502a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/paket.references +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/paket.references @@ -1,4 +1,3 @@ -System.IO.FileSystem xunit xunit.runner.visualstudio Microsoft.NET.Test.Sdk diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index a29079d205b..e07f7592887 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -48,7 +48,7 @@ namespace Semmle.Autobuild.CSharp { // When a custom .NET CLI has been installed, `dotnet --info` has already been executed // to verify the installation. - var ret = dotNetPath is null ? GetInfoCommand(builder.Actions, dotNetPath, environment) : BuildScript.Success; + var ret = dotNetPath is null ? DotNet.InfoScript(builder.Actions, DotNetCommand(builder.Actions, dotNetPath), environment, builder.Logger) : BuildScript.Success; foreach (var projectOrSolution in builder.ProjectsOrSolutionsToBuild) { var cleanCommand = GetCleanCommand(builder.Actions, dotNetPath, environment); @@ -84,11 +84,7 @@ namespace Semmle.Autobuild.CSharp var temp = FileUtils.GetTemporaryWorkingDirectory(builder.Actions.GetEnvironmentVariable, builder.Options.Language.UpperCaseName, out var shouldCleanUp); return DotNet.WithDotNet(builder.Actions, builder.Logger, builder.Paths.Select(x => x.Item1), temp, shouldCleanUp, ensureDotNetAvailable, builder.Options.DotNetVersion, installDir => { - var env = new Dictionary - { - { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, - { "MSBUILDDISABLENODEREUSE", "1" } - }; + var env = DotNet.MinimalEnvironment.ToDictionary(); if (installDir is not null) { // The installation succeeded, so use the newly installed .NET @@ -115,14 +111,6 @@ namespace Semmle.Autobuild.CSharp private static string DotNetCommand(IBuildActions actions, string? dotNetPath) => dotNetPath is not null ? actions.PathCombine(dotNetPath, "dotnet") : "dotnet"; - private static BuildScript GetInfoCommand(IBuildActions actions, string? dotNetPath, IDictionary? environment) - { - var info = new CommandBuilder(actions, null, environment). - RunCommand(DotNetCommand(actions, dotNetPath)). - Argument("--info"); - return info.Script; - } - private static CommandBuilder GetCleanCommand(IBuildActions actions, string? dotNetPath, IDictionary? environment) { var clean = new CommandBuilder(actions, null, environment). diff --git a/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/BUILD.bazel b/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/BUILD.bazel index ad8f6e3d1f1..0a718903a95 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/BUILD.bazel +++ b/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/BUILD.bazel @@ -13,6 +13,5 @@ codeql_xunit_test( "//csharp/autobuilder/Semmle.Autobuild.Cpp:bin/Semmle.Autobuild.Cpp", "//csharp/autobuilder/Semmle.Autobuild.Shared", "@paket.main//microsoft.net.test.sdk", - "@paket.main//system.io.filesystem", ], ) diff --git a/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/paket.references b/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/paket.references index 83bb87685b1..0582094502a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/paket.references +++ b/csharp/autobuilder/Semmle.Autobuild.Cpp.Tests/paket.references @@ -1,4 +1,3 @@ -System.IO.FileSystem xunit xunit.runner.visualstudio Microsoft.NET.Test.Sdk diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs index 919e3821750..a15235d3502 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs @@ -182,8 +182,16 @@ namespace Semmle.Autobuild.Shared if (ret is not null) return ret; + // Then look for language specific solution files, e.g. `.slnx` files + if (Options.Language.SolutionExtension is string solutionExtension) + { + ret = FindFiles(solutionExtension, f => new Solution(this, f, false))?.ToList(); + if (ret is not null) + return ret; + } + // Finally look for language specific project files, e.g. `.csproj` files - ret = FindFiles(this.Options.Language.ProjectExtension, f => new Project(this, f))?.ToList(); + ret = FindFiles(Options.Language.ProjectExtension, f => new Project(this, f))?.ToList(); return ret ?? new List(); }); diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BUILD.bazel b/csharp/autobuilder/Semmle.Autobuild.Shared/BUILD.bazel index bc968ff8a4d..41a53574487 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BUILD.bazel +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BUILD.bazel @@ -12,5 +12,6 @@ codeql_csharp_library( deps = [ "//csharp/extractor/Semmle.Util", "@paket.main//microsoft.build", + "@paket.main//microsoft.visualstudio.solutionpersistence", ], ) diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs index 7a98a01de25..5cf0c4a8487 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Solution.cs @@ -4,12 +4,11 @@ using System.IO; using System.Linq; using Microsoft.Build.Construction; using Microsoft.Build.Exceptions; -using Semmle.Util.Logging; namespace Semmle.Autobuild.Shared { /// - /// A solution file, extension .sln. + /// A solution file, extension .sln or .slnx. /// public interface ISolution : IProjectOrSolution { diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/paket.references b/csharp/autobuilder/Semmle.Autobuild.Shared/paket.references index ec65ce95b91..ca431a6703e 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/paket.references +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/paket.references @@ -1 +1,2 @@ Microsoft.Build +Microsoft.VisualStudio.SolutionPersistence diff --git a/csharp/codeql-extractor.yml b/csharp/codeql-extractor.yml index da7d665f7a7..8cba8f18e47 100644 --- a/csharp/codeql-extractor.yml +++ b/csharp/codeql-extractor.yml @@ -74,3 +74,8 @@ options: [EXPERIMENTAL] The value is a path to the MsBuild binary log file that should be extracted. This option only works when `--build-mode none` is also specified. type: array + buildless_dependency_dir: + title: The path where buildless (standalone) extraction should keep dependencies. + description: > + If set, the buildless (standalone) extractor will store dependencies in this directory. + type: string diff --git a/csharp/documentation/library-coverage/coverage.csv b/csharp/documentation/library-coverage/coverage.csv index 4713679cd23..d71bc79b3c0 100644 --- a/csharp/documentation/library-coverage/coverage.csv +++ b/csharp/documentation/library-coverage/coverage.csv @@ -40,6 +40,7 @@ Microsoft.VisualBasic,,,6,,,,,,,,,,,,,,,,,,,1,5 Microsoft.Win32,,4,2,,,,,,,,,,,,,,,,,,4,,2 Mono.Linker,,,278,,,,,,,,,,,,,,,,,,,127,151 MySql.Data.MySqlClient,48,,,,,,,,,,,,48,,,,,,,,,, +NHibernate,3,,,,,,,,,,,,3,,,,,,,,,, Newtonsoft.Json,,,91,,,,,,,,,,,,,,,,,,,73,18 ServiceStack,194,,7,27,,,,,75,,,,92,,,,,,,,,7, SourceGenerators,,,5,,,,,,,,,,,,,,,,,,,,5 diff --git a/csharp/documentation/library-coverage/coverage.rst b/csharp/documentation/library-coverage/coverage.rst index 061662f9714..8128c27dccd 100644 --- a/csharp/documentation/library-coverage/coverage.rst +++ b/csharp/documentation/library-coverage/coverage.rst @@ -9,6 +9,6 @@ C# framework & library support Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE-079` :sub:`Cross-site scripting` `ServiceStack `_,"``ServiceStack.*``, ``ServiceStack``",,7,194, System,"``System.*``, ``System``",47,12241,54,5 - Others,"``Amazon.Lambda.APIGatewayEvents``, ``Amazon.Lambda.Core``, ``Dapper``, ``ILCompiler``, ``ILLink.RoslynAnalyzer``, ``ILLink.Shared``, ``ILLink.Tasks``, ``Internal.IL``, ``Internal.Pgo``, ``Internal.TypeSystem``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.AspNetCore.Components``, ``Microsoft.AspNetCore.Http``, ``Microsoft.AspNetCore.Mvc``, ``Microsoft.AspNetCore.WebUtilities``, ``Microsoft.CSharp``, ``Microsoft.Data.SqlClient``, ``Microsoft.Diagnostics.Tools.Pgo``, ``Microsoft.DotNet.Build.Tasks``, ``Microsoft.DotNet.PlatformAbstractions``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.Diagnostics.Metrics``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.JSInterop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``Mono.Linker``, ``MySql.Data.MySqlClient``, ``Newtonsoft.Json``, ``SourceGenerators``, ``Windows.Security.Cryptography.Core``",60,2257,159,4 - Totals,,107,14505,407,9 + Others,"``Amazon.Lambda.APIGatewayEvents``, ``Amazon.Lambda.Core``, ``Dapper``, ``ILCompiler``, ``ILLink.RoslynAnalyzer``, ``ILLink.Shared``, ``ILLink.Tasks``, ``Internal.IL``, ``Internal.Pgo``, ``Internal.TypeSystem``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.AspNetCore.Components``, ``Microsoft.AspNetCore.Http``, ``Microsoft.AspNetCore.Mvc``, ``Microsoft.AspNetCore.WebUtilities``, ``Microsoft.CSharp``, ``Microsoft.Data.SqlClient``, ``Microsoft.Diagnostics.Tools.Pgo``, ``Microsoft.DotNet.Build.Tasks``, ``Microsoft.DotNet.PlatformAbstractions``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.Diagnostics.Metrics``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.JSInterop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``Mono.Linker``, ``MySql.Data.MySqlClient``, ``NHibernate``, ``Newtonsoft.Json``, ``SourceGenerators``, ``Windows.Security.Cryptography.Core``",60,2257,162,4 + Totals,,107,14505,410,9 diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/BUILD.bazel b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/BUILD.bazel index 96ecccc31aa..aefa581837e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/BUILD.bazel +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/BUILD.bazel @@ -15,6 +15,8 @@ codeql_csharp_library( deps = [ "//csharp/extractor/Semmle.Extraction.CSharp", "//csharp/extractor/Semmle.Util", + "@paket.main//microsoft.visualstudio.solutionpersistence", "@paket.main//newtonsoft.json", + "@paket.main//nuget.versioning", ], ) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyDirectory.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyDirectory.cs new file mode 100644 index 00000000000..7c816ed5837 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyDirectory.cs @@ -0,0 +1,62 @@ +using System; +using System.IO; +using Semmle.Util; +using Semmle.Util.Logging; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + /// + /// A directory used for storing fetched dependencies. + /// When a specific directory is set via the dependency directory extractor option, + /// we store dependencies in that directory for caching purposes. + /// Otherwise, we create a temporary directory that is deleted upon disposal. + /// + public sealed class DependencyDirectory : IDisposable + { + private readonly string userReportedDirectoryPurpose; + private readonly ILogger logger; + private readonly bool attemptCleanup; + + public DirectoryInfo DirInfo { get; } + + public DependencyDirectory(string subfolderName, string userReportedDirectoryPurpose, ILogger logger) + { + this.logger = logger; + this.userReportedDirectoryPurpose = userReportedDirectoryPurpose; + + string path; + if (EnvironmentVariables.GetBuildlessDependencyDir() is string dir) + { + path = dir; + attemptCleanup = false; + } + else + { + path = FileUtils.GetTemporaryWorkingDirectory(out _); + attemptCleanup = true; + } + DirInfo = new DirectoryInfo(Path.Join(path, subfolderName)); + DirInfo.Create(); + } + + public void Dispose() + { + if (!attemptCleanup) + { + logger.LogInfo($"Keeping {userReportedDirectoryPurpose} directory {DirInfo.FullName} for possible caching purposes."); + return; + } + + try + { + DirInfo.Delete(true); + } + catch (Exception exc) + { + logger.LogInfo($"Couldn't delete {userReportedDirectoryPurpose} directory {exc.Message}"); + } + } + + public override string ToString() => DirInfo.FullName; + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index 040e89dcec1..ad69d0c85c3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -283,7 +283,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { foreach (var fp in frameworkPaths) { - dotnetFrameworkVersionVariantCount += NugetPackageRestorer.GetOrderedPackageVersionSubDirectories(fp.Path!).Length; + dotnetFrameworkVersionVariantCount += nugetPackageRestorer.GetOrderedPackageVersionSubDirectories(fp.Path!).Length; } var folder = nugetPackageRestorer.GetNewestNugetPackageVersionFolder(frameworkPath.Path, ".NET Framework"); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index 4a4fd651a5b..9d3d79e4c4f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Linq; +using System.Threading; using Newtonsoft.Json.Linq; using Semmle.Util; @@ -35,12 +37,29 @@ namespace Semmle.Extraction.CSharp.DependencyFetching public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, dependabotProxy); + private static void HandleRetryExitCode143(string dotnet, int attempt, ILogger logger) + { + logger.LogWarning($"Running '{dotnet} --info' failed with exit code 143. Retrying..."); + var sleep = Math.Pow(2, attempt) * 1000; + Thread.Sleep((int)sleep); + } + private void Info() { - var res = dotnetCliInvoker.RunCommand("--info", silent: false); - if (!res) + // Allow up to four attempts (with up to three retries) to run `dotnet --info`, to mitigate transient issues + for (int attempt = 0; attempt < 4; attempt++) { - throw new Exception($"{dotnetCliInvoker.Exec} --info failed."); + var exitCode = dotnetCliInvoker.RunCommandExitCode("--info", silent: false); + switch (exitCode) + { + case 0: + return; + case 143 when attempt < 3: + HandleRetryExitCode143(dotnetCliInvoker.Exec, attempt, logger); + continue; + default: + throw new Exception($"{dotnetCliInvoker.Exec} --info failed with exit code {exitCode}."); + } } } @@ -58,7 +77,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching Directory.CreateDirectory(path); } - args += $" /p:TargetFrameworkRootPath=\"{path}\" /p:NetCoreTargetingPackRoot=\"{path}\""; + args += $" /p:TargetFrameworkRootPath=\"{path}\" /p:NetCoreTargetingPackRoot=\"{path}\" /p:AllowMissingPrunePackageData=true"; } if (restoreSettings.PathToNugetConfig != null) @@ -138,7 +157,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } // The version number should be kept in sync with the version .NET version used for building the application. - public const string LatestDotNetSdkVersion = "9.0.300"; + public const string LatestDotNetSdkVersion = "10.0.100"; + + public static ReadOnlyDictionary MinimalEnvironment => IDotNetCliInvoker.MinimalEnvironment; /// /// Returns a script for downloading relevant versions of the @@ -190,6 +211,35 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return BuildScript.Failure; } + /// + /// Returns a script for running `dotnet --info`, with retries on exit code 143. + /// + public static BuildScript InfoScript(IBuildActions actions, string dotnet, IDictionary? environment, ILogger logger) + { + var info = new CommandBuilder(actions, null, environment). + RunCommand(dotnet). + Argument("--info"); + var script = info.Script; + for (var attempt = 0; attempt < 4; attempt++) + { + var attemptCopy = attempt; // Capture in local variable + script = BuildScript.Bind(script, ret => + { + switch (ret) + { + case 0: + return BuildScript.Success; + case 143 when attemptCopy < 3: + HandleRetryExitCode143(dotnet, attemptCopy, logger); + return info.Script; + default: + return BuildScript.Failure; + } + }); + } + return script; + } + /// /// Returns a script for downloading specific .NET SDK versions, if the /// versions are not already installed. @@ -254,7 +304,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching else { var dotnetInstallPath = actions.PathCombine(tempWorkingDirectory, ".dotnet", "dotnet-install.sh"); - var downloadDotNetInstallSh = BuildScript.DownloadFile( "https://dot.net/v1/dotnet-install.sh", dotnetInstallPath, @@ -269,19 +318,28 @@ namespace Semmle.Extraction.CSharp.DependencyFetching prelude = downloadDotNetInstallSh & chmod.Script; postlude = shouldCleanUp ? BuildScript.DeleteFile(dotnetInstallPath) : BuildScript.Success; - getInstall = version => new CommandBuilder(actions). - RunCommand(dotnetInstallPath). - Argument("--channel"). - Argument("release"). - Argument("--version"). - Argument(version). - Argument("--install-dir"). - Argument(path).Script; + getInstall = version => + { + var cb = new CommandBuilder(actions). + RunCommand(dotnetInstallPath). + Argument("--channel"). + Argument("release"). + Argument("--version"). + Argument(version); + + // Request ARM64 architecture on Apple Silicon machines + if (actions.IsRunningOnAppleSilicon()) + { + cb.Argument("--architecture"). + Argument("arm64"); + } + + return cb.Argument("--install-dir"). + Argument(path).Script; + }; } - var dotnetInfo = new CommandBuilder(actions). - RunCommand(actions.PathCombine(path, "dotnet")). - Argument("--info").Script; + var dotnetInfo = InfoScript(actions, actions.PathCombine(path, "dotnet"), MinimalEnvironment.ToDictionary(), logger); Func getInstallAndVerify = version => // run `dotnet --info` after install, to check that it executes successfully @@ -311,7 +369,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private static BuildScript GetInstalledSdksScript(IBuildActions actions) { - var listSdks = new CommandBuilder(actions, silent: true). + var listSdks = new CommandBuilder(actions, silent: true, environment: MinimalEnvironment). RunCommand("dotnet"). Argument("--list-sdks"); return listSdks.Script; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs index e3efce09481..4c4e789973c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Diagnostics; using Semmle.Util; using Semmle.Util.Logging; @@ -36,10 +37,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { startInfo.WorkingDirectory = workingDirectory; } - // Set the .NET CLI language to English to avoid localized output. - startInfo.EnvironmentVariables["DOTNET_CLI_UI_LANGUAGE"] = "en"; - startInfo.EnvironmentVariables["MSBUILDDISABLENODEREUSE"] = "1"; - startInfo.EnvironmentVariables["DOTNET_SKIP_FIRST_TIME_EXPERIENCE"] = "true"; + + // Set minimal environment variables. + foreach (var kvp in IDotNetCliInvoker.MinimalEnvironment) + { + startInfo.EnvironmentVariables[kvp.Key] = kvp.Value; + } // Configure the proxy settings, if applicable. if (this.proxy != null) @@ -54,15 +57,21 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return startInfo; } - private bool RunCommandAux(string args, string? workingDirectory, out IList output, bool silent) + private int RunCommandExitCodeAux(string args, string? workingDirectory, out IList output, out string dirLog, bool silent) { - var dirLog = string.IsNullOrWhiteSpace(workingDirectory) ? "" : $" in {workingDirectory}"; + dirLog = string.IsNullOrWhiteSpace(workingDirectory) ? "" : $" in {workingDirectory}"; var pi = MakeDotnetStartInfo(args, workingDirectory); var threadId = Environment.CurrentManagedThreadId; void onOut(string s) => logger.Log(silent ? Severity.Debug : Severity.Info, s, threadId); void onError(string s) => logger.LogError(s, threadId); logger.LogInfo($"Running '{Exec} {args}'{dirLog}"); var exitCode = pi.ReadOutput(out output, onOut, onError); + return exitCode; + } + + private bool RunCommandAux(string args, string? workingDirectory, out IList output, bool silent) + { + var exitCode = RunCommandExitCodeAux(args, workingDirectory, out output, out var dirLog, silent); if (exitCode != 0) { logger.LogError($"Command '{Exec} {args}'{dirLog} failed with exit code {exitCode}"); @@ -74,6 +83,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching public bool RunCommand(string args, bool silent = true) => RunCommandAux(args, null, out _, silent); + public int RunCommandExitCode(string args, bool silent = true) => + RunCommandExitCodeAux(args, null, out _, out _, silent); + public bool RunCommand(string args, out IList output, bool silent = true) => RunCommandAux(args, null, out output, silent); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetVersion.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetVersion.cs index b4273d02b77..31a4ac2292d 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetVersion.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetVersion.cs @@ -1,24 +1,16 @@ using System; using System.IO; +using NuGet.Versioning; namespace Semmle.Extraction.CSharp.DependencyFetching { internal record DotNetVersion : IComparable { private readonly string dir; - private readonly Version version; - private readonly Version? preReleaseVersion; - private readonly string? preReleaseVersionType; - private bool IsPreRelease => preReleaseVersionType is not null && preReleaseVersion is not null; + private readonly NuGetVersion version; - private string FullVersion - { - get - { - var preRelease = IsPreRelease ? $"-{preReleaseVersionType}.{preReleaseVersion}" : ""; - return this.version + preRelease; - } - } + private string FullVersion => + version.ToString(); public string FullPath => Path.Combine(dir, FullVersion); @@ -48,37 +40,14 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } - public DotNetVersion(string dir, string version, string preReleaseVersionType, string preReleaseVersion) + public DotNetVersion(string dir, NuGetVersion version) { this.dir = dir; - this.version = Version.Parse(version); - if (!string.IsNullOrEmpty(preReleaseVersion) && !string.IsNullOrEmpty(preReleaseVersionType)) - { - this.preReleaseVersionType = preReleaseVersionType; - this.preReleaseVersion = Version.Parse(preReleaseVersion); - } + this.version = version; } - public int CompareTo(DotNetVersion? other) - { - var c = version.CompareTo(other?.version); - if (c == 0 && IsPreRelease) - { - if (!other!.IsPreRelease) - { - return -1; - } - - // Both are pre-release like runtime versions. - // The pre-release version types are sorted alphabetically (e.g. alpha, beta, preview, rc) - // and the pre-release version types are more important that the pre-release version numbers. - return preReleaseVersionType != other!.preReleaseVersionType - ? preReleaseVersionType!.CompareTo(other!.preReleaseVersionType) - : preReleaseVersion!.CompareTo(other!.preReleaseVersion); - } - - return c; - } + public int CompareTo(DotNetVersion? other) => + version.CompareTo(other?.version); public override string ToString() => FullPath; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs index 1a1e9934e8c..e33e6703b43 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FilePathFilter.cs @@ -55,12 +55,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } else { - logger.LogInfo($"Invalid filter: {filter}"); + logger.LogWarning($"Invalid filter: {filter}"); continue; } var regex = new FilePattern(filterText).RegexPattern; - logger.LogInfo($"Filtering {(include ? "in" : "out")} files matching '{regex}'. Original glob filter: '{filter}'"); + logger.LogDebug($"Filtering {(include ? "in" : "out")} files matching '{regex}'. Original glob filter: '{filter}'"); pathFilters.Add(new PathFilter(new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline), include)); } @@ -91,7 +91,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching if (!include) { - logger.LogInfo($"Excluding '{f.FileInfo.FullName}'"); + logger.LogDebug($"Excluding '{f.FileInfo.FullName}'"); } return include; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs index e908855df0a..9e6b810b95e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs @@ -37,7 +37,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching smallNonBinary = new Lazy(() => ReturnAndLogFiles("small non-binary", SelectSmallFiles(allNonBinary.Value).SelectFileNames().ToArray())); sources = new Lazy(() => SelectTextFileNamesByExtension("source", ".cs")); projects = new Lazy(() => SelectTextFileNamesByExtension("project", ".csproj")); - solutions = new Lazy(() => SelectTextFileNamesByExtension("solution", ".sln")); + solutions = new Lazy(() => SelectTextFileNamesByExtension("solution", ".sln", ".slnx")); dlls = new Lazy(() => SelectBinaryFileNamesByExtension("DLL", ".dll")); nugetConfigs = new Lazy(() => SelectTextFileNamesByName("nuget.config")); globalJsons = new Lazy(() => SelectTextFileNamesByName("global.json")); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs index 89631ffa861..61d0ea4260d 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Collections.ObjectModel; namespace Semmle.Extraction.CSharp.DependencyFetching { @@ -9,12 +10,32 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// string Exec { get; } + /// + /// A minimal environment for running the .NET CLI. + /// + /// DOTNET_CLI_UI_LANGUAGE: The .NET CLI language is set to English to avoid localized output. + /// MSBUILDDISABLENODEREUSE: To ensure clean environment for each build. + /// DOTNET_SKIP_FIRST_TIME_EXPERIENCE: To skip first time experience messages. + /// + static ReadOnlyDictionary MinimalEnvironment { get; } = new(new Dictionary + { + {"DOTNET_CLI_UI_LANGUAGE", "en"}, + {"MSBUILDDISABLENODEREUSE", "1"}, + {"DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true"} + }); + /// /// Execute `dotnet ` and return true if the command succeeded, otherwise false. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// bool RunCommand(string args, bool silent = true); + /// + /// Execute `dotnet ` and return the exit code. + /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. + /// + int RunCommandExitCode(string args, bool silent = true); + /// /// Execute `dotnet ` and return true if the command succeeded, otherwise false. /// The output of the command is returned in `output`. diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetExeWrapper.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetExeWrapper.cs index c77daa8899c..b90b388e865 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetExeWrapper.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetExeWrapper.cs @@ -24,16 +24,16 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private readonly FileProvider fileProvider; /// - /// The computed packages directory. - /// This will be in the Temp location + /// The packages directory. + /// This will be in the user-specified or computed Temp location /// so as to not trample the source tree. /// - private readonly TemporaryDirectory packageDirectory; + private readonly DependencyDirectory packageDirectory; /// /// Create the package manager for a specified source tree. /// - public NugetExeWrapper(FileProvider fileProvider, TemporaryDirectory packageDirectory, Semmle.Util.Logging.ILogger logger) + public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger) { this.fileProvider = fileProvider; this.packageDirectory = packageDirectory; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index e0e1bc649fa..29cec8a0e33 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -10,6 +10,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using NuGet.Versioning; using Semmle.Util; using Semmle.Util.Logging; @@ -24,12 +25,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private readonly IDotNet dotnet; private readonly DependabotProxy? dependabotProxy; private readonly IDiagnosticsWriter diagnosticsWriter; - private readonly TemporaryDirectory legacyPackageDirectory; - private readonly TemporaryDirectory missingPackageDirectory; + private readonly DependencyDirectory legacyPackageDirectory; + private readonly DependencyDirectory missingPackageDirectory; private readonly ILogger logger; private readonly ICompilationInfoContainer compilationInfoContainer; - public TemporaryDirectory PackageDirectory { get; } + public DependencyDirectory PackageDirectory { get; } public NugetPackageRestorer( FileProvider fileProvider, @@ -48,9 +49,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching this.logger = logger; this.compilationInfoContainer = compilationInfoContainer; - PackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("packages"), "package", logger); - legacyPackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("legacypackages"), "legacy package", logger); - missingPackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("missingpackages"), "missing package", logger); + PackageDirectory = new DependencyDirectory("packages", "package", logger); + legacyPackageDirectory = new DependencyDirectory("legacypackages", "legacy package", logger); + missingPackageDirectory = new DependencyDirectory("missingpackages", "missing package", logger); } public string? TryRestore(string package) @@ -87,11 +88,22 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return selectedFrameworkFolder; } - public static DirectoryInfo[] GetOrderedPackageVersionSubDirectories(string packagePath) + public DirectoryInfo[] GetOrderedPackageVersionSubDirectories(string packagePath) { + // Only consider directories with valid NuGet version names. return new DirectoryInfo(packagePath) .EnumerateDirectories("*", new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive, RecurseSubdirectories = false }) - .OrderByDescending(d => d.Name) // TODO: Improve sorting to handle pre-release versions. + .SelectMany(d => + { + if (NuGetVersion.TryParse(d.Name, out var version)) + { + return new[] { new { Directory = d, NuGetVersion = version } }; + } + logger.LogInfo($"Ignoring package directory '{d.FullName}' as it does not have a valid NuGet version name."); + return []; + }) + .OrderByDescending(dw => dw.NuGetVersion) + .Select(dw => dw.Directory) .ToArray(); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs index a489ec504c4..64c835d27fc 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Runtime.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; +using NuGet.Versioning; using Semmle.Util; using Semmle.Util.Logging; @@ -27,7 +28,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching this.newestRuntimes = new(GetNewestRuntimes); } - [GeneratedRegex(@"^(\S+)\s(\d+\.\d+\.\d+)(-([a-z]+)\.(\d+\.\d+\.\d+))?\s\[(.+)\]$")] + [GeneratedRegex(@"^(\S+)\s(\d+\.\d+\.\d+(-[a-z]+\.\d+\.\d+\.\d+)?)\s\[(.+)\]$")] private static partial Regex RuntimeRegex(); /// @@ -44,9 +45,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching listed.ForEach(r => { var match = regex.Match(r); - if (match.Success) + if (match.Success && NuGetVersion.TryParse(match.Groups[2].Value, out var version)) { - runtimes.AddOrUpdateToLatest(match.Groups[1].Value, new DotNetVersion(match.Groups[6].Value, match.Groups[2].Value, match.Groups[4].Value, match.Groups[5].Value)); + runtimes.AddOrUpdateToLatest(match.Groups[1].Value, new DotNetVersion(match.Groups[4].Value, version)); } }); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Sdk.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Sdk.cs index 848350bce98..c4d1ba9ac08 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Sdk.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Sdk.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; +using NuGet.Versioning; using Semmle.Util; using Semmle.Util.Logging; @@ -27,7 +28,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching cscPath = new Lazy(GetCscPath); } - [GeneratedRegex(@"^(\d+\.\d+\.\d+)(-([a-z]+)\.(\d+\.\d+\.\d+))?\s\[(.+)\]$")] + [GeneratedRegex(@"^(\d+\.\d+\.\d+(-[a-z]+\.\d+\.\d+\.\d+)?)\s\[(.+)\]$")] private static partial Regex SdkRegex(); private static HashSet ParseSdks(IList listed) @@ -37,9 +38,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching listed.ForEach(r => { var match = regex.Match(r); - if (match.Success) + if (match.Success && NuGetVersion.TryParse(match.Groups[1].Value, out var version)) { - sdks.Add(new DotNetVersion(match.Groups[5].Value, match.Groups[1].Value, match.Groups[3].Value, match.Groups[4].Value)); + sdks.Add(new DotNetVersion(match.Groups[3].Value, version)); } }); @@ -73,4 +74,4 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return path; } } -} \ No newline at end of file +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SolutionFile.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SolutionFile.cs index 6858cd77f4a..f143ec8f3d2 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SolutionFile.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SolutionFile.cs @@ -6,7 +6,7 @@ using Microsoft.Build.Construction; namespace Semmle.Extraction.CSharp.DependencyFetching { /// - /// Access data in a .sln file. + /// Access data in a .sln or .slnx file. /// internal class SolutionFile { @@ -17,7 +17,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// /// Read the file. /// - /// The filename of the .sln. + /// The filename of the .sln or .slnx. public SolutionFile(string filename) { // SolutionFile.Parse() expects a rooted path. @@ -26,7 +26,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } /// - /// Projects directly included in the .sln file. + /// Projects directly included in the .sln or .slnx file. /// public IEnumerable MsBuildProjects { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/paket.references b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/paket.references index 99e44f5d76e..b70a0ef65be 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/paket.references +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/paket.references @@ -1 +1,3 @@ +Microsoft.VisualStudio.SolutionPersistence Newtonsoft.Json +NuGet.Versioning diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Semmle.Extraction.CSharp.DependencyStubGenerator.csproj b/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Semmle.Extraction.CSharp.DependencyStubGenerator.csproj index 9ec28298950..2f05a1f9fe4 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Semmle.Extraction.CSharp.DependencyStubGenerator.csproj +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyStubGenerator/Semmle.Extraction.CSharp.DependencyStubGenerator.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 Semmle.Extraction.CSharp.DependencyStubGenerator Semmle.Extraction.CSharp.DependencyStubGenerator enable @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs index 573c8954bf4..2bcf1a88c87 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs @@ -170,7 +170,8 @@ namespace Semmle.Extraction.CSharp.Standalone fileLogger.LogError($" Unhandled exception: {ex}"); } - logger.Log(Severity.Info, $"Extraction completed in {overallStopwatch.Elapsed}"); + logger.Log(Severity.Info, $"Extraction completed in {analyzerStopwatch.Elapsed}"); + logger.Log(Severity.Info, $"Total time: {overallStopwatch.Elapsed}"); return ExitCode.Ok; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/paket.references b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/paket.references index 9a2eede6b35..ec65ce95b91 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/paket.references +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/paket.references @@ -1,5 +1 @@ Microsoft.Build -Microsoft.Win32.Primitives -System.Net.Primitives -System.Security.Principal -System.Threading.ThreadPool diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs index 2c3b25b2e1c..14d9b548015 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs @@ -74,6 +74,7 @@ namespace Semmle.Extraction.CSharp.Entities { case SyntaxKind.BaseConstructorInitializer: initializerType = Symbol.ContainingType.BaseType!; + ExtractObjectInitCall(trapFile); break; case SyntaxKind.ThisConstructorInitializer: initializerType = Symbol.ContainingType; @@ -90,10 +91,12 @@ namespace Semmle.Extraction.CSharp.Entities var primaryInfo = Context.GetSymbolInfo(primaryInitializer); var primarySymbol = primaryInfo.Symbol; + ExtractObjectInitCall(trapFile); ExtractSourceInitializer(trapFile, primarySymbol?.ContainingType, (IMethodSymbol?)primarySymbol, primaryInitializer.ArgumentList, primaryInitializer.GetLocation()); } else if (Symbol.MethodKind is MethodKind.Constructor) { + ExtractObjectInitCall(trapFile); var baseType = Symbol.ContainingType.BaseType; if (baseType is null) { @@ -127,6 +130,27 @@ namespace Semmle.Extraction.CSharp.Entities } } + private void ExtractObjectInitCall(TextWriter trapFile) + { + var target = ObjectInitMethod.Create(Context, ContainingType!); + + var type = Context.Compilation.GetSpecialType(SpecialType.System_Void); + + var info = new ExpressionInfo(Context, + AnnotatedTypeSymbol.CreateNotAnnotated(type), + Location, + Kinds.ExprKind.METHOD_INVOCATION, + this, + -2, + isCompilerGenerated: true, + null); + var obinitCall = new Expression(info); + + trapFile.expr_call(obinitCall, target); + + Expressions.This.CreateImplicit(Context, Symbol.ContainingType, Location, obinitCall, -1); + } + private void ExtractSourceInitializer(TextWriter trapFile, ITypeSymbol? type, IMethodSymbol? symbol, ArgumentListSyntax arguments, Microsoft.CodeAnalysis.Location location) { var initInfo = new ExpressionInfo(Context, diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/IMethodEntity.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/IMethodEntity.cs new file mode 100644 index 00000000000..278f2b18798 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/IMethodEntity.cs @@ -0,0 +1,9 @@ +namespace Semmle.Extraction.CSharp.Entities +{ + /// + /// Marker interface for method entities. + /// + public interface IMethodEntity : IEntity + { + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs index c1b0f1a65bc..c92c561f31b 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs @@ -9,7 +9,7 @@ using Semmle.Extraction.CSharp.Populators; namespace Semmle.Extraction.CSharp.Entities { - internal abstract class Method : CachedSymbol, IExpressionParentEntity, IStatementParentEntity + internal abstract class Method : CachedSymbol, IExpressionParentEntity, IStatementParentEntity, IMethodEntity { protected Method(Context cx, IMethodSymbol init) : base(cx, init) { } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/ObjectInitMethod.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/ObjectInitMethod.cs new file mode 100644 index 00000000000..81c08ec35d5 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/ObjectInitMethod.cs @@ -0,0 +1,56 @@ +using System.IO; +using Microsoft.CodeAnalysis; + +namespace Semmle.Extraction.CSharp.Entities +{ + internal sealed class ObjectInitMethod : CachedEntity, IMethodEntity + { + private Type ContainingType { get; } + + private ObjectInitMethod(Context cx, Type containingType) + : base(cx) + { + this.ContainingType = containingType; + } + + private static readonly string Name = ""; + + public static ObjectInitMethod Create(Context cx, Type containingType) + { + return ObjectInitMethodFactory.Instance.CreateEntity(cx, (typeof(ObjectInitMethod), containingType), containingType); + } + + public override void Populate(TextWriter trapFile) + { + var returnType = Type.Create(Context, Context.Compilation.GetSpecialType(SpecialType.System_Void)); + + trapFile.methods(this, Name, ContainingType, returnType.TypeRef, this); + + trapFile.compiler_generated(this); + + trapFile.method_location(this, Context.CreateLocation(ReportingLocation)); + } + + public override void WriteId(EscapingTextWriter trapFile) + { + trapFile.WriteSubId(ContainingType); + trapFile.Write("."); + trapFile.Write(Name); + trapFile.Write(";method"); + } + + public override Microsoft.CodeAnalysis.Location? ReportingLocation => ContainingType.ReportingLocation; + + public override bool NeedsPopulation => true; + + public override TrapStackBehaviour TrapStackBehaviour => TrapStackBehaviour.NoLabel; + + private class ObjectInitMethodFactory : CachedEntityFactory + { + public static ObjectInitMethodFactory Instance { get; } = new ObjectInitMethodFactory(); + + public override ObjectInitMethod Create(Context cx, Type containingType) => + new ObjectInitMethod(cx, containingType); + } + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs index 1ba8827c9d2..6701f993ac6 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs @@ -360,5 +360,22 @@ namespace Semmle.Extraction.CSharp return versionString.InformationalVersion; } } + + private static readonly HashSet errorsToIgnore = new HashSet + { + "CS7027", // Code signing failure + "CS1589", // XML referencing not supported + "CS1569" // Error writing XML documentation + }; + + /// + /// Retrieves the diagnostics from the compilation, filtering out those that should be ignored. + /// + protected List GetFilteredDiagnostics() => + compilation is not null + ? compilation.GetDiagnostics() + .Where(e => e.Severity >= DiagnosticSeverity.Error && !errorsToIgnore.Contains(e.Id)) + .ToList() + : []; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/StandaloneAnalyser.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/StandaloneAnalyser.cs index ff3c2889bc9..b940b02cb5c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/StandaloneAnalyser.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/StandaloneAnalyser.cs @@ -13,6 +13,14 @@ namespace Semmle.Extraction.CSharp { } + private void LogDiagnostics() + { + foreach (var error in GetFilteredDiagnostics()) + { + Logger.LogDebug($" Compilation error: {error}"); + } + } + public void Initialize(string outputPath, IEnumerable<(string, string)> compilationInfos, CSharpCompilation compilationIn, CommonOptions options) { compilation = compilationIn; @@ -20,6 +28,7 @@ namespace Semmle.Extraction.CSharp this.options = options; LogExtractorInfo(); SetReferencePaths(); + LogDiagnostics(); } } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs index 8a9856f1d31..9f2a1256f1a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/TracingAnalyser.cs @@ -136,11 +136,7 @@ namespace Semmle.Extraction.CSharp private int LogDiagnostics() { - var filteredDiagnostics = compilation! - .GetDiagnostics() - .Where(e => e.Severity >= DiagnosticSeverity.Error && !errorsToIgnore.Contains(e.Id)) - .ToList(); - + var filteredDiagnostics = GetFilteredDiagnostics(); foreach (var error in filteredDiagnostics) { Logger.LogError($" Compilation error: {error}"); @@ -148,7 +144,7 @@ namespace Semmle.Extraction.CSharp if (filteredDiagnostics.Count != 0) { - foreach (var reference in compilation.References) + foreach (var reference in compilation!.References) { Logger.LogInfo($" Resolved reference {reference.Display}"); } @@ -156,12 +152,5 @@ namespace Semmle.Extraction.CSharp return filteredDiagnostics.Count; } - - private static readonly HashSet errorsToIgnore = new HashSet - { - "CS7027", // Code signing failure - "CS1589", // XML referencing not supported - "CS1569" // Error writing XML documentation - }; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Trap/Tuples.cs b/csharp/extractor/Semmle.Extraction.CSharp/Trap/Tuples.cs index 8960b6adb67..b789eaa2e9c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Trap/Tuples.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Trap/Tuples.cs @@ -175,7 +175,7 @@ namespace Semmle.Extraction.CSharp internal static void expr_argument_name(this TextWriter trapFile, Expression expr, string name) => trapFile.WriteTuple("expr_argument_name", expr, name); - internal static void expr_call(this TextWriter trapFile, Expression expr, Method target) => + internal static void expr_call(this TextWriter trapFile, Expression expr, IMethodEntity target) => trapFile.WriteTuple("expr_call", expr, target); internal static void expr_flowstate(this TextWriter trapFile, Expression expr, int flowState) => @@ -247,10 +247,10 @@ namespace Semmle.Extraction.CSharp internal static void localvars(this TextWriter trapFile, LocalVariable key, VariableKind kind, string name, int @var, Type type, Expression expr) => trapFile.WriteTuple("localvars", key, (int)kind, name, @var, type, expr); - internal static void method_location(this TextWriter trapFile, Method method, Location location) => + internal static void method_location(this TextWriter trapFile, IMethodEntity method, Location location) => trapFile.WriteTuple("method_location", method, location); - internal static void methods(this TextWriter trapFile, Method method, string name, Type declType, Type retType, Method originalDefinition) => + internal static void methods(this TextWriter trapFile, IMethodEntity method, string name, Type declType, Type retType, IMethodEntity originalDefinition) => trapFile.WriteTuple("methods", method, name, declType, retType, originalDefinition); internal static void modifiers(this TextWriter trapFile, Label entity, string modifier) => diff --git a/csharp/extractor/Semmle.Extraction.Tests/BUILD.bazel b/csharp/extractor/Semmle.Extraction.Tests/BUILD.bazel index 4d13f7f4fb8..2b27e4048ba 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/BUILD.bazel +++ b/csharp/extractor/Semmle.Extraction.Tests/BUILD.bazel @@ -16,6 +16,5 @@ codeql_xunit_test( "//csharp/extractor/Semmle.Extraction.CSharp.StubGenerator", "//csharp/extractor/Semmle.Util", "@paket.main//microsoft.net.test.sdk", - "@paket.main//system.io.filesystem", ], ) diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs index 904ad04ce82..a2996497e00 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs @@ -12,6 +12,7 @@ namespace Semmle.Extraction.Tests private string lastArgs = ""; public string WorkingDirectory { get; private set; } = ""; public bool Success { get; set; } = true; + public int ExitCode { get; set; } = 0; public DotNetCliInvokerStub(IList output) { @@ -26,6 +27,12 @@ namespace Semmle.Extraction.Tests return Success; } + public int RunCommandExitCode(string args, bool silent) + { + lastArgs = args; + return ExitCode; + } + public bool RunCommand(string args, out IList output, bool silent) { lastArgs = args; @@ -83,7 +90,7 @@ namespace Semmle.Extraction.Tests public void TestDotnetInfoFailure() { // Setup - var dotnetCliInvoker = new DotNetCliInvokerStub(new List()) { Success = false }; + var dotnetCliInvoker = new DotNetCliInvokerStub(new List()) { ExitCode = 1 }; // Execute try @@ -94,7 +101,7 @@ namespace Semmle.Extraction.Tests // Verify catch (Exception e) { - Assert.Equal("dotnet --info failed.", e.Message); + Assert.Equal("dotnet --info failed with exit code 1.", e.Message); return; } Assert.Fail("Expected exception"); diff --git a/csharp/extractor/Semmle.Extraction.Tests/paket.references b/csharp/extractor/Semmle.Extraction.Tests/paket.references index 83bb87685b1..0582094502a 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/paket.references +++ b/csharp/extractor/Semmle.Extraction.Tests/paket.references @@ -1,4 +1,3 @@ -System.IO.FileSystem xunit xunit.runner.visualstudio Microsoft.NET.Test.Sdk diff --git a/csharp/extractor/Semmle.Util/EnvironmentVariables.cs b/csharp/extractor/Semmle.Util/EnvironmentVariables.cs index edce64a53fe..1af05b9d4ad 100644 --- a/csharp/extractor/Semmle.Util/EnvironmentVariables.cs +++ b/csharp/extractor/Semmle.Util/EnvironmentVariables.cs @@ -76,5 +76,14 @@ namespace Semmle.Util { return Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OVERLAY_BASE_METADATA_OUT"); } + + /// + /// If set, returns the directory where buildless dependencies should be stored. + /// This can be used for caching dependencies. + /// + public static string? GetBuildlessDependencyDir() + { + return Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_BUILDLESS_DEPENDENCY_DIR"); + } } } diff --git a/csharp/extractor/Semmle.Util/Language.cs b/csharp/extractor/Semmle.Util/Language.cs index fa3d71b6154..a895a6e3e06 100644 --- a/csharp/extractor/Semmle.Util/Language.cs +++ b/csharp/extractor/Semmle.Util/Language.cs @@ -2,21 +2,27 @@ { public sealed class Language { - public static Language Cpp { get; } = new Language(".vcxproj", "CPP"); - public static Language CSharp { get; } = new Language(".csproj", "CSHARP"); + public static Language Cpp { get; } = new Language("CPP", ".vcxproj"); + public static Language CSharp { get; } = new Language("CSHARP", ".csproj", ".slnx"); public bool ProjectFileHasThisLanguage(string path) => System.IO.Path.GetExtension(path) == ProjectExtension; public string ProjectExtension { get; } + public string? SolutionExtension { get; } public string UpperCaseName { get; } - private Language(string extension, string name) + private Language(string name, string projectExtension) { - ProjectExtension = extension; + ProjectExtension = projectExtension; UpperCaseName = name; } + private Language(string name, string projectExtension, string solutionExtension) : this(name, projectExtension) + { + SolutionExtension = solutionExtension; + } + public override string ToString() => ProjectExtension == Cpp.ProjectExtension ? "C/C++" : "C#"; } diff --git a/csharp/paket.dependencies b/csharp/paket.dependencies index cd2ac36422b..61cb1d3d8d9 100644 --- a/csharp/paket.dependencies +++ b/csharp/paket.dependencies @@ -1,21 +1,18 @@ -framework: net9.0 +framework: net10.0 storage: none source https://api.nuget.org/v3/index.json # behave like nuget in choosing transitive dependency versions strategy: max -nuget Basic.CompilerLog.Util 0.9.21 +nuget Basic.CompilerLog.Util 0.9.25 nuget Mono.Posix.NETStandard nuget Newtonsoft.Json +nuget NuGet.Versioning nuget xunit nuget xunit.runner.visualstudio nuget xunit.runner.utility nuget Microsoft.NET.Test.Sdk -nuget Microsoft.CodeAnalysis.CSharp 4.14.0 -nuget Microsoft.CodeAnalysis 4.14.0 -nuget Microsoft.Build 17.14.28 -nuget Microsoft.Win32.Primitives -nuget System.Net.Primitives -nuget System.Security.Principal -nuget System.Threading.ThreadPool -nuget System.IO.FileSystem +nuget Microsoft.CodeAnalysis.CSharp 5.0.0 +nuget Microsoft.CodeAnalysis 5.0.0 +nuget Microsoft.Build 18.0.2 +nuget Microsoft.VisualStudio.SolutionPersistence diff --git a/csharp/paket.lock b/csharp/paket.lock index d503e19d87d..42d537cc181 100644 --- a/csharp/paket.lock +++ b/csharp/paket.lock @@ -1,9 +1,9 @@ STORAGE: NONE STRATEGY: MAX -RESTRICTION: == net9.0 +RESTRICTION: == net10.0 NUGET remote: https://api.nuget.org/v3/index.json - Basic.CompilerLog.Util (0.9.21) + Basic.CompilerLog.Util (0.9.25) MessagePack (>= 3.1.4) Microsoft.Bcl.Memory (>= 9.0.10) Microsoft.CodeAnalysis (>= 4.8) @@ -12,197 +12,133 @@ NUGET Microsoft.Extensions.ObjectPool (>= 9.0.10) MSBuild.StructuredLogger (>= 2.3.71) NaturalSort.Extension (>= 4.4) - Humanizer.Core (2.14.1) + NuGet.Versioning (>= 6.14) + Humanizer.Core (3.0.1) MessagePack (3.1.4) MessagePack.Annotations (>= 3.1.4) MessagePackAnalyzer (>= 3.1.4) Microsoft.NET.StringTools (>= 17.11.4) MessagePack.Annotations (3.1.4) MessagePackAnalyzer (3.1.4) - Microsoft.Bcl.AsyncInterfaces (9.0.10) - Microsoft.Bcl.Memory (9.0.10) - Microsoft.Build (17.14.28) - Microsoft.Build.Framework (>= 17.14.28) - Microsoft.NET.StringTools (>= 17.14.28) + Microsoft.Bcl.AsyncInterfaces (10.0.1) + Microsoft.Bcl.Memory (10.0.1) + Microsoft.Build (18.0.2) + Microsoft.Build.Framework (>= 18.0.2) + Microsoft.NET.StringTools (>= 18.0.2) System.Configuration.ConfigurationManager (>= 9.0) System.Diagnostics.EventLog (>= 9.0) System.Reflection.MetadataLoadContext (>= 9.0) - System.Security.Cryptography.ProtectedData (>= 9.0) - Microsoft.Build.Framework (17.14.28) - Microsoft.Build.Utilities.Core (17.14.28) - Microsoft.Build.Framework (>= 17.14.28) - Microsoft.NET.StringTools (>= 17.14.28) - System.Collections.Immutable (>= 9.0) + System.Security.Cryptography.ProtectedData (>= 9.0.6) + Microsoft.Build.Framework (18.0.2) + Microsoft.Build.Utilities.Core (18.0.2) + Microsoft.Build.Framework (>= 18.0.2) + Microsoft.NET.StringTools (>= 18.0.2) System.Configuration.ConfigurationManager (>= 9.0) System.Diagnostics.EventLog (>= 9.0) - System.Security.Cryptography.ProtectedData (>= 9.0) - Microsoft.CodeAnalysis (4.14) + System.Security.Cryptography.ProtectedData (>= 9.0.6) + Microsoft.CodeAnalysis (5.0) Humanizer.Core (>= 2.14.1) Microsoft.Bcl.AsyncInterfaces (>= 9.0) Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.CSharp.Workspaces (4.14) - Microsoft.CodeAnalysis.VisualBasic.Workspaces (4.14) - System.Buffers (>= 4.5.1) + Microsoft.CodeAnalysis.CSharp.Workspaces (5.0) + Microsoft.CodeAnalysis.VisualBasic.Workspaces (5.0) + System.Buffers (>= 4.6) System.Collections.Immutable (>= 9.0) System.Composition (>= 9.0) System.IO.Pipelines (>= 9.0) - System.Memory (>= 4.5.5) - System.Numerics.Vectors (>= 4.5) + System.Memory (>= 4.6) + System.Numerics.Vectors (>= 4.6) System.Reflection.Metadata (>= 9.0) - System.Runtime.CompilerServices.Unsafe (>= 6.0) - System.Text.Encoding.CodePages (>= 7.0) - System.Threading.Channels (>= 7.0) - System.Threading.Tasks.Extensions (>= 4.5.4) + System.Runtime.CompilerServices.Unsafe (>= 6.1) + System.Text.Encoding.CodePages (>= 8.0) + System.Threading.Channels (>= 8.0) + System.Threading.Tasks.Extensions (>= 4.6) Microsoft.CodeAnalysis.Analyzers (3.11) - Microsoft.CodeAnalysis.Common (4.14) + Microsoft.CodeAnalysis.Common (5.0) Microsoft.CodeAnalysis.Analyzers (>= 3.11) - System.Collections.Immutable (>= 9.0) - System.Reflection.Metadata (>= 9.0) - Microsoft.CodeAnalysis.CSharp (4.14) + Microsoft.CodeAnalysis.CSharp (5.0) Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (4.14) - System.Collections.Immutable (>= 9.0) - System.Reflection.Metadata (>= 9.0) - Microsoft.CodeAnalysis.CSharp.Workspaces (4.14) + Microsoft.CodeAnalysis.Common (5.0) + Microsoft.CodeAnalysis.CSharp.Workspaces (5.0) Humanizer.Core (>= 2.14.1) Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (4.14) - Microsoft.CodeAnalysis.CSharp (4.14) - Microsoft.CodeAnalysis.Workspaces.Common (4.14) - System.Collections.Immutable (>= 9.0) + Microsoft.CodeAnalysis.Common (5.0) + Microsoft.CodeAnalysis.CSharp (5.0) + Microsoft.CodeAnalysis.Workspaces.Common (5.0) System.Composition (>= 9.0) - System.IO.Pipelines (>= 9.0) - System.Reflection.Metadata (>= 9.0) - System.Threading.Channels (>= 7.0) - Microsoft.CodeAnalysis.VisualBasic (4.14) + Microsoft.CodeAnalysis.VisualBasic (5.0) Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (4.14) - System.Collections.Immutable (>= 9.0) - System.Reflection.Metadata (>= 9.0) - Microsoft.CodeAnalysis.VisualBasic.Workspaces (4.14) + Microsoft.CodeAnalysis.Common (5.0) + Microsoft.CodeAnalysis.VisualBasic.Workspaces (5.0) Humanizer.Core (>= 2.14.1) Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (4.14) - Microsoft.CodeAnalysis.VisualBasic (4.14) - Microsoft.CodeAnalysis.Workspaces.Common (4.14) - System.Collections.Immutable (>= 9.0) + Microsoft.CodeAnalysis.Common (5.0) + Microsoft.CodeAnalysis.VisualBasic (5.0) + Microsoft.CodeAnalysis.Workspaces.Common (5.0) System.Composition (>= 9.0) - System.IO.Pipelines (>= 9.0) - System.Reflection.Metadata (>= 9.0) - System.Threading.Channels (>= 7.0) - Microsoft.CodeAnalysis.Workspaces.Common (4.14) + Microsoft.CodeAnalysis.Workspaces.Common (5.0) Humanizer.Core (>= 2.14.1) Microsoft.CodeAnalysis.Analyzers (>= 3.11) - Microsoft.CodeAnalysis.Common (4.14) - System.Collections.Immutable (>= 9.0) + Microsoft.CodeAnalysis.Common (5.0) System.Composition (>= 9.0) - System.IO.Pipelines (>= 9.0) - System.Reflection.Metadata (>= 9.0) - System.Threading.Channels (>= 7.0) - Microsoft.CodeCoverage (18.0) - Microsoft.Extensions.ObjectPool (9.0.10) - Microsoft.NET.StringTools (17.14.28) - Microsoft.NET.Test.Sdk (18.0) - Microsoft.CodeCoverage (>= 18.0) - Microsoft.TestPlatform.TestHost (>= 18.0) - Microsoft.NETCore.Platforms (7.0.4) - Microsoft.NETCore.Targets (5.0) - Microsoft.TestPlatform.ObjectModel (18.0) + Microsoft.CodeCoverage (18.0.1) + Microsoft.Extensions.ObjectPool (10.0.1) + Microsoft.NET.StringTools (18.0.2) + Microsoft.NET.Test.Sdk (18.0.1) + Microsoft.CodeCoverage (>= 18.0.1) + Microsoft.TestPlatform.TestHost (>= 18.0.1) + Microsoft.TestPlatform.ObjectModel (18.0.1) System.Reflection.Metadata (>= 8.0) - Microsoft.TestPlatform.TestHost (18.0) - Microsoft.TestPlatform.ObjectModel (>= 18.0) + Microsoft.TestPlatform.TestHost (18.0.1) + Microsoft.TestPlatform.ObjectModel (>= 18.0.1) Newtonsoft.Json (>= 13.0.3) - Microsoft.Win32.Primitives (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) + Microsoft.VisualStudio.SolutionPersistence (1.0.52) Mono.Posix.NETStandard (1.0) - MSBuild.StructuredLogger (2.3.71) + MSBuild.StructuredLogger (2.3.113) Microsoft.Build.Framework (>= 17.5) Microsoft.Build.Utilities.Core (>= 17.5) System.Collections.Immutable (>= 8.0) - NaturalSort.Extension (4.4) + NaturalSort.Extension (4.4.1) Newtonsoft.Json (13.0.4) + NuGet.Versioning (7.0.1) System.Buffers (4.6.1) - System.Collections.Immutable (9.0.10) - System.Composition (9.0.10) - System.Composition.AttributedModel (>= 9.0.10) - System.Composition.Convention (>= 9.0.10) - System.Composition.Hosting (>= 9.0.10) - System.Composition.Runtime (>= 9.0.10) - System.Composition.TypedParts (>= 9.0.10) - System.Composition.AttributedModel (9.0.10) - System.Composition.Convention (9.0.10) - System.Composition.AttributedModel (>= 9.0.10) - System.Composition.Hosting (9.0.10) - System.Composition.Runtime (>= 9.0.10) - System.Composition.Runtime (9.0.10) - System.Composition.TypedParts (9.0.10) - System.Composition.AttributedModel (>= 9.0.10) - System.Composition.Hosting (>= 9.0.10) - System.Composition.Runtime (>= 9.0.10) - System.Configuration.ConfigurationManager (9.0.10) - System.Diagnostics.EventLog (>= 9.0.10) - System.Security.Cryptography.ProtectedData (>= 9.0.10) - System.Diagnostics.EventLog (9.0.10) - System.IO (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.IO.FileSystem (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.IO (>= 4.3) - System.IO.FileSystem.Primitives (>= 4.3) - System.Runtime (>= 4.3) - System.Runtime.Handles (>= 4.3) - System.Text.Encoding (>= 4.3) - System.Threading.Tasks (>= 4.3) - System.IO.FileSystem.Primitives (4.3) - System.Runtime (>= 4.3) - System.IO.Pipelines (9.0.10) + System.Collections.Immutable (10.0.1) + System.Composition (10.0.1) + System.Composition.AttributedModel (>= 10.0.1) + System.Composition.Convention (>= 10.0.1) + System.Composition.Hosting (>= 10.0.1) + System.Composition.Runtime (>= 10.0.1) + System.Composition.TypedParts (>= 10.0.1) + System.Composition.AttributedModel (10.0.1) + System.Composition.Convention (10.0.1) + System.Composition.AttributedModel (>= 10.0.1) + System.Composition.Hosting (10.0.1) + System.Composition.Runtime (>= 10.0.1) + System.Composition.Runtime (10.0.1) + System.Composition.TypedParts (10.0.1) + System.Composition.AttributedModel (>= 10.0.1) + System.Composition.Hosting (>= 10.0.1) + System.Composition.Runtime (>= 10.0.1) + System.Configuration.ConfigurationManager (10.0.1) + System.Diagnostics.EventLog (>= 10.0.1) + System.Security.Cryptography.ProtectedData (>= 10.0.1) + System.Diagnostics.EventLog (10.0.1) + System.IO.Pipelines (10.0.1) System.Memory (4.6.3) - System.Net.Primitives (4.3.1) - Microsoft.NETCore.Platforms (>= 1.1.1) - Microsoft.NETCore.Targets (>= 1.1.3) - System.Runtime (>= 4.3.1) - System.Runtime.Handles (>= 4.3) System.Numerics.Vectors (4.6.1) - System.Reflection.Metadata (9.0.10) - System.Reflection.MetadataLoadContext (9.0.10) - System.Runtime (4.3.1) - Microsoft.NETCore.Platforms (>= 1.1.1) - Microsoft.NETCore.Targets (>= 1.1.3) + System.Reflection.Metadata (10.0.1) + System.Reflection.MetadataLoadContext (10.0.1) System.Runtime.CompilerServices.Unsafe (6.1.2) - System.Runtime.Handles (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Security.Cryptography.ProtectedData (9.0.10) - System.Security.Principal (4.3) - System.Runtime (>= 4.3) - System.Text.Encoding (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) - System.Text.Encoding.CodePages (9.0.10) - System.Threading.Channels (9.0.10) - System.Threading.Tasks (4.3) - Microsoft.NETCore.Platforms (>= 1.1) - Microsoft.NETCore.Targets (>= 1.1) - System.Runtime (>= 4.3) + System.Security.Cryptography.ProtectedData (10.0.1) + System.Text.Encoding.CodePages (10.0.1) + System.Threading.Channels (10.0.1) System.Threading.Tasks.Extensions (4.6.3) - System.Threading.ThreadPool (4.3) - System.Runtime (>= 4.3) - System.Runtime.Handles (>= 4.3) xunit (2.9.3) xunit.analyzers (>= 1.18) xunit.assert (>= 2.9.3) xunit.core (2.9.3) xunit.abstractions (2.0.3) - xunit.analyzers (1.24) + xunit.analyzers (1.26) xunit.assert (2.9.3) xunit.core (2.9.3) xunit.extensibility.core (2.9.3) diff --git a/csharp/paket.main.bzl b/csharp/paket.main.bzl index 1ef6f63df8f..88131888227 100644 --- a/csharp/paket.main.bzl +++ b/csharp/paket.main.bzl @@ -7,75 +7,64 @@ def main(): nuget_repo( name = "paket.main", packages = [ - {"name": "Basic.CompilerLog.Util", "id": "Basic.CompilerLog.Util", "version": "0.9.21", "sha512": "sha512-l+Qbzh3nVaLLwZYgv/v5zIEdprseLgxcprHBvbNBzOyer7m6XD/N5GJC+FPChnSP48kK1/p7Nj7mvQH8d5NOtA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net462": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net47": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net471": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net472": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net48": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net5.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net6.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net7.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "net8.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension"], "net9.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "netcoreapp2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "netcoreapp2.2": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "netcoreapp3.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "netcoreapp3.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"], "netstandard2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "System.Buffers"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Humanizer.Core", "id": "Humanizer.Core", "version": "2.14.1", "sha512": "sha512-yzqGU/HKNLZ9Uvr6kvSc3wYV/S5O/IvklIUW5WF7MuivGLY8wS5IZnLPkt7D1KW8Et2Enl0I3Lzg2vGWM24Xsw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "MessagePack", "id": "MessagePack", "version": "3.1.4", "sha512": "sha512-O0JoklM97ru+Rqr1hGnlCbSAxi8MOk48pwoaT458RzboCHuAkQWTh+Of9MUoN3LE0Cb2tapku0FRPt2hnk+o0g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net6.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net7.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net8.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net9.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netcoreapp3.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "3.1.4", "sha512": "sha512-kIgD3A0OHs8+VUabMhIJT9ZF4oGHqjCocaRDmERI/Ds2hzJ5q3kcvzn5zI7V3CJ2NlQ4HDI80uh6zCqglwgQCQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "MessagePackAnalyzer", "id": "MessagePackAnalyzer", "version": "3.1.4", "sha512": "sha512-DFlhiA5fia4iK6i0S+L7sYMYmo5XRgWydKxiaxwz7tfcbvIhU7nmG4JzN1D9Y2XCEmLNExvNwTzXVEgURu4GnA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.Bcl.AsyncInterfaces", "id": "Microsoft.Bcl.AsyncInterfaces", "version": "9.0.10", "sha512": "sha512-Di823U3L+0A2YQGU1HqJC7Gh8o/nuSXle5u6QDgho9s920QbVk6BS5fKJ0s+pzW+WbqM9+aPUQ2DJsfP6tLdKg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Threading.Tasks.Extensions"], "net462": ["System.Threading.Tasks.Extensions"], "net47": ["System.Threading.Tasks.Extensions"], "net471": ["System.Threading.Tasks.Extensions"], "net472": ["System.Threading.Tasks.Extensions"], "net48": ["System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.Bcl.Memory", "id": "Microsoft.Bcl.Memory", "version": "9.0.10", "sha512": "sha512-BZV+TVnrDf9O+Ak5gN47uOkECCtpiVq6MpEYX5lQcG1WFD6/Bnx5eyfueX9giDQPEk6azzhSPTGmJcWNXRBc+Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.Build", "id": "Microsoft.Build", "version": "17.14.28", "sha512": "sha512-/J3DY36eYjSi/NYf/m4fS4HlxN8Zy+bCsopJUN0j4NNnrws4NR9ueWd0HKyhWEYYUa29Q1kjG1uKSGN1jBWg4g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.Build.Framework", "id": "Microsoft.Build.Framework", "version": "17.14.28", "sha512": "sha512-Gj4C8LNilfH6u6xu7QI/y0tkJCp3yQQpde/3qeK8E2FOfrZ4ENOoG/r2eKZws15bN6HPj09PhaJoqBhdbJdLpA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.Build.Utilities.Core", "id": "Microsoft.Build.Utilities.Core", "version": "17.14.28", "sha512": "sha512-A5uyO5HysGJRFR3IjjVKJ0Y69USn3E5Vlt/h51yID5Ynts4zHdh5ZELeU1gCoeF8i3tE21gO2u+QQLqQlb/iUg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net462": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net47": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net471": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Text.Encoding.CodePages", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Security.Cryptography.ProtectedData"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis", "id": "Microsoft.CodeAnalysis", "version": "4.14.0", "sha512": "sha512-eNBbL927Lc1Nh24ElWJmlGA928O9tu4mgWGOqmMFe6sskqQWCdnronCrrzwUdhBsBIjfx898MOCMOXuZQMtqOg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net9.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis.Analyzers", "id": "Microsoft.CodeAnalysis.Analyzers", "version": "3.11.0", "sha512": "sha512-tP9SLzLK72XCExlh8KXfrKbU6ycmZL3ExGl/a3Ml7LNy2Uaam7gFjjUmdzyTYkMXTyckCHHpzx7bD6BMumh8Bg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis.Common", "id": "Microsoft.CodeAnalysis.Common", "version": "4.14.0", "sha512": "sha512-k9AIzOrtcZVqr9+lmcEW0vY80emyXx5JB/757K0HUF96GeUeiTD+djOlFF2y7k4XPZo20Lru4tDgQos+VKBr0w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net462": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net47": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net471": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net472": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net48": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net5.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net6.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net7.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net8.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis.CSharp", "id": "Microsoft.CodeAnalysis.CSharp", "version": "4.14.0", "sha512": "sha512-kqS2NihVvNQHxzLePtyYiiJmFzoYO9Wm46O9DhfUgIIf5NwTbvSy66kV9EM+qAHmGpi7zQy4w8JU6DFnPlAyTA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis.CSharp.Workspaces", "id": "Microsoft.CodeAnalysis.CSharp.Workspaces", "version": "4.14.0", "sha512": "sha512-q9VD/wqMEGW0S5WIKuTZ4Wr9EpsZJQrQxqCodxjlsfW0bWl7mOQ4zA7k0Nf80ZrEe7Edaz6+3SBvrALiUcaHzA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata", "System.Threading.Channels"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata", "System.Threading.Channels"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis.VisualBasic", "id": "Microsoft.CodeAnalysis.VisualBasic", "version": "4.14.0", "sha512": "sha512-vXhNyQk07THoSHzsu/fM48tFFHYAZQumfT7uDJuL/5ZO4CRgJK9Zr6UOJOwX1Df8N//lRMeymYyT+qiAmnWiYA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "id": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "version": "4.14.0", "sha512": "sha512-LZMVjjbRTcKOtgVDz/sZn+AXBNGL4iKYnWwu5eOvvRcdXaLNlOA7bYtTZOnSMlqig7b/3gMzkoaLqcJ+7hgddg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata", "System.Threading.Channels"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata", "System.Threading.Channels"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeAnalysis.Workspaces.Common", "id": "Microsoft.CodeAnalysis.Workspaces.Common", "version": "4.14.0", "sha512": "sha512-m/c+FWBNr/JgCYRJ/jh14U9oAtPxHTgDiujb+19QG1AA3KMNZed+UQ51PRSaOt9CbIoMubZp2AkUMSeioz4EHQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "18.0.0", "sha512": "sha512-HT0zpIWW9Q0Csllqo7lefZ27HE6dl5gfh7NA4FPZjEURenH2GsvpRSZ63b1d3klDphxiX8bpxKwVSzyURhhgkQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.Extensions.ObjectPool", "id": "Microsoft.Extensions.ObjectPool", "version": "9.0.10", "sha512": "sha512-mx7sdMdkCBJuJQkSEaV9wQaB39+ciVUX0VCB7YrqAGvxyBkLRR0mgl9v7j4c6lVMeRZH79FgKOy1WaQbSyhVKA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.NET.StringTools", "id": "Microsoft.NET.StringTools", "version": "17.14.28", "sha512": "sha512-oJDGPNoVuWOmKTPpFK0lJnVwbLMRsm2oxgxBFOMKBYzSZtmiS0kcoednhArAeAicV2aSUFiuor1pw7JK/p2LwQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "18.0.0", "sha512": "sha512-+0iHCuP77nxZLLfEhCNDMOcy8+qC7IFtsLrSwSzp0qc7pUs2J28Stu2c+m9AEKkKdvhsMKB/AhlFOSyeOpdKVg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.NETCore.Platforms", "id": "Microsoft.NETCore.Platforms", "version": "7.0.4", "sha512": "sha512-mcQWjuDBh4WHGG4WcBI0k025WAdA2afMm6fs42sm1f+3gRyNQUiuMVT5gAWNUGSHmlu6qn/TCnAQpfl4Gm6cBw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.NETCore.Targets", "id": "Microsoft.NETCore.Targets", "version": "5.0.0", "sha512": "sha512-hYHm3JAjQO/nySxcl1EpZhYEW+2P3H1eLZNr+QxgO5TnLS6hqtfi5WchjQzjid45MYmhy2X7IOmcWtDP4fpMGw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "18.0.0", "sha512": "sha512-/ShCZQuIxaxzGjRQqCYTLD/KnG1yQKsNZXDUtjO2d55IOB8FEyhXleLw2hw8QlK/1gkblyJsp4BfQ8BQFaEAlg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "18.0.0", "sha512": "sha512-9IZUooXUUnh+z04QtWCu5iku4D4FAfJajP1su+I6741AxXa0bnXPo2125vqjvK0Khfsk16zskgDpG6vf2Mjubg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net9.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.Win32.Primitives", "id": "Microsoft.Win32.Primitives", "version": "4.3.0", "sha512": "sha512-Nm8Hp51y9tYcK3xD6qk43Wjftrg1mdH24CCJsTb6gr7HS21U1uA+CKPGEtUcVZbjU1y8Kynzm5eoJ7Pnx5gm8A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Mono.Posix.NETStandard", "id": "Mono.Posix.NETStandard", "version": "1.0.0", "sha512": "sha512-RtGiutQZJAmajvQ0QvBvh73VJye85iW9f9tjZlzF88idLxNMo4lAktP/4Y9ilCpais0LDO0tpoICt9Hdv6wooA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "MSBuild.StructuredLogger", "id": "MSBuild.StructuredLogger", "version": "2.3.71", "sha512": "sha512-u2Tw1WLYy+2VdccrQWyN3AY8zcFj4evfwqWMd7aBiicX3eGfkWkME7lsh9K2XS/+S8KVkjGNPI/g78E2A7Zx0g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "NaturalSort.Extension", "id": "NaturalSort.Extension", "version": "4.4.0", "sha512": "sha512-lcwYGJO2xZylcLW6B64tp6wE9UAt6fSn6el8MSAly5+6QG1vc/9uXQz+dsi69q1DxFv2TOaWrrheHNzg4yvy3Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Newtonsoft.Json", "id": "Newtonsoft.Json", "version": "13.0.4", "sha512": "sha512-bR+v+E/yJ6g7GV2uXw2OrUSjYYfjLkOLC8JD4kCS23msLapnKtdJPBJA75fwHH++ErIffeIqzYITLxAur4KAXA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Buffers", "id": "System.Buffers", "version": "4.6.1", "sha512": "sha512-qve/dFwECwehSWlZmpkrrlIeATCvo/Hw2koyMrUVcDBy5gXAQrnwX8pHEoqgj8DgkrWuWW1DrQbFqoMbo+Fvrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Collections.Immutable", "id": "System.Collections.Immutable", "version": "9.0.10", "sha512": "sha512-00LI4a7blU063Z0lCdRVLlh0Mzl1yYLZaxlOZe0MiNH+TELklX0Mne/XKU7UuCZQQh6FHrcEUPDjxIsy2jZUxg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Composition", "id": "System.Composition", "version": "9.0.10", "sha512": "sha512-PyUH0f6tdjlQBntP/73cqaR53fjAZkaqGRatIi1BgZIfQH/Z0k1rPHaklBZqFV5+wKUkL74+49TrFPnB/zw+2Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net462": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net47": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net471": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net472": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net48": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Composition.AttributedModel", "id": "System.Composition.AttributedModel", "version": "9.0.10", "sha512": "sha512-9Gx8SRD1DJcQLca7ZaeMjU+qUd4EdxDj6urKR4TizWx+NM7L+beoAn07XCKkdJsweqF6gUK7el93DhUbpssSqA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Composition.Convention", "id": "System.Composition.Convention", "version": "9.0.10", "sha512": "sha512-hzvwytBYpKoDX+OJpHXKoupR+BYy+QCUY5vSWOTvJLagAm3zYJKxAUR3l8OyPy46tnQ+3lK/6f5DeLHiTfbIIw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel"], "net462": ["System.Composition.AttributedModel"], "net47": ["System.Composition.AttributedModel"], "net471": ["System.Composition.AttributedModel"], "net472": ["System.Composition.AttributedModel"], "net48": ["System.Composition.AttributedModel"], "net5.0": ["System.Composition.AttributedModel"], "net6.0": ["System.Composition.AttributedModel"], "net7.0": ["System.Composition.AttributedModel"], "net8.0": ["System.Composition.AttributedModel"], "net9.0": ["System.Composition.AttributedModel"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel"], "netcoreapp2.1": ["System.Composition.AttributedModel"], "netcoreapp2.2": ["System.Composition.AttributedModel"], "netcoreapp3.0": ["System.Composition.AttributedModel"], "netcoreapp3.1": ["System.Composition.AttributedModel"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel"], "netstandard2.1": ["System.Composition.AttributedModel"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Composition.Hosting", "id": "System.Composition.Hosting", "version": "9.0.10", "sha512": "sha512-fPTM06IdvHrFIRJyYEpVKl5W7UTT4U3E+iiAVg3DFfuQ4Abe4XVhkoHn3DB4pUTOU2RpVc2+PxQ6y9hULPta1A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.Runtime"], "net462": ["System.Composition.Runtime"], "net47": ["System.Composition.Runtime"], "net471": ["System.Composition.Runtime"], "net472": ["System.Composition.Runtime"], "net48": ["System.Composition.Runtime"], "net5.0": ["System.Composition.Runtime"], "net6.0": ["System.Composition.Runtime"], "net7.0": ["System.Composition.Runtime"], "net8.0": ["System.Composition.Runtime"], "net9.0": ["System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.Runtime"], "netstandard2.1": ["System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Composition.Runtime", "id": "System.Composition.Runtime", "version": "9.0.10", "sha512": "sha512-8iDtNLXkjiFwir6Ocrm4XCC19Jzj06OHTvDeL6BZ4guWhCCGRCl6nWJVPonq6G2kZmNiDfraOwC8RgV5qPAAjg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Composition.TypedParts", "id": "System.Composition.TypedParts", "version": "9.0.10", "sha512": "sha512-7OUDlDYszrhjJ8/r5na3N07XzBWl8e6/87dyGoDraDHlkl+APL4dbZ8TfniaXLJxZabDHVaaMLpViiIf+Fb9Ng==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net462": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net47": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net471": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net472": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net48": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Configuration.ConfigurationManager", "id": "System.Configuration.ConfigurationManager", "version": "9.0.10", "sha512": "sha512-/LM2cc6vZulHDcDsd+9vntVD9j953k8WCCzB4Fea6YxOoIexpGP8iJhC7v13hKN5V66MDprjCJRjHHhDaDuOXw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Security.Cryptography.ProtectedData"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Security.Cryptography.ProtectedData"], "net6.0": ["System.Security.Cryptography.ProtectedData"], "net7.0": ["System.Security.Cryptography.ProtectedData"], "net8.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net9.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.1": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.2": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.1": ["System.Security.Cryptography.ProtectedData"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Security.Cryptography.ProtectedData"], "netstandard2.1": ["System.Security.Cryptography.ProtectedData"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Diagnostics.EventLog", "id": "System.Diagnostics.EventLog", "version": "9.0.10", "sha512": "sha512-3rC2TD7/ikgwu5Z7BzViMVDDp7RGyaej8pvVDzhy6rI7QZ9+x6DPiOPD5y4FjePxTLh/rFjMNcP7nG9IHWsB2Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.IO", "id": "System.IO", "version": "4.3.0", "sha512": "sha512-v8paIePhmGuXZbE9xvvNb4uJ5ME4OFXR1+8la/G/L1GIl2nbU2WFnddgb79kVK3U2us7q1aZT/uY/R0D/ovB5g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard": [], "netstandard1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Text.Encoding", "System.Threading.Tasks"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.IO.FileSystem", "id": "System.IO.FileSystem", "version": "4.3.0", "sha512": "sha512-T7WB1vhblSmgkaDpdGM3Uqo55Qsr5sip5eyowrwiXOoHBkzOx3ePd9+Zh97r9NzOwFCxqX7awO6RBxQuao7n7g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": ["System.IO.FileSystem.Primitives"], "net461": ["System.IO.FileSystem.Primitives"], "net462": ["System.IO.FileSystem.Primitives"], "net47": ["System.IO.FileSystem.Primitives"], "net471": ["System.IO.FileSystem.Primitives"], "net472": ["System.IO.FileSystem.Primitives"], "net48": ["System.IO.FileSystem.Primitives"], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.IO", "System.IO.FileSystem.Primitives", "System.Runtime", "System.Runtime.Handles", "System.Text.Encoding", "System.Threading.Tasks"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.IO.FileSystem.Primitives", "id": "System.IO.FileSystem.Primitives", "version": "4.3.0", "sha512": "sha512-WIWVPQlYLP/Zc9I6IakpBk1y8ryVGK83MtZx//zGKKi2hvHQWKAB7moRQCOz5Is/wNDksiYpocf3FeA3le6e5Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Runtime"], "net6.0": ["System.Runtime"], "net7.0": ["System.Runtime"], "net8.0": ["System.Runtime"], "net9.0": ["System.Runtime"], "netcoreapp1.0": ["System.Runtime"], "netcoreapp1.1": ["System.Runtime"], "netcoreapp2.0": ["System.Runtime"], "netcoreapp2.1": ["System.Runtime"], "netcoreapp2.2": ["System.Runtime"], "netcoreapp3.0": ["System.Runtime"], "netcoreapp3.1": ["System.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": ["System.Runtime"], "netstandard1.4": ["System.Runtime"], "netstandard1.5": ["System.Runtime"], "netstandard1.6": ["System.Runtime"], "netstandard2.0": ["System.Runtime"], "netstandard2.1": ["System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.IO.Pipelines", "id": "System.IO.Pipelines", "version": "9.0.10", "sha512": "sha512-kQg8x+mbt8Xi1mwm32DVEz6DtfqKn9XUGziGQvdNJ2QEGWvufcZfRWtxAf9nB+/B1FT1x7W4Wh2Fr9lcKlVWPA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net462": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net47": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net471": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net472": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net7.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Memory", "id": "System.Memory", "version": "4.6.3", "sha512": "sha512-NXcNYlWoXe5cz9sb8Huo6x2dCZVYkhwKtgE00n/MoI8V4ZI/7/t+EI5bOhQFlZfFjjqM8+U6prjU/aARt7H/tA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Net.Primitives", "id": "System.Net.Primitives", "version": "4.3.1", "sha512": "sha512-BgdlyYCI7rrdh36p3lMTqbkvaafPETpB1bk9iQlFdQxYE692kiXvmseXs8ghL+gEgQF2xgDc8GH4QLkSgUUs+Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netstandard": [], "netstandard1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime", "System.Runtime.Handles"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Numerics.Vectors", "id": "System.Numerics.Vectors", "version": "4.6.1", "sha512": "sha512-/rkvpUeUPlCY/2qYVQKiUsj5IKaXZcy2+SQAGAfemAdyEF5AgIgYOFNSTMWDXo09JWFX9HB+wV1yCyi2Mwi3TA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Reflection.Metadata", "id": "System.Reflection.Metadata", "version": "9.0.10", "sha512": "sha512-3ZztNrfQJww1qZ9UgdB5aTAYlAIWd5dMyyBagAC8jth6iG5vxawtaGbZJMh4xkL9A5v6Ng48YL+hAjt08GBWKQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Memory"], "net8.0": ["System.Collections.Immutable"], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Reflection.MetadataLoadContext", "id": "System.Reflection.MetadataLoadContext", "version": "9.0.10", "sha512": "sha512-qf9IjoUO2XfK4BTPhCIFDYAsiWtFCTpyiklmxoNK2Ys1wZdoVe5C3j5BH2ajSDWy2mAQcN1n+Eh/3uhd3oUcEA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net8.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Runtime", "id": "System.Runtime", "version": "4.3.1", "sha512": "sha512-Al69mPDfzdD+bKGK2HAfB+lNFOHFqnkqzNnUJmmvUe1/qEPK9M7EiTT4zuycKDPy7ev11xz8XVgJWKP0hm7NIA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard": [], "netstandard1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard1.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Runtime.CompilerServices.Unsafe", "id": "System.Runtime.CompilerServices.Unsafe", "version": "6.1.2", "sha512": "sha512-t2aXWJZBkAkRrTOnw31OBELKEVSDD5YvC3O5dXaHFsR66/nRTKm1y3Iq6NwFI5u5IlKrWYfdan66V+GKKkY8hQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Runtime.Handles", "id": "System.Runtime.Handles", "version": "4.3.0", "sha512": "sha512-CluvHdVUv54BvLTOCCyybugreDNk/rR8unMPruzXDtxSjvrQOU3M4R831/lQf4YI8VYp668FGQa/01E+Rq8PEQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Security.Cryptography.ProtectedData", "id": "System.Security.Cryptography.ProtectedData", "version": "9.0.10", "sha512": "sha512-yR8dvnme5ndA3L6Q6F/2N+4QBCi8sdfGWg9lmRVNBZO+evqIt323UdXMu8b8MnMYoyxXaml+vTEl74t5Nu7ABQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Memory"], "net6.0": ["System.Memory"], "net7.0": ["System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory"], "netcoreapp2.1": ["System.Memory"], "netcoreapp2.2": ["System.Memory"], "netcoreapp3.0": ["System.Memory"], "netcoreapp3.1": ["System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory"], "netstandard2.1": ["System.Memory"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Security.Principal", "id": "System.Security.Principal", "version": "4.3.0", "sha512": "sha512-24oe0NGJY32e+DFHVQzl2okM9uwYmn0Aa6nehqtVZ55/Al4Yva7S3BN934Kn5qATH7TVTUJkgxhisdfF7mKDfg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Runtime"], "net6.0": ["System.Runtime"], "net7.0": ["System.Runtime"], "net8.0": ["System.Runtime"], "net9.0": ["System.Runtime"], "netcoreapp1.0": ["System.Runtime"], "netcoreapp1.1": ["System.Runtime"], "netcoreapp2.0": ["System.Runtime"], "netcoreapp2.1": ["System.Runtime"], "netcoreapp2.2": ["System.Runtime"], "netcoreapp3.0": ["System.Runtime"], "netcoreapp3.1": ["System.Runtime"], "netstandard": [], "netstandard1.0": ["System.Runtime"], "netstandard1.1": ["System.Runtime"], "netstandard1.2": ["System.Runtime"], "netstandard1.3": ["System.Runtime"], "netstandard1.4": ["System.Runtime"], "netstandard1.5": ["System.Runtime"], "netstandard1.6": ["System.Runtime"], "netstandard2.0": ["System.Runtime"], "netstandard2.1": ["System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Text.Encoding", "id": "System.Text.Encoding", "version": "4.3.0", "sha512": "sha512-b/f+7HMTpxIfeV7H03bkuHKMFylCGfr9/U6gePnfFFW0aF8LOWLDgQCY6V1oWUqDksC3mdNuyChM1vy9TP4sZw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard": [], "netstandard1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Text.Encoding.CodePages", "id": "System.Text.Encoding.CodePages", "version": "9.0.10", "sha512": "sha512-LPoLnlvwb3D12yjwva2nvfzDqm4XNUBrAf/zQ5ad2IOqhTWqRm4GIXxlH4lSr3W/ET31aLtM4C4vHbr8sGEzWA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Threading.Channels", "id": "System.Threading.Channels", "version": "9.0.10", "sha512": "sha512-wMh3VX2qbwFg8rZllC1QsiXl4NjLkamNVT+O6bJG5V3sN6cwRZRza2v7f2ohFNGdGlViwUAO/PKSZgJfuJNXTg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Threading.Tasks", "id": "System.Threading.Tasks", "version": "4.3.0", "sha512": "sha512-fUiP+CyyCjs872OA8trl6p97qma/da1xGq3h4zAbJZk8zyaU4zyEfqW5vbkP80xG/Nimun1vlWBboMEk7XxdEw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard": [], "netstandard1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Threading.Tasks.Extensions", "id": "System.Threading.Tasks.Extensions", "version": "4.6.3", "sha512": "sha512-zWRHXIBnbfzQE1SamNoW9X5NjEcW/JNAtvVxGKd3bcg71wQVmoI3pDq+WUa2A+temXSNCm7707hmAFwwcYlK0A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "System.Threading.ThreadPool", "id": "System.Threading.ThreadPool", "version": "4.3.0", "sha512": "sha512-RQpA+UpI6Tlpeedk5JStYk2DM/M3i5HqabI/yDbfj1xDu9bIz9kdoquVpHbh/wQjOJaOCbcgRH8iQcAUv8dRWQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Runtime", "System.Runtime.Handles"], "net6.0": ["System.Runtime", "System.Runtime.Handles"], "net7.0": ["System.Runtime", "System.Runtime.Handles"], "net8.0": ["System.Runtime", "System.Runtime.Handles"], "net9.0": ["System.Runtime", "System.Runtime.Handles"], "netcoreapp1.0": ["System.Runtime", "System.Runtime.Handles"], "netcoreapp1.1": ["System.Runtime", "System.Runtime.Handles"], "netcoreapp2.0": ["System.Runtime", "System.Runtime.Handles"], "netcoreapp2.1": ["System.Runtime", "System.Runtime.Handles"], "netcoreapp2.2": ["System.Runtime", "System.Runtime.Handles"], "netcoreapp3.0": ["System.Runtime", "System.Runtime.Handles"], "netcoreapp3.1": ["System.Runtime", "System.Runtime.Handles"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": ["System.Runtime", "System.Runtime.Handles"], "netstandard1.4": ["System.Runtime", "System.Runtime.Handles"], "netstandard1.5": ["System.Runtime", "System.Runtime.Handles"], "netstandard1.6": ["System.Runtime", "System.Runtime.Handles"], "netstandard2.0": ["System.Runtime", "System.Runtime.Handles"], "netstandard2.1": ["System.Runtime", "System.Runtime.Handles"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit", "id": "xunit", "version": "2.9.3", "sha512": "sha512-3/ayVPC7NQWQENR5REbOgXYsbhoJsmpnxQa5pO4lxbjGbckOs62nsm4kLErzc8ng7V5Xz08uwVjMqaZGJiXCrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net20": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net30": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net35": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net40": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net403": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net45": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net451": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net452": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net46": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net461": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net462": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net47": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net471": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net472": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net48": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net5.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net6.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net7.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net8.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net9.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.3": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.4": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.5": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.6": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.abstractions", "id": "xunit.abstractions", "version": "2.0.3", "sha512": "sha512-PKJri5f0qEQPFvgY6CZR9XG8JROlWSdC/ZYLkkDQuID++Egn+yWjB+Yf57AZ8U6GRlP7z33uDQ4/r5BZPer2JA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.analyzers", "id": "xunit.analyzers", "version": "1.24.0", "sha512": "sha512-LiogS9RX6I4MHFN8V3dNgEQ4QJrtvtKq49h9k5NAOvmwcrbR1IeNMZvyuez3YITKAeF+ka9yVG3+OH6vApPB/A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.assert", "id": "xunit.assert", "version": "2.9.3", "sha512": "sha512-wfqwCKAhSWGy9P/dPqDGSIBnPW3sUJ49MEfcTqNF+5BgJwjwtHb9SE7ajYZuR8ymTd8dwxoEGnlJHiejbgDv9w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.core", "id": "xunit.core", "version": "2.9.3", "sha512": "sha512-cv2sO37qJkIbBL3fXDIn3EPQ2zK8LQ6FkMJNnn1xc9n8mo3ik0URA4MfUNCmwDDCx83ZiJeRrJ0y1ykasojNJg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net20": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net30": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net35": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net40": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net403": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net45": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net451": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net452": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net46": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net461": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net462": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net47": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net471": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net472": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net48": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net5.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net6.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net7.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net8.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net9.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp1.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp1.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.2": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp3.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp3.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.2": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.3": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.4": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.5": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.6": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard2.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard2.1": ["xunit.extensibility.core", "xunit.extensibility.execution"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.extensibility.core", "id": "xunit.extensibility.core", "version": "2.9.3", "sha512": "sha512-S0a+jmIF/DraKuJ+FfWbqXMwvpcKxjP3GdrQzz5pr3GYtgII2XfDdAhkU/5VIWqWon2R6Q31X/9sTGaU+koDaQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": ["xunit.abstractions"], "net451": ["xunit.abstractions"], "net452": ["xunit.abstractions"], "net46": ["xunit.abstractions"], "net461": ["xunit.abstractions"], "net462": ["xunit.abstractions"], "net47": ["xunit.abstractions"], "net471": ["xunit.abstractions"], "net472": ["xunit.abstractions"], "net48": ["xunit.abstractions"], "net5.0": ["xunit.abstractions"], "net6.0": ["xunit.abstractions"], "net7.0": ["xunit.abstractions"], "net8.0": ["xunit.abstractions"], "net9.0": ["xunit.abstractions"], "netcoreapp1.0": ["xunit.abstractions"], "netcoreapp1.1": ["xunit.abstractions"], "netcoreapp2.0": ["xunit.abstractions"], "netcoreapp2.1": ["xunit.abstractions"], "netcoreapp2.2": ["xunit.abstractions"], "netcoreapp3.0": ["xunit.abstractions"], "netcoreapp3.1": ["xunit.abstractions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": ["xunit.abstractions"], "netstandard1.2": ["xunit.abstractions"], "netstandard1.3": ["xunit.abstractions"], "netstandard1.4": ["xunit.abstractions"], "netstandard1.5": ["xunit.abstractions"], "netstandard1.6": ["xunit.abstractions"], "netstandard2.0": ["xunit.abstractions"], "netstandard2.1": ["xunit.abstractions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.extensibility.execution", "id": "xunit.extensibility.execution", "version": "2.9.3", "sha512": "sha512-IidoBSrGw/KhWzZsKXIcStohj/oRFZizbWeUv+0hOFLeMJMegSW5QoGNzmjQuF8BuRtCyPQQukWSYdNnnfPAkA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": ["xunit.extensibility.core"], "net451": ["xunit.extensibility.core"], "net452": ["xunit.extensibility.core"], "net46": ["xunit.extensibility.core"], "net461": ["xunit.extensibility.core"], "net462": ["xunit.extensibility.core"], "net47": ["xunit.extensibility.core"], "net471": ["xunit.extensibility.core"], "net472": ["xunit.extensibility.core"], "net48": ["xunit.extensibility.core"], "net5.0": ["xunit.extensibility.core"], "net6.0": ["xunit.extensibility.core"], "net7.0": ["xunit.extensibility.core"], "net8.0": ["xunit.extensibility.core"], "net9.0": ["xunit.extensibility.core"], "netcoreapp1.0": ["xunit.extensibility.core"], "netcoreapp1.1": ["xunit.extensibility.core"], "netcoreapp2.0": ["xunit.extensibility.core"], "netcoreapp2.1": ["xunit.extensibility.core"], "netcoreapp2.2": ["xunit.extensibility.core"], "netcoreapp3.0": ["xunit.extensibility.core"], "netcoreapp3.1": ["xunit.extensibility.core"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": ["xunit.extensibility.core"], "netstandard1.2": ["xunit.extensibility.core"], "netstandard1.3": ["xunit.extensibility.core"], "netstandard1.4": ["xunit.extensibility.core"], "netstandard1.5": ["xunit.extensibility.core"], "netstandard1.6": ["xunit.extensibility.core"], "netstandard2.0": ["xunit.extensibility.core"], "netstandard2.1": ["xunit.extensibility.core"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.runner.utility", "id": "xunit.runner.utility", "version": "2.9.3", "sha512": "sha512-L2zlPa7Ci/Awf5LdeTOvKOanev1bB6xV2Gxbrc+EDDN1hO/j0AIbu5PM8lXgkX69/8xaaex7zrxHZd8gcz2ilQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": ["xunit.abstractions"], "net40": ["xunit.abstractions"], "net403": ["xunit.abstractions"], "net45": ["xunit.abstractions"], "net451": ["xunit.abstractions"], "net452": ["xunit.abstractions"], "net46": ["xunit.abstractions"], "net461": ["xunit.abstractions"], "net462": ["xunit.abstractions"], "net47": ["xunit.abstractions"], "net471": ["xunit.abstractions"], "net472": ["xunit.abstractions"], "net48": ["xunit.abstractions"], "net5.0": ["xunit.abstractions"], "net6.0": ["xunit.abstractions"], "net7.0": ["xunit.abstractions"], "net8.0": ["xunit.abstractions"], "net9.0": ["xunit.abstractions"], "netcoreapp1.0": ["xunit.abstractions"], "netcoreapp1.1": ["xunit.abstractions"], "netcoreapp2.0": ["xunit.abstractions"], "netcoreapp2.1": ["xunit.abstractions"], "netcoreapp2.2": ["xunit.abstractions"], "netcoreapp3.0": ["xunit.abstractions"], "netcoreapp3.1": ["xunit.abstractions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": ["xunit.abstractions"], "netstandard1.2": ["xunit.abstractions"], "netstandard1.3": ["xunit.abstractions"], "netstandard1.4": ["xunit.abstractions"], "netstandard1.5": ["xunit.abstractions"], "netstandard1.6": ["xunit.abstractions"], "netstandard2.0": ["xunit.abstractions"], "netstandard2.1": ["xunit.abstractions"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "xunit.runner.visualstudio", "id": "xunit.runner.visualstudio", "version": "3.1.5", "sha512": "sha512-b/tvN9kXtUd3wSSYbC80Ic6y/dYlYbNSvatYiv71iozPhXqM4EaOuHujkIJh85b+wY6dgf25k9ENSy8jN6mlvQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.TestPlatform.ObjectModel"], "net48": ["Microsoft.TestPlatform.ObjectModel"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "Basic.CompilerLog.Util", "id": "Basic.CompilerLog.Util", "version": "0.9.25", "sha512": "sha512-AU428QscGy1Z9eM4WqAqlO19pRIyHPZ+K63jgKX+sBWFzVLHMlyc97RVdm8VUAqVVBauS7kwaiA3S1sE/mBr4w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net462": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net47": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net471": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net472": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net48": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net5.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net6.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net7.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "net8.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning"], "net9.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp2.2": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp3.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netcoreapp3.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"], "netstandard2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "NaturalSort.Extension", "NuGet.Versioning", "System.Buffers"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Humanizer.Core", "id": "Humanizer.Core", "version": "3.0.1", "sha512": "sha512-lcQ2HfNqHljfbalRLMKc8j4M0Og3qIvMSeyLp7KY58aCcgcZwiR0s5Uf2vrJ3p7OFGoWjcgbWATTpxqzrbuBSw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePack", "id": "MessagePack", "version": "3.1.4", "sha512": "sha512-O0JoklM97ru+Rqr1hGnlCbSAxi8MOk48pwoaT458RzboCHuAkQWTh+Of9MUoN3LE0Cb2tapku0FRPt2hnk+o0g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net6.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net7.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net8.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net9.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netcoreapp3.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "3.1.4", "sha512": "sha512-kIgD3A0OHs8+VUabMhIJT9ZF4oGHqjCocaRDmERI/Ds2hzJ5q3kcvzn5zI7V3CJ2NlQ4HDI80uh6zCqglwgQCQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePackAnalyzer", "id": "MessagePackAnalyzer", "version": "3.1.4", "sha512": "sha512-DFlhiA5fia4iK6i0S+L7sYMYmo5XRgWydKxiaxwz7tfcbvIhU7nmG4JzN1D9Y2XCEmLNExvNwTzXVEgURu4GnA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Bcl.AsyncInterfaces", "id": "Microsoft.Bcl.AsyncInterfaces", "version": "10.0.1", "sha512": "sha512-2SbGOdcRb04XU0XDlYH3o3a2Xu9w2kgkS5SXXru/YVvdpbLymqgen+JcYsPzf9IzLO4hFiZhKpBTJRe7fB885A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Threading.Tasks.Extensions"], "net462": ["System.Threading.Tasks.Extensions"], "net47": ["System.Threading.Tasks.Extensions"], "net471": ["System.Threading.Tasks.Extensions"], "net472": ["System.Threading.Tasks.Extensions"], "net48": ["System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Bcl.Memory", "id": "Microsoft.Bcl.Memory", "version": "10.0.1", "sha512": "sha512-e0Z3KEDQN0Q7HxmYBNuY2r1pCyaUl9T5AbtyC2v7Nnn+XcT2v41B+nnhGKesGUWo119e9Qq9wbOhh94Tm6kR/A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build", "id": "Microsoft.Build", "version": "18.0.2", "sha512": "sha512-/rRET3AtEAUTKFDboKvp/GTDxGwU7VBBfwaKeZtzGg+pyqYdvasHeR3ERTuoxSrgJqnu1J23xd4H481IiJFhnA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build.Framework", "id": "Microsoft.Build.Framework", "version": "18.0.2", "sha512": "sha512-cmXoGncAIrDZgu0NumtXJSTILv9NHU2sPhrlkckefMK1XCuJUrvClVxkmvQDpvm4sCKwSFolW2AanGCLNJ6xDw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build.Utilities.Core", "id": "Microsoft.Build.Utilities.Core", "version": "18.0.2", "sha512": "sha512-4f5DSPN/nLyGddOx2Etrjy42XFQ9tWeJ8lwJr/tLloRl/YRzT1kV+1txwRFXlav9V93wMOUrwMQqpnd131Sb+w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Configuration.ConfigurationManager", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework"], "net462": ["Microsoft.Build.Framework"], "net47": ["Microsoft.Build.Framework"], "net471": ["Microsoft.Build.Framework"], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Build.Framework"], "net6.0": ["Microsoft.Build.Framework"], "net7.0": ["Microsoft.Build.Framework"], "net8.0": ["Microsoft.Build.Framework"], "net9.0": ["Microsoft.Build.Framework"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework"], "netcoreapp2.1": ["Microsoft.Build.Framework"], "netcoreapp2.2": ["Microsoft.Build.Framework"], "netcoreapp3.0": ["Microsoft.Build.Framework"], "netcoreapp3.1": ["Microsoft.Build.Framework"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework"], "netstandard2.1": ["Microsoft.Build.Framework"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis", "id": "Microsoft.CodeAnalysis", "version": "5.0.0", "sha512": "sha512-ToXzcZLcHA9vT4e1A6jNafAPuTJj4osfqJck562Be8ByvzS78pY9I+SdO5yo2Kwka0lz++hOWypW1Qdf1TtR4w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net9.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.Analyzers", "id": "Microsoft.CodeAnalysis.Analyzers", "version": "3.11.0", "sha512": "sha512-tP9SLzLK72XCExlh8KXfrKbU6ycmZL3ExGl/a3Ml7LNy2Uaam7gFjjUmdzyTYkMXTyckCHHpzx7bD6BMumh8Bg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.Common", "id": "Microsoft.CodeAnalysis.Common", "version": "5.0.0", "sha512": "sha512-uK5yslTJQ2UznzYlttFuDCa/6KruN1aQW/ZNFFHvK+yyA6q7vZ5o0BSPvLj+Com1/R7wGJ07c2O0lPcbDrmQdw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net462": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net47": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net471": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net472": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net48": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net5.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net6.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net7.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net8.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.CSharp", "id": "Microsoft.CodeAnalysis.CSharp", "version": "5.0.0", "sha512": "sha512-wwT/CJOQyQ72Ldouy7gjS/3Vi92hbAAoU3Y0e/6mb39+Vp7aXr3PxuBD73U2QrK1zzgTyv3QhvJPrQX0EiWS8Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.CSharp.Workspaces", "id": "Microsoft.CodeAnalysis.CSharp.Workspaces", "version": "5.0.0", "sha512": "sha512-Fy0BNxco9b7XC7LKdTgq+Kk62HKapyEM05LN5ua3Nt6PZ4pzfAAh+9Dg/VW4aSflgYoiQw/mjnotgUuM9NP6Kw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.VisualBasic", "id": "Microsoft.CodeAnalysis.VisualBasic", "version": "5.0.0", "sha512": "sha512-jGrTRyHgUXYd0iH1wF4svuGnB/3kPerq+iIbaLq5XpNv2+3hbZPyyDla+k/Ylpur6+9ZsDoP0ymhribbgXLmYA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "id": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "version": "5.0.0", "sha512": "sha512-sgWa3mUtCHIfPcSCyKKksrZNlYnmKWeivbZdENrPLTJQXiKXCjFcVYaxRvGBcYeAQES5J63iV03XVviSkJyMqQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.Workspaces.Common", "id": "Microsoft.CodeAnalysis.Workspaces.Common", "version": "5.0.0", "sha512": "sha512-zbKJyIkFW+2Bx5eQl/IWBLmbPTpo9/UyAbt8vaVTXsoi4EYlXrJftCRZmUsmyQP7pg3qKMiR6czPdUjTadNkhA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "18.0.1", "sha512": "sha512-0bzrz+vR49E/jtdBySXaJSPP4plwnMHE2qsyJZgZJuDdIOtLUFswInVa7krxIVz2ur6KJZFdTPXr3WMXfgnDNg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Extensions.ObjectPool", "id": "Microsoft.Extensions.ObjectPool", "version": "10.0.1", "sha512": "sha512-dDQU1quroimptw3K9WSczyFrVmFYKEjeWXmba4BHHSEovYZw2TI77wIJTwrPHgk6j9ozE02AgjP0z0A8POZFwg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.NET.StringTools", "id": "Microsoft.NET.StringTools", "version": "18.0.2", "sha512": "sha512-s9BywFgRKhPV5OyY2t2EMQXfoDrvYSEzX4bHaWkZ/PwYJnxbxmLEqA/dh8MQ2mUOq48sGr3hbkgnghZQHeZc7Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "18.0.1", "sha512": "sha512-cfpn4IW0Q+emID8eUocS7xfmwwYgD/JX5S+zCZA2l7gcYzxZ1vvfcdZHcKkuzCH4gMbBYqcZqtBn9uZa0WJRUg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "18.0.1", "sha512": "sha512-qZKcsS5mN7GMwtpd+tRfAt4Dmg8yVbtWkm9iGfqY2GNOG2qW95NH6zf/FrTLXTiS7rB7zqihWGEcSspOaSK8TQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Reflection.Metadata"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "18.0.1", "sha512": "sha512-SX1FnYA8zcNv/lbWK3GjLnAx93jalmyHyQMVi+TNWA61R6xzkLMNpC3fotbfpDheXCFhwy/1rKoULyaOOe0jEg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net9.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.VisualStudio.SolutionPersistence", "id": "Microsoft.VisualStudio.SolutionPersistence", "version": "1.0.52", "sha512": "sha512-lHyMm5j5wRwVaC3vlCWrFH2FGy2SpFUZqLvYhzwf1cEUIQCUChU960h8kteFSf01ZkLSgJwrznmspwjW8kPtrA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Mono.Posix.NETStandard", "id": "Mono.Posix.NETStandard", "version": "1.0.0", "sha512": "sha512-RtGiutQZJAmajvQ0QvBvh73VJye85iW9f9tjZlzF88idLxNMo4lAktP/4Y9ilCpais0LDO0tpoICt9Hdv6wooA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MSBuild.StructuredLogger", "id": "MSBuild.StructuredLogger", "version": "2.3.113", "sha512": "sha512-FS/vecrCK5mq3v4OIyd90BU6x9clwoRzW6LiIfilSQZQBYp/E9/+G9LS2Q9nB1rHEhJ8kDWnsZdytEIsNAb4Jw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "NaturalSort.Extension", "id": "NaturalSort.Extension", "version": "4.4.1", "sha512": "sha512-UTrcQcgmn7pBdx+0Oi/NxlyPslWbMt7U8I1sg/4m36OkOCS+7QKZWY3O4dKcjHD2wQaBr9L2/XWnx3ViTaehZw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Newtonsoft.Json", "id": "Newtonsoft.Json", "version": "13.0.4", "sha512": "sha512-bR+v+E/yJ6g7GV2uXw2OrUSjYYfjLkOLC8JD4kCS23msLapnKtdJPBJA75fwHH++ErIffeIqzYITLxAur4KAXA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "NuGet.Versioning", "id": "NuGet.Versioning", "version": "7.0.1", "sha512": "sha512-ibGcrpgA8foidKNcnf+AQ4zEaVZu4OyWjcPITii6mNgwt2uhd8VFsEq7/Mb0KDxrEJaew+nWJQb7Ju166SAyzw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Buffers", "id": "System.Buffers", "version": "4.6.1", "sha512": "sha512-qve/dFwECwehSWlZmpkrrlIeATCvo/Hw2koyMrUVcDBy5gXAQrnwX8pHEoqgj8DgkrWuWW1DrQbFqoMbo+Fvrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Collections.Immutable", "id": "System.Collections.Immutable", "version": "10.0.1", "sha512": "sha512-JdD3TbINwQPseS67IR4oTJHb0KGxwnaT/j3A/VWqoKhvBIqTBgWK08UhDn7mcKEozKIfeSUWspmpW9kE2EgsHQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition", "id": "System.Composition", "version": "10.0.1", "sha512": "sha512-N6NIjCYQpESjd6TSFlaZwbNrV7ZuLZuVBv/5/UuyX2z2zI+zr9lmbCXMN9IEa6gKSu561gsGjveEXAPCY1u6Ug==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net462": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net47": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net471": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net472": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net48": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.AttributedModel", "id": "System.Composition.AttributedModel", "version": "10.0.1", "sha512": "sha512-1YnM6Ly+qKW62DGTz9Ew+vaYpB7Y3d6R+oxaOgdJwp6vlHP9oUNsL7hD12+ugoGheWcg8Ld+X63wI8/XbLaUxA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Convention", "id": "System.Composition.Convention", "version": "10.0.1", "sha512": "sha512-/ugIOC1IAYV2+waaSutJXMvAe5cGG9bP+dKt9oGiXdAFJ3cUFqJdxwQJJSeDZ4OQ220aj6EYErDewWxUoo0QHQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel"], "net462": ["System.Composition.AttributedModel"], "net47": ["System.Composition.AttributedModel"], "net471": ["System.Composition.AttributedModel"], "net472": ["System.Composition.AttributedModel"], "net48": ["System.Composition.AttributedModel"], "net5.0": ["System.Composition.AttributedModel"], "net6.0": ["System.Composition.AttributedModel"], "net7.0": ["System.Composition.AttributedModel"], "net8.0": ["System.Composition.AttributedModel"], "net9.0": ["System.Composition.AttributedModel"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel"], "netcoreapp2.1": ["System.Composition.AttributedModel"], "netcoreapp2.2": ["System.Composition.AttributedModel"], "netcoreapp3.0": ["System.Composition.AttributedModel"], "netcoreapp3.1": ["System.Composition.AttributedModel"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel"], "netstandard2.1": ["System.Composition.AttributedModel"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Hosting", "id": "System.Composition.Hosting", "version": "10.0.1", "sha512": "sha512-LVw0GhK+7IJLeIgggvNh7wu3I3MkOBdq+O3SUA378mQeLKjwR8ElsPvyq3rqaO+de38pVl0oFt0Fz/fU/Jox4A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.Runtime"], "net462": ["System.Composition.Runtime"], "net47": ["System.Composition.Runtime"], "net471": ["System.Composition.Runtime"], "net472": ["System.Composition.Runtime"], "net48": ["System.Composition.Runtime"], "net5.0": ["System.Composition.Runtime"], "net6.0": ["System.Composition.Runtime"], "net7.0": ["System.Composition.Runtime"], "net8.0": ["System.Composition.Runtime"], "net9.0": ["System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.Runtime"], "netstandard2.1": ["System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Runtime", "id": "System.Composition.Runtime", "version": "10.0.1", "sha512": "sha512-HYfhfKira/soAn1h3e3pOctNx5WTAZMdGFbF5rO55oXXRzzFtBoujTEjGYCyJVj8jKezGZVvIZNr1N2bmqc3sQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.TypedParts", "id": "System.Composition.TypedParts", "version": "10.0.1", "sha512": "sha512-AfgzCNetIffOWMnRo2szRGaeV6YZTpS0zrkZj5/6BWWaF2qgGllTtZOBBiZqA57tVDUoVUNf/LP1I6Lt1xkrAw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net462": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net47": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net471": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net472": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net48": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Configuration.ConfigurationManager", "id": "System.Configuration.ConfigurationManager", "version": "10.0.1", "sha512": "sha512-E6SRJRaRweplupgFl3IRfNZ/AeCCb+6/FNeXpG6Wgj0mzKs7EAUoJTn0V+8c+SwffVifZRz9+bvNL/hKVddkyg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Security.Cryptography.ProtectedData"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Security.Cryptography.ProtectedData"], "net6.0": ["System.Security.Cryptography.ProtectedData"], "net7.0": ["System.Security.Cryptography.ProtectedData"], "net8.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net9.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.1": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.2": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.1": ["System.Security.Cryptography.ProtectedData"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Security.Cryptography.ProtectedData"], "netstandard2.1": ["System.Security.Cryptography.ProtectedData"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Diagnostics.EventLog", "id": "System.Diagnostics.EventLog", "version": "10.0.1", "sha512": "sha512-Q1RjaIGlmcSUWEjPkIq6eUd/O5FVR9Kgseq/cPPldpdkRWK/GO5HkDE7B4Az1tVVjDiY/UnpRLQy2e/pH5nr1g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.IO.Pipelines", "id": "System.IO.Pipelines", "version": "10.0.1", "sha512": "sha512-hiEzKxYthGSjhsrnW/D4jCxBbE+lDG01KvAf3Iv7cQjpNU9ZoVo25Ukedth0LRymKpWcsTs3Fuawu9O6+Gnr5g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net462": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net47": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net471": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net472": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net7.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Memory", "id": "System.Memory", "version": "4.6.3", "sha512": "sha512-NXcNYlWoXe5cz9sb8Huo6x2dCZVYkhwKtgE00n/MoI8V4ZI/7/t+EI5bOhQFlZfFjjqM8+U6prjU/aARt7H/tA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Numerics.Vectors", "id": "System.Numerics.Vectors", "version": "4.6.1", "sha512": "sha512-/rkvpUeUPlCY/2qYVQKiUsj5IKaXZcy2+SQAGAfemAdyEF5AgIgYOFNSTMWDXo09JWFX9HB+wV1yCyi2Mwi3TA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Reflection.Metadata", "id": "System.Reflection.Metadata", "version": "10.0.1", "sha512": "sha512-wY+305y+G3F14m0ba1znntQaZZSGDeCkUYJu1MP4ms0yer0wjx1lDr9PV+3PPXF1FJaKZqynUPzh5S0Oud2OHg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable"], "net462": ["System.Collections.Immutable"], "net47": ["System.Collections.Immutable"], "net471": ["System.Collections.Immutable"], "net472": ["System.Collections.Immutable"], "net48": ["System.Collections.Immutable"], "net5.0": ["System.Collections.Immutable"], "net6.0": ["System.Collections.Immutable"], "net7.0": ["System.Collections.Immutable"], "net8.0": ["System.Collections.Immutable"], "net9.0": ["System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable"], "netcoreapp2.1": ["System.Collections.Immutable"], "netcoreapp2.2": ["System.Collections.Immutable"], "netcoreapp3.0": ["System.Collections.Immutable"], "netcoreapp3.1": ["System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable"], "netstandard2.1": ["System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Reflection.MetadataLoadContext", "id": "System.Reflection.MetadataLoadContext", "version": "10.0.1", "sha512": "sha512-PhPuIrzG9J6x9stz1ItEOOO+avF41vmPMrvVCGZvIdNUym5i7fepNQsegXfAWYNl8Am8hswj+Gv4eIl9y3gy/Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net8.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Runtime.CompilerServices.Unsafe", "id": "System.Runtime.CompilerServices.Unsafe", "version": "6.1.2", "sha512": "sha512-t2aXWJZBkAkRrTOnw31OBELKEVSDD5YvC3O5dXaHFsR66/nRTKm1y3Iq6NwFI5u5IlKrWYfdan66V+GKKkY8hQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Security.Cryptography.ProtectedData", "id": "System.Security.Cryptography.ProtectedData", "version": "10.0.1", "sha512": "sha512-ktT9zhhc2gGmPFGOCy6m+eqnY/yBEnaSanjINTDmF4zqNmSteydGR/Hebaf1IkNOGWs2jrkXvovWO86omwLGQA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Memory"], "net6.0": ["System.Memory"], "net7.0": ["System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory"], "netcoreapp2.1": ["System.Memory"], "netcoreapp2.2": ["System.Memory"], "netcoreapp3.0": ["System.Memory"], "netcoreapp3.1": ["System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory"], "netstandard2.1": ["System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Text.Encoding.CodePages", "id": "System.Text.Encoding.CodePages", "version": "10.0.1", "sha512": "sha512-iRoZmmRaI0ZLsMd9+ESdBWZX/tYhM9kozmutE53ZJCiGFXQ7aYaD1Q6LJU8UCDclB+4kY2VfFBRNcIU87jsdgw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Threading.Channels", "id": "System.Threading.Channels", "version": "10.0.1", "sha512": "sha512-zRRdonHIIJHLwFRDMynwD8zZRpkF+FOFz3kqsTO0Az36YBoRsDVjrhnH79P2+UUFl4eBAbgr9U/m7qFtNBtbnA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Threading.Tasks.Extensions", "id": "System.Threading.Tasks.Extensions", "version": "4.6.3", "sha512": "sha512-zWRHXIBnbfzQE1SamNoW9X5NjEcW/JNAtvVxGKd3bcg71wQVmoI3pDq+WUa2A+temXSNCm7707hmAFwwcYlK0A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit", "id": "xunit", "version": "2.9.3", "sha512": "sha512-3/ayVPC7NQWQENR5REbOgXYsbhoJsmpnxQa5pO4lxbjGbckOs62nsm4kLErzc8ng7V5Xz08uwVjMqaZGJiXCrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net11": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net20": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net30": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net35": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net40": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net403": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net45": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net451": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net452": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net46": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net461": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net462": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net47": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net471": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net472": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net48": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net5.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net6.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net7.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net8.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net9.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.3": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.4": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.5": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.6": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.abstractions", "id": "xunit.abstractions", "version": "2.0.3", "sha512": "sha512-PKJri5f0qEQPFvgY6CZR9XG8JROlWSdC/ZYLkkDQuID++Egn+yWjB+Yf57AZ8U6GRlP7z33uDQ4/r5BZPer2JA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.analyzers", "id": "xunit.analyzers", "version": "1.26.0", "sha512": "sha512-gJ6shgzXmTVaWJsRCpWrfp1ymSSIwjandPL5myGv3wt+96TkARHFUV1bAS4omFPPkSLkFV7nOssjCeEIorPE+w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.assert", "id": "xunit.assert", "version": "2.9.3", "sha512": "sha512-wfqwCKAhSWGy9P/dPqDGSIBnPW3sUJ49MEfcTqNF+5BgJwjwtHb9SE7ajYZuR8ymTd8dwxoEGnlJHiejbgDv9w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.core", "id": "xunit.core", "version": "2.9.3", "sha512": "sha512-cv2sO37qJkIbBL3fXDIn3EPQ2zK8LQ6FkMJNnn1xc9n8mo3ik0URA4MfUNCmwDDCx83ZiJeRrJ0y1ykasojNJg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net11": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net20": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net30": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net35": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net40": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net403": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net45": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net451": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net452": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net46": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net461": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net462": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net47": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net471": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net472": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net48": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net5.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net6.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net7.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net8.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "net9.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp1.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp1.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp2.2": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp3.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netcoreapp3.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.1": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.2": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.3": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.4": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.5": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard1.6": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard2.0": ["xunit.extensibility.core", "xunit.extensibility.execution"], "netstandard2.1": ["xunit.extensibility.core", "xunit.extensibility.execution"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.extensibility.core", "id": "xunit.extensibility.core", "version": "2.9.3", "sha512": "sha512-S0a+jmIF/DraKuJ+FfWbqXMwvpcKxjP3GdrQzz5pr3GYtgII2XfDdAhkU/5VIWqWon2R6Q31X/9sTGaU+koDaQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.abstractions"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": ["xunit.abstractions"], "net451": ["xunit.abstractions"], "net452": ["xunit.abstractions"], "net46": ["xunit.abstractions"], "net461": ["xunit.abstractions"], "net462": ["xunit.abstractions"], "net47": ["xunit.abstractions"], "net471": ["xunit.abstractions"], "net472": ["xunit.abstractions"], "net48": ["xunit.abstractions"], "net5.0": ["xunit.abstractions"], "net6.0": ["xunit.abstractions"], "net7.0": ["xunit.abstractions"], "net8.0": ["xunit.abstractions"], "net9.0": ["xunit.abstractions"], "netcoreapp1.0": ["xunit.abstractions"], "netcoreapp1.1": ["xunit.abstractions"], "netcoreapp2.0": ["xunit.abstractions"], "netcoreapp2.1": ["xunit.abstractions"], "netcoreapp2.2": ["xunit.abstractions"], "netcoreapp3.0": ["xunit.abstractions"], "netcoreapp3.1": ["xunit.abstractions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": ["xunit.abstractions"], "netstandard1.2": ["xunit.abstractions"], "netstandard1.3": ["xunit.abstractions"], "netstandard1.4": ["xunit.abstractions"], "netstandard1.5": ["xunit.abstractions"], "netstandard1.6": ["xunit.abstractions"], "netstandard2.0": ["xunit.abstractions"], "netstandard2.1": ["xunit.abstractions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.extensibility.execution", "id": "xunit.extensibility.execution", "version": "2.9.3", "sha512": "sha512-IidoBSrGw/KhWzZsKXIcStohj/oRFZizbWeUv+0hOFLeMJMegSW5QoGNzmjQuF8BuRtCyPQQukWSYdNnnfPAkA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.extensibility.core"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": ["xunit.extensibility.core"], "net451": ["xunit.extensibility.core"], "net452": ["xunit.extensibility.core"], "net46": ["xunit.extensibility.core"], "net461": ["xunit.extensibility.core"], "net462": ["xunit.extensibility.core"], "net47": ["xunit.extensibility.core"], "net471": ["xunit.extensibility.core"], "net472": ["xunit.extensibility.core"], "net48": ["xunit.extensibility.core"], "net5.0": ["xunit.extensibility.core"], "net6.0": ["xunit.extensibility.core"], "net7.0": ["xunit.extensibility.core"], "net8.0": ["xunit.extensibility.core"], "net9.0": ["xunit.extensibility.core"], "netcoreapp1.0": ["xunit.extensibility.core"], "netcoreapp1.1": ["xunit.extensibility.core"], "netcoreapp2.0": ["xunit.extensibility.core"], "netcoreapp2.1": ["xunit.extensibility.core"], "netcoreapp2.2": ["xunit.extensibility.core"], "netcoreapp3.0": ["xunit.extensibility.core"], "netcoreapp3.1": ["xunit.extensibility.core"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": ["xunit.extensibility.core"], "netstandard1.2": ["xunit.extensibility.core"], "netstandard1.3": ["xunit.extensibility.core"], "netstandard1.4": ["xunit.extensibility.core"], "netstandard1.5": ["xunit.extensibility.core"], "netstandard1.6": ["xunit.extensibility.core"], "netstandard2.0": ["xunit.extensibility.core"], "netstandard2.1": ["xunit.extensibility.core"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.runner.utility", "id": "xunit.runner.utility", "version": "2.9.3", "sha512": "sha512-L2zlPa7Ci/Awf5LdeTOvKOanev1bB6xV2Gxbrc+EDDN1hO/j0AIbu5PM8lXgkX69/8xaaex7zrxHZd8gcz2ilQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.abstractions"], "net11": [], "net20": [], "net30": [], "net35": ["xunit.abstractions"], "net40": ["xunit.abstractions"], "net403": ["xunit.abstractions"], "net45": ["xunit.abstractions"], "net451": ["xunit.abstractions"], "net452": ["xunit.abstractions"], "net46": ["xunit.abstractions"], "net461": ["xunit.abstractions"], "net462": ["xunit.abstractions"], "net47": ["xunit.abstractions"], "net471": ["xunit.abstractions"], "net472": ["xunit.abstractions"], "net48": ["xunit.abstractions"], "net5.0": ["xunit.abstractions"], "net6.0": ["xunit.abstractions"], "net7.0": ["xunit.abstractions"], "net8.0": ["xunit.abstractions"], "net9.0": ["xunit.abstractions"], "netcoreapp1.0": ["xunit.abstractions"], "netcoreapp1.1": ["xunit.abstractions"], "netcoreapp2.0": ["xunit.abstractions"], "netcoreapp2.1": ["xunit.abstractions"], "netcoreapp2.2": ["xunit.abstractions"], "netcoreapp3.0": ["xunit.abstractions"], "netcoreapp3.1": ["xunit.abstractions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": ["xunit.abstractions"], "netstandard1.2": ["xunit.abstractions"], "netstandard1.3": ["xunit.abstractions"], "netstandard1.4": ["xunit.abstractions"], "netstandard1.5": ["xunit.abstractions"], "netstandard1.6": ["xunit.abstractions"], "netstandard2.0": ["xunit.abstractions"], "netstandard2.1": ["xunit.abstractions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "xunit.runner.visualstudio", "id": "xunit.runner.visualstudio", "version": "3.1.5", "sha512": "sha512-b/tvN9kXtUd3wSSYbC80Ic6y/dYlYbNSvatYiv71iozPhXqM4EaOuHujkIJh85b+wY6dgf25k9ENSy8jN6mlvQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.TestPlatform.ObjectModel"], "net48": ["Microsoft.TestPlatform.ObjectModel"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, ], ) diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index a25c349e35e..73990a2c6fd 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.7.55 + +No user-facing changes. + +## 1.7.54 + +No user-facing changes. + +## 1.7.53 + +No user-facing changes. + +## 1.7.52 + +No user-facing changes. + ## 1.7.51 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.52.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.52.md new file mode 100644 index 00000000000..07bec2a826a --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.52.md @@ -0,0 +1,3 @@ +## 1.7.52 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.53.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.53.md new file mode 100644 index 00000000000..b50e2ef9d7c --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.53.md @@ -0,0 +1,3 @@ +## 1.7.53 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.54.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.54.md new file mode 100644 index 00000000000..4a829015914 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.54.md @@ -0,0 +1,3 @@ +## 1.7.54 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.55.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.55.md new file mode 100644 index 00000000000..8c13e6f5191 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.55.md @@ -0,0 +1,3 @@ +## 1.7.55 + +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 26376c0cebb..26e02fb41f4 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.51 +lastReleaseVersion: 1.7.55 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 7877ad717e2..46f964a1bae 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.52-dev +version: 1.7.56-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index a25c349e35e..73990a2c6fd 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.7.55 + +No user-facing changes. + +## 1.7.54 + +No user-facing changes. + +## 1.7.53 + +No user-facing changes. + +## 1.7.52 + +No user-facing changes. + ## 1.7.51 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.52.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.52.md new file mode 100644 index 00000000000..07bec2a826a --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.52.md @@ -0,0 +1,3 @@ +## 1.7.52 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.53.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.53.md new file mode 100644 index 00000000000..b50e2ef9d7c --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.53.md @@ -0,0 +1,3 @@ +## 1.7.53 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.54.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.54.md new file mode 100644 index 00000000000..4a829015914 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.54.md @@ -0,0 +1,3 @@ +## 1.7.54 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.55.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.55.md new file mode 100644 index 00000000000..8c13e6f5191 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.55.md @@ -0,0 +1,3 @@ +## 1.7.55 + +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 26376c0cebb..26e02fb41f4 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.51 +lastReleaseVersion: 1.7.55 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 6427ecbb935..cb91019ff14 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.52-dev +version: 1.7.56-dev groups: - csharp - solorigate diff --git a/csharp/ql/integration-tests/all-platforms/autobuild/global.json b/csharp/ql/integration-tests/all-platforms/autobuild/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/autobuild/global.json +++ b/csharp/ql/integration-tests/all-platforms/autobuild/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/Files.expected b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/Files.expected new file mode 100644 index 00000000000..9654753b642 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/Files.expected @@ -0,0 +1,4 @@ +| proj1/Program.cs:0:0:0:0 | proj1/Program.cs | +| proj1/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | proj1/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| proj1/obj/Debug/net10.0/proj1.AssemblyInfo.cs:0:0:0:0 | proj1/obj/Debug/net10.0/proj1.AssemblyInfo.cs | +| proj1/obj/Debug/net10.0/proj1.GlobalUsings.g.cs:0:0:0:0 | proj1/obj/Debug/net10.0/proj1.GlobalUsings.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/Files.ql b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/Files.ql new file mode 100644 index 00000000000..bea5557a25f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/Files.ql @@ -0,0 +1,5 @@ +import csharp + +from File f +where f.fromSource() +select f diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/autobuild_slnx.slnx b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/autobuild_slnx.slnx new file mode 100644 index 00000000000..27d7235ae8b --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/autobuild_slnx.slnx @@ -0,0 +1,5 @@ + + + + diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/global.json b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/global.json new file mode 100644 index 00000000000..481e95ec7be --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj1/Program.cs b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj1/Program.cs new file mode 100644 index 00000000000..3751555cbd3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj1/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/csharp/ql/integration-tests/windows/dotnet_10_rc2/dotnet_build.csproj b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj1/proj1.csproj similarity index 84% rename from csharp/ql/integration-tests/windows/dotnet_10_rc2/dotnet_build.csproj rename to csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj1/proj1.csproj index dfb40caafcf..ed9781c223a 100644 --- a/csharp/ql/integration-tests/windows/dotnet_10_rc2/dotnet_build.csproj +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj1/proj1.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj2/Program.cs b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj2/Program.cs new file mode 100644 index 00000000000..3751555cbd3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj2/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj2/proj2.csproj b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj2/proj2.csproj new file mode 100644 index 00000000000..ed9781c223a --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/proj2/proj2.csproj @@ -0,0 +1,10 @@ + + + + Exe + net10.0 + enable + enable + + + diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/test.py b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/test.py new file mode 100644 index 00000000000..b0cc524b00d --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/test.py @@ -0,0 +1,3 @@ +def test(codeql, csharp): + # Only proj1 is included in the solution, so only it should be built (and extracted). + codeql.database.create() diff --git a/csharp/ql/integration-tests/all-platforms/binlog/Files.expected b/csharp/ql/integration-tests/all-platforms/binlog/Files.expected index 1b566ea2fd2..8535872531f 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/binlog/Files.expected @@ -1,10 +1,10 @@ | a/A.cs:0:0:0:0 | a/A.cs | -| a/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:0:0:0:0 | a/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| a/obj/Debug/net9.0/test.AssemblyInfo.cs:0:0:0:0 | a/obj/Debug/net9.0/test.AssemblyInfo.cs | -| a/obj/Debug/net9.0/test.GlobalUsings.g.cs:0:0:0:0 | a/obj/Debug/net9.0/test.GlobalUsings.g.cs | +| a/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | a/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| a/obj/Debug/net10.0/test.AssemblyInfo.cs:0:0:0:0 | a/obj/Debug/net10.0/test.AssemblyInfo.cs | +| a/obj/Debug/net10.0/test.GlobalUsings.g.cs:0:0:0:0 | a/obj/Debug/net10.0/test.GlobalUsings.g.cs | | b/B.cs:0:0:0:0 | b/B.cs | -| b/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:0:0:0:0 | b/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| b/obj/Debug/net9.0/test.AssemblyInfo.cs:0:0:0:0 | b/obj/Debug/net9.0/test.AssemblyInfo.cs | -| b/obj/Debug/net9.0/test.GlobalUsings.g.cs:0:0:0:0 | b/obj/Debug/net9.0/test.GlobalUsings.g.cs | -| generated/a/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/a/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | -| generated/b/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/b/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | +| b/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | b/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| b/obj/Debug/net10.0/test.AssemblyInfo.cs:0:0:0:0 | b/obj/Debug/net10.0/test.AssemblyInfo.cs | +| b/obj/Debug/net10.0/test.GlobalUsings.g.cs:0:0:0:0 | b/obj/Debug/net10.0/test.GlobalUsings.g.cs | +| generated/a/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/a/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | +| generated/b/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/b/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/binlog/a/test.csproj b/csharp/ql/integration-tests/all-platforms/binlog/a/test.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog/a/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/binlog/a/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/binlog/b/test.csproj b/csharp/ql/integration-tests/all-platforms/binlog/b/test.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog/b/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/binlog/b/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/binlog/global.json b/csharp/ql/integration-tests/all-platforms/binlog/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog/global.json +++ b/csharp/ql/integration-tests/all-platforms/binlog/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/binlog_multiple/Files.expected b/csharp/ql/integration-tests/all-platforms/binlog_multiple/Files.expected index 1b566ea2fd2..8535872531f 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog_multiple/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/binlog_multiple/Files.expected @@ -1,10 +1,10 @@ | a/A.cs:0:0:0:0 | a/A.cs | -| a/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:0:0:0:0 | a/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| a/obj/Debug/net9.0/test.AssemblyInfo.cs:0:0:0:0 | a/obj/Debug/net9.0/test.AssemblyInfo.cs | -| a/obj/Debug/net9.0/test.GlobalUsings.g.cs:0:0:0:0 | a/obj/Debug/net9.0/test.GlobalUsings.g.cs | +| a/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | a/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| a/obj/Debug/net10.0/test.AssemblyInfo.cs:0:0:0:0 | a/obj/Debug/net10.0/test.AssemblyInfo.cs | +| a/obj/Debug/net10.0/test.GlobalUsings.g.cs:0:0:0:0 | a/obj/Debug/net10.0/test.GlobalUsings.g.cs | | b/B.cs:0:0:0:0 | b/B.cs | -| b/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:0:0:0:0 | b/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| b/obj/Debug/net9.0/test.AssemblyInfo.cs:0:0:0:0 | b/obj/Debug/net9.0/test.AssemblyInfo.cs | -| b/obj/Debug/net9.0/test.GlobalUsings.g.cs:0:0:0:0 | b/obj/Debug/net9.0/test.GlobalUsings.g.cs | -| generated/a/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/a/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | -| generated/b/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/b/test.csproj (net9.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | +| b/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | b/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| b/obj/Debug/net10.0/test.AssemblyInfo.cs:0:0:0:0 | b/obj/Debug/net10.0/test.AssemblyInfo.cs | +| b/obj/Debug/net10.0/test.GlobalUsings.g.cs:0:0:0:0 | b/obj/Debug/net10.0/test.GlobalUsings.g.cs | +| generated/a/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/a/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | +| generated/b/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | generated/b/test.csproj (net10.0)/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/binlog_multiple/a/test.csproj b/csharp/ql/integration-tests/all-platforms/binlog_multiple/a/test.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog_multiple/a/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/binlog_multiple/a/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/binlog_multiple/b/test.csproj b/csharp/ql/integration-tests/all-platforms/binlog_multiple/b/test.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog_multiple/b/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/binlog_multiple/b/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json b/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json +++ b/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj index 6568b3dcfb4..a3a34b647cd 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/BlazorTest.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor/Files.expected b/csharp/ql/integration-tests/all-platforms/blazor/Files.expected index 5242b9f73d1..cd035dc7ae9 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/blazor/Files.expected @@ -8,15 +8,18 @@ | BlazorTest/Components/Routes.razor:0:0:0:0 | BlazorTest/Components/Routes.razor | | BlazorTest/Components/_Imports.razor:0:0:0:0 | BlazorTest/Components/_Imports.razor | | BlazorTest/Program.cs:0:0:0:0 | BlazorTest/Program.cs | -| BlazorTest/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| BlazorTest/obj/Debug/net9.0/BlazorTest.AssemblyInfo.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/BlazorTest.AssemblyInfo.cs | -| BlazorTest/obj/Debug/net9.0/BlazorTest.GlobalUsings.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/BlazorTest.GlobalUsings.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_App_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_App_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_MainLayout_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_MainLayout_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_NavMenu_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_NavMenu_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyInput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyInput_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyOutput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyOutput_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_Error_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_Error_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Routes_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Routes_razor.g.cs | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components__Imports_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components__Imports_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| BlazorTest/obj/Debug/net10.0/BlazorTest.AssemblyInfo.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/BlazorTest.AssemblyInfo.cs | +| BlazorTest/obj/Debug/net10.0/BlazorTest.GlobalUsings.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/BlazorTest.GlobalUsings.g.cs | +| BlazorTest/obj/Debug/net10.0/EmbeddedAttribute.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/EmbeddedAttribute.cs | +| BlazorTest/obj/Debug/net10.0/ValidatableTypeAttribute.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/ValidatableTypeAttribute.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_App_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_App_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_MainLayout_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_MainLayout_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_NavMenu_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_NavMenu_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyInput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyInput_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyOutput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyOutput_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_Error_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_Error_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Routes_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Routes_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components__Imports_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components__Imports_razor.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected b/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected index 2129be6da47..6518eb74a9f 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected +++ b/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected @@ -3,8 +3,8 @@ | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | User-provided value | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | User-provided value | edges -| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | +| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | models | 1 | Sink: Microsoft.AspNetCore.Components; MarkupString; false; MarkupString; (System.String); ; Argument[0]; html-injection; manual | | 2 | Source: Microsoft.AspNetCore.Components; SupplyParameterFromQueryAttribute; false; ; ; Attribute.Getter; ReturnValue; remote; manual | @@ -14,5 +14,5 @@ nodes | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | semmle.label | access to property UrlParam | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | semmle.label | access to property QueryParam | | BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | semmle.label | access to property QueryParam : String | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | subpaths diff --git a/csharp/ql/integration-tests/all-platforms/blazor/global.json b/csharp/ql/integration-tests/all-platforms/blazor/global.json new file mode 100644 index 00000000000..481e95ec7be --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/BlazorTest.csproj b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/BlazorTest.csproj index 6568b3dcfb4..a3a34b647cd 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/BlazorTest.csproj +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/BlazorTest.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/global.json b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/global.json new file mode 100644 index 00000000000..481e95ec7be --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor_net_8/global.json b/csharp/ql/integration-tests/all-platforms/blazor_net_8/global.json new file mode 100644 index 00000000000..402fd849691 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/blazor_net_8/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "8.0.401" + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json b/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json +++ b/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/conditional_compilation/test.csproj b/csharp/ql/integration-tests/all-platforms/conditional_compilation/test.csproj index d457711bd99..a421553fde2 100644 --- a/csharp/ql/integration-tests/all-platforms/conditional_compilation/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/conditional_compilation/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected b/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected index 946bef62462..ef4dc96389f 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected @@ -1,7 +1,8 @@ | Program.cs:0:0:0:0 | Program.cs | | Views/Home/Index.cshtml:0:0:0:0 | Views/Home/Index.cshtml | -| obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:0:0:0:0 | obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| obj/Debug/net9.0/cshtml.AssemblyInfo.cs:0:0:0:0 | obj/Debug/net9.0/cshtml.AssemblyInfo.cs | -| obj/Debug/net9.0/cshtml.GlobalUsings.g.cs:0:0:0:0 | obj/Debug/net9.0/cshtml.GlobalUsings.g.cs | -| obj/Debug/net9.0/cshtml.RazorAssemblyInfo.cs:0:0:0:0 | obj/Debug/net9.0/cshtml.RazorAssemblyInfo.cs | -| obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs:0:0:0:0 | obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs | +| obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| obj/Debug/net10.0/cshtml.AssemblyInfo.cs:0:0:0:0 | obj/Debug/net10.0/cshtml.AssemblyInfo.cs | +| obj/Debug/net10.0/cshtml.GlobalUsings.g.cs:0:0:0:0 | obj/Debug/net10.0/cshtml.GlobalUsings.g.cs | +| obj/Debug/net10.0/cshtml.RazorAssemblyInfo.cs:0:0:0:0 | obj/Debug/net10.0/cshtml.RazorAssemblyInfo.cs | +| obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs:0:0:0:0 | obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs | +| obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs:0:0:0:0 | obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/cshtml/cshtml.csproj b/csharp/ql/integration-tests/all-platforms/cshtml/cshtml.csproj index bdb0e0d0c31..3fe9d113e46 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml/cshtml.csproj +++ b/csharp/ql/integration-tests/all-platforms/cshtml/cshtml.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/cshtml/global.json b/csharp/ql/integration-tests/all-platforms/cshtml/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/cshtml.csproj b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/cshtml.csproj index bdb0e0d0c31..3fe9d113e46 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/cshtml.csproj +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/cshtml.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/cshtml.csproj b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/cshtml.csproj index bdb0e0d0c31..3fe9d113e46 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/cshtml.csproj +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/cshtml.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/cshtml.csproj b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/cshtml.csproj index 6568b3dcfb4..a3a34b647cd 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/cshtml.csproj +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/cshtml.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/test.csproj b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/test.csproj index 6bb5914483b..06f7ce8bff0 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable $(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.csproj b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.csproj index 546e25e0172..b3b85d19406 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/linux/dotnet_10_rc2/Program.cs b/csharp/ql/integration-tests/all-platforms/dotnet_10/Program.cs similarity index 100% rename from csharp/ql/integration-tests/linux/dotnet_10_rc2/Program.cs rename to csharp/ql/integration-tests/all-platforms/dotnet_10/Program.cs diff --git a/csharp/ql/integration-tests/linux/dotnet_10_rc2/dotnet_build.csproj b/csharp/ql/integration-tests/all-platforms/dotnet_10/dotnet_build.csproj similarity index 100% rename from csharp/ql/integration-tests/linux/dotnet_10_rc2/dotnet_build.csproj rename to csharp/ql/integration-tests/all-platforms/dotnet_10/dotnet_build.csproj diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_10/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_10/global.json new file mode 100644 index 00000000000..481e95ec7be --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/dotnet_10/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_10/test.py b/csharp/ql/integration-tests/all-platforms/dotnet_10/test.py new file mode 100644 index 00000000000..1f1fe52a4e5 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/dotnet_10/test.py @@ -0,0 +1,7 @@ +import pytest + +def test1(codeql, csharp): + codeql.database.create() + +def test2(codeql, csharp): + codeql.database.create(build_mode="none") diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_build/dotnet_build.csproj b/csharp/ql/integration-tests/all-platforms/dotnet_build/dotnet_build.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_build/dotnet_build.csproj +++ b/csharp/ql/integration-tests/all-platforms/dotnet_build/dotnet_build.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/dotnet_build.csproj b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/dotnet_build.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/dotnet_build.csproj +++ b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/dotnet_build.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_pack/dotnet_pack.csproj b/csharp/ql/integration-tests/all-platforms/dotnet_pack/dotnet_pack.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_pack/dotnet_pack.csproj +++ b/csharp/ql/integration-tests/all-platforms/dotnet_pack/dotnet_pack.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_publish/dotnet_publish.csproj b/csharp/ql/integration-tests/all-platforms/dotnet_publish/dotnet_publish.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_publish/dotnet_publish.csproj +++ b/csharp/ql/integration-tests/all-platforms/dotnet_publish/dotnet_publish.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_run/dotnet_run.csproj b/csharp/ql/integration-tests/all-platforms/dotnet_run/dotnet_run.csproj index 8bb8e6387f9..dfc5eaaa032 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_run/dotnet_run.csproj +++ b/csharp/ql/integration-tests/all-platforms/dotnet_run/dotnet_run.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/source_generator/Files.expected b/csharp/ql/integration-tests/all-platforms/source_generator/Files.expected index 48151f8387f..9e84046bb15 100644 --- a/csharp/ql/integration-tests/all-platforms/source_generator/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/source_generator/Files.expected @@ -1,6 +1,7 @@ +| Generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs:0:0:0:0 | Generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs | | Generated/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs:0:0:0:0 | Generated/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs | | Generated/x.cs:0:0:0:0 | Generated/x.cs | | Program.cs:0:0:0:0 | Program.cs | -| obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs:0:0:0:0 | obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| obj/Debug/net9.0/test.AssemblyInfo.cs:0:0:0:0 | obj/Debug/net9.0/test.AssemblyInfo.cs | -| obj/Debug/net9.0/test.GlobalUsings.g.cs:0:0:0:0 | obj/Debug/net9.0/test.GlobalUsings.g.cs | +| obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs:0:0:0:0 | obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| obj/Debug/net10.0/test.AssemblyInfo.cs:0:0:0:0 | obj/Debug/net10.0/test.AssemblyInfo.cs | +| obj/Debug/net10.0/test.GlobalUsings.g.cs:0:0:0:0 | obj/Debug/net10.0/test.GlobalUsings.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/source_generator/global.json b/csharp/ql/integration-tests/all-platforms/source_generator/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/source_generator/global.json +++ b/csharp/ql/integration-tests/all-platforms/source_generator/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/source_generator/test.csproj b/csharp/ql/integration-tests/all-platforms/source_generator/test.csproj index 966a7fdb5c5..bfbc94c22ea 100644 --- a/csharp/ql/integration-tests/all-platforms/source_generator/test.csproj +++ b/csharp/ql/integration-tests/all-platforms/source_generator/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected b/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected index e9b4f2e2428..662b7d18f72 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected @@ -1,6 +1,6 @@ diagnosticAttributes -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityCliSummaryTable | true | -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityStatusPage | true | -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityTelemetry | true | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 40 % (threshold 85 %). Percentage of expressions with known type: 64 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityCliSummaryTable | true | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 40 % (threshold 85 %). Percentage of expressions with known type: 64 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityStatusPage | true | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 40 % (threshold 85 %). Percentage of expressions with known type: 64 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityTelemetry | true | #select -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | 1 | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 40 % (threshold 85 %). Percentage of expressions with known type: 64 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 40 % (threshold 85 %). Percentage of expressions with known type: 64 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone/global.json b/csharp/ql/integration-tests/all-platforms/standalone/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone/standalone.csproj b/csharp/ql/integration-tests/all-platforms/standalone/standalone.csproj index 8bb8e6387f9..dfc5eaaa032 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone/standalone.csproj +++ b/csharp/ql/integration-tests/all-platforms/standalone/standalone.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/standalone.csproj b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/standalone.csproj index 92e46ddaccf..a15a29bf12c 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/standalone.csproj +++ b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/standalone.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json index 4c6e2601f69..376af49c07f 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/Assemblies.expected b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/Assemblies.expected new file mode 100644 index 00000000000..b98f10a366c --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/Assemblies.expected @@ -0,0 +1 @@ +| dependencies/packages/newtonsoft.json/13.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/Assemblies.ql b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/Assemblies.ql new file mode 100644 index 00000000000..625fc299761 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/Assemblies.ql @@ -0,0 +1,7 @@ +import csharp + +from Assembly a +where + not a.getCompilation().getOutputAssembly() = a and + a.getName().matches("%Newtonsoft%") +select a diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/Program.cs b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/Program.cs new file mode 100644 index 00000000000..39a9e95bb6e --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/Program.cs @@ -0,0 +1,6 @@ +class Program +{ + static void Main(string[] args) + { + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/global.json b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/global.json new file mode 100644 index 00000000000..376af49c07f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/standalone.csproj b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/standalone.csproj new file mode 100644 index 00000000000..92273963f8c --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/standalone.csproj @@ -0,0 +1,16 @@ + + + + Exe + net10.0 + + + + + + + + + + + diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/test.py b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/test.py new file mode 100644 index 00000000000..3629693ad29 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/test.py @@ -0,0 +1,14 @@ +import os +import shutil + +def test(codeql, csharp, cwd): + path = os.path.join(cwd, "dependencies") + os.environ["CODEQL_EXTRACTOR_CSHARP_OPTION_BUILDLESS_DEPENDENCY_DIR"] = path + # The Assemblies.ql query shows that the Newtonsoft assembly is found in the + # dependency directory set above. + codeql.database.create(source_root="proj", build_mode="none") + + # Check that the packages directory has been created in the dependencies folder. + packages_dir = os.path.join(path, "packages") + assert os.path.isdir(packages_dir), "The packages directory was not created in the specified dependency directory." + shutil.rmtree(path) diff --git a/csharp/ql/integration-tests/all-platforms/standalone_failed/global.json b/csharp/ql/integration-tests/all-platforms/standalone_failed/global.json new file mode 100644 index 00000000000..376af49c07f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_failed/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_failed/standalone.csproj b/csharp/ql/integration-tests/all-platforms/standalone_failed/standalone.csproj index 8bb8e6387f9..dfc5eaaa032 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_failed/standalone.csproj +++ b/csharp/ql/integration-tests/all-platforms/standalone_failed/standalone.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/Members.expected b/csharp/ql/integration-tests/all-platforms/standalone_resx/Members.expected index 469a8556db6..0de697aab2d 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/Members.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/Members.expected @@ -1,4 +1,5 @@ | Program | Program.
$ | +| Program | Program. | | Program | Program.Program | | Resx.Test1.Test2.test | Resx.Test1.Test2.test.Culture | | Resx.Test1.Test2.test | Resx.Test1.Test2.test.GetResourceString | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json b/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/resx.csproj b/csharp/ql/integration-tests/all-platforms/standalone_resx/resx.csproj index 951f79551f2..919ededcdce 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/resx.csproj +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/resx.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable Resx.Test1.Test2 diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected new file mode 100644 index 00000000000..3bd3941b27c --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected @@ -0,0 +1,19 @@ +| All NuGet feeds reachable | 1.0 | +| Failed project restore with package source error | 0.0 | +| Failed solution restore with package source error | 0.0 | +| Inherited NuGet feed count | 1.0 | +| NuGet feed responsiveness checked | 1.0 | +| Project files on filesystem | 2.0 | +| Reachable fallback NuGet feed count | 1.0 | +| Resource extraction enabled | 0.0 | +| Restored .NET framework variants | 1.0 | +| Restored projects through solution files | 2.0 | +| Solution files on filesystem | 1.0 | +| Source files generated | 1.0 | +| Source files on filesystem | 2.0 | +| Successfully restored project files | 0.0 | +| Successfully restored solution files | 1.0 | +| Unresolved references | 0.0 | +| UseWPF set | 0.0 | +| UseWindowsForms set | 0.0 | +| WebView extraction enabled | 1.0 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql new file mode 100644 index 00000000000..078e352be4d --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql @@ -0,0 +1,16 @@ +import csharp +import semmle.code.csharp.commons.Diagnostics + +query predicate compilationInfo(string key, float value) { + key != "Resolved references" and + key != "Resolved assembly conflicts" and + not key.matches(["Compiler diagnostic count for%", "Extractor message count for group%"]) and + exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | + key = infoKey and + value = infoValue.toFloat() + or + not exists(infoValue.toFloat()) and + key = infoKey + ": " + infoValue and + value = 1 + ) +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/global.json b/csharp/ql/integration-tests/all-platforms/standalone_slnx/global.json new file mode 100644 index 00000000000..481e95ec7be --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/mylib/Class1.cs b/csharp/ql/integration-tests/all-platforms/standalone_slnx/mylib/Class1.cs new file mode 100644 index 00000000000..8f662eb2ce6 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/mylib/Class1.cs @@ -0,0 +1,6 @@ +namespace mylib; + +public class Class1 +{ + +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/mylib/mylib.csproj b/csharp/ql/integration-tests/all-platforms/standalone_slnx/mylib/mylib.csproj new file mode 100644 index 00000000000..b760144708e --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/mylib/mylib.csproj @@ -0,0 +1,9 @@ + + + + net10.0 + enable + enable + + + diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/proj/Program.cs b/csharp/ql/integration-tests/all-platforms/standalone_slnx/proj/Program.cs new file mode 100644 index 00000000000..3751555cbd3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/proj/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/proj/proj.csproj b/csharp/ql/integration-tests/all-platforms/standalone_slnx/proj/proj.csproj new file mode 100644 index 00000000000..ed9781c223a --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/proj/proj.csproj @@ -0,0 +1,10 @@ + + + + Exe + net10.0 + enable + enable + + + diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/test.py b/csharp/ql/integration-tests/all-platforms/standalone_slnx/test.py new file mode 100644 index 00000000000..237174a46c6 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/test.py @@ -0,0 +1,2 @@ +def test(codeql, csharp): + codeql.database.create(build_mode="none") diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/test.slnx b/csharp/ql/integration-tests/all-platforms/standalone_slnx/test.slnx new file mode 100644 index 00000000000..40c1aa63ae1 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/test.slnx @@ -0,0 +1,4 @@ + + + + diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected index d973f6d8be4..aa00093875c 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected @@ -1,49 +1,50 @@ -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Design.dll:0:0:0:0 | System.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Design.dll:0:0:0:0 | System.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.GdiPlus.dll:0:0:0:0 | System.Private.Windows.GdiPlus, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Primitives.dll:0:0:0:0 | System.Windows.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj b/csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj index 355e815cdee..848cf9fdca5 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/winforms.csproj @@ -2,10 +2,10 @@ WinExe - net9.0-windows + net10.0-windows enable true enable - \ No newline at end of file + diff --git a/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected b/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected index cb1f6163d71..67a23e2d941 100644 --- a/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected +++ b/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected @@ -5,198 +5,203 @@ | 4 | /fullpaths | | 5 | /nostdlib+ | | 6 | /errorreport:prompt | -| 7 | /warn:9 | -| 8 | /define:TRACE;DEBUG;NET;NET9_0;NETCOREAPP;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NET7_0_OR_GREATER;NET8_0_OR_GREATER;NET9_0_OR_GREATER;NETCOREAPP1_0_OR_GREATER;NETCOREAPP1_1_OR_GREATER;NETCOREAPP2_0_OR_GREATER;NETCOREAPP2_1_OR_GREATER;NETCOREAPP2_2_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER | -| 9 | /highentropyva+ | -| 10 | /nullable:enable | -| 11 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll | -| 12 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll | -| 13 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll | -| 14 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll | -| 15 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll | -| 16 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/mscorlib.dll | -| 17 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/netstandard.dll | -| 18 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.AppContext.dll | -| 19 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Buffers.dll | -| 20 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll | -| 21 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.dll | -| 22 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll | -| 23 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll | -| 24 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll | -| 25 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll | -| 26 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll | -| 27 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.dll | -| 28 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll | -| 29 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll | -| 30 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll | -| 31 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Configuration.dll | -| 32 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Console.dll | -| 33 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Core.dll | -| 34 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Data.Common.dll | -| 35 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll | -| 36 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Data.dll | -| 37 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll | -| 38 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll | -| 39 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll | -| 40 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll | -| 41 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll | -| 42 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll | -| 43 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll | -| 44 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll | -| 45 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll | -| 46 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll | -| 47 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.dll | -| 48 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Drawing.dll | -| 49 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll | -| 50 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll | -| 51 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll | -| 52 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Formats.Tar.dll | -| 53 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll | -| 54 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Globalization.dll | -| 55 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll | -| 56 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll | -| 57 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.dll | -| 58 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll | -| 59 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll | -| 60 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.dll | -| 61 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll | -| 62 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll | -| 63 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll | -| 64 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll | -| 65 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll | -| 66 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll | -| 67 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll | -| 68 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll | -| 69 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll | -| 70 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Pipes.dll | -| 71 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll | -| 72 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.dll | -| 73 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll | -| 74 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll | -| 75 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll | -| 76 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Memory.dll | -| 77 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.dll | -| 78 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Http.dll | -| 79 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll | -| 80 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll | -| 81 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Mail.dll | -| 82 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll | -| 83 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll | -| 84 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Ping.dll | -| 85 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Primitives.dll | -| 86 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Quic.dll | -| 87 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Requests.dll | -| 88 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Security.dll | -| 89 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll | -| 90 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Sockets.dll | -| 91 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebClient.dll | -| 92 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll | -| 93 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll | -| 94 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll | -| 95 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll | -| 96 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Numerics.dll | -| 97 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll | -| 98 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ObjectModel.dll | -| 99 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll | -| 100 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.dll | -| 101 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll | -| 102 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll | -| 103 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll | -| 104 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll | -| 105 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll | -| 106 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll | -| 107 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll | -| 108 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Resources.Reader.dll | -| 109 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll | -| 110 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Resources.Writer.dll | -| 111 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll | -| 112 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll | -| 113 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.dll | -| 114 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll | -| 115 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll | -| 116 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll | -| 117 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll | -| 118 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll | -| 119 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll | -| 120 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll | -| 121 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll | -| 122 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll | -| 123 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll | -| 124 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll | -| 125 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll | -| 126 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll | -| 127 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll | -| 128 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Claims.dll | -| 129 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll | -| 130 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll | -| 131 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll | -| 132 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll | -| 133 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll | -| 134 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll | -| 135 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll | -| 136 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll | -| 137 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.dll | -| 138 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Principal.dll | -| 139 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll | -| 140 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.SecureString.dll | -| 141 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll | -| 142 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ServiceProcess.dll | -| 143 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll | -| 144 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encoding.dll | -| 145 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll | -| 146 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll | -| 147 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Json.dll | -| 148 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll | -| 149 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Channels.dll | -| 150 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.dll | -| 151 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll | -| 152 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll | -| 153 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll | -| 154 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll | -| 155 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll | -| 156 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Thread.dll | -| 157 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll | -| 158 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Timer.dll | -| 159 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Transactions.dll | -| 160 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Transactions.Local.dll | -| 161 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ValueTuple.dll | -| 162 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Web.dll | -| 163 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll | -| 164 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Windows.dll | -| 165 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.dll | -| 166 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.Linq.dll | -| 167 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll | -| 168 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll | -| 169 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll | -| 170 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll | -| 171 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll | -| 172 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XPath.dll | -| 173 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll | -| 174 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/WindowsBase.dll | -| 175 | /debug+ | -| 176 | /debug:portable | -| 177 | /filealign:512 | -| 178 | /generatedfilesout:obj/Debug/net9.0//generated | -| 179 | /optimize- | -| 180 | /out:obj/Debug/net9.0/test.dll | -| 181 | /refout:obj/Debug/net9.0/refint/test.dll | -| 182 | /target:exe | -| 183 | /warnaserror- | -| 184 | /utf8output | -| 185 | /deterministic+ | -| 186 | /langversion:13.0 | -| 187 | /analyzerconfig:obj/Debug/net9.0/test.GeneratedMSBuildEditorConfig.editorconfig | -| 188 | /analyzerconfig:/usr/share/dotnet/sdk/9.0.304/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_9_default.globalconfig | -| 189 | /analyzer:/usr/share/dotnet/sdk/9.0.304/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll | -| 190 | /analyzer:/usr/share/dotnet/sdk/9.0.304/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.NetAnalyzers.dll | -| 191 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.ComInterfaceGenerator.dll | -| 192 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll | -| 193 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll | -| 194 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll | -| 195 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/System.Text.Json.SourceGeneration.dll | -| 196 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll | -| 197 | Program.cs | -| 198 | obj/Debug/net9.0/test.GlobalUsings.g.cs | -| 199 | obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| 200 | obj/Debug/net9.0/test.AssemblyInfo.cs | -| 201 | /warnaserror+:NU1605,SYSLIB0011 | +| 7 | /warn:10 | +| 8 | /define:TRACE;DEBUG;NET;NET10_0;NETCOREAPP;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NET7_0_OR_GREATER;NET8_0_OR_GREATER;NET9_0_OR_GREATER;NET10_0_OR_GREATER;NETCOREAPP1_0_OR_GREATER;NETCOREAPP1_1_OR_GREATER;NETCOREAPP2_0_OR_GREATER;NETCOREAPP2_1_OR_GREATER;NETCOREAPP2_2_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER | +| 9 | /preferreduilang:en | +| 10 | /highentropyva+ | +| 11 | /nullable:enable | +| 12 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll | +| 13 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll | +| 14 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll | +| 15 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll | +| 16 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll | +| 17 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/mscorlib.dll | +| 18 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/netstandard.dll | +| 19 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.AppContext.dll | +| 20 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Buffers.dll | +| 21 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll | +| 22 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.dll | +| 23 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll | +| 24 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll | +| 25 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll | +| 26 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll | +| 27 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll | +| 28 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.dll | +| 29 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll | +| 30 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll | +| 31 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll | +| 32 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Configuration.dll | +| 33 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Console.dll | +| 34 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Core.dll | +| 35 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Data.Common.dll | +| 36 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll | +| 37 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Data.dll | +| 38 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll | +| 39 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll | +| 40 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll | +| 41 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll | +| 42 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll | +| 43 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll | +| 44 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll | +| 45 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll | +| 46 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll | +| 47 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll | +| 48 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.dll | +| 49 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Drawing.dll | +| 50 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll | +| 51 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll | +| 52 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll | +| 53 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Formats.Tar.dll | +| 54 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll | +| 55 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Globalization.dll | +| 56 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll | +| 57 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll | +| 58 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.dll | +| 59 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll | +| 60 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll | +| 61 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.dll | +| 62 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll | +| 63 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll | +| 64 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll | +| 65 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll | +| 66 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll | +| 67 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll | +| 68 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll | +| 69 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll | +| 70 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll | +| 71 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Pipes.dll | +| 72 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll | +| 73 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll | +| 74 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.dll | +| 75 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll | +| 76 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll | +| 77 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll | +| 78 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Memory.dll | +| 79 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.dll | +| 80 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Http.dll | +| 81 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll | +| 82 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll | +| 83 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Mail.dll | +| 84 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll | +| 85 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll | +| 86 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Ping.dll | +| 87 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Primitives.dll | +| 88 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Quic.dll | +| 89 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Requests.dll | +| 90 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Security.dll | +| 91 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll | +| 92 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll | +| 93 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Sockets.dll | +| 94 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebClient.dll | +| 95 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll | +| 96 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll | +| 97 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll | +| 98 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll | +| 99 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Numerics.dll | +| 100 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll | +| 101 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ObjectModel.dll | +| 102 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll | +| 103 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.dll | +| 104 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll | +| 105 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll | +| 106 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll | +| 107 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll | +| 108 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll | +| 109 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll | +| 110 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll | +| 111 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Resources.Reader.dll | +| 112 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll | +| 113 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Resources.Writer.dll | +| 114 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll | +| 115 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll | +| 116 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.dll | +| 117 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll | +| 118 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll | +| 119 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll | +| 120 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll | +| 121 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll | +| 122 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll | +| 123 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll | +| 124 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll | +| 125 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll | +| 126 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll | +| 127 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll | +| 128 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll | +| 129 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll | +| 130 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll | +| 131 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Claims.dll | +| 132 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll | +| 133 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll | +| 134 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll | +| 135 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll | +| 136 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll | +| 137 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll | +| 138 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll | +| 139 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll | +| 140 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.dll | +| 141 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Principal.dll | +| 142 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll | +| 143 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.SecureString.dll | +| 144 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll | +| 145 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ServiceProcess.dll | +| 146 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll | +| 147 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encoding.dll | +| 148 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll | +| 149 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll | +| 150 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Json.dll | +| 151 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll | +| 152 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll | +| 153 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Channels.dll | +| 154 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.dll | +| 155 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll | +| 156 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll | +| 157 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll | +| 158 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll | +| 159 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll | +| 160 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Thread.dll | +| 161 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll | +| 162 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Timer.dll | +| 163 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Transactions.dll | +| 164 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Transactions.Local.dll | +| 165 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ValueTuple.dll | +| 166 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Web.dll | +| 167 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll | +| 168 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Windows.dll | +| 169 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.dll | +| 170 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.Linq.dll | +| 171 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll | +| 172 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll | +| 173 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll | +| 174 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll | +| 175 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll | +| 176 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XPath.dll | +| 177 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll | +| 178 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/WindowsBase.dll | +| 179 | /features:"InterceptorsNamespaces=;Microsoft.Extensions.Validation.Generated" | +| 180 | /debug+ | +| 181 | /debug:portable | +| 182 | /filealign:512 | +| 183 | /generatedfilesout:obj/Debug/net10.0//generated | +| 184 | /optimize- | +| 185 | /out:obj/Debug/net10.0/test.dll | +| 186 | /refout:obj/Debug/net10.0/refint/test.dll | +| 187 | /target:exe | +| 188 | /warnaserror- | +| 189 | /utf8output | +| 190 | /deterministic+ | +| 191 | /langversion:14.0 | +| 192 | /analyzerconfig:obj/Debug/net10.0/test.GeneratedMSBuildEditorConfig.editorconfig | +| 193 | /analyzerconfig:/usr/share/dotnet/sdk/10.0.100/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_10_default.globalconfig | +| 194 | /analyzer:/usr/share/dotnet/sdk/10.0.100/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll | +| 195 | /analyzer:/usr/share/dotnet/sdk/10.0.100/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.NetAnalyzers.dll | +| 196 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.ComInterfaceGenerator.dll | +| 197 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll | +| 198 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll | +| 199 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll | +| 200 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/System.Text.Json.SourceGeneration.dll | +| 201 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll | +| 202 | Program.cs | +| 203 | obj/Debug/net10.0/test.GlobalUsings.g.cs | +| 204 | obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | +| 205 | obj/Debug/net10.0/test.AssemblyInfo.cs | +| 206 | /warnaserror+:NU1605,SYSLIB0011 | diff --git a/csharp/ql/integration-tests/linux/compiler_args/global.json b/csharp/ql/integration-tests/linux/compiler_args/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/linux/compiler_args/global.json +++ b/csharp/ql/integration-tests/linux/compiler_args/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/linux/compiler_args/test.csproj b/csharp/ql/integration-tests/linux/compiler_args/test.csproj index 8bb8e6387f9..dfc5eaaa032 100644 --- a/csharp/ql/integration-tests/linux/compiler_args/test.csproj +++ b/csharp/ql/integration-tests/linux/compiler_args/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/linux/dotnet_10_rc2/global.json b/csharp/ql/integration-tests/linux/dotnet_10_rc2/global.json deleted file mode 100644 index e870e2cf7bd..00000000000 --- a/csharp/ql/integration-tests/linux/dotnet_10_rc2/global.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sdk": { - "version": "10.0.100-rc.2.25502.107" - } -} diff --git a/csharp/ql/integration-tests/linux/dotnet_10_rc2/test.py b/csharp/ql/integration-tests/linux/dotnet_10_rc2/test.py deleted file mode 100644 index 148626b1cb8..00000000000 --- a/csharp/ql/integration-tests/linux/dotnet_10_rc2/test.py +++ /dev/null @@ -1,6 +0,0 @@ -import os -import runs_on - -@runs_on.linux -def test(codeql, csharp): - codeql.database.create() diff --git a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json +++ b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/test.csproj b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/test.csproj index 92e46ddaccf..a15a29bf12c 100644 --- a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/test.csproj +++ b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/test.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/dotnet_test/dotnet_test.csproj b/csharp/ql/integration-tests/posix/dotnet_test/dotnet_test.csproj index ae797904315..149082b384c 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test/dotnet_test.csproj +++ b/csharp/ql/integration-tests/posix/dotnet_test/dotnet_test.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable false diff --git a/csharp/ql/integration-tests/posix/dotnet_test/global.json b/csharp/ql/integration-tests/posix/dotnet_test/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test/global.json +++ b/csharp/ql/integration-tests/posix/dotnet_test/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/dotnet_test_mstest/dotnet_test_mstest.csproj b/csharp/ql/integration-tests/posix/dotnet_test_mstest/dotnet_test_mstest.csproj index 45ccf93ee74..9237cbc44ef 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test_mstest/dotnet_test_mstest.csproj +++ b/csharp/ql/integration-tests/posix/dotnet_test_mstest/dotnet_test_mstest.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json b/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json +++ b/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/inherit-env-vars/global.json b/csharp/ql/integration-tests/posix/inherit-env-vars/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/inherit-env-vars/global.json +++ b/csharp/ql/integration-tests/posix/inherit-env-vars/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected index 05b3826c73c..619475882b5 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected @@ -1,167 +1,170 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies/global.json index 4c6e2601f69..376af49c07f 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies/standalone.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies/standalone.csproj index 58df1d80a86..88362e96131 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies/standalone.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies/standalone.csproj @@ -2,7 +2,7 @@ Exe - net9.0;net6.0;netcoreapp3.1;netstandard2.0;net48 + net10.0;net6.0;netcoreapp3.1;netstandard2.0;net48 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected index bbfd3417df3..2be1117efc0 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.expected @@ -18,11 +18,13 @@ | [...]/csharp/tools/[...]/Microsoft.NET.StringTools.dll | | [...]/csharp/tools/[...]/Microsoft.VisualBasic.Core.dll | | [...]/csharp/tools/[...]/Microsoft.VisualBasic.dll | +| [...]/csharp/tools/[...]/Microsoft.VisualStudio.SolutionPersistence.dll | | [...]/csharp/tools/[...]/Microsoft.Win32.Primitives.dll | | [...]/csharp/tools/[...]/Microsoft.Win32.Registry.dll | | [...]/csharp/tools/[...]/Mono.Posix.NETStandard.dll | | [...]/csharp/tools/[...]/NaturalSort.Extension.dll | | [...]/csharp/tools/[...]/Newtonsoft.Json.dll | +| [...]/csharp/tools/[...]/NuGet.Versioning.dll | | [...]/csharp/tools/[...]/StructuredLogger.dll | | [...]/csharp/tools/[...]/System.AppContext.dll | | [...]/csharp/tools/[...]/System.Buffers.dll | @@ -84,6 +86,7 @@ | [...]/csharp/tools/[...]/System.IO.Pipes.dll | | [...]/csharp/tools/[...]/System.IO.UnmanagedMemoryStream.dll | | [...]/csharp/tools/[...]/System.IO.dll | +| [...]/csharp/tools/[...]/System.Linq.AsyncEnumerable.dll | | [...]/csharp/tools/[...]/System.Linq.Expressions.dll | | [...]/csharp/tools/[...]/System.Linq.Parallel.dll | | [...]/csharp/tools/[...]/System.Linq.Queryable.dll | @@ -100,6 +103,7 @@ | [...]/csharp/tools/[...]/System.Net.Quic.dll | | [...]/csharp/tools/[...]/System.Net.Requests.dll | | [...]/csharp/tools/[...]/System.Net.Security.dll | +| [...]/csharp/tools/[...]/System.Net.ServerSentEvents.dll | | [...]/csharp/tools/[...]/System.Net.ServicePoint.dll | | [...]/csharp/tools/[...]/System.Net.Sockets.dll | | [...]/csharp/tools/[...]/System.Net.WebClient.dll | @@ -168,6 +172,7 @@ | [...]/csharp/tools/[...]/System.Text.Encodings.Web.dll | | [...]/csharp/tools/[...]/System.Text.Json.dll | | [...]/csharp/tools/[...]/System.Text.RegularExpressions.dll | +| [...]/csharp/tools/[...]/System.Threading.AccessControl.dll | | [...]/csharp/tools/[...]/System.Threading.Channels.dll | | [...]/csharp/tools/[...]/System.Threading.Overlapped.dll | | [...]/csharp/tools/[...]/System.Threading.Tasks.Dataflow.dll | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected index 05b3826c73c..619475882b5 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected @@ -1,167 +1,170 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json index 4c6e2601f69..376af49c07f 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone1.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone1.csproj index 45639c4ecd2..998b6402127 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone1.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone1.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone2.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone2.csproj index 40d116df47f..d5249ad8ef5 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone2.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/standalone2.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected index 1e4df659ded..7e3b8f6e453 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected @@ -1,164 +1,167 @@ -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json index 4c6e2601f69..376af49c07f 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/net70.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/net70.csproj index 694035b3acd..dfb40caafcf 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/net70.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/net70.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/Assemblies.expected index 0934f8063db..10fa6873383 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/Assemblies.expected @@ -1 +1 @@ -| test-db/working/packages/newtonsoft.json/6.0.4/lib/net45/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | +| test-db/working/packages/newtonsoft.json/13.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/test_sdk.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/test_sdk.csproj index 3beee773f83..58c469d39c7 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/test_sdk.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/test_sdk.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 @@ -11,6 +11,6 @@ - + diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj index e16e4f4b6a6..6010c6c7f37 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/global.json new file mode 100644 index 00000000000..481e95ec7be --- /dev/null +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj index e16e4f4b6a6..6010c6c7f37 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/global.json new file mode 100644 index 00000000000..481e95ec7be --- /dev/null +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.100" + } +} diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj index e16e4f4b6a6..6010c6c7f37 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d1/test1.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d1/test1.csproj index 47798ff95a4..faba700d110 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d1/test1.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d1/test1.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d2/test2.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d2/test2.csproj index 29604e2cbd8..92273963f8c 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d2/test2.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/d2/test2.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/posix/warn_as_error/WarnAsError.csproj b/csharp/ql/integration-tests/posix/warn_as_error/WarnAsError.csproj index 3c234e42302..2c22edadfc9 100644 --- a/csharp/ql/integration-tests/posix/warn_as_error/WarnAsError.csproj +++ b/csharp/ql/integration-tests/posix/warn_as_error/WarnAsError.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 enable enable true diff --git a/csharp/ql/integration-tests/posix/warn_as_error/global.json b/csharp/ql/integration-tests/posix/warn_as_error/global.json index d488208a2a7..481e95ec7be 100644 --- a/csharp/ql/integration-tests/posix/warn_as_error/global.json +++ b/csharp/ql/integration-tests/posix/warn_as_error/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/windows/dotnet_10_rc2/Program.cs b/csharp/ql/integration-tests/windows/dotnet_10_rc2/Program.cs deleted file mode 100644 index bd44629f7e2..00000000000 --- a/csharp/ql/integration-tests/windows/dotnet_10_rc2/Program.cs +++ /dev/null @@ -1 +0,0 @@ -Console.WriteLine($"{string.Join(",", args)}"); diff --git a/csharp/ql/integration-tests/windows/dotnet_10_rc2/global.json b/csharp/ql/integration-tests/windows/dotnet_10_rc2/global.json deleted file mode 100644 index e870e2cf7bd..00000000000 --- a/csharp/ql/integration-tests/windows/dotnet_10_rc2/global.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sdk": { - "version": "10.0.100-rc.2.25502.107" - } -} diff --git a/csharp/ql/integration-tests/windows/dotnet_10_rc2/test.py b/csharp/ql/integration-tests/windows/dotnet_10_rc2/test.py deleted file mode 100644 index 00905b67cd4..00000000000 --- a/csharp/ql/integration-tests/windows/dotnet_10_rc2/test.py +++ /dev/null @@ -1,6 +0,0 @@ -import os -import runs_on - -@runs_on.windows -def test(codeql, csharp): - codeql.database.create() diff --git a/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected index 0b4ea613c8e..90a2806afe5 100644 --- a/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected @@ -1,213 +1,217 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Design.dll:0:0:0:0 | System.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Design.dll:0:0:0:0 | System.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.GdiPlus.dll:0:0:0:0 | System.Private.Windows.GdiPlus, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Primitives.dll:0:0:0:0 | System.Windows.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/windows/standalone_dependencies/global.json b/csharp/ql/integration-tests/windows/standalone_dependencies/global.json index 4c6e2601f69..376af49c07f 100644 --- a/csharp/ql/integration-tests/windows/standalone_dependencies/global.json +++ b/csharp/ql/integration-tests/windows/standalone_dependencies/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "10.0.100" } } diff --git a/csharp/ql/integration-tests/windows/standalone_dependencies/standalone.csproj b/csharp/ql/integration-tests/windows/standalone_dependencies/standalone.csproj index 58df1d80a86..88362e96131 100644 --- a/csharp/ql/integration-tests/windows/standalone_dependencies/standalone.csproj +++ b/csharp/ql/integration-tests/windows/standalone_dependencies/standalone.csproj @@ -2,7 +2,7 @@ Exe - net9.0;net6.0;netcoreapp3.1;netstandard2.0;net48 + net10.0;net6.0;netcoreapp3.1;netstandard2.0;net48 diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 20b1c03d722..59eb2a98cf0 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,33 @@ +## 5.4.3 + +No user-facing changes. + +## 5.4.2 + +No user-facing changes. + +## 5.4.1 + +### Minor Analysis Improvements + +* Improved stability when downloading .NET versions by setting appropriate environment variables for `dotnet` commands. The correct architecture-specific version of .NET is now downloaded on ARM runners. +* Compilation errors are now included in the debug log when using build-mode none. +* Added a new extractor option to specify a custom directory for dependency downloads in buildless mode. Use `-O buildless_dependency_dir=` to configure the target directory. + +## 5.4.0 + +### Deprecated APIs + +* `ControlFlowElement.controlsBlock` has been deprecated in favor of the Guards library. + +### New Features + +* Initial support for incremental C# databases via `codeql database create --overlay-base`/`--overlay-changes`. + +### Minor Analysis Improvements + +* Updated *roslyn* and *binlog* dependencies in the extractor, which may improve database and analysis quality. + ## 5.3.0 ### Deprecated APIs @@ -143,7 +173,7 @@ No user-facing changes. * Added `remote` flow source models for properties of Blazor components annotated with any of the following attributes from `Microsoft.AspNetCore.Components`: - `[SupplyParameterFromForm]` - `[SupplyParameterFromQuery]` -* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. +* Added the constructor and explicit cast operator of `Microsoft.AspNetCore.Components.MarkupString` as an `html-injection` sink. This will help catch cross-site scripting resulting from using `MarkupString`. * Added flow summaries for the `Microsoft.AspNetCore.Mvc.Controller::View` method. * The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. * The C# extractor now supports *basic* extraction of .NET 9 projects. There might be limited support for extraction of code using the new C# 13 language features. @@ -163,7 +193,7 @@ No user-facing changes. - `System.Web.HttpUtility::ParseQueryString` - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseQuery` - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseNullableQuery` -* Added `js-interop` sinks for the `InvokeAsync` and `InvokeVoidAsync` methods of `Microsoft.JSInterop.IJSRuntime`, which can run arbitrary JavaScript. +* Added `js-interop` sinks for the `InvokeAsync` and `InvokeVoidAsync` methods of `Microsoft.JSInterop.IJSRuntime`, which can run arbitrary JavaScript. ## 3.1.1 @@ -201,8 +231,8 @@ No user-facing changes. ### Breaking Changes -* Deleted many deprecated taint-tracking configurations based on `TaintTracking::Configuration`. -* Deleted many deprecated dataflow configurations based on `DataFlow::Configuration`. +* Deleted many deprecated taint-tracking configurations based on `TaintTracking::Configuration`. +* Deleted many deprecated dataflow configurations based on `DataFlow::Configuration`. * Deleted the deprecated `explorationLimit` predicate from `DataFlow::Configuration`, use `FlowExploration` instead. ### Minor Analysis Improvements @@ -451,7 +481,7 @@ No user-facing changes. ### New Features -* The `DataFlow::StateConfigSig` signature module has gained default implementations for `isBarrier/2` and `isAdditionalFlowStep/4`. +* The `DataFlow::StateConfigSig` signature module has gained default implementations for `isBarrier/2` and `isAdditionalFlowStep/4`. Hence it is no longer needed to provide `none()` implementations of these predicates if they are not needed. ### Minor Analysis Improvements @@ -586,7 +616,7 @@ No user-facing changes. * Attributes on methods in CIL are now extracted (Bugfix). * Support for `static virtual` and `static abstract` interface members. -* Support for *operators* in interface definitions. +* Support for *operators* in interface definitions. * C# 11: Added support for the unsigned right shift `>>>` and unsigned right shift assignment `>>>=` operators. * Query id's have been aligned such that they are prefixed with `cs` instead of `csharp`. @@ -626,13 +656,13 @@ No user-facing changes. ### Minor Analysis Improvements * `DateTime` expressions are now considered simple type sanitizers. This affects a wide range of security queries. -* ASP.NET Core controller definition has been made more precise. The amount of introduced taint sources or eliminated false positives should be low though, since the most common pattern is to derive all user defined ASP.NET Core controllers from the standard Controller class, which is not affected. +* ASP.NET Core controller definition has been made more precise. The amount of introduced taint sources or eliminated false positives should be low though, since the most common pattern is to derive all user defined ASP.NET Core controllers from the standard Controller class, which is not affected. ## 0.4.0 ### Deprecated APIs -* Some classes/modules with upper-case acronyms in their name have been renamed to follow our style-guide. +* Some classes/modules with upper-case acronyms in their name have been renamed to follow our style-guide. The old name still exists as a deprecated alias. ### Bug Fixes @@ -645,7 +675,7 @@ No user-facing changes. ### Deprecated APIs -* Many classes/predicates/modules with upper-case acronyms in their name have been renamed to follow our style-guide. +* Many classes/predicates/modules with upper-case acronyms in their name have been renamed to follow our style-guide. The old name still exists as a deprecated alias. ### Minor Analysis Improvements @@ -692,7 +722,7 @@ No user-facing changes. ### Deprecated APIs -* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. +* Many classes/predicates/modules that had upper-case acronyms have been renamed to follow our style-guide. The old name still exists as a deprecated alias. ### New Features diff --git a/csharp/ql/lib/change-notes/2025-10-04-deprecate-controlsblock.md b/csharp/ql/lib/change-notes/2025-10-04-deprecate-controlsblock.md deleted file mode 100644 index a3c69932917..00000000000 --- a/csharp/ql/lib/change-notes/2025-10-04-deprecate-controlsblock.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* `ControlFlowElement.controlsBlock` has been deprecated in favor of the Guards library. diff --git a/csharp/ql/lib/change-notes/2025-10-30-overlay-compilation-and-extraction.md b/csharp/ql/lib/change-notes/2025-10-30-overlay-compilation-and-extraction.md deleted file mode 100644 index 0f5005a22a2..00000000000 --- a/csharp/ql/lib/change-notes/2025-10-30-overlay-compilation-and-extraction.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: feature ---- - -* Initial support for incremental C# databases via `codeql database create --overlay-base`/`--overlay-changes`. diff --git a/csharp/ql/lib/change-notes/2025-11-03-roslyn-and-binlog.md b/csharp/ql/lib/change-notes/2025-11-03-roslyn-and-binlog.md deleted file mode 100644 index 92231d3be2f..00000000000 --- a/csharp/ql/lib/change-notes/2025-11-03-roslyn-and-binlog.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Updated *roslyn* and *binlog* dependencies in the extractor, which may improve database and analysis quality. diff --git a/csharp/ql/lib/change-notes/2025-12-03-implicit-map-value-reads.md b/csharp/ql/lib/change-notes/2025-12-03-implicit-map-value-reads.md new file mode 100644 index 00000000000..2b7f47fe98d --- /dev/null +++ b/csharp/ql/lib/change-notes/2025-12-03-implicit-map-value-reads.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added implicit reads of `System.Collections.Generic.KeyValuePair.Value` at taint-tracking sinks and at inputs to additional taint steps. As a result, taint-tracking queries will now produce more results when a container is tainted. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2025-12-03-run-tracer-after-compilation.md b/csharp/ql/lib/change-notes/2025-12-03-run-tracer-after-compilation.md new file mode 100644 index 00000000000..d7dd475cb0b --- /dev/null +++ b/csharp/ql/lib/change-notes/2025-12-03-run-tracer-after-compilation.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed an issue where compiler-generated files were not being extracted. The extractor now runs after compilation completes to ensure all generated files are properly analyzed. diff --git a/csharp/ql/lib/change-notes/2025-12-04-bmn-dotnet-fixes.md b/csharp/ql/lib/change-notes/2025-12-04-bmn-dotnet-fixes.md new file mode 100644 index 00000000000..af1f1b91966 --- /dev/null +++ b/csharp/ql/lib/change-notes/2025-12-04-bmn-dotnet-fixes.md @@ -0,0 +1,6 @@ +--- +category: fix +--- +* Fixed two issues affecting build mode `none`: + * Corrected version sorting logic when detecting the newest .NET framework to use. + * Improved stability for .NET 10 compatibility. diff --git a/csharp/ql/lib/change-notes/2025-12-09-bmn-default-dotnet.md b/csharp/ql/lib/change-notes/2025-12-09-bmn-default-dotnet.md new file mode 100644 index 00000000000..832e6069ee0 --- /dev/null +++ b/csharp/ql/lib/change-notes/2025-12-09-bmn-default-dotnet.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* In `build mode: none`, .NET 10 is now used by default unless a specific .NET version is specified elsewhere. diff --git a/csharp/ql/lib/change-notes/2025-12-11-net10-basic-support.md b/csharp/ql/lib/change-notes/2025-12-11-net10-basic-support.md new file mode 100644 index 00000000000..d15a55a7eb4 --- /dev/null +++ b/csharp/ql/lib/change-notes/2025-12-11-net10-basic-support.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Basic extractor support for .NET 10 is now available. Extraction is supported for .NET 10 projects in both traced mode and `build mode: none`. However, code that uses language features new to C# 14 is not yet fully supported for extraction and analysis. diff --git a/csharp/ql/lib/change-notes/2025-12-11-slnx-support.md b/csharp/ql/lib/change-notes/2025-12-11-slnx-support.md new file mode 100644 index 00000000000..9ca9b989812 --- /dev/null +++ b/csharp/ql/lib/change-notes/2025-12-11-slnx-support.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added autobuilder and `build-mode: none` support for `.slnx` solution files. diff --git a/csharp/ql/lib/change-notes/released/5.3.0.md b/csharp/ql/lib/change-notes/released/5.3.0.md index 144f8bf2633..fa305362575 100644 --- a/csharp/ql/lib/change-notes/released/5.3.0.md +++ b/csharp/ql/lib/change-notes/released/5.3.0.md @@ -6,7 +6,7 @@ ### Major Analysis Improvements -* The representation of the C# control-flow graph has been significantly changed. This has minor effects on a wide range of queries including both minor improvements and minor regressions, for example, improved precision has been observed for `cs/inefficient-containskey` and `cs/stringbuilder-creation-in-loop`. Two queries stand out as being significantly affected with great improvements: `cs/dereferenced-value-may-be-null` has been completely rewritten which removes a very significant number of false positives. Furthermore, `cs/constant-condition` has been updated to report many new results - these new results are primarily expected to be true positives, but a few new false positives are expected as well. As part of these changes, `cs/dereferenced-value-may-be-null` has been changed from a `path-problem` query to a `problem` query, so paths are no longer reported for this query. +* The representation of the C# control-flow graph has been significantly changed. This has minor effects on a wide range of queries including both minor improvements and minor regressions. For example, improved precision has been observed for `cs/inefficient-containskey` and `cs/stringbuilder-creation-in-loop`. Two queries stand out as being significantly affected with great improvements: `cs/dereferenced-value-may-be-null` has been completely rewritten which removes a very significant number of false positives. Furthermore, `cs/constant-condition` has been updated to report many new results - these new results are primarily expected to be true positives, but a few new false positives are expected as well. As part of these changes, `cs/dereferenced-value-may-be-null` has been changed from a `path-problem` query to a `problem` query, so paths are no longer reported for this query. ### Minor Analysis Improvements diff --git a/csharp/ql/lib/change-notes/released/5.4.0.md b/csharp/ql/lib/change-notes/released/5.4.0.md new file mode 100644 index 00000000000..478e6deb414 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.4.0.md @@ -0,0 +1,13 @@ +## 5.4.0 + +### Deprecated APIs + +* `ControlFlowElement.controlsBlock` has been deprecated in favor of the Guards library. + +### New Features + +* Initial support for incremental C# databases via `codeql database create --overlay-base`/`--overlay-changes`. + +### Minor Analysis Improvements + +* Updated *roslyn* and *binlog* dependencies in the extractor, which may improve database and analysis quality. diff --git a/csharp/ql/lib/change-notes/released/5.4.1.md b/csharp/ql/lib/change-notes/released/5.4.1.md new file mode 100644 index 00000000000..2b0961ec925 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.4.1.md @@ -0,0 +1,7 @@ +## 5.4.1 + +### Minor Analysis Improvements + +* Improved stability when downloading .NET versions by setting appropriate environment variables for `dotnet` commands. The correct architecture-specific version of .NET is now downloaded on ARM runners. +* Compilation errors are now included in the debug log when using build-mode none. +* Added a new extractor option to specify a custom directory for dependency downloads in buildless mode. Use `-O buildless_dependency_dir=` to configure the target directory. diff --git a/csharp/ql/lib/change-notes/released/5.4.2.md b/csharp/ql/lib/change-notes/released/5.4.2.md new file mode 100644 index 00000000000..ae5501672ad --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.4.2.md @@ -0,0 +1,3 @@ +## 5.4.2 + +No user-facing changes. diff --git a/csharp/ql/lib/change-notes/released/5.4.3.md b/csharp/ql/lib/change-notes/released/5.4.3.md new file mode 100644 index 00000000000..61270c2fe02 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.4.3.md @@ -0,0 +1,3 @@ +## 5.4.3 + +No user-facing changes. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index b0a1c83e5bc..dc2d3dec96c 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.3.0 +lastReleaseVersion: 5.4.3 diff --git a/csharp/ql/lib/ext/NHibernate.model.yml b/csharp/ql/lib/ext/NHibernate.model.yml new file mode 100644 index 00000000000..472374cfbc3 --- /dev/null +++ b/csharp/ql/lib/ext/NHibernate.model.yml @@ -0,0 +1,8 @@ +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: sinkModel + data: + - ["NHibernate", "ISession", True, "CreateSQLQuery", "(System.String)", "", "Argument[0]", "sql-injection", "manual"] + - ["NHibernate", "IStatelessSession", True, "CreateSQLQuery", "(System.String)", "", "Argument[0]", "sql-injection", "manual"] + - ["NHibernate.Impl", "AbstractSessionImpl", True, "CreateSQLQuery", "(System.String)", "", "Argument[0]", "sql-injection", "manual"] \ No newline at end of file diff --git a/csharp/ql/lib/ext/empty.model.yml b/csharp/ql/lib/ext/empty.model.yml index 6b38b783cbe..09d848ea57d 100644 --- a/csharp/ql/lib/ext/empty.model.yml +++ b/csharp/ql/lib/ext/empty.model.yml @@ -11,6 +11,16 @@ extensions: extensible: sinkModel data: [] + - addsTo: + pack: codeql/csharp-all + extensible: barrierModel + data: [] + + - addsTo: + pack: codeql/csharp-all + extensible: barrierGuardModel + data: [] + - addsTo: pack: codeql/csharp-all extensible: summaryModel diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 3ecdad08291..527e890f47b 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 5.3.1-dev +version: 5.4.4-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll index 44e7c3cf4ca..49a2271b27c 100644 --- a/csharp/ql/lib/semmle/code/csharp/Callable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll @@ -281,7 +281,6 @@ class Method extends Callable, Virtualizable, Attributable, @method { /** Holds if this method has a `params` parameter. */ predicate hasParams() { exists(this.getParamsType()) } - // Remove when `Callable.isOverridden()` is removed override predicate fromSource() { Callable.super.fromSource() and not this.isCompilerGenerated() @@ -317,6 +316,19 @@ class ExtensionMethod extends Method { override string getAPrimaryQlClass() { result = "ExtensionMethod" } } +/** + * An object initializer method. + * + * This is an extractor-synthesized method that executes the field + * initializers. Note that the AST nodes for the field initializers are nested + * directly under the class, and therefore this method has no body in the AST. + * On the other hand, this provides the unique enclosing callable for the field + * initializers and their control flow graph. + */ +class ObjectInitMethod extends Method { + ObjectInitMethod() { this.getName() = "" } +} + /** * A constructor, for example `public C() { }` on line 2 in * @@ -350,6 +362,9 @@ class Constructor extends Callable, Member, Attributable, @constructor { */ ConstructorInitializer getInitializer() { result = this.getChildExpr(-1) } + /** Gets the object initializer call of this constructor, if any. */ + MethodCall getObjectInitializerCall() { result = this.getChildExpr(-2) } + /** Holds if this constructor has an initializer. */ predicate hasInitializer() { exists(this.getInitializer()) } diff --git a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll index be79c579513..aa834ef9103 100644 --- a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll +++ b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll @@ -55,7 +55,8 @@ class TopLevelExprParent extends Element, @top_level_expr_parent { /** INTERNAL: Do not use. */ Expr getExpressionBody(Callable c) { result = c.getAChildExpr() and - not result = c.(Constructor).getInitializer() + not result = c.(Constructor).getInitializer() and + not result = c.(Constructor).getObjectInitializerCall() } /** INTERNAL: Do not use. */ @@ -211,6 +212,8 @@ private module Cached { enclosingBody(cfe, getBody(c)) or parent*(enclosingStart(cfe), c.(Constructor).getInitializer()) + or + parent*(cfe, c.(Constructor).getObjectInitializerCall()) } /** Holds if the enclosing statement of expression `e` is `s`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll b/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll index 908d1c2fb5a..bdf9e558539 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll @@ -3,6 +3,7 @@ */ import csharp +private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.frameworks.Format private import semmle.code.csharp.frameworks.System private import semmle.code.csharp.frameworks.system.Text @@ -33,7 +34,7 @@ class ImplicitToStringExpr extends Expr { or p instanceof StringFormatItemParameter and not p.getType() = - any(ArrayType at | + any(ParamsCollectionType at | at.getElementType() instanceof ObjectType and this.getType().isImplicitlyConvertibleTo(at) ) diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index f61d7f9c3a7..414cfc2d50a 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -842,6 +842,40 @@ module Internal { e3 = any(NullCoalescingExpr nce | e1 = nce.getLeftOperand() and e2 = nce.getRightOperand()) } + predicate nullValueImplied(Expr e) { + nullValue(e) + or + exists(Expr e1 | nullValueImplied(e1) and nullValueImpliedUnary(e1, e)) + or + exists(Expr e1, Expr e2 | + nullValueImplied(e1) and nullValueImplied(e2) and nullValueImpliedBinary(e1, e2, e) + ) + or + e = + any(Ssa::Definition def | + forex(Ssa::Definition u | u = def.getAnUltimateDefinition() | nullDef(u)) + ).getARead() + } + + private predicate nullDef(Ssa::ExplicitDefinition def) { + nullValueImplied(def.getADefinition().getSource()) + } + + predicate nonNullValueImplied(Expr e) { + nonNullValue(e) + or + exists(Expr e1 | nonNullValueImplied(e1) and nonNullValueImpliedUnary(e1, e)) + or + e = + any(Ssa::Definition def | + forex(Ssa::Definition u | u = def.getAnUltimateDefinition() | nonNullDef(u)) + ).getARead() + } + + private predicate nonNullDef(Ssa::ExplicitDefinition def) { + nonNullValueImplied(def.getADefinition().getSource()) + } + /** A callable that always returns a non-`null` value. */ private class NonNullCallable extends Callable { NonNullCallable() { this = any(SystemObjectClass c).getGetTypeMethod() } @@ -936,154 +970,21 @@ module Internal { e = any(BinaryArithmeticOperation bao | result = bao.getAnOperand()) } - // The predicates in this module should be evaluated in the same stage as the CFG - // construction stage. This is to avoid recomputation of pre-basic-blocks and - // pre-SSA predicates - private module PreCfg { - private import semmle.code.csharp.controlflow.internal.PreBasicBlocks as PreBasicBlocks - private import semmle.code.csharp.controlflow.internal.PreSsa - - private predicate nullDef(PreSsa::Definition def) { - nullValueImplied(def.getDefinition().getSource()) - } - - private predicate nonNullDef(PreSsa::Definition def) { - nonNullValueImplied(def.getDefinition().getSource()) - } - - private predicate emptyDef(PreSsa::Definition def) { - emptyValue(def.getDefinition().getSource()) - } - - private predicate nonEmptyDef(PreSsa::Definition def) { - nonEmptyValue(def.getDefinition().getSource()) - } - - deprecated predicate isGuard(Expr e, GuardValue val) { - ( - e.getType() instanceof BoolType and - not e instanceof BoolLiteral and - not e instanceof SwitchCaseExpr and - not e instanceof PatternExpr and - exists(val.asBooleanValue()) - or - e instanceof DereferenceableExpr and - val.isNullness(_) - ) and - not e = any(ExprStmt es).getExpr() and - not e = any(LocalVariableDeclStmt s).getAVariableDeclExpr() - } - - cached - private module CachedWithCfg { - private import semmle.code.csharp.Caching - - private predicate firstReadSameVarUniquePredecessor( - PreSsa::Definition def, AssignableRead read - ) { - read = def.getAFirstRead() and - ( - not PreSsa::adjacentReadPairSameVar(_, read) - or - read = unique(AssignableRead read0 | PreSsa::adjacentReadPairSameVar(read0, read)) - ) - } - - cached - predicate nullValueImplied(Expr e) { - nullValue(e) - or - exists(Expr e1 | nullValueImplied(e1) and nullValueImpliedUnary(e1, e)) - or - exists(Expr e1, Expr e2 | - nullValueImplied(e1) and nullValueImplied(e2) and nullValueImpliedBinary(e1, e2, e) - ) - or - e = - any(PreSsa::Definition def | - forex(PreSsa::Definition u | u = def.getAnUltimateDefinition() | nullDef(u)) - ).getARead() - } - - cached - predicate nonNullValueImplied(Expr e) { - nonNullValue(e) - or - exists(Expr e1 | nonNullValueImplied(e1) and nonNullValueImpliedUnary(e1, e)) - or - e = - any(PreSsa::Definition def | - forex(PreSsa::Definition u | u = def.getAnUltimateDefinition() | nonNullDef(u)) - ).getARead() - } - - private predicate adjacentReadPairSameVarUniquePredecessor( - AssignableRead read1, AssignableRead read2 - ) { - PreSsa::adjacentReadPairSameVar(read1, read2) and - ( - read1 = read2 and - read1 = unique(AssignableRead other | PreSsa::adjacentReadPairSameVar(other, read2)) - or - read1 = - unique(AssignableRead other | - PreSsa::adjacentReadPairSameVar(other, read2) and other != read2 - ) - ) - } - - cached - predicate emptyValue(Expr e) { - e.(ArrayCreation).getALengthArgument().getValue().toInt() = 0 - or - e.(ArrayInitializer).hasNoElements() - or - exists(Expr mid | emptyValue(mid) | - mid = e.(AssignExpr).getRValue() - or - mid = e.(Cast).getExpr() - ) - or - exists(PreSsa::Definition def | emptyDef(def) | firstReadSameVarUniquePredecessor(def, e)) - or - exists(MethodCall mc | - mc.getTarget().getAnUltimateImplementee().getUnboundDeclaration() = - any(SystemCollectionsGenericICollectionInterface c).getClearMethod() and - adjacentReadPairSameVarUniquePredecessor(mc.getQualifier(), e) - ) - } - - cached - predicate nonEmptyValue(Expr e) { - forex(Expr length | length = e.(ArrayCreation).getALengthArgument() | - length.getValue().toInt() != 0 - ) - or - e.(ArrayInitializer).getNumberOfElements() > 0 - or - exists(Expr mid | nonEmptyValue(mid) | - mid = e.(AssignExpr).getRValue() - or - mid = e.(Cast).getExpr() - ) - or - exists(PreSsa::Definition def | nonEmptyDef(def) | - firstReadSameVarUniquePredecessor(def, e) - ) - or - exists(MethodCall mc | - mc.getTarget().getAnUltimateImplementee().getUnboundDeclaration() = - any(SystemCollectionsGenericICollectionInterface c).getAddMethod() and - adjacentReadPairSameVarUniquePredecessor(mc.getQualifier(), e) - ) - } - } - - import CachedWithCfg + deprecated predicate isGuard(Expr e, GuardValue val) { + ( + e.getType() instanceof BoolType and + not e instanceof BoolLiteral and + not e instanceof SwitchCaseExpr and + not e instanceof PatternExpr and + exists(val.asBooleanValue()) + or + e instanceof DereferenceableExpr and + val.isNullness(_) + ) and + not e = any(ExprStmt es).getExpr() and + not e = any(LocalVariableDeclStmt s).getAVariableDeclExpr() } - import PreCfg - private predicate interestingDescendantCandidate(Expr e) { guardControls(e, _, _) or diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll index 5f62d6d21df..96fe5703090 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll @@ -6,10 +6,65 @@ import csharp private import codeql.controlflow.Cfg as CfgShared private import Completion -private import Splitting private import semmle.code.csharp.ExprOrStmtParent private import semmle.code.csharp.commons.Compilation +private module Initializers { + /** + * A non-static member with an initializer, for example a field `int Field = 0`. + */ + class InitializedInstanceMember extends Member { + private AssignExpr ae; + + InitializedInstanceMember() { + not this.isStatic() and + expr_parent_top_level(ae, _, this) and + not ae = any(Callable c).getExpressionBody() + } + + /** Gets the initializer expression. */ + AssignExpr getInitializer() { result = ae } + } + + /** + * Holds if `obinit` is an object initializer method that performs the initialization + * of a member via assignment `init`. + */ + predicate obinitInitializes(ObjectInitMethod obinit, AssignExpr init) { + exists(InitializedInstanceMember m | + obinit.getDeclaringType().getAMember() = m and + init = m.getInitializer() + ) + } + + /** + * Gets the `i`th member initializer expression for object initializer method `obinit` + * in compilation `comp`. + */ + AssignExpr initializedInstanceMemberOrder(ObjectInitMethod obinit, CompilationExt comp, int i) { + obinitInitializes(obinit, result) and + result = + rank[i + 1](AssignExpr ae0, Location l | + obinitInitializes(obinit, ae0) and + l = ae0.getLocation() and + getCompilation(l.getFile()) = comp + | + ae0 order by l.getStartLine(), l.getStartColumn(), l.getFile().getAbsolutePath() + ) + } + + /** + * Gets the last member initializer expression for object initializer method `obinit` + * in compilation `comp`. + */ + AssignExpr lastInitializer(ObjectInitMethod obinit, CompilationExt comp) { + exists(int i | + result = initializedInstanceMemberOrder(obinit, comp, i) and + not exists(initializedInstanceMemberOrder(obinit, comp, i + 1)) + ) + } +} + /** An element that defines a new CFG scope. */ class CfgScope extends Element, @top_level_exprorstmt_parent { CfgScope() { @@ -19,7 +74,7 @@ class CfgScope extends Element, @top_level_exprorstmt_parent { any(Callable c | c.(Constructor).hasInitializer() or - InitializerSplitting::constructorInitializes(c, _) + Initializers::obinitInitializes(c, _) or c.hasBody() ) @@ -146,14 +201,16 @@ private predicate expr_parent_top_level_adjusted2( predicate scopeFirst(CfgScope scope, AstNode first) { scope = any(Callable c | - if exists(c.(Constructor).getInitializer()) - then first(c.(Constructor).getInitializer(), first) + if exists(c.(Constructor).getObjectInitializerCall()) + then first(c.(Constructor).getObjectInitializerCall(), first) else - if InitializerSplitting::constructorInitializes(c, _) - then first(InitializerSplitting::constructorInitializeOrder(c, _, 0), first) + if exists(c.(Constructor).getInitializer()) + then first(c.(Constructor).getInitializer(), first) else first(c.getBody(), first) ) or + first(Initializers::initializedInstanceMemberOrder(scope, _, 0), first) + or expr_parent_top_level_adjusted2(any(Expr e | first(e, first)), _, scope) and not scope instanceof Callable } @@ -165,14 +222,40 @@ predicate scopeLast(CfgScope scope, AstNode last, Completion c) { last(callable.getBody(), last, c) and not c instanceof GotoCompletion or - last(InitializerSplitting::lastConstructorInitializer(scope, _), last, c) and + last(callable.(Constructor).getInitializer(), last, c) and + not callable.hasBody() + or + // This is only relevant in the context of compilation errors, since + // normally the existence of an object initializer call implies the + // existence of an initializer. + last(callable.(Constructor).getObjectInitializerCall(), last, c) and + not callable.(Constructor).hasInitializer() and not callable.hasBody() ) or + last(Initializers::lastInitializer(scope, _), last, c) + or expr_parent_top_level_adjusted2(any(Expr e | last(e, last, c)), _, scope) and not scope instanceof Callable } +private class ObjectInitTree extends ControlFlowTree instanceof ObjectInitMethod { + final override predicate propagatesAbnormal(AstNode child) { none() } + + final override predicate first(AstNode first) { none() } + + final override predicate last(AstNode last, Completion c) { none() } + + final override predicate succ(AstNode pred, AstNode succ, Completion c) { + exists(CompilationExt comp, int i | + // Flow from one member initializer to the next + last(Initializers::initializedInstanceMemberOrder(this, comp, i), pred, c) and + c instanceof NormalCompletion and + first(Initializers::initializedInstanceMemberOrder(this, comp, i + 1), succ) + ) + } +} + private class ConstructorTree extends ControlFlowTree instanceof Constructor { final override predicate propagatesAbnormal(AstNode child) { none() } @@ -187,17 +270,29 @@ private class ConstructorTree extends ControlFlowTree instanceof Constructor { comp = getCompilation(result.getFile()) } + pragma[noinline] + private MethodCall getObjectInitializerCall(CompilationExt comp) { + result = super.getObjectInitializerCall() and + comp = getCompilation(result.getFile()) + } + + pragma[noinline] + private ConstructorInitializer getInitializer(CompilationExt comp) { + result = super.getInitializer() and + comp = getCompilation(result.getFile()) + } + final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(CompilationExt comp, int i, AssignExpr ae | - ae = InitializerSplitting::constructorInitializeOrder(this, comp, i) and - last(ae, pred, c) and + exists(CompilationExt comp | + last(this.getObjectInitializerCall(comp), pred, c) and c instanceof NormalCompletion | - // Flow from one member initializer to the next - first(InitializerSplitting::constructorInitializeOrder(this, comp, i + 1), succ) + first(this.getInitializer(comp), succ) or - // Flow from last member initializer to constructor body - ae = InitializerSplitting::lastConstructorInitializer(this, comp) and + // This is only relevant in the context of compilation errors, since + // normally the existence of an object initializer call implies the + // existence of an initializer. + not exists(this.getInitializer(comp)) and first(this.getBody(comp), succ) ) } @@ -837,13 +932,7 @@ module Expressions { last(this, pred, c) and con = super.getConstructor() and comp = getCompilation(this.getFile()) and - c instanceof NormalCompletion - | - // Flow from constructor initializer to first member initializer - first(InitializerSplitting::constructorInitializeOrder(con, comp, 0), succ) - or - // Flow from constructor initializer to first element of constructor body - not exists(InitializerSplitting::constructorInitializeOrder(con, comp, _)) and + c instanceof NormalCompletion and first(con.getBody(comp), succ) ) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll deleted file mode 100644 index 4921e692623..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll +++ /dev/null @@ -1,221 +0,0 @@ -import csharp - -/** - * Provides an SSA implementation based on "pre-basic-blocks", restricted - * to local scope variables and fields/properties that behave like local - * scope variables. - */ -module PreSsa { - private import AssignableDefinitions - private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl - private import semmle.code.csharp.controlflow.internal.PreBasicBlocks as PreBasicBlocks - private import codeql.ssa.Ssa as SsaImplCommon - - private predicate definitionAt( - AssignableDefinition def, PreBasicBlocks::PreBasicBlock bb, int i, SsaInput::SourceVariable v - ) { - 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 | - second.getAssignment() = first.getAssignment() and - second.getEvaluationOrder() > first.getEvaluationOrder() and - second.getTarget() = v - ) - or - def.(ImplicitParameterDefinition).getParameter() = v and - exists(Callable c | v = c.getAParameter() | - scopeFirst(c, bb) and - i = -1 - ) - } - - predicate implicitEntryDef( - Callable c, PreBasicBlocks::PreBasicBlock bb, SsaInput::SourceVariable v - ) { - c = v.getACallable() and - scopeFirst(c, bb) and - ( - not v instanceof LocalScopeVariable - or - v.(SimpleLocalScopeVariable).isReadonlyCapturedBy(c) - ) - } - - /** Holds if `a` is assigned in callable `c`. */ - pragma[nomagic] - private predicate assignableDefinition(Assignable a, Callable c) { - exists(AssignableDefinition def | - def.getTarget() = a and - c = def.getEnclosingCallable() - | - not c instanceof Constructor or - a instanceof LocalScopeVariable - ) - } - - pragma[nomagic] - private predicate assignableUniqueWriter(Assignable a, Callable c) { - c = unique(Callable c0 | assignableDefinition(a, c0) | c0) - } - - /** Holds if `a` is accessed in callable `c`. */ - pragma[nomagic] - private predicate assignableAccess(Assignable a, Callable c) { - exists(AssignableAccess aa | aa.getTarget() = a | c = aa.getEnclosingCallable()) - } - - /** - * A local scope variable that is amenable to SSA analysis. - * - * This is either a local variable that is not captured, or one - * where all writes happen in the defining callable. - */ - class SimpleLocalScopeVariable extends LocalScopeVariable { - SimpleLocalScopeVariable() { assignableUniqueWriter(this, this.getCallable()) } - - /** Holds if this local scope variable is read-only captured by `c`. */ - predicate isReadonlyCapturedBy(Callable c) { - assignableAccess(this, c) and - c != this.getCallable() - } - } - - module SsaInput implements SsaImplCommon::InputSig { - private import semmle.code.csharp.Caching - - private class ExitBasicBlock extends PreBasicBlocks::PreBasicBlock { - ExitBasicBlock() { scopeLast(_, this.getLastNode(), _) } - } - - pragma[noinline] - private predicate assignableNoComplexQualifiers(Assignable a) { - forall(QualifiableExpr qe | qe.(AssignableAccess).getTarget() = a | qe.targetIsThisInstance()) - } - - /** - * A simple assignable. Either a local scope variable or a field/property - * that behaves like a local scope variable. - */ - class SourceVariable extends Assignable { - private Callable c; - - SourceVariable() { - assignableAccess(this, c) and - ( - this instanceof SimpleLocalScopeVariable - or - ( - this = any(Field f | not f.isVolatile()) - or - this = any(TrivialProperty tp | not tp.isOverridableOrImplementable()) - ) and - ( - not assignableDefinition(this, _) - or - assignableUniqueWriter(this, c) - ) and - assignableNoComplexQualifiers(this) - ) - } - - /** Gets a callable in which this simple assignable can be analyzed. */ - Callable getACallable() { result = c } - } - - predicate variableWrite( - PreBasicBlocks::PreBasicBlock bb, int i, SourceVariable v, boolean certain - ) { - Stages::ControlFlowStage::forceCachingInSameStage() and - exists(AssignableDefinition def | - definitionAt(def, bb, i, v) and - if def.getTargetAccess().isRefArgument() then certain = false else certain = true - ) - or - implicitEntryDef(_, bb, v) and - i = -1 and - certain = true - } - - predicate variableRead( - PreBasicBlocks::PreBasicBlock bb, int i, SourceVariable v, boolean certain - ) { - exists(AssignableRead read | - read = bb.getNode(i) and - read.getTarget() = v and - certain = true - ) - or - v = - any(LocalScopeVariable lsv | - lsv.getCallable() = bb.(ExitBasicBlock).getEnclosingCallable() and - i = bb.length() and - (lsv.isRef() or v.(Parameter).isOut()) and - certain = false - ) - } - } - - private module SsaImpl = SsaImplCommon::Make; - - class Definition extends SsaImpl::Definition { - final AssignableRead getARead() { - exists(PreBasicBlocks::PreBasicBlock bb, int i | - SsaImpl::ssaDefReachesRead(_, this, bb, i) and - result = bb.getNode(i) - ) - } - - final AssignableDefinition getDefinition() { - exists(PreBasicBlocks::PreBasicBlock bb, int i, SsaInput::SourceVariable v | - this.definesAt(v, bb, i) and - definitionAt(result, bb, i, v) - ) - } - - final AssignableRead getAFirstRead() { - exists(PreBasicBlocks::PreBasicBlock bb, int i | - SsaImpl::firstUse(this, bb, i, true) and - result = bb.getNode(i) - ) - } - - private Definition getAPhiInputOrPriorDefinition() { - result = this.(PhiNode).getAnInput() or - SsaImpl::uncertainWriteDefinitionInput(this, result) - } - - final Definition getAnUltimateDefinition() { - result = this.getAPhiInputOrPriorDefinition*() and - not result instanceof PhiNode - } - - final predicate isLiveAtEndOfBlock(PreBasicBlocks::PreBasicBlock bb) { - SsaImpl::ssaDefReachesEndOfBlock(bb, this, _) - } - - override Location getLocation() { - result = this.getDefinition().getLocation() - or - exists(Callable c, PreBasicBlocks::PreBasicBlock bb, SsaInput::SourceVariable v | - this.definesAt(v, bb, -1) and - implicitEntryDef(c, bb, v) and - result = c.getLocation() - ) - } - } - - class PhiNode extends SsaImpl::PhiNode, Definition { - final override Location getLocation() { result = this.getBasicBlock().getLocation() } - - final Definition getAnInput() { SsaImpl::phiHasInputFromBlock(this, result, _) } - } - - predicate adjacentReadPairSameVar(AssignableRead read1, AssignableRead read2) { - 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.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 63d2c181da4..55b75ed31a7 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll @@ -9,27 +9,16 @@ private import Completion as Comp private import Comp private import ControlFlowGraphImpl private import semmle.code.csharp.controlflow.ControlFlowGraph::ControlFlow as Cfg -private import semmle.code.csharp.controlflow.internal.PreSsa cached private module Cached { private import semmle.code.csharp.Caching cached - newtype TBooleanSplitSubKind = - TSsaBooleanSplitSubKind(PreSsa::Definition def) { - Stages::ControlFlowStage::forceCachingInSameStage() - } + newtype TSplitKind = TConditionalCompletionSplitKind() cached - newtype TSplitKind = - TInitializerSplitKind() or - TConditionalCompletionSplitKind() - - cached - newtype TSplit = - TInitializerSplit(Constructor c) { InitializerSplitting::constructorInitializes(c, _) } or - TConditionalCompletionSplit(ConditionalCompletion c) + newtype TSplit = TConditionalCompletionSplit(ConditionalCompletion c) } import Cached @@ -43,186 +32,6 @@ class Split extends TSplit { string toString() { none() } } -module InitializerSplitting { - private import semmle.code.csharp.ExprOrStmtParent - - /** - * A non-static member with an initializer, for example a field `int Field = 0`. - */ - class InitializedInstanceMember extends Member { - InitializedInstanceMember() { - exists(AssignExpr ae | - not this.isStatic() and - expr_parent_top_level(ae, _, this) and - not ae = any(Callable c).getExpressionBody() - ) - } - - /** Gets the initializer expression. */ - AssignExpr getInitializer() { expr_parent_top_level(result, _, this) } - - /** - * Gets a control flow element that is a syntactic descendant of the - * initializer expression. - */ - AstNode getAnInitializerDescendant() { - result = this.getInitializer() - or - result = this.getAnInitializerDescendant().getAChild() - } - } - - /** - * Holds if `c` is a non-static constructor that performs the initialization - * of a member via assignment `init`. - */ - predicate constructorInitializes(InstanceConstructor c, AssignExpr init) { - exists(InitializedInstanceMember m | - c.isUnboundDeclaration() and - c.getDeclaringType().getAMember() = m and - not c.getInitializer().isThis() and - init = m.getInitializer() - ) - } - - /** - * Gets the `i`th member initializer expression for non-static constructor `c` - * in compilation `comp`. - */ - AssignExpr constructorInitializeOrder(Constructor c, CompilationExt comp, int i) { - constructorInitializes(c, result) and - result = - rank[i + 1](AssignExpr ae0, Location l | - constructorInitializes(c, ae0) and - l = ae0.getLocation() and - getCompilation(l.getFile()) = comp - | - ae0 order by l.getStartLine(), l.getStartColumn(), l.getFile().getAbsolutePath() - ) - } - - /** - * Gets the last member initializer expression for non-static constructor `c` - * in compilation `comp`. - */ - AssignExpr lastConstructorInitializer(Constructor c, CompilationExt comp) { - exists(int i | - result = constructorInitializeOrder(c, comp, i) and - not exists(constructorInitializeOrder(c, comp, i + 1)) - ) - } - - /** - * A split for non-static member initializers belonging to a given non-static - * constructor. For example, in - * - * ```csharp - * class C - * { - * int Field1 = 0; - * int Field2 = Field1 + 1; - * int Field3; - * - * public C() - * { - * Field3 = 2; - * } - * - * public C(int i) - * { - * Field3 = 3; - * } - * } - * ``` - * - * the initializer expressions `Field1 = 0` and `Field2 = Field1 + 1` are split - * on the two constructors. This is in order to generate CFGs for the two - * constructors that mimic - * - * ```csharp - * public C() - * { - * Field1 = 0; - * Field2 = Field1 + 1; - * Field3 = 2; - * } - * ``` - * - * and - * - * ```csharp - * public C() - * { - * Field1 = 0; - * Field2 = Field1 + 1; - * Field3 = 3; - * } - * ``` - * - * respectively. - */ - private class InitializerSplit extends Split, TInitializerSplit { - private Constructor c; - - InitializerSplit() { this = TInitializerSplit(c) } - - /** Gets the constructor. */ - Constructor getConstructor() { result = c } - - override string toString() { result = "" } - } - - private class InitializerSplitKind extends SplitKind, TInitializerSplitKind { - override int getListOrder() { result = 0 } - - override predicate isEnabled(AstNode cfe) { this.appliesTo(cfe) } - - override string toString() { result = "Initializer" } - } - - int getNextListOrder() { result = 1 } - - private class InitializerSplitImpl extends SplitImpl instanceof InitializerSplit { - override InitializerSplitKind getKind() { any() } - - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - exists(ConstructorInitializer ci | - last(ci, pred, c) and - succ(pred, succ, c) and - succ = any(InitializedInstanceMember m).getAnInitializerDescendant() and - super.getConstructor() = ci.getConstructor() - ) - } - - override predicate hasEntryScope(CfgScope scope, AstNode first) { - scopeFirst(scope, first) and - scope = super.getConstructor() and - first = any(InitializedInstanceMember m).getAnInitializerDescendant() - } - - override predicate hasExit(AstNode pred, AstNode succ, Completion c) { - this.appliesTo(pred) and - succ(pred, succ, c) and - not succ = any(InitializedInstanceMember m).getAnInitializerDescendant() and - succ.(ControlFlowElement).getEnclosingCallable() = super.getConstructor() - } - - override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) { - this.appliesTo(last) and - scopeLast(scope, last, c) and - scope = super.getConstructor() - } - - override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) { - this.appliesSucc(pred, succ, c) and - succ = - any(InitializedInstanceMember m | - constructorInitializes(super.getConstructor(), m.getInitializer()) - ).getAnInitializerDescendant() - } - } -} - module ConditionalCompletionSplitting { /** * A split for conditional completions. For example, in @@ -249,7 +58,7 @@ module ConditionalCompletionSplitting { } private class ConditionalCompletionSplitKind_ extends SplitKind, TConditionalCompletionSplitKind { - override int getListOrder() { result = InitializerSplitting::getNextListOrder() } + override int getListOrder() { result = 0 } override predicate isEnabled(AstNode cfe) { this.appliesTo(cfe) } @@ -312,6 +121,4 @@ module ConditionalCompletionSplitting { ) } } - - int getNextListOrder() { result = InitializerSplitting::getNextListOrder() + 1 } } 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 747cf790d91..a994873274a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll @@ -43,10 +43,47 @@ module BaseSsa { ) } - private module SsaInput implements SsaImplCommon::InputSig { - private import semmle.code.csharp.controlflow.internal.PreSsa + /** Holds if `a` is assigned in callable `c`. */ + pragma[nomagic] + private predicate assignableDefinition(Assignable a, Callable c) { + exists(AssignableDefinition def | + def.getTarget() = a and + c = def.getEnclosingCallable() + | + not c instanceof Constructor or + a instanceof LocalScopeVariable + ) + } - class SourceVariable = PreSsa::SimpleLocalScopeVariable; + pragma[nomagic] + private predicate assignableUniqueWriter(Assignable a, Callable c) { + c = unique(Callable c0 | assignableDefinition(a, c0) | c0) + } + + /** Holds if `a` is accessed in callable `c`. */ + pragma[nomagic] + private predicate assignableAccess(Assignable a, Callable c) { + exists(AssignableAccess aa | aa.getTarget() = a | c = aa.getEnclosingCallable()) + } + + /** + * A local scope variable that is amenable to SSA analysis. + * + * This is either a local variable that is not captured, or one + * where all writes happen in the defining callable. + */ + class SimpleLocalScopeVariable extends LocalScopeVariable { + SimpleLocalScopeVariable() { assignableUniqueWriter(this, this.getCallable()) } + + /** Holds if this local scope variable is read-only captured by `c`. */ + predicate isReadonlyCapturedBy(Callable c) { + assignableAccess(this, c) and + c != this.getCallable() + } + } + + private module SsaInput implements SsaImplCommon::InputSig { + class SourceVariable = SimpleLocalScopeVariable; predicate variableWrite(ControlFlow::BasicBlock bb, int i, SourceVariable v, boolean certain) { exists(AssignableDefinition def | diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll index 9ba96154820..c7d34a38979 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll @@ -16,7 +16,7 @@ private import semmle.code.csharp.internal.Location */ Callable getCallableForDataFlow(Callable c) { result = c.getUnboundDeclaration() and - result.hasBody() and + (result.hasBody() or result instanceof ObjectInitMethod) and result.getFile().fromSource() } @@ -27,6 +27,12 @@ newtype TReturnKind = private predicate hasMultipleSourceLocations(Callable c) { strictcount(getASourceLocation(c)) > 1 } +private predicate objectInitEntry(ObjectInitMethod m, ControlFlowElement first) { + exists(ControlFlow::Nodes::EntryNode en | + en.getCallable() = m and first.getControlFlowNode() = en.getASuccessor() + ) +} + private module NearestBodyLocationInput implements NearestLocationInputSig { class C = ControlFlowElement; @@ -34,7 +40,7 @@ private module NearestBodyLocationInput implements NearestLocationInputSig { exists(Callable c | hasMultipleSourceLocations(c) and l1 = getASourceLocation(c) and - body = c.getBody() and + (body = c.getBody() or objectInitEntry(c, body)) and l2 = body.getLocation() ) } @@ -207,7 +213,9 @@ class DataFlowCallable extends TDataFlowCallable { private ControlFlow::Nodes::ElementNode getAMultiBodyEntryNode(ControlFlow::BasicBlock bb, int i) { this.isMultiBodied() and exists(ControlFlowElement body, Location l | - body = this.asCallable(l).getBody() and + body = this.asCallable(l).getBody() or + objectInitEntry(this.asCallable(l), body) + | NearestLocation::nearestLocation(body, l, _) and result = body.getAControlFlowEntryNode() ) and 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 4f7f0141da2..a05651b4c64 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -178,12 +178,24 @@ private module ThisFlow { cfn = n.(InstanceParameterAccessPreNode).getUnderlyingControlFlowNode() } + private predicate primaryConstructorThisAccess(Node n, BasicBlock bb, int ppos) { + exists(Parameter p | + n.(PrimaryConstructorThisAccessPreNode).getParameter() = p and + bb.getCallable() = p.getCallable() and + ppos = p.getPosition() + ) + } + + private int numberOfPrimaryConstructorParameters(BasicBlock bb) { + result = strictcount(int primaryParamPos | primaryConstructorThisAccess(_, bb, primaryParamPos)) + } + private predicate thisAccess(Node n, BasicBlock bb, int i) { thisAccess(n, bb.getNode(i)) or - exists(Parameter p | n.(PrimaryConstructorThisAccessPreNode).getParameter() = p | - bb.getCallable() = p.getCallable() and - i = p.getPosition() + 1 + exists(int ppos | + primaryConstructorThisAccess(n, bb, ppos) and + i = ppos - numberOfPrimaryConstructorParameters(bb) ) or exists(DataFlowCallable c, ControlFlow::BasicBlocks::EntryBlock entry | @@ -195,8 +207,11 @@ private module ThisFlow { // entry definition. In case `c` doesn't have multiple bodies, the line below // is simply the same as `bb = entry`, because `entry.getFirstNode().getASuccessor()` // will be in the entry block. - bb = succ.getBasicBlock() and - i = -1 + bb = succ.getBasicBlock() + | + i = -1 - numberOfPrimaryConstructorParameters(bb) + or + not exists(numberOfPrimaryConstructorParameters(bb)) and i = -1 ) ) } @@ -3035,8 +3050,11 @@ predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preserves exists(AssignableDefinition def | def.getTargetAccess() = fa and nodeFrom.asExpr() = def.getSource() and - nodeTo = TFlowInsensitiveFieldNode(f) and + nodeTo = TFlowInsensitiveFieldNode(f) + | nodeFrom.getEnclosingCallable() instanceof Constructor + or + nodeFrom.getEnclosingCallable() instanceof ObjectInitMethod ) or nodeFrom = TFlowInsensitiveFieldNode(f) and @@ -3070,6 +3088,9 @@ predicate allowParameterReturnInSelf(ParameterNode p) { or VariableCapture::Flow::heuristicAllowInstanceParameterReturnInSelf(p.(DelegateSelfReferenceNode) .getCallable()) + or + // Allow field initializers to access Primary Constructor parameters + p.getEnclosingCallable() instanceof ObjectInitMethod } /** An approximated `Content`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlow.qll index 87b28b76e99..75d14034e00 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlow.qll @@ -88,7 +88,7 @@ */ import csharp -import ExternalFlowExtensions +private import ExternalFlowExtensions::Extensions as Extensions private import DataFlowDispatch private import DataFlowPrivate private import DataFlowPublic @@ -101,100 +101,13 @@ private import semmle.code.csharp.dispatch.OverridableCallable private import semmle.code.csharp.frameworks.System private import codeql.dataflow.internal.AccessPathSyntax as AccessPathSyntax private import codeql.mad.ModelValidation as SharedModelVal +private import codeql.mad.static.ModelsAsData as SharedMaD -/** - * Holds if the given extension tuple `madId` should pretty-print as `model`. - * - * This predicate should only be used in tests. - */ -predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind, string provenance - | - sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance, madId) and - model = - "Source: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " - + ext + "; " + output + "; " + kind + "; " + provenance - ) - or - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance - | - sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, madId) and - model = - "Sink: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " + - ext + "; " + input + "; " + kind + "; " + provenance - ) - or - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind, string provenance - | - summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance, - madId) and - model = - "Summary: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + - "; " + ext + "; " + input + "; " + output + "; " + kind + "; " + provenance - ) -} +private module MadInput implements SharedMaD::InputSig { } -private predicate relevantNamespace(string namespace) { - sourceModel(namespace, _, _, _, _, _, _, _, _, _) or - sinkModel(namespace, _, _, _, _, _, _, _, _, _) or - summaryModel(namespace, _, _, _, _, _, _, _, _, _, _) -} +private module MaD = SharedMaD::ModelsAsData; -private predicate namespaceLink(string shortns, string longns) { - relevantNamespace(shortns) and - relevantNamespace(longns) and - longns.prefix(longns.indexOf(".")) = shortns -} - -private predicate canonicalNamespace(string namespace) { - relevantNamespace(namespace) and not namespaceLink(_, namespace) -} - -private predicate canonicalNamespaceLink(string namespace, string subns) { - canonicalNamespace(namespace) and - (subns = namespace or namespaceLink(namespace, subns)) -} - -/** - * Holds if MaD framework coverage of `namespace` is `n` api endpoints of the - * kind `(kind, part)`, and `namespaces` is the number of subnamespaces of - * `namespace` which have MaD framework coverage (including `namespace` - * itself). - */ -predicate modelCoverage(string namespace, int namespaces, string kind, string part, int n) { - namespaces = strictcount(string subns | canonicalNamespaceLink(namespace, subns)) and - ( - part = "source" and - n = - strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string output, string provenance | - canonicalNamespaceLink(namespace, subns) and - sourceModel(subns, type, subtypes, name, signature, ext, output, kind, provenance, _) - ) - or - part = "sink" and - n = - strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string input, string provenance | - canonicalNamespaceLink(namespace, subns) and - sinkModel(subns, type, subtypes, name, signature, ext, input, kind, provenance, _) - ) - or - part = "summary" and - n = - strictcount(string subns, string type, boolean subtypes, string name, string signature, - string ext, string input, string output, string provenance | - canonicalNamespaceLink(namespace, subns) and - summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind, provenance, _) - ) - ) -} +import MaD /** Provides a query predicate to check the MaD models for validation errors. */ module ModelValidation { @@ -258,7 +171,7 @@ module ModelValidation { predicate sourceKind(string kind) { sourceModel(_, _, _, _, _, _, _, kind, _, _) } - predicate neutralKind(string kind) { neutralModel(_, _, _, _, kind, _) } + predicate neutralKind(string kind) { Extensions::neutralModel(_, _, _, _, kind, _) } } private module KindVal = SharedModelVal::KindValidation; @@ -275,7 +188,7 @@ module ModelValidation { summaryModel(namespace, type, _, name, signature, ext, _, _, _, provenance, _) and pred = "summary" or - neutralModel(namespace, type, name, signature, _, provenance) and + Extensions::neutralModel(namespace, type, name, signature, _, provenance) and ext = "" and pred = "neutral" | @@ -318,7 +231,7 @@ private predicate elementSpec( or summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _, _, _) or - neutralModel(namespace, type, name, signature, _, _) and ext = "" and subtypes = true + Extensions::neutralModel(namespace, type, name, signature, _, _) and ext = "" and subtypes = true } private predicate elementSpec( @@ -590,19 +503,17 @@ private predicate interpretSummary( UnboundCallable c, string input, string output, string kind, string provenance, string model ) { exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - QlBuiltins::ExtensionId madId + string namespace, string type, boolean subtypes, string name, string signature, string ext | summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance, - madId) and - model = "MaD:" + madId.toString() and + model) and c = interpretElement(namespace, type, subtypes, name, signature, ext) ) } predicate interpretNeutral(UnboundCallable c, string kind, string provenance) { exists(string namespace, string type, string name, string signature | - neutralModel(namespace, type, name, signature, kind, provenance) and + Extensions::neutralModel(namespace, type, name, signature, kind, provenance) and c = interpretElement(namespace, type, true, name, signature, "") ) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlowExtensions.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlowExtensions.qll index f761a0a9f5c..3461f0a5186 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlowExtensions.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ExternalFlowExtensions.qll @@ -2,6 +2,8 @@ * This module provides extensible predicates for defining MaD models. */ +private import codeql.mad.static.ModelsAsData as SharedMaD + /** * Holds if a source model exists for the given parameters. */ @@ -18,6 +20,22 @@ extensible predicate sinkModel( string input, string kind, string provenance, QlBuiltins::ExtensionId madId ); +/** + * Holds if a barrier model exists for the given parameters. + */ +extensible predicate barrierModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, QlBuiltins::ExtensionId madId +); + +/** + * Holds if a barrier guard model exists for the given parameters. + */ +extensible predicate barrierGuardModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string acceptingvalue, string kind, string provenance, QlBuiltins::ExtensionId madId +); + /** * Holds if a summary model exists for the given parameters. */ @@ -32,3 +50,9 @@ extensible predicate summaryModel( extensible predicate neutralModel( string namespace, string type, string name, string signature, string kind, string provenance ); + +module Extensions implements SharedMaD::ExtensionsSig { + import ExternalFlowExtensions + + predicate namespaceGrouping(string group, string namespace) { none() } +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index 3ee16f21489..56278b9ef95 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -213,11 +213,9 @@ module SourceSinkInterpretationInput implements Element e, string output, string kind, Public::Provenance provenance, string model ) { exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - QlBuiltins::ExtensionId madId + string namespace, string type, boolean subtypes, string name, string signature, string ext | - sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance, madId) and - model = "MaD:" + madId.toString() and + sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance, model) and e = interpretElement(namespace, type, subtypes, name, signature, ext) ) } @@ -226,15 +224,26 @@ module SourceSinkInterpretationInput implements Element e, string input, string kind, Public::Provenance provenance, string model ) { exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - QlBuiltins::ExtensionId madId + string namespace, string type, boolean subtypes, string name, string signature, string ext | - sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, madId) and - model = "MaD:" + madId.toString() and + sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, model) and e = interpretElement(namespace, type, subtypes, name, signature, ext) ) } + predicate barrierElement( + Element n, string output, string kind, Public::Provenance provenance, string model + ) { + none() + } + + predicate barrierGuardElement( + Element n, string input, Public::AcceptingValue acceptingvalue, string kind, + Public::Provenance provenance, string model + ) { + none() + } + class SourceOrSinkElement = Element; private newtype TInterpretNode = 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 70fda2b1296..277abd1d26e 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -5,9 +5,9 @@ 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 import semmle.code.csharp.dataflow.internal.BaseSSA private module SsaInput implements SsaImplCommon::InputSig { class SourceVariable = Ssa::SourceVariable; @@ -783,7 +783,7 @@ cached private module Cached { cached newtype TSourceVariable = - TLocalVar(Callable c, PreSsa::SimpleLocalScopeVariable v) { + TLocalVar(Callable c, BaseSsa::SimpleLocalScopeVariable v) { c = v.getCallable() or // Local scope variables can be captured @@ -967,18 +967,22 @@ private module Cached { cached // nothing is actually cached module BarrierGuard { - private predicate guardChecksAdjTypes( - DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, - DataFlowIntegrationInput::GuardValue branch + private import codeql.util.Unit + + private predicate guardChecksAdjTypes(Guards::Guards::Guard g, Expr e, Guards::GuardValue v) { + guardChecks(g, e, v) + } + + private predicate guardChecksWithWrappers( + Guards::Guard g, Definition def, Guards::GuardValue val, Unit state ) { - exists(Guards::GuardValue v | - guardChecks(g, e.getAstNode(), v) and - branch = v.asBooleanValue() - ) + Guards::Guards::ValidationWrapper::guardChecksDef(g, def, val) and + exists(state) } private Node getABarrierNodeImpl() { - result = DataFlowIntegrationImpl::BarrierGuard::getABarrierNode() + result = + DataFlowIntegrationImpl::BarrierGuardDefWithState::getABarrierNode(_) } predicate getABarrierNode = getABarrierNodeImpl/0; @@ -1037,38 +1041,18 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu ) } - class GuardValue = Boolean; + class GuardValue = Guards::GuardValue; - class Guard extends Guards::Guard { - /** - * Holds if the evaluation of this guard to `branch` corresponds to the edge - * from `bb1` to `bb2`. - */ - predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { - exists(ControlFlow::ConditionalSuccessor s | - this.getAControlFlowNode() = bb1.getLastNode() and - bb2 = bb1.getASuccessor(s) and - s.getValue() = branch - ) - } + class Guard = Guards::Guard; - /** - * Holds if this guard evaluating to `branch` controls the control-flow - * branch edge from `bb1` to `bb2`. That is, following the edge from - * `bb1` to `bb2` implies that this guard evaluated to `branch`. - */ - predicate valueControlsBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { - this.hasValueBranchEdge(bb1, bb2, branch) - } + /** Holds if the guard `guard` directly controls block `bb` upon evaluating to `val`. */ + predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { + guard.directlyValueControls(bb, val) } - /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ - predicate guardDirectlyControlsBlock(Guard guard, ControlFlow::BasicBlock bb, GuardValue branch) { - exists(ConditionBlock conditionBlock, ControlFlow::ConditionalSuccessor s | - guard.getAControlFlowNode() = conditionBlock.getLastNode() and - s.getValue() = branch and - conditionBlock.edgeDominates(bb, s) - ) + /** Holds if the guard `guard` controls block `bb` upon evaluating to `val`. */ + predicate guardControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { + guard.valueControls(bb, val) } } 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 3146720efe8..b24a104d388 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -24,6 +24,13 @@ predicate defaultTaintSanitizer(DataFlow::Node node) { ) } +/** + * Gets the (unbound) property `System.Collections.Generic.KeyValuePair.Value`. + */ +private Property keyValuePairValue() { + result.hasFullyQualifiedName("System.Collections.Generic", "KeyValuePair`2", "Value") +} + /** * Holds if default `TaintTracking::Configuration`s should allow implicit reads * of `c` at sinks and inputs to additional taint steps. @@ -31,7 +38,11 @@ predicate defaultTaintSanitizer(DataFlow::Node node) { bindingset[node] predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::ContentSet c) { exists(node) and - c.isElement() + ( + c.isElement() + or + c.isProperty(keyValuePairValue()) + ) } private class LocalTaintExprStepConfiguration extends ControlFlowReachabilityConfiguration { diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll index 77d749a0333..6b1eb7b67fb 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll @@ -52,7 +52,7 @@ class IDbCommandConstructionSqlExpr extends SqlExpr, ObjectCreation { class DapperCommandDefinitionMethodCallSqlExpr extends SqlExpr, ObjectCreation { DapperCommandDefinitionMethodCallSqlExpr() { this.getObjectType() instanceof Dapper::CommandDefinitionStruct and - DapperCommandDefinitionMethodCallSql::flow(DataFlow::exprNode(this), _) + DapperCommandDefinitionMethodCallSql::flowFromExpr(this) } override Expr getSql() { result = this.getArgumentForName("commandText") } diff --git a/csharp/ql/lib/semmle/code/csharp/internal/Overlay.qll b/csharp/ql/lib/semmle/code/csharp/internal/Overlay.qll index a44d82c92ad..a2939a5df03 100644 --- a/csharp/ql/lib/semmle/code/csharp/internal/Overlay.qll +++ b/csharp/ql/lib/semmle/code/csharp/internal/Overlay.qll @@ -2,6 +2,8 @@ * Defines entity discard predicates for C# overlay analysis. */ +private import OverlayXml + /** * Holds always for the overlay variant and never for the base variant. * This local predicate is used to define local predicates that behave @@ -110,36 +112,6 @@ private predicate discardLocation(@location_default loc) { exists(string path | discardableLocation(loc, path) | overlayChangedFiles(path)) } -/** - * A class of Xml locatables that can be discarded from the base. - */ -overlay[local] -private class DiscardableXmlEntity extends DiscardableEntityBase instanceof @xmllocatable { - /** Gets the path to the file in which this element occurs. */ - override string getFilePath() { - exists(@location_default loc | result = getLocationFilePath(loc) | xmllocations(this, loc)) - } -} - -overlay[local] -private predicate overlayXmlExtracted(string file) { - exists(DiscardableXmlEntity dxe | - dxe.existsInOverlay() and - file = dxe.getFilePath() and - not files(dxe, _) and - not xmlNs(dxe, _, _, _) - ) -} - -overlay[discard_entity] -private predicate discardXmlEntity(@xmllocatable xml) { - overlayChangedFiles(xml.(DiscardableXmlEntity).getFilePath()) - or - // The XML extractor is not incremental and may extract more - // XML files than those included in overlayChangedFiles. - overlayXmlExtracted(xml.(DiscardableXmlEntity).getFilePath()) -} - overlay[local] private class DiscardableAspEntity extends DiscardableEntityBase instanceof @asp_element { /** Gets the path to the file in which this element occurs. */ diff --git a/csharp/ql/lib/semmle/code/csharp/internal/OverlayXml.qll b/csharp/ql/lib/semmle/code/csharp/internal/OverlayXml.qll new file mode 100644 index 00000000000..95d49f2d611 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/internal/OverlayXml.qll @@ -0,0 +1,46 @@ +overlay[local] +module; + +/** + * A local predicate that always holds for the overlay variant and never holds for the base variant. + * This is used to define local predicates that behave differently for the base and overlay variant. + */ +private predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +private string getXmlFile(@xmllocatable locatable) { + exists(@location_default location, @file file | xmllocations(locatable, location) | + locations_default(location, file, _, _, _, _) and + files(file, result) + ) +} + +private string getXmlFileInBase(@xmllocatable locatable) { + not isOverlay() and + result = getXmlFile(locatable) +} + +/** + * Holds if the given `file` was extracted as part of the overlay and was extracted by the HTML/XML + * extractor. + */ +private predicate overlayXmlExtracted(string file) { + isOverlay() and + exists(@xmllocatable locatable | + not files(locatable, _) and not xmlNs(locatable, _, _, _) and file = getXmlFile(locatable) + ) +} + +/** + * Holds if the given XML `locatable` should be discarded, because it is part of the overlay base + * and is in a file that was also extracted as part of the overlay database. + */ +overlay[discard_entity] +private predicate discardXmlLocatable(@xmllocatable locatable) { + exists(string file | file = getXmlFileInBase(locatable) | + overlayChangedFiles(file) + or + // The HTML/XML extractor is currently not incremental and may extract more files than those + // included in overlayChangedFiles. + overlayXmlExtracted(file) + ) +} diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll index f1a64f6810b..e623628fea6 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll @@ -85,7 +85,7 @@ module RemoteSourceToExternalApi = TaintTracking::Global` elements. +* The `cs/web/missing-x-frame-options` query now correctly handles configuration nested in root `` elements. diff --git a/csharp/ql/src/change-notes/released/1.5.0.md b/csharp/ql/src/change-notes/released/1.5.0.md new file mode 100644 index 00000000000..16106aaca11 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.5.0.md @@ -0,0 +1,9 @@ +## 1.5.0 + +### New Queries + +* The `cs/web/cookie-secure-not-set` and `cs/web/cookie-httponly-not-set` queries have been promoted from experimental to the main query pack. + +### Minor Analysis Improvements + +* An improvement to the Guards library for recognizing disjunctions means improved precision for `cs/constant-condition`, `cs/inefficient-containskey`, and `cs/dereferenced-value-may-be-null`. The two former can have additional findings, and the latter will have fewer false positives. diff --git a/csharp/ql/src/change-notes/released/1.5.1.md b/csharp/ql/src/change-notes/released/1.5.1.md new file mode 100644 index 00000000000..7b24a64aca3 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.5.1.md @@ -0,0 +1,3 @@ +## 1.5.1 + +No user-facing changes. diff --git a/csharp/ql/src/change-notes/released/1.5.2.md b/csharp/ql/src/change-notes/released/1.5.2.md new file mode 100644 index 00000000000..384c27833f1 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.5.2.md @@ -0,0 +1,3 @@ +## 1.5.2 + +No user-facing changes. diff --git a/csharp/ql/src/change-notes/released/1.5.3.md b/csharp/ql/src/change-notes/released/1.5.3.md new file mode 100644 index 00000000000..2e9bcb5e663 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.5.3.md @@ -0,0 +1,3 @@ +## 1.5.3 + +No user-facing changes. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 08f88b689fb..232224b0e26 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.3 +lastReleaseVersion: 1.5.3 diff --git a/csharp/ql/src/experimental/Security Features/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql b/csharp/ql/src/experimental/Security Features/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql index d8bbbce7065..a2983f15d82 100644 --- a/csharp/ql/src/experimental/Security Features/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql +++ b/csharp/ql/src/experimental/Security Features/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql @@ -1,5 +1,5 @@ /** - * @name Unsafe usage of v1 version of Azure Storage client-side encryption (CVE-2022-30187). + * @name Unsafe usage of v1 version of Azure Storage client-side encryption (CVE-2022-30187) * @description Unsafe usage of v1 version of Azure Storage client-side encryption, please refer to http://aka.ms/azstorageclientencryptionblog * @kind problem * @tags security diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 2597e99f55b..efe787aaae5 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.4.4-dev +version: 1.5.4-dev groups: - csharp - queries diff --git a/csharp/ql/src/utils/modelconverter/ExtractNeutrals.ql b/csharp/ql/src/utils/modelconverter/ExtractNeutrals.ql index 830365e161d..b9d748fdf77 100644 --- a/csharp/ql/src/utils/modelconverter/ExtractNeutrals.ql +++ b/csharp/ql/src/utils/modelconverter/ExtractNeutrals.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD neutral model rows. + * @name Extract MaD neutral model rows * @description This extracts the Models as data neutral model rows. * @id cs/utils/modelconverter/generate-data-extensions-neutral */ diff --git a/csharp/ql/src/utils/modelconverter/ExtractSinks.ql b/csharp/ql/src/utils/modelconverter/ExtractSinks.ql index aef2e8fa10e..d442e42b4b6 100644 --- a/csharp/ql/src/utils/modelconverter/ExtractSinks.ql +++ b/csharp/ql/src/utils/modelconverter/ExtractSinks.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD sink model rows. + * @name Extract MaD sink model rows * @description This extracts the Models as data sink model rows. * @id cs/utils/modelconverter/generate-data-extensions-sink */ diff --git a/csharp/ql/src/utils/modelconverter/ExtractSources.ql b/csharp/ql/src/utils/modelconverter/ExtractSources.ql index d940178ca05..d2899346286 100644 --- a/csharp/ql/src/utils/modelconverter/ExtractSources.ql +++ b/csharp/ql/src/utils/modelconverter/ExtractSources.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD source model rows. + * @name Extract MaD source model rows * @description This extracts the Models as data source model rows. * @id cs/utils/modelconverter/generate-data-extensions-source */ diff --git a/csharp/ql/src/utils/modelconverter/ExtractSummaries.ql b/csharp/ql/src/utils/modelconverter/ExtractSummaries.ql index c6c5a257f74..e5ca42a97b5 100644 --- a/csharp/ql/src/utils/modelconverter/ExtractSummaries.ql +++ b/csharp/ql/src/utils/modelconverter/ExtractSummaries.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD summary model rows. + * @name Extract MaD summary model rows * @description This extracts the Models as data summary model rows. * @id cs/utils/modelconverter/generate-data-extensions-summary */ diff --git a/csharp/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql index 6030960a1a7..59d917ebbdc 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture content based summary models. + * @name Capture content based summary models * @description Finds applicable content based summary models to be used by other queries. * @kind diagnostic * @id cs/utils/modelgenerator/contentbased-summary-models diff --git a/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql index c74240bedea..04f58e1b45e 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture neutral models. + * @name Capture neutral models * @description Finds neutral models to be used by other queries. * @kind diagnostic * @id cs/utils/modelgenerator/neutral-models diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql index f0d3294cd8a..be69194d9c2 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture sink models. + * @name Capture sink models * @description Finds public methods that act as sinks as they flow into a known sink. * @kind diagnostic * @id cs/utils/modelgenerator/sink-models diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql index 97688d6eb42..78268446c5e 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture source models. + * @name Capture source models * @description Finds APIs that act as sources as they expose already known sources. * @kind diagnostic * @id cs/utils/modelgenerator/source-models diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql index 61656c200ad..456cc020870 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture summary models. + * @name Capture summary models * @description Finds applicable summary models to be used by other queries. * @kind diagnostic * @id cs/utils/modelgenerator/summary-models diff --git a/csharp/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql index 19bec058d40..bd7b923a14b 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture typed based summary models. + * @name Capture typed based summary models * @description Finds applicable summary models to be used by other queries. * @kind diagnostic * @id cs/utils/modelgenerator/summary-models-typed-based diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll index db3d72bd27b..f27743fda47 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -260,6 +260,8 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig { ) } + int contentAccessPathLimitInternal() { result = 2 } + bindingset[d] private string getFullyQualifiedName(Declaration d) { exists(string qualifier, string name | diff --git a/csharp/ql/test/library-tests/arguments/PrintAst.expected b/csharp/ql/test/library-tests/arguments/PrintAst.expected index b63b49cc7f5..fbf61c14743 100644 --- a/csharp/ql/test/library-tests/arguments/PrintAst.expected +++ b/csharp/ql/test/library-tests/arguments/PrintAst.expected @@ -1,6 +1,6 @@ arguments.cs: # 4| [Class] ArgumentsTest -# 6| 4: [InstanceConstructor] ArgumentsTest +# 6| 5: [InstanceConstructor] ArgumentsTest #-----| 2: (Parameters) # 6| 0: [Parameter] x # 6| -1: [TypeMention] int @@ -9,7 +9,7 @@ arguments.cs: # 6| -1: [TypeMention] int # 6| 1: [IntLiteral] 0 # 7| 4: [BlockStmt] {...} -# 10| 5: [InstanceConstructor] ArgumentsTest +# 10| 6: [InstanceConstructor] ArgumentsTest #-----| 2: (Parameters) # 10| 0: [Parameter] x # 10| -1: [TypeMention] int @@ -22,7 +22,7 @@ arguments.cs: # 12| 0: [AssignExpr] ... = ... # 12| 0: [ParameterAccess] access to parameter y # 12| 1: [ParameterAccess] access to parameter x -# 15| 6: [Method] f1 +# 15| 7: [Method] f1 # 15| -1: [TypeMention] Void #-----| 2: (Parameters) # 15| 0: [Parameter] x @@ -32,7 +32,7 @@ arguments.cs: # 15| -1: [TypeMention] int # 15| 1: [IntLiteral] 2 # 16| 4: [BlockStmt] {...} -# 19| 7: [Method] f2 +# 19| 8: [Method] f2 # 19| -1: [TypeMention] Void #-----| 2: (Parameters) # 19| 0: [Parameter] x @@ -46,7 +46,7 @@ arguments.cs: # 21| 0: [AssignExpr] ... = ... # 21| 0: [ParameterAccess] access to parameter y # 21| 1: [ParameterAccess] access to parameter x -# 24| 8: [Method] f +# 24| 9: [Method] f # 24| -1: [TypeMention] Void # 25| 4: [BlockStmt] {...} # 26| 0: [LocalVariableDeclStmt] ... ...; @@ -73,7 +73,7 @@ arguments.cs: # 31| -1: [TypeMention] ArgumentsTest # 31| 0: [IntLiteral] 10 # 31| 1: [IntLiteral] 5 -# 34| 9: [Method] f3 +# 34| 10: [Method] f3 # 34| -1: [TypeMention] Void #-----| 2: (Parameters) # 34| 0: [Parameter] o @@ -135,7 +135,7 @@ arguments.cs: # 43| 1: [LocalVariableAccess] access to local variable s1 # 43| 2: [CastExpr] (...) ... # 43| 1: [LocalVariableAccess] access to local variable s2 -# 46| 10: [Method] f4 +# 46| 11: [Method] f4 # 46| -1: [TypeMention] Void #-----| 2: (Parameters) # 46| 0: [Parameter] args @@ -150,13 +150,13 @@ arguments.cs: # 48| -1: [ArrayInitializer] { ..., ... } # 48| 0: [NullLiteral] null # 48| 1: [NullLiteral] null -# 51| 11: [Property] Prop +# 51| 12: [Property] Prop # 51| -1: [TypeMention] int # 51| 3: [Getter] get_Prop # 51| 4: [Setter] set_Prop #-----| 2: (Parameters) # 51| 0: [Parameter] value -# 53| 12: [Indexer] Item +# 53| 13: [Indexer] Item # 53| -1: [TypeMention] int #-----| 1: (Parameters) # 53| 0: [Parameter] a @@ -176,7 +176,7 @@ arguments.cs: # 53| 1: [Parameter] b # 53| 2: [Parameter] value # 53| 4: [BlockStmt] {...} -# 55| 13: [Method] f5 +# 55| 14: [Method] f5 # 55| -1: [TypeMention] Void # 56| 4: [BlockStmt] {...} # 57| 0: [ExprStmt] ...; @@ -237,14 +237,14 @@ arguments.cs: # 65| 0: [IntLiteral] 15 # 65| 1: [IntLiteral] 16 # 65| 1: [LocalVariableAccess] access to local variable tuple -# 69| 14: [Method] f6 +# 69| 15: [Method] f6 # 69| -1: [TypeMention] Void #-----| 0: (Attributes) # 68| 1: [DefaultAttribute] [My(...)] # 68| -1: [TypeMention] MyAttribute # 68| 0: [BoolLiteral] false # 69| 4: [BlockStmt] {...} -# 72| 15: [Method] f7 +# 72| 16: [Method] f7 # 72| -1: [TypeMention] Void #-----| 0: (Attributes) # 71| 1: [DefaultAttribute] [My(...)] @@ -253,7 +253,7 @@ arguments.cs: # 71| 1: [StringLiteralUtf16] "" # 71| 2: [IntLiteral] 0 # 72| 4: [BlockStmt] {...} -# 74| 17: [Method] f8`1 +# 74| 18: [Method] f8`1 # 74| -1: [TypeMention] Void #-----| 1: (Type parameters) # 74| 0: [TypeParameter] T @@ -337,7 +337,7 @@ arguments.cs: # 86| 1: [IntLiteral] 1 # 86| 1: [CastExpr] (...) ... # 86| 1: [IntLiteral] 2 -# 89| 19: [Method] f9`1 +# 89| 20: [Method] f9`1 # 89| -1: [TypeMention] Void #-----| 1: (Type parameters) # 89| 0: [TypeParameter] T @@ -406,7 +406,7 @@ arguments.cs: # 100| 1: [ElementInitializer] call to method Add # 100| 0: [CastExpr] (...) ... # 100| 1: [IntLiteral] 2 -# 103| 20: [Method] f10 +# 103| 21: [Method] f10 # 103| -1: [TypeMention] Void #-----| 2: (Parameters) # 103| 0: [Parameter] o @@ -465,22 +465,22 @@ arguments.cs: # 116| [Class] MyAttribute #-----| 3: (Base types) # 116| 0: [TypeMention] Attribute -# 118| 4: [Field] x +# 118| 5: [Field] x # 118| -1: [TypeMention] int -# 119| 5: [Property] y +# 119| 6: [Property] y # 119| -1: [TypeMention] string # 119| 3: [Getter] get_y # 119| 4: [Setter] set_y #-----| 2: (Parameters) # 119| 0: [Parameter] value -# 120| 6: [InstanceConstructor] MyAttribute +# 120| 7: [InstanceConstructor] MyAttribute #-----| 2: (Parameters) # 120| 0: [Parameter] b # 120| -1: [TypeMention] bool # 120| 4: [BlockStmt] {...} lambdas.cs: # 3| [Class] LambdaArgumentsTest -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; @@ -546,13 +546,13 @@ lambdas.cs: # 17| 0: [IntLiteral] 7 # 17| 1: [IntLiteral] 8 # 17| 2: [IntLiteral] 9 -# 20| 6: [DelegateType] MyDelegate +# 20| 7: [DelegateType] MyDelegate #-----| 2: (Parameters) # 20| 0: [Parameter] x # 20| -1: [TypeMention] int # 20| 1: [Parameter] y # 20| -1: [TypeMention] int -# 22| 7: [Method] M2 +# 22| 8: [Method] M2 # 22| -1: [TypeMention] Void # 23| 4: [BlockStmt] {...} # 24| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/assemblies/compilation.expected b/csharp/ql/test/library-tests/assemblies/compilation.expected index ee9126f59ce..8afa20dab5f 100644 --- a/csharp/ql/test/library-tests/assemblies/compilation.expected +++ b/csharp/ql/test/library-tests/assemblies/compilation.expected @@ -1,9 +1,9 @@ | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | no compilation | | Locations, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | has compilation | | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | no compilation | -| System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | +| System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | no compilation | -| System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e | no compilation | -| System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | -| System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | +| System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e | no compilation | +| System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | +| System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | no compilation | diff --git a/csharp/ql/test/library-tests/assignments/PrintAst.expected b/csharp/ql/test/library-tests/assignments/PrintAst.expected index e309da37a0e..bece0312d15 100644 --- a/csharp/ql/test/library-tests/assignments/PrintAst.expected +++ b/csharp/ql/test/library-tests/assignments/PrintAst.expected @@ -1,6 +1,6 @@ Assignments.cs: # 1| [Class] Assignments -# 3| 5: [Method] M +# 3| 6: [Method] M # 3| -1: [TypeMention] Void # 4| 4: [BlockStmt] {...} # 5| 0: [LocalVariableDeclStmt] ... ...; @@ -40,7 +40,7 @@ Assignments.cs: # 14| 0: [Parameter] sender # 14| 1: [Parameter] e # 14| 4: [BlockStmt] {...} -# 17| 6: [AddOperator] + +# 17| 7: [AddOperator] + # 17| -1: [TypeMention] Assignments #-----| 2: (Parameters) # 17| 0: [Parameter] x @@ -50,13 +50,13 @@ Assignments.cs: # 18| 4: [BlockStmt] {...} # 19| 0: [ReturnStmt] return ...; # 19| 0: [ParameterAccess] access to parameter x -# 22| 7: [DelegateType] EventHandler +# 22| 8: [DelegateType] EventHandler #-----| 2: (Parameters) # 22| 0: [Parameter] sender # 22| -1: [TypeMention] object # 22| 1: [Parameter] e # 22| -1: [TypeMention] object -# 23| 8: [Event] Event +# 23| 9: [Event] Event # 23| -1: [TypeMention] EventHandler # 23| 3: [AddEventAccessor] add_Event #-----| 2: (Parameters) diff --git a/csharp/ql/test/library-tests/attributes/PrintAst.expected b/csharp/ql/test/library-tests/attributes/PrintAst.expected index 00412ae011a..e16a6ff8a92 100644 --- a/csharp/ql/test/library-tests/attributes/PrintAst.expected +++ b/csharp/ql/test/library-tests/attributes/PrintAst.expected @@ -102,7 +102,7 @@ attributes.cs: # 45| 0: [TypeMention] AttributeTargets #-----| 3: (Base types) # 46| 0: [TypeMention] Attribute -# 49| 5: [Method] foo +# 49| 6: [Method] foo # 49| -1: [TypeMention] Void #-----| 0: (Attributes) # 48| 1: [DefaultAttribute] [Conditional(...)] @@ -110,7 +110,7 @@ attributes.cs: # 48| 0: [StringLiteralUtf16] "DEBUG2" # 49| 4: [BlockStmt] {...} # 52| [Class] Bar -# 54| 5: [Method] inc +# 54| 6: [Method] inc # 54| -1: [TypeMention] int #-----| 2: (Parameters) # 54| 0: [Parameter] x @@ -123,14 +123,14 @@ attributes.cs: # 54| 0: [AddExpr] ... + ... # 54| 0: [ParameterAccess] access to parameter x # 54| 1: [IntLiteral] 1 -# 57| 6: [Method] M1 +# 57| 7: [Method] M1 # 57| -1: [TypeMention] Void #-----| 0: (Attributes) # 56| 1: [DefaultAttribute] [My(...)] # 56| -1: [TypeMention] MyAttribute # 56| 0: [BoolLiteral] false # 57| 4: [BlockStmt] {...} -# 61| 7: [Method] M2 +# 61| 8: [Method] M2 # 61| -1: [TypeMention] Void #-----| 0: (Attributes) # 59| 1: [DefaultAttribute] [My(...)] @@ -148,15 +148,15 @@ attributes.cs: # 64| [Class] MyAttribute #-----| 3: (Base types) # 64| 0: [TypeMention] Attribute -# 66| 4: [Field] x +# 66| 5: [Field] x # 66| -1: [TypeMention] int -# 67| 5: [Property] y +# 67| 6: [Property] y # 67| -1: [TypeMention] string # 67| 3: [Getter] get_y # 67| 4: [Setter] set_y #-----| 2: (Parameters) # 67| 0: [Parameter] value -# 68| 6: [InstanceConstructor] MyAttribute +# 68| 7: [InstanceConstructor] MyAttribute #-----| 2: (Parameters) # 68| 0: [Parameter] b # 68| -1: [TypeMention] bool @@ -167,14 +167,14 @@ attributes.cs: # 73| [Class] ArgsAttribute #-----| 3: (Base types) # 73| 0: [TypeMention] Attribute -# 75| 4: [Property] Prop +# 75| 5: [Property] Prop # 75| -1: [TypeMention] Object[] # 75| 1: [TypeMention] object # 75| 3: [Getter] get_Prop # 75| 4: [Setter] set_Prop #-----| 2: (Parameters) # 75| 0: [Parameter] value -# 76| 5: [InstanceConstructor] ArgsAttribute +# 76| 6: [InstanceConstructor] ArgsAttribute #-----| 2: (Parameters) # 76| 0: [Parameter] i # 76| -1: [TypeMention] int @@ -216,7 +216,7 @@ attributes.cs: # 79| 1: [TypeofExpr] typeof(...) # 79| 0: [TypeAccess] access to type Int32 # 79| 0: [TypeMention] int -# 84| 5: [Method] SomeMethod +# 84| 6: [Method] SomeMethod # 84| -1: [TypeMention] int #-----| 0: (Attributes) # 82| 1: [DefaultAttribute] [Args(...)] @@ -279,13 +279,13 @@ attributes.cs: # 87| [Class] My2Attribute #-----| 3: (Base types) # 87| 0: [TypeMention] Attribute -# 89| 4: [Property] X +# 89| 5: [Property] X # 89| -1: [TypeMention] int # 89| 3: [Getter] get_X # 89| 4: [Setter] set_X #-----| 2: (Parameters) # 89| 0: [Parameter] value -# 90| 5: [InstanceConstructor] My2Attribute +# 90| 6: [InstanceConstructor] My2Attribute #-----| 2: (Parameters) # 90| 0: [Parameter] a # 90| -1: [TypeMention] bool @@ -301,7 +301,7 @@ attributes.cs: # 93| [Class] My3Attribute #-----| 3: (Base types) # 93| 0: [TypeMention] Attribute -# 95| 4: [InstanceConstructor] My3Attribute +# 95| 5: [InstanceConstructor] My3Attribute #-----| 2: (Parameters) # 95| 0: [Parameter] x # 95| -1: [TypeMention] int @@ -323,7 +323,7 @@ attributes.cs: # 104| 0: [Parameter] message # 104| -1: [TypeMention] string # 106| [Class] MyAttributeUsage -# 110| 5: [AddOperator] + +# 110| 6: [AddOperator] + # 110| -1: [TypeMention] int #-----| 0: (Attributes) # 108| 1: [DefaultAttribute] [My3(...)] @@ -338,7 +338,7 @@ attributes.cs: # 110| 1: [Parameter] b # 110| -1: [TypeMention] MyAttributeUsage # 110| 4: [IntLiteral] 0 -# 113| 6: [Indexer] Item +# 113| 7: [Indexer] Item # 113| -1: [TypeMention] int #-----| 0: (Attributes) # 112| 1: [DefaultAttribute] [My3(...)] @@ -376,9 +376,9 @@ attributes.cs: # 120| 0: [IntLiteral] 10 # 121| 4: [BlockStmt] {...} # 121| 0: [ReturnStmt] return ...; -# 124| 7: [Field] p +# 124| 8: [Field] p # 124| -1: [TypeMention] int -# 126| 8: [Property] Prop1 +# 126| 9: [Property] Prop1 # 126| -1: [TypeMention] int #-----| 0: (Attributes) # 125| 1: [DefaultAttribute] [My3(...)] @@ -412,10 +412,10 @@ attributes.cs: # 134| 0: [FieldAccess] access to field p # 134| 1: [ParameterAccess] access to parameter value # 138| [Class] Class1 -# 140| 5: [Class] ParamsAttribute +# 140| 6: [Class] ParamsAttribute #-----| 3: (Base types) # 140| 0: [TypeMention] Attribute -# 142| 4: [InstanceConstructor] ParamsAttribute +# 142| 5: [InstanceConstructor] ParamsAttribute #-----| 2: (Parameters) # 142| 0: [Parameter] s1 # 142| -1: [TypeMention] string @@ -425,7 +425,7 @@ attributes.cs: # 142| -1: [TypeMention] Int32[] # 142| 1: [TypeMention] int # 142| 4: [BlockStmt] {...} -# 146| 6: [Method] M1 +# 146| 7: [Method] M1 # 146| -1: [TypeMention] Void #-----| 0: (Attributes) # 145| 1: [DefaultAttribute] [Params(...)] @@ -436,7 +436,7 @@ attributes.cs: # 145| 3: [IntLiteral] 2 # 145| 4: [IntLiteral] 3 # 146| 4: [BlockStmt] {...} -# 149| 7: [Method] M2 +# 149| 8: [Method] M2 # 149| -1: [TypeMention] Void #-----| 0: (Attributes) # 148| 1: [DefaultAttribute] [Params(...)] @@ -447,7 +447,7 @@ attributes.cs: # 148| 3: [IntLiteral] 2 # 148| 4: [IntLiteral] 3 # 149| 4: [BlockStmt] {...} -# 152| 8: [Method] M3 +# 152| 9: [Method] M3 # 152| -1: [TypeMention] Void #-----| 0: (Attributes) # 151| 1: [DefaultAttribute] [Params(...)] @@ -456,7 +456,7 @@ attributes.cs: # 151| 1: [StringLiteralUtf16] "b" # 151| 2: [IntLiteral] 1 # 152| 4: [BlockStmt] {...} -# 155| 9: [Method] M4 +# 155| 10: [Method] M4 # 155| -1: [TypeMention] Void #-----| 0: (Attributes) # 154| 1: [DefaultAttribute] [Params(...)] @@ -472,7 +472,7 @@ attributes.cs: # 158| 1: [DefaultAttribute] [Experimental(...)] # 158| -1: [TypeMention] ExperimentalAttribute # 158| 0: [StringLiteralUtf16] "MyExperimentalClassId" -# 162| 5: [Method] MyExperimentalMethod +# 162| 6: [Method] MyExperimentalMethod # 162| -1: [TypeMention] Void #-----| 0: (Attributes) # 161| 1: [DefaultAttribute] [Experimental(...)] @@ -480,7 +480,7 @@ attributes.cs: # 161| 0: [StringLiteralUtf16] "MyExperimentalMethodId" # 162| 4: [BlockStmt] {...} # 165| [Class] MyOverloadResolutionClass -# 168| 5: [Method] M +# 168| 6: [Method] M # 168| -1: [TypeMention] Void #-----| 0: (Attributes) # 167| 1: [DefaultAttribute] [OverloadResolutionPriority(...)] @@ -492,7 +492,7 @@ attributes.cs: # 168| -1: [TypeMention] Int32[] # 168| 1: [TypeMention] int # 168| 4: [BlockStmt] {...} -# 171| 6: [Method] M +# 171| 7: [Method] M # 171| -1: [TypeMention] Void #-----| 0: (Attributes) # 170| 1: [DefaultAttribute] [OverloadResolutionPriority(...)] @@ -503,7 +503,7 @@ attributes.cs: # 171| -1: [TypeMention] IEnumerable # 171| 1: [TypeMention] int # 171| 4: [BlockStmt] {...} -# 174| 7: [Method] M +# 174| 8: [Method] M # 174| -1: [TypeMention] Void #-----| 0: (Attributes) # 173| 1: [DefaultAttribute] [OverloadResolutionPriority(...)] diff --git a/csharp/ql/test/library-tests/comments/PrintAst.expected b/csharp/ql/test/library-tests/comments/PrintAst.expected index 68c2c582e37..9bc446858ee 100644 --- a/csharp/ql/test/library-tests/comments/PrintAst.expected +++ b/csharp/ql/test/library-tests/comments/PrintAst.expected @@ -1,19 +1,19 @@ comments1.cs: # 9| [Class] C # 34| [Class] Foo -# 39| 5: [Field] x +# 39| 6: [Field] x # 39| -1: [TypeMention] int -# 42| 6: [Field] y +# 42| 7: [Field] y # 42| -1: [TypeMention] int -# 43| 7: [Field] z +# 43| 8: [Field] z # 43| -1: [TypeMention] int comments2.cs: # 11| [Class] C2 -# 13| 4: [Field] field1 +# 13| 5: [Field] field1 # 13| -1: [TypeMention] int -# 14| 5: [Field] field2 +# 14| 6: [Field] field2 # 14| -1: [TypeMention] int -# 19| 6: [Method] f +# 19| 7: [Method] f # 19| -1: [TypeMention] Void # 20| 4: [BlockStmt] {...} # 23| 0: [ExprStmt] ...; @@ -21,7 +21,7 @@ comments2.cs: # 26| 1: [ExprStmt] ...; # 26| 0: [MethodCall] call to method g # 26| 0: [IntLiteral] 2 -# 29| 7: [Method] g +# 29| 8: [Method] g # 29| -1: [TypeMention] Void #-----| 2: (Parameters) # 29| 0: [Parameter] x @@ -37,8 +37,8 @@ comments2.cs: # 34| -1: [TypeMention] int # 34| 0: [LocalVariableAccess] access to local variable z # 34| 1: [IntLiteral] 0 -# 40| 8: [Class] C3 -# 48| 9: [Property] S1 +# 40| 9: [Class] C3 +# 48| 10: [Property] S1 # 48| -1: [TypeMention] string # 52| 3: [Getter] get_S1 # 52| 4: [BlockStmt] {...} @@ -48,15 +48,15 @@ comments2.cs: #-----| 2: (Parameters) # 53| 0: [Parameter] value # 54| 4: [BlockStmt] {...} -# 61| 10: [Enum] Values +# 61| 11: [Enum] Values # 66| 5: [Field] First # 67| 6: [Field] Second # 73| 7: [Field] Third -# 79| 11: [InstanceConstructor] C2 +# 79| 12: [InstanceConstructor] C2 # 80| 4: [BlockStmt] {...} -# 85| 12: [Destructor] ~C2 +# 85| 13: [Destructor] ~C2 # 86| 4: [BlockStmt] {...} -# 90| 13: [AddOperator] + +# 90| 14: [AddOperator] + # 90| -1: [TypeMention] int #-----| 2: (Parameters) # 90| 0: [Parameter] x @@ -66,7 +66,7 @@ comments2.cs: # 91| 4: [BlockStmt] {...} # 92| 0: [ReturnStmt] return ...; # 92| 0: [IntLiteral] 2 -# 95| 14: [Method] f +# 95| 15: [Method] f # 95| -1: [TypeMention] Void #-----| 2: (Parameters) # 96| 0: [Parameter] x @@ -74,8 +74,8 @@ comments2.cs: # 97| 1: [Parameter] y # 97| -1: [TypeMention] int # 99| 4: [BlockStmt] {...} -# 103| 15: [DelegateType] D -# 107| 16: [Event] E +# 103| 16: [DelegateType] D +# 107| 17: [Event] E # 107| -1: [TypeMention] D # 107| 3: [AddEventAccessor] add_E #-----| 2: (Parameters) @@ -83,7 +83,7 @@ comments2.cs: # 107| 4: [RemoveEventAccessor] remove_E #-----| 2: (Parameters) # 107| 0: [Parameter] value -# 110| 17: [Method] gen +# 110| 18: [Method] gen # 110| -1: [TypeMention] Void # 111| 4: [BlockStmt] {...} # 112| 0: [LocalVariableDeclStmt] ... ...; @@ -110,12 +110,12 @@ comments2.cs: # 115| -1: [TypeMention] int # 115| 0: [LocalVariableAccess] access to local variable t4 # 115| 1: [MethodCall] call to method GenericFn -# 119| 20: [Class] GenericClass`1 +# 119| 21: [Class] GenericClass`1 #-----| 1: (Type parameters) # 119| 0: [TypeParameter] T -# 121| 5: [Field] f +# 121| 6: [Field] f # 121| -1: [TypeMention] int -# 125| 23: [Method] GenericFn`1 +# 125| 24: [Method] GenericFn`1 # 125| -1: [TypeMention] int #-----| 1: (Type parameters) # 125| 0: [TypeParameter] T @@ -129,7 +129,7 @@ comments2.cs: # 128| 0: [IntLiteral] 0 trivia.cs: # 14| [Class] Tr1 -# 16| 5: [Method] M1 +# 16| 6: [Method] M1 # 16| -1: [TypeMention] Void # 17| 4: [BlockStmt] {...} comments1.cs: @@ -155,7 +155,7 @@ trivia.cs: # 28| 0: [LocalVariableDeclExpr] Double d # 28| 0: [TypeMention] double # 32| [Class] Tr2 -# 34| 5: [Method] M1 +# 34| 6: [Method] M1 # 34| -1: [TypeMention] Void # 35| 4: [BlockStmt] {...} # 37| 0: [LocalVariableDeclStmt] ... ...; @@ -165,11 +165,11 @@ trivia.cs: # 39| 0: [LocalVariableDeclExpr] Int32 j # 39| 0: [TypeMention] int # 45| [Class] Tr3 -# 47| 5: [Method] M1 +# 47| 6: [Method] M1 # 47| -1: [TypeMention] Void # 48| 4: [BlockStmt] {...} # 61| [Class] Tr4 -# 63| 5: [Method] M1 +# 63| 6: [Method] M1 # 63| -1: [TypeMention] Void # 64| 4: [BlockStmt] {...} # 73| 0: [LocalVariableDeclStmt] ... ...; @@ -178,25 +178,25 @@ trivia.cs: # 73| 0: [LocalVariableAccess] access to local variable i # 73| 1: [IntLiteral] 1 # 80| [Class] Tr5 -# 83| 5: [Method] M1 +# 83| 6: [Method] M1 # 83| -1: [TypeMention] Void # 84| 4: [BlockStmt] {...} -# 88| 6: [Method] M2 +# 88| 7: [Method] M2 # 88| -1: [TypeMention] Void # 89| 4: [BlockStmt] {...} -# 92| 7: [Field] F1 +# 92| 8: [Field] F1 # 92| -1: [TypeMention] int # 94| 1: [IntLiteral] 10 -# 98| 8: [Field] F2 +# 98| 9: [Field] F2 # 98| -1: [TypeMention] int # 98| 1: [IntLiteral] 0 -# 100| 9: [Property] P1 +# 100| 10: [Property] P1 # 100| -1: [TypeMention] int # 102| 3: [Getter] get_P1 # 104| 4: [Setter] set_P1 #-----| 2: (Parameters) # 104| 0: [Parameter] value -# 108| 10: [Property] P2 +# 108| 11: [Property] P2 # 108| -1: [TypeMention] int # 108| 3: [Getter] get_P2 # 108| 4: [Setter] set_P2 diff --git a/csharp/ql/test/library-tests/constructors/PrintAst.expected b/csharp/ql/test/library-tests/constructors/PrintAst.expected index fc5c19ac2df..000ae29f2c2 100644 --- a/csharp/ql/test/library-tests/constructors/PrintAst.expected +++ b/csharp/ql/test/library-tests/constructors/PrintAst.expected @@ -1,16 +1,16 @@ constructors.cs: # 1| [NamespaceDeclaration] namespace ... { ... } # 3| 1: [Class] Class -# 5| 4: [InstanceConstructor] Class +# 5| 5: [InstanceConstructor] Class # 6| 4: [BlockStmt] {...} -# 8| 5: [InstanceConstructor] Class +# 8| 6: [InstanceConstructor] Class #-----| 2: (Parameters) # 8| 0: [Parameter] i # 8| -1: [TypeMention] int # 9| 4: [BlockStmt] {...} -# 11| 6: [StaticConstructor] Class +# 11| 7: [StaticConstructor] Class # 12| 4: [BlockStmt] {...} -# 14| 7: [Destructor] ~Class +# 14| 8: [Destructor] ~Class # 15| 4: [BlockStmt] {...} # 16| 0: [LocalVariableDeclStmt] ... ...; # 16| 0: [LocalVariableDeclAndInitExpr] Int32 i = ... @@ -19,13 +19,13 @@ constructors.cs: # 16| 1: [IntLiteral] 0 # 21| [NamespaceDeclaration] namespace ... { ... } # 23| 1: [Class] C1 -# 23| 4: [InstanceConstructor,PrimaryConstructor] C1 +# 23| 5: [InstanceConstructor,PrimaryConstructor] C1 #-----| 2: (Parameters) # 23| 0: [Parameter] o # 23| -1: [TypeMention] object # 23| 1: [Parameter] s # 23| -1: [TypeMention] string -# 25| 5: [InstanceConstructor] C1 +# 25| 6: [InstanceConstructor] C1 #-----| 2: (Parameters) # 25| 0: [Parameter] o # 25| -1: [TypeMention] object @@ -36,7 +36,7 @@ constructors.cs: # 28| 2: [Class] C2 #-----| 3: (Base types) # 28| 0: [TypeMention] C1 -# 28| 4: [InstanceConstructor,PrimaryConstructor] C2 +# 28| 5: [InstanceConstructor,PrimaryConstructor] C2 #-----| 2: (Parameters) # 28| 0: [Parameter] o # 28| -1: [TypeMention] object diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index c9f7d2ab35c..99d89a29c13 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -1,4 +1,4 @@ -| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | 5 | +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | 7 | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | exit get_Item | 4 | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | exit set_Item | 4 | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | exit add_Event | 4 | @@ -12,12 +12,12 @@ | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | exit M7 | 24 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | exit M8 | 30 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | exit M9 | 58 | -| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | 5 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | 7 | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | exit M1 | 5 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | exit M2 | 6 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | exit M3 | 8 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | exit M4 | 13 | -| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | exit AssertTests | 5 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | exit AssertTests | 7 | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:9:20:9:20 | access to parameter b | 4 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | exit M1 | 1 | | Assert.cs:7:10:7:11 | exit M1 (abnormal) | Assert.cs:7:10:7:11 | exit M1 (abnormal) | 1 | @@ -163,11 +163,11 @@ | Assert.cs:138:10:138:12 | exit M13 | Assert.cs:138:10:138:12 | exit M13 | 1 | | Assert.cs:138:10:138:12 | exit M13 (abnormal) | Assert.cs:138:10:138:12 | exit M13 (abnormal) | 1 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | 2 | -| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | exit Assignments | 5 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | exit Assignments | 7 | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | exit M | 34 | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | exit (...) => ... | 4 | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | exit + | 6 | -| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | exit BreakInTry | 5 | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | exit BreakInTry | 7 | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:7:33:7:36 | access to parameter args | 5 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | 2 | | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | 1 | @@ -197,18 +197,18 @@ | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | 1 | | BreakInTry.cs:65:26:65:28 | String arg | BreakInTry.cs:67:21:67:31 | ... == ... | 6 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | 1 | -| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | 5 | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | 7 | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | exit Default | 6 | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | exit Sizeof | 6 | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | exit Typeof | 6 | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | exit Nameof | 6 | -| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | 5 | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | 7 | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | 9 | | CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | exit M | 1 | | CompileTimeOperators.cs:28:10:28:10 | exit M (abnormal) | CompileTimeOperators.cs:28:10:28:10 | exit M (abnormal) | 1 | | CompileTimeOperators.cs:39:9:39:34 | ...; | CompileTimeOperators.cs:39:9:39:33 | call to method WriteLine | 3 | | CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | 5 | -| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | 5 | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | 7 | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | 2 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | 2 | | ConditionalAccess.cs:3:26:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:38 | call to method ToString | 1 | @@ -245,7 +245,7 @@ | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | exit M8 | 2 | | ConditionalAccess.cs:35:9:35:24 | call to method Out | ConditionalAccess.cs:35:9:35:24 | call to method Out | 1 | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith | 8 | -| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | exit Conditions | 5 | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | exit Conditions | 7 | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:5:13:5:15 | access to parameter inc | 4 | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | 2 | | Conditions.cs:6:13:6:16 | ...; | Conditions.cs:6:13:6:15 | ...++ | 3 | @@ -334,7 +334,7 @@ | Conditions.cs:145:27:145:29 | "b" | Conditions.cs:145:27:145:29 | "b" | 1 | | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:48 | call to method WriteLine | 6 | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:48 | call to method WriteLine | 6 | -| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods | 5 | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods | 7 | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | exit M1 | 8 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | exit M2 | 8 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | exit M3 | 7 | @@ -383,7 +383,7 @@ | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | exit ToBool | 8 | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | exit CallToInt32 | 5 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | exit Main | 20 | -| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | exit Finally | 5 | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | exit Finally | 7 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:15:13:15:40 | call to method WriteLine | 11 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | 1 | | Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 1 | @@ -464,9 +464,9 @@ | Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:39:161:54 | ... == ... | 5 | | Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | 6 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:167:17:167:37 | call to method WriteLine | 5 | -| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA | 5 | -| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB | 5 | -| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | exit ExceptionC | 5 | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA | 7 | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB | 7 | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | exit ExceptionC | 7 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:17:180:18 | access to parameter b1 | 6 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | 1 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | 1 | @@ -511,7 +511,7 @@ | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | 1 | | Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 1 | | Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:263:10:263:12 | exit M13 (normal) | 1 | -| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | exit Foreach | 5 | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | exit Foreach | 7 | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:8:29:8:32 | access to parameter args | 3 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | 2 | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | 1 | @@ -539,19 +539,22 @@ | Foreach.cs:36:10:36:11 | exit M6 (normal) | Foreach.cs:36:10:36:11 | exit M6 | 2 | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | 1 | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:39:11:39:11 | ; | 4 | +| Initializers.cs:3:7:3:18 | enter | Initializers.cs:3:7:3:18 | exit | 14 | | Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | exit Initializers | 4 | -| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | exit Initializers | 16 | -| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | exit Initializers | 16 | +| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | exit Initializers | 7 | +| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | exit Initializers | 7 | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | exit M | 22 | | Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:16:18:16 | exit H | 5 | -| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor | 11 | -| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | exit Sub | 12 | +| Initializers.cs:20:11:20:23 | enter | Initializers.cs:20:11:20:23 | exit | 9 | +| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor | 7 | +| Initializers.cs:26:11:26:13 | enter | Initializers.cs:26:11:26:13 | exit | 6 | +| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | exit Sub | 11 | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | exit Sub | 9 | -| Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | exit Sub | 14 | -| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | exit IndexInitializers | 5 | -| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | exit Compound | 5 | +| Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | exit Sub | 13 | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | exit IndexInitializers | 7 | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | exit Compound | 7 | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | exit Test | 105 | -| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | 5 | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | 7 | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:9:13:9:28 | ... == ... | 7 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | 2 | | LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:10:13:10:19 | return ...; | 1 | @@ -609,9 +612,9 @@ | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | exit M11 | 2 | | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | 1 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | 5 | -| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | 2 | | MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | 1 | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | 2 | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | {...} | 4 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | 1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | 1 | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | 3 | @@ -624,6 +627,9 @@ | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationA.cs:8:16:8:16 | enter M | 1 | | MultiImplementationA.cs:8:16:8:16 | exit M | MultiImplementationA.cs:8:16:8:16 | exit M | 1 | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | 3 | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:11:7:11:8 | enter | 1 | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | exit | 2 | +| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:24:32:24:34 | ... = ... | 7 | | MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | exit get_Item (normal) | 2 | | MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | enter get_Item | 1 | | MultiImplementationA.cs:14:31:14:31 | exit get_Item | MultiImplementationA.cs:14:31:14:31 | exit get_Item | 1 | @@ -637,9 +643,9 @@ | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | MultiImplementationA.cs:16:17:16:18 | exit M1 | 2 | | MultiImplementationA.cs:17:5:19:5 | {...} | MultiImplementationA.cs:18:9:18:22 | M2(...) | 2 | | MultiImplementationA.cs:18:9:18:22 | enter M2 | MultiImplementationA.cs:18:9:18:22 | exit M2 | 4 | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | 14 | | MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | enter C2 | 1 | | MultiImplementationA.cs:20:12:20:13 | exit C2 | MultiImplementationA.cs:20:12:20:13 | exit C2 | 1 | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | 9 | | MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationA.cs:21:12:21:13 | enter C2 | 1 | | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | MultiImplementationA.cs:21:12:21:13 | exit C2 | 2 | | MultiImplementationA.cs:21:24:21:24 | 0 | MultiImplementationA.cs:21:27:21:29 | {...} | 3 | @@ -649,35 +655,36 @@ | MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | 1 | | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | 1 | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | 2 | -| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | {...} | 2 | | MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | 1 | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | 2 | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | {...} | 4 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | 5 | -| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | 2 | | MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | 1 | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | 2 | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | {...} | 4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | 1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | 1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | 4 | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | exit M2 | 6 | -| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | 2 | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | {...} | 4 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | 2 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (normal) | 4 | | MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (normal) | 2 | | MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationA.cs:8:16:8:16 | exit M (normal) | 2 | +| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:22:32:22:34 | ... = ... | 7 | | MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | 3 | | MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | 4 | | MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationB.cs:13:60:13:62 | {...} | 1 | | MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:16:9:16:31 | M2(...) | 2 | | MultiImplementationB.cs:16:9:16:31 | enter M2 | MultiImplementationB.cs:16:9:16:31 | exit M2 | 5 | -| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | 12 | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | 7 | | MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationB.cs:19:27:19:29 | {...} | 3 | | MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | 4 | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | 3 | -| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | {...} | 2 | -| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | {...} | 2 | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | {...} | 4 | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | {...} | 4 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | 2 | -| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | 5 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | 7 | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | 2 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | exit M1 | 3 | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | 1 | @@ -715,9 +722,10 @@ | NullCoalescing.cs:15:31:15:31 | 0 | NullCoalescing.cs:16:17:16:18 | "" | 5 | | NullCoalescing.cs:16:17:16:25 | ... ?? ... | NullCoalescing.cs:17:13:17:19 | (...) ... | 5 | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | exit M6 | 4 | -| PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | exit Partial | 12 | -| PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | exit Partial | 12 | -| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | exit Patterns | 5 | +| PartialImplementationA.cs:1:15:1:21 | enter | PartialImplementationA.cs:1:15:1:21 | exit | 10 | +| PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | exit Partial | 7 | +| PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | exit Partial | 7 | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | exit Patterns | 7 | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:8:18:8:23 | Int32 i1 | 8 | | Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:8:13:8:23 | [false] ... is ... | 1 | | Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:8:13:8:23 | [true] ... is ... | 1 | @@ -811,7 +819,7 @@ | Patterns.cs:95:29:95:38 | [no-match] ... or ... | Patterns.cs:95:29:95:38 | [no-match] ... or ... | 1 | | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:36:95:38 | access to constant B | 1 | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:97:13:97:38 | call to method WriteLine | 4 | -| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | exit PostDominance | 5 | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | exit PostDominance | 7 | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | exit M1 | 7 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:12:18:12:21 | null | 5 | | PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | exit M2 | 2 | @@ -825,11 +833,11 @@ | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:19:13:19:21 | [true] ... is ... | 1 | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | 4 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | exit M3 (normal) | 4 | -| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | exit Qualifiers | 5 | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | exit Qualifiers | 7 | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | exit Method | 4 | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | exit StaticMethod | 4 | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | exit M | 58 | -| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | exit Switch | 5 | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | exit Switch | 7 | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | exit M1 | 6 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:14:18:14:20 | "a" | 6 | | Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | exit M2 | 1 | @@ -947,20 +955,20 @@ | Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:18:171:18 | 3 | 2 | | Switch.cs:172:17:172:46 | ...; | Switch.cs:173:17:173:22 | break; | 4 | | Switch.cs:174:13:174:20 | default: | Switch.cs:176:17:176:22 | break; | 5 | -| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | 5 | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | 7 | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:18:7:22 | Int32 j | 13 | | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | 1 | | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | 1 | | TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; | 1 | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | exit M | 5 | -| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | exit VarDecls | 5 | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | exit VarDecls | 7 | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | exit M1 | 19 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | exit M2 | 13 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:25:20:25:20 | access to parameter b | 11 | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | exit M3 | 4 | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | 1 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | 1 | -| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | exit C | 5 | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | exit C | 7 | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | exit Dispose | 4 | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:11:13:11:17 | ... > ... | 15 | | cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | exit Main | 2 | @@ -1034,7 +1042,7 @@ | cflow.cs:127:48:127:49 | "" | cflow.cs:127:48:127:49 | "" | 1 | | cflow.cs:127:53:127:57 | this access | cflow.cs:127:53:127:57 | access to field Field | 2 | | cflow.cs:127:62:127:64 | enter set_Prop | cflow.cs:127:62:127:64 | exit set_Prop | 8 | -| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | exit ControlFlow | 9 | +| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | exit ControlFlow | 11 | | cflow.cs:134:5:134:15 | enter ControlFlow | cflow.cs:134:5:134:15 | exit ControlFlow | 9 | | cflow.cs:136:12:136:22 | enter ControlFlow | cflow.cs:136:12:136:22 | exit ControlFlow | 8 | | cflow.cs:138:40:138:40 | enter + | cflow.cs:138:40:138:40 | exit + | 9 | @@ -1132,17 +1140,17 @@ | cflow.cs:264:25:264:25 | access to local variable i | cflow.cs:264:25:264:30 | ... < ... | 3 | | cflow.cs:265:9:267:9 | {...} | cflow.cs:264:33:264:35 | ...++ | 5 | | cflow.cs:268:9:276:9 | try {...} ... | cflow.cs:275:13:275:41 | call to method WriteLine | 7 | -| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | exit ControlFlowSub | 5 | +| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | exit ControlFlowSub | 7 | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | exit ControlFlowSub | 5 | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | exit ControlFlowSub | 7 | -| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | exit DelegateCall | 5 | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | exit DelegateCall | 7 | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | exit M | 6 | -| cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | exit NegationInConstructor | 5 | +| cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | exit NegationInConstructor | 7 | | cflow.cs:298:10:298:10 | enter M | cflow.cs:300:46:300:50 | ... > ... | 7 | | cflow.cs:300:44:300:51 | [false] !... | cflow.cs:300:44:300:51 | [false] !... | 1 | | cflow.cs:300:44:300:51 | [true] !... | cflow.cs:300:44:300:51 | [true] !... | 1 | | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:298:10:298:10 | exit M | 5 | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:64 | ... != ... | 3 | -| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | exit LambdaGetter | 5 | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | exit LambdaGetter | 7 | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | exit (...) => ... | 9 | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | exit get__getter | 4 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index f5368b5c7e9..8240e61a419 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -1,7 +1,9 @@ dominance | AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | {...} | -| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | call to method | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | this access | | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | this access | AccessorCalls.cs:1:7:1:19 | call to method | | AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:23:5:25 | exit get_Item | @@ -305,8 +307,10 @@ dominance | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:74:73:82 | (..., ...) | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:81 | dynamic access to element | | ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | {...} | -| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | call to method | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | this access | | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | this access | ArrayCreation.cs:1:7:1:19 | call to method | | ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:11:3:12 | exit M1 | @@ -337,8 +341,10 @@ dominance | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:48:9:48 | 3 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:43:9:50 | { ..., ... } | | Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | {...} | -| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | call to method | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | this access | | Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | exit AssertTests | +| Assert.cs:5:7:5:17 | this access | Assert.cs:5:7:5:17 | call to method | | Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | exit AssertTests (normal) | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:8:5:12:5 | {...} | | Assert.cs:8:5:12:5 | {...} | Assert.cs:9:9:9:33 | ... ...; | @@ -708,8 +714,10 @@ dominance | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | | Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | {...} | -| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | call to method | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | this access | | Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | exit Assignments | +| Assignments.cs:1:7:1:17 | this access | Assignments.cs:1:7:1:17 | call to method | | Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | exit Assignments (normal) | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:3:10:3:10 | exit M | @@ -753,8 +761,10 @@ dominance | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | exit + (normal) | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:9:19:17 | return ...; | | BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | {...} | -| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | call to method | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | this access | | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | exit BreakInTry | +| BreakInTry.cs:1:7:1:16 | this access | BreakInTry.cs:1:7:1:16 | call to method | | BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | @@ -839,8 +849,10 @@ dominance | BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:68:21:68:26 | break; | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:31 | ... == ... | | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | {...} | -| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | call to method | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | this access | | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | this access | CompileTimeOperators.cs:3:7:3:26 | call to method | | CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:5:9:5:15 | exit Default | @@ -863,8 +875,10 @@ dominance | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | exit Nameof (normal) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:9:22:25 | return ...; | | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | {...} | -| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | call to method | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | this access | | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | this access | CompileTimeOperators.cs:26:7:26:22 | call to method | | CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | @@ -884,8 +898,10 @@ dominance | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | {...} | -| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | call to method | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | this access | | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | this access | ConditionalAccess.cs:1:7:1:23 | call to method | | ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | @@ -963,8 +979,10 @@ dominance | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:78 | ... + ... | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:83 | ... + ... | | Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | {...} | -| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | call to method | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | this access | | Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | exit Conditions | +| Conditions.cs:1:7:1:16 | this access | Conditions.cs:1:7:1:16 | call to method | | Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | exit Conditions (normal) | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | @@ -1266,8 +1284,10 @@ dominance | Conditions.cs:149:44:149:46 | {...} | Conditions.cs:149:38:149:47 | $"..." | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:44:149:46 | {...} | | ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | {...} | -| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | call to method | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | this access | | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | exit ExitMethods | +| ExitMethods.cs:6:7:6:17 | this access | ExitMethods.cs:6:7:6:17 | call to method | | ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:8:10:8:11 | exit M1 | @@ -1464,8 +1484,10 @@ dominance | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | delegate creation of type Func | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:9:25:33 | call to method ToBool | | Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | {...} | -| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | call to method | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | this access | | Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | exit Finally | +| Finally.cs:3:14:3:20 | this access | Finally.cs:3:14:3:20 | call to method | | Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | exit Finally (normal) | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:8:5:17:5 | {...} | | Finally.cs:8:5:17:5 | {...} | Finally.cs:9:9:16:9 | try {...} ... | @@ -1679,16 +1701,22 @@ dominance | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:35:167:36 | "" | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:37 | call to method WriteLine | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | {...} | -| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | call to method | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | this access | | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | exit ExceptionA | +| Finally.cs:172:11:172:20 | this access | Finally.cs:172:11:172:20 | call to method | | Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | | Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | {...} | -| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | call to method | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | this access | | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | exit ExceptionB | +| Finally.cs:173:11:173:20 | this access | Finally.cs:173:11:173:20 | call to method | | Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | | Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | {...} | -| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | call to method | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | this access | | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | exit ExceptionC | +| Finally.cs:174:11:174:20 | this access | Finally.cs:174:11:174:20 | call to method | | Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:177:5:193:5 | {...} | | Finally.cs:177:5:193:5 | {...} | Finally.cs:178:9:192:9 | try {...} ... | @@ -1812,8 +1840,10 @@ dominance | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | -| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | this access | | Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | exit Foreach | +| Foreach.cs:4:7:4:13 | this access | Foreach.cs:4:7:4:13 | call to method | | Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | exit Foreach (normal) | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | @@ -1865,38 +1895,33 @@ dominance | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:33:38:33 | Int32 y | | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:18:38:34 | (..., ...) | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | +| Initializers.cs:3:7:3:18 | enter | Initializers.cs:5:9:5:9 | this access | | Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | {...} | +| Initializers.cs:3:7:3:18 | exit (normal) | Initializers.cs:3:7:3:18 | exit | | Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | exit Initializers | | Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | exit Initializers (normal) | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | -| Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | -| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | | Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:17:5:17 | 1 | -| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:17:5:17 | 1 | -| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:9:5:17 | ... = ... | | Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:9:5:17 | ... = ... | | Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:17 | ... + ... | -| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:17 | ... + ... | -| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:25:6:31 | ... = ... | | Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:25:6:31 | ... = ... | | Initializers.cs:6:9:6:9 | this access | Initializers.cs:6:27:6:27 | access to field H | -| Initializers.cs:6:9:6:9 | this access | Initializers.cs:6:27:6:27 | access to field H | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:8:20:8:22 | {...} | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:10:28:10:30 | {...} | -| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:31:6:31 | 2 | +| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:3:7:3:18 | exit (normal) | | Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:31:6:31 | 2 | | Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:9:6:9 | access to property G | -| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:9:6:9 | access to property G | | Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:31 | ... + ... | -| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:31 | ... + ... | -| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:5:9:5:9 | this access | -| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | call to constructor Object | +| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:20:8:22 | {...} | +| Initializers.cs:8:5:8:16 | call to method | Initializers.cs:8:5:8:16 | call to constructor Object | +| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | this access | | Initializers.cs:8:5:8:16 | exit Initializers (normal) | Initializers.cs:8:5:8:16 | exit Initializers | +| Initializers.cs:8:5:8:16 | this access | Initializers.cs:8:5:8:16 | call to method | | Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:5:8:16 | exit Initializers (normal) | -| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:5:9:5:9 | this access | -| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | call to constructor Object | +| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:28:10:30 | {...} | +| Initializers.cs:10:5:10:16 | call to method | Initializers.cs:10:5:10:16 | call to constructor Object | +| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | this access | | Initializers.cs:10:5:10:16 | exit Initializers (normal) | Initializers.cs:10:5:10:16 | exit Initializers | +| Initializers.cs:10:5:10:16 | this access | Initializers.cs:10:5:10:16 | call to method | | Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:5:10:16 | exit Initializers (normal) | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:13:5:16:5 | {...} | | Initializers.cs:12:10:12:10 | exit M (normal) | Initializers.cs:12:10:12:10 | exit M | @@ -1923,25 +1948,30 @@ dominance | Initializers.cs:18:16:18:16 | exit H (normal) | Initializers.cs:18:16:18:16 | exit H | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:16 | exit H (normal) | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:20 | ... = ... | -| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:22:23:22:23 | this access | -| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | call to constructor Object | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | {...} | +| Initializers.cs:20:11:20:23 | call to method | Initializers.cs:20:11:20:23 | call to constructor Object | +| Initializers.cs:20:11:20:23 | enter | Initializers.cs:22:23:22:23 | this access | +| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | this access | +| Initializers.cs:20:11:20:23 | exit (normal) | Initializers.cs:20:11:20:23 | exit | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | exit NoConstructor | +| Initializers.cs:20:11:20:23 | this access | Initializers.cs:20:11:20:23 | call to method | | Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:27:22:27 | 0 | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:23:23:23:23 | this access | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:27 | ... = ... | | Initializers.cs:23:23:23:23 | this access | Initializers.cs:23:27:23:27 | 1 | -| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | {...} | +| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | exit (normal) | | Initializers.cs:23:27:23:27 | 1 | Initializers.cs:23:23:23:27 | ... = ... | +| Initializers.cs:26:11:26:13 | enter | Initializers.cs:28:13:28:13 | this access | +| Initializers.cs:26:11:26:13 | exit (normal) | Initializers.cs:26:11:26:13 | exit | | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | -| Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:31:24:31:33 | {...} | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:35:27:35:40 | {...} | +| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:26:11:26:13 | exit (normal) | | Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:17 | ... = ... | -| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:17 | ... = ... | -| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | +| Initializers.cs:31:9:31:11 | call to method | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | +| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | this access | | Initializers.cs:31:9:31:11 | exit Sub (normal) | Initializers.cs:31:9:31:11 | exit Sub | -| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:28:13:28:13 | this access | +| Initializers.cs:31:9:31:11 | this access | Initializers.cs:31:9:31:11 | call to method | +| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:24:31:33 | {...} | | Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:26:31:31 | ...; | | Initializers.cs:31:26:31:26 | this access | Initializers.cs:31:30:31:30 | 3 | | Initializers.cs:31:26:31:30 | ... = ... | Initializers.cs:31:9:31:11 | exit Sub (normal) | @@ -1955,9 +1985,11 @@ dominance | Initializers.cs:33:31:33:35 | ... = ... | Initializers.cs:33:9:33:11 | exit Sub (normal) | | Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:31:33:31 | this access | | Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:31:33:35 | ... = ... | -| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:28:13:28:13 | this access | -| Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | +| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:27:35:40 | {...} | +| Initializers.cs:35:9:35:11 | call to method | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | +| Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | this access | | Initializers.cs:35:9:35:11 | exit Sub (normal) | Initializers.cs:35:9:35:11 | exit Sub | +| Initializers.cs:35:9:35:11 | this access | Initializers.cs:35:9:35:11 | call to method | | Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:29:35:38 | ...; | | Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:33:35:33 | access to parameter i | | Initializers.cs:35:29:35:37 | ... = ... | Initializers.cs:35:9:35:11 | exit Sub (normal) | @@ -1966,12 +1998,16 @@ dominance | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:29:35:37 | ... = ... | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:37 | ... + ... | | Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | {...} | -| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:39:7:39:23 | call to method | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | this access | | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | exit IndexInitializers | +| Initializers.cs:39:7:39:23 | this access | Initializers.cs:39:7:39:23 | call to method | | Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | | Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | {...} | -| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:41:11:41:18 | call to method | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | this access | | Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | exit Compound | +| Initializers.cs:41:11:41:18 | this access | Initializers.cs:41:11:41:18 | call to method | | Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | exit Compound (normal) | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:52:5:66:5 | {...} | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:51:10:51:13 | exit Test | @@ -2078,8 +2114,10 @@ dominance | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:54 | ... + ... | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:46:64:61 | ... = ... | | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | {...} | -| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | call to method | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | this access | | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | this access | LoopUnrolling.cs:5:7:5:19 | call to method | | LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | @@ -2275,9 +2313,11 @@ dominance | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | -| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | -| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | call to method | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | this access | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | this access | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | call to method | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | @@ -2296,6 +2336,9 @@ dominance | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationB.cs:5:23:5:23 | 2 | | MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:23:8:32 | throw ... | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:13:16:13:16 | this access | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationB.cs:11:16:11:16 | this access | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | exit | | MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:20:13:20 | 0 | | MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | | MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:13:16:13:20 | ... = ... | @@ -2317,9 +2360,11 @@ dominance | MultiImplementationA.cs:18:9:18:22 | enter M2 | MultiImplementationA.cs:18:21:18:21 | 0 | | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | MultiImplementationA.cs:18:9:18:22 | exit M2 | | MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:13:16:13:16 | this access | -| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | -| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | +| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:22:20:31 | {...} | +| MultiImplementationA.cs:20:12:20:13 | call to method | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | +| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | this access | +| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | this access | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | call to method | | MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:24:20:29 | ...; | | MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:28:20:28 | access to parameter i | | MultiImplementationA.cs:20:24:20:28 | ... = ... | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | @@ -2338,20 +2383,23 @@ dominance | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | | MultiImplementationA.cs:24:16:24:16 | access to property P | MultiImplementationA.cs:24:32:24:34 | ... = ... | | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:34:24:34 | 0 | -| MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:20:22:20:31 | {...} | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | access to property P | | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | {...} | -| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | -| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | call to method | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | this access | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | this access | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | call to method | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:28:30:37 | throw ... | | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | -| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | -| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | call to method | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | this access | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | this access | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | call to method | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:22:36:25 | null | @@ -2363,6 +2411,8 @@ dominance | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:16:37:26 | throw ...; | | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | +| MultiImplementationB.cs:1:7:1:8 | call to method | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | call to method | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:34:4:34 | 1 | | MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (normal) | @@ -2382,7 +2432,9 @@ dominance | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | MultiImplementationB.cs:16:9:16:31 | exit M2 | | MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:21:16:30 | throw ... | -| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:11:16:11:16 | this access | +| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:22:18:36 | {...} | +| MultiImplementationB.cs:18:12:18:13 | call to method | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | call to method | | MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:30:18:33 | null | | MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:24:18:34 | throw ...; | @@ -2395,14 +2447,19 @@ dominance | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:50:21:59 | throw ... | | MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationB.cs:22:32:22:34 | ... = ... | | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:34:22:34 | 1 | -| MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:18:22:18:36 | {...} | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | access to property P | | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationB.cs:25:7:25:8 | call to method | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | call to method | | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | {...} | +| MultiImplementationB.cs:30:15:30:16 | call to method | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | call to method | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | | NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | {...} | -| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | call to method | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | this access | | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | this access | NullCoalescing.cs:1:7:1:20 | call to method | | NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:9:3:10 | exit M1 | @@ -2460,31 +2517,32 @@ dominance | NullCoalescing.cs:17:13:17:19 | (...) ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:9:17:24 | ... = ... | | NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:17:13:17:19 | (...) ... | -| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationB.cs:3:16:3:16 | this access | -| PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | +| PartialImplementationA.cs:1:15:1:21 | enter | PartialImplementationB.cs:3:16:3:16 | this access | +| PartialImplementationA.cs:1:15:1:21 | exit (normal) | PartialImplementationA.cs:1:15:1:21 | exit | +| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:27:3:29 | {...} | +| PartialImplementationA.cs:3:12:3:18 | call to method | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | +| PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | this access | | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | PartialImplementationA.cs:3:12:3:18 | exit Partial | +| PartialImplementationA.cs:3:12:3:18 | this access | PartialImplementationA.cs:3:12:3:18 | call to method | | PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | | PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:20:3:20 | 0 | -| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:20:3:20 | 0 | -| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:20 | ... = ... | -| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:20 | ... = ... | -| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:3:16:3:16 | this access | -| PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | +| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:22:4:24 | {...} | +| PartialImplementationB.cs:4:12:4:18 | call to method | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | +| PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | this access | | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | PartialImplementationB.cs:4:12:4:18 | exit Partial | +| PartialImplementationB.cs:4:12:4:18 | this access | PartialImplementationB.cs:4:12:4:18 | call to method | | PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | | PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:32:5:34 | ... = ... | -| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:32:5:34 | ... = ... | | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:34:5:34 | 0 | -| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:34:5:34 | 0 | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationA.cs:3:27:3:29 | {...} | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:22:4:24 | {...} | -| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | +| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationA.cs:1:15:1:21 | exit (normal) | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | | Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | {...} | -| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | call to constructor Object | +| Patterns.cs:3:7:3:14 | call to method | Patterns.cs:3:7:3:14 | call to constructor Object | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | this access | | Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | exit Patterns | +| Patterns.cs:3:7:3:14 | this access | Patterns.cs:3:7:3:14 | call to method | | Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | exit Patterns (normal) | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:5:10:5:11 | exit M1 | @@ -2683,8 +2741,10 @@ dominance | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:38 | call to method WriteLine | | PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | {...} | -| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | call to method | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | this access | | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | exit PostDominance | +| PostDominance.cs:3:7:3:19 | this access | PostDominance.cs:3:7:3:19 | call to method | | PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:5:10:5:11 | exit M1 | @@ -2718,8 +2778,10 @@ dominance | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:28 | call to method WriteLine | | Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | {...} | -| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | call to method | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | this access | | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | exit Qualifiers | +| Qualifiers.cs:1:7:1:16 | this access | Qualifiers.cs:1:7:1:16 | call to method | | Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:16:7:21 | exit Method | @@ -2785,8 +2847,10 @@ dominance | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:46 | call to method Method | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:9:30:46 | ... = ... | | Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | {...} | -| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | call to method | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | this access | | Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | exit Switch | +| Switch.cs:3:7:3:12 | this access | Switch.cs:3:7:3:12 | call to method | | Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | exit Switch (normal) | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:6:5:8:5 | {...} | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:5:10:5:11 | exit M1 | @@ -3055,8 +3119,10 @@ dominance | Switch.cs:175:17:175:48 | ...; | Switch.cs:175:42:175:46 | "def" | | Switch.cs:175:42:175:46 | "def" | Switch.cs:175:17:175:47 | call to method WriteLine | | TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | {...} | -| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | call to method | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | this access | | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | this access | TypeAccesses.cs:1:7:1:18 | call to method | | TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:4:5:9:5 | {...} | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:3:10:3:10 | exit M | @@ -3078,8 +3144,10 @@ dominance | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | exit M (normal) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:13:8:27 | Type t = ... | | VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | {...} | -| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | call to method | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | this access | | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | exit VarDecls | +| VarDecls.cs:3:7:3:14 | this access | VarDecls.cs:3:7:3:14 | call to method | | VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:5:18:5:19 | exit M1 | @@ -3127,8 +3195,10 @@ dominance | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:28:25:28 | access to local variable y | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:13:25:29 | return ...; | | VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | {...} | -| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | call to method | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | this access | | VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | exit C | +| VarDecls.cs:28:11:28:11 | this access | VarDecls.cs:28:11:28:11 | call to method | | VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | exit C (normal) | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:51:28:53 | {...} | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:41:28:47 | exit Dispose | @@ -3397,8 +3467,10 @@ dominance | cflow.cs:127:68:127:81 | ...; | cflow.cs:127:68:127:72 | this access | | cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:68:127:80 | ... = ... | | cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:130:5:132:5 | {...} | -| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | call to constructor Object | +| cflow.cs:129:5:129:15 | call to method | cflow.cs:129:5:129:15 | call to constructor Object | +| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | this access | | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | cflow.cs:129:5:129:15 | exit ControlFlow | +| cflow.cs:129:5:129:15 | this access | cflow.cs:129:5:129:15 | call to method | | cflow.cs:130:5:132:5 | {...} | cflow.cs:131:9:131:18 | ...; | | cflow.cs:131:9:131:13 | this access | cflow.cs:131:17:131:17 | access to parameter s | | cflow.cs:131:9:131:17 | ... = ... | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | @@ -3739,8 +3811,10 @@ dominance | cflow.cs:275:13:275:41 | call to method WriteLine | cflow.cs:261:49:261:53 | exit Yield (normal) | | cflow.cs:275:13:275:42 | ...; | cflow.cs:275:31:275:40 | "not dead" | | cflow.cs:275:31:275:40 | "not dead" | cflow.cs:275:13:275:41 | call to method WriteLine | -| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:24:282:27 | call to constructor ControlFlow | +| cflow.cs:282:5:282:18 | call to method | cflow.cs:282:24:282:27 | call to constructor ControlFlow | +| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | this access | | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | cflow.cs:282:5:282:18 | exit ControlFlowSub | +| cflow.cs:282:5:282:18 | this access | cflow.cs:282:5:282:18 | call to method | | cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:31:282:33 | {...} | | cflow.cs:282:31:282:33 | {...} | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | @@ -3754,8 +3828,10 @@ dominance | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | exit ControlFlowSub (normal) | | cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | {...} | -| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | call to method | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | this access | | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | exit DelegateCall | +| cflow.cs:289:7:289:18 | this access | cflow.cs:289:7:289:18 | call to method | | cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:12:291:12 | exit M | @@ -3763,8 +3839,10 @@ dominance | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:12:291:12 | exit M (normal) | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:38:291:41 | delegate call | | cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:52:296:54 | {...} | -| cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | call to constructor Object | +| cflow.cs:296:5:296:25 | call to method | cflow.cs:296:5:296:25 | call to constructor Object | +| cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | this access | | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | cflow.cs:296:5:296:25 | exit NegationInConstructor | +| cflow.cs:296:5:296:25 | this access | cflow.cs:296:5:296:25 | call to method | | cflow.cs:296:52:296:54 | {...} | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | | cflow.cs:298:10:298:10 | enter M | cflow.cs:299:5:301:5 | {...} | | cflow.cs:298:10:298:10 | exit M (normal) | cflow.cs:298:10:298:10 | exit M | @@ -3782,8 +3860,10 @@ dominance | cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:64 | ... != ... | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | | cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | {...} | -| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | call to method | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | this access | | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | exit LambdaGetter | +| cflow.cs:304:7:304:18 | this access | cflow.cs:304:7:304:18 | call to method | | cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | exit get__getter (normal) | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:307:5:310:5 | {...} | @@ -3797,9 +3877,11 @@ dominance | cflow.cs:309:9:309:17 | return ...; | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | | cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:309:9:309:17 | return ...; | postDominance -| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to method | +| AccessorCalls.cs:1:7:1:19 | call to method | AccessorCalls.cs:1:7:1:19 | this access | | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | {...} | +| AccessorCalls.cs:1:7:1:19 | this access | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | | AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | call to constructor Object | | AccessorCalls.cs:5:23:5:25 | exit get_Item | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:30:5:30 | access to parameter i | @@ -4102,9 +4184,11 @@ postDominance | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:75:73:75 | 0 | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:80:73:80 | 1 | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:78 | access to local variable d | -| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to method | +| ArrayCreation.cs:1:7:1:19 | call to method | ArrayCreation.cs:1:7:1:19 | this access | | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | {...} | +| ArrayCreation.cs:1:7:1:19 | this access | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | | ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | call to constructor Object | | ArrayCreation.cs:3:11:3:12 | exit M1 | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | @@ -4134,9 +4218,11 @@ postDominance | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:48:9:48 | 3 | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:33:9:40 | { ..., ... } | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:45:9:45 | 2 | -| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | enter AssertTests | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to method | +| Assert.cs:5:7:5:17 | call to method | Assert.cs:5:7:5:17 | this access | | Assert.cs:5:7:5:17 | exit AssertTests | Assert.cs:5:7:5:17 | exit AssertTests (normal) | | Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | {...} | +| Assert.cs:5:7:5:17 | this access | Assert.cs:5:7:5:17 | enter AssertTests | | Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | call to constructor Object | | Assert.cs:7:10:7:11 | exit M1 (normal) | Assert.cs:11:9:11:35 | call to method WriteLine | | Assert.cs:8:5:12:5 | {...} | Assert.cs:7:10:7:11 | enter M1 | @@ -4492,9 +4578,11 @@ postDominance | Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:25:140:26 | access to parameter b1 | | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:29:140:30 | access to parameter b2 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | -| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | enter Assignments | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to method | +| Assignments.cs:1:7:1:17 | call to method | Assignments.cs:1:7:1:17 | this access | | Assignments.cs:1:7:1:17 | exit Assignments | Assignments.cs:1:7:1:17 | exit Assignments (normal) | | Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | {...} | +| Assignments.cs:1:7:1:17 | this access | Assignments.cs:1:7:1:17 | enter Assignments | | Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | call to constructor Object | | Assignments.cs:3:10:3:10 | exit M | Assignments.cs:3:10:3:10 | exit M (normal) | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:14:9:14:35 | ... += ... | @@ -4537,9 +4625,11 @@ postDominance | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:17:40:17:40 | enter + | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:18:5:20:5 | {...} | -| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | enter BreakInTry | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to method | +| BreakInTry.cs:1:7:1:16 | call to method | BreakInTry.cs:1:7:1:16 | this access | | BreakInTry.cs:1:7:1:16 | exit BreakInTry | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | {...} | +| BreakInTry.cs:1:7:1:16 | this access | BreakInTry.cs:1:7:1:16 | enter BreakInTry | | BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | call to constructor Object | | BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:15:17:15:28 | ... == ... | @@ -4620,9 +4710,11 @@ postDominance | BreakInTry.cs:67:21:67:23 | access to local variable arg | BreakInTry.cs:67:17:68:26 | if (...) ... | | BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:67:28:67:31 | null | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:23 | access to local variable arg | -| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to method | +| CompileTimeOperators.cs:3:7:3:26 | call to method | CompileTimeOperators.cs:3:7:3:26 | this access | | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | {...} | +| CompileTimeOperators.cs:3:7:3:26 | this access | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | | CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | | CompileTimeOperators.cs:5:9:5:15 | exit Default | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:7:9:7:28 | return ...; | @@ -4644,9 +4736,11 @@ postDominance | CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:21:5:23:5 | {...} | -| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to method | +| CompileTimeOperators.cs:26:7:26:22 | call to method | CompileTimeOperators.cs:26:7:26:22 | this access | | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | this access | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | | CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:28:10:28:10 | enter M | @@ -4664,9 +4758,11 @@ postDominance | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:9:40:11 | End: | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:38 | ...; | -| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to method | +| ConditionalAccess.cs:1:7:1:23 | call to method | ConditionalAccess.cs:1:7:1:23 | this access | | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | {...} | +| ConditionalAccess.cs:1:7:1:23 | this access | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | | ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | | ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:26:3:26 | access to parameter i | @@ -4743,9 +4839,11 @@ postDominance | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:78 | ... + ... | -| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | enter Conditions | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to method | +| Conditions.cs:1:7:1:16 | call to method | Conditions.cs:1:7:1:16 | this access | | Conditions.cs:1:7:1:16 | exit Conditions | Conditions.cs:1:7:1:16 | exit Conditions (normal) | | Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | {...} | +| Conditions.cs:1:7:1:16 | this access | Conditions.cs:1:7:1:16 | enter Conditions | | Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | call to constructor Object | | Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:7:13:7:16 | [false] !... | @@ -5040,9 +5138,11 @@ postDominance | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:13:149:49 | ...; | | Conditions.cs:149:44:149:46 | {...} | Conditions.cs:149:45:149:45 | access to local variable s | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:40:149:43 | "b = " | -| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | enter ExitMethods | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to method | +| ExitMethods.cs:6:7:6:17 | call to method | ExitMethods.cs:6:7:6:17 | this access | | ExitMethods.cs:6:7:6:17 | exit ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | {...} | +| ExitMethods.cs:6:7:6:17 | this access | ExitMethods.cs:6:7:6:17 | enter ExitMethods | | ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | call to constructor Object | | ExitMethods.cs:8:10:8:11 | exit M1 | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:11:9:11:15 | return ...; | @@ -5231,9 +5331,11 @@ postDominance | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:24:9:24:45 | call to method ToBool | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:9:25:14 | "true" | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | access to method Parse | -| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | enter Finally | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to method | +| Finally.cs:3:14:3:20 | call to method | Finally.cs:3:14:3:20 | this access | | Finally.cs:3:14:3:20 | exit Finally | Finally.cs:3:14:3:20 | exit Finally (normal) | | Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | {...} | +| Finally.cs:3:14:3:20 | this access | Finally.cs:3:14:3:20 | enter Finally | | Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | call to constructor Object | | Finally.cs:7:10:7:11 | exit M1 (normal) | Finally.cs:15:13:15:40 | call to method WriteLine | | Finally.cs:8:5:17:5 | {...} | Finally.cs:7:10:7:11 | enter M1 | @@ -5433,17 +5535,23 @@ postDominance | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:35:167:36 | "" | | Finally.cs:167:17:167:38 | ...; | Finally.cs:166:13:168:13 | {...} | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:38 | ...; | -| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | enter ExceptionA | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to method | +| Finally.cs:172:11:172:20 | call to method | Finally.cs:172:11:172:20 | this access | | Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | {...} | +| Finally.cs:172:11:172:20 | this access | Finally.cs:172:11:172:20 | enter ExceptionA | | Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | call to constructor Exception | -| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | enter ExceptionB | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to method | +| Finally.cs:173:11:173:20 | call to method | Finally.cs:173:11:173:20 | this access | | Finally.cs:173:11:173:20 | exit ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | {...} | +| Finally.cs:173:11:173:20 | this access | Finally.cs:173:11:173:20 | enter ExceptionB | | Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | call to constructor Exception | -| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | enter ExceptionC | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to method | +| Finally.cs:174:11:174:20 | call to method | Finally.cs:174:11:174:20 | this access | | Finally.cs:174:11:174:20 | exit ExceptionC | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | {...} | +| Finally.cs:174:11:174:20 | this access | Finally.cs:174:11:174:20 | enter ExceptionC | | Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | call to constructor Exception | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:186:21:186:22 | access to parameter b2 | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:190:21:190:22 | access to parameter b1 | @@ -5560,9 +5668,11 @@ postDominance | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... + ... | | Finally.cs:272:13:272:19 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:13 | access to parameter i | -| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | enter Foreach | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to method | +| Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | this access | | Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | exit Foreach (normal) | | Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | {...} | +| Foreach.cs:4:7:4:13 | this access | Foreach.cs:4:7:4:13 | enter Foreach | | Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | exit M1 (normal) | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | @@ -5614,39 +5724,34 @@ postDominance | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:37:5:40:5 | {...} | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:18:38:34 | (..., ...) | +| Initializers.cs:3:7:3:18 | exit | Initializers.cs:3:7:3:18 | exit (normal) | +| Initializers.cs:3:7:3:18 | exit (normal) | Initializers.cs:6:25:6:31 | ... = ... | | Initializers.cs:3:7:3:18 | exit Initializers | Initializers.cs:3:7:3:18 | exit Initializers (normal) | | Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | {...} | | Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | enter Initializers | -| Initializers.cs:5:9:5:9 | this access | Initializers.cs:8:5:8:16 | call to constructor Object | -| Initializers.cs:5:9:5:9 | this access | Initializers.cs:10:5:10:16 | call to constructor Object | -| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:13:5:17 | ... + ... | +| Initializers.cs:5:9:5:9 | this access | Initializers.cs:3:7:3:18 | enter | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:13:5:17 | ... + ... | | Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:9:5:9 | this access | -| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:9:5:9 | this access | -| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:17:5:17 | 1 | | Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:17:5:17 | 1 | | Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:13 | access to field H | -| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:13 | access to field H | -| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:27:6:31 | ... + ... | | Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:27:6:31 | ... + ... | | Initializers.cs:6:9:6:9 | this access | Initializers.cs:5:9:5:17 | ... = ... | -| Initializers.cs:6:9:6:9 | this access | Initializers.cs:5:9:5:17 | ... = ... | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:6:9:6:9 | access to property G | | Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:6:9:6:9 | access to property G | | Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:9:6:9 | this access | -| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:9:6:9 | this access | -| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:31:6:31 | 2 | | Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:31:6:31 | 2 | | Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:27 | access to field H | -| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:27 | access to field H | -| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:5:8:16 | enter Initializers | +| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:5:8:16 | call to method | +| Initializers.cs:8:5:8:16 | call to method | Initializers.cs:8:5:8:16 | this access | | Initializers.cs:8:5:8:16 | exit Initializers | Initializers.cs:8:5:8:16 | exit Initializers (normal) | | Initializers.cs:8:5:8:16 | exit Initializers (normal) | Initializers.cs:8:20:8:22 | {...} | -| Initializers.cs:8:20:8:22 | {...} | Initializers.cs:6:25:6:31 | ... = ... | -| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:5:10:16 | enter Initializers | +| Initializers.cs:8:5:8:16 | this access | Initializers.cs:8:5:8:16 | enter Initializers | +| Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:5:8:16 | call to constructor Object | +| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:5:10:16 | call to method | +| Initializers.cs:10:5:10:16 | call to method | Initializers.cs:10:5:10:16 | this access | | Initializers.cs:10:5:10:16 | exit Initializers | Initializers.cs:10:5:10:16 | exit Initializers (normal) | | Initializers.cs:10:5:10:16 | exit Initializers (normal) | Initializers.cs:10:28:10:30 | {...} | -| Initializers.cs:10:28:10:30 | {...} | Initializers.cs:6:25:6:31 | ... = ... | +| Initializers.cs:10:5:10:16 | this access | Initializers.cs:10:5:10:16 | enter Initializers | +| Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:5:10:16 | call to constructor Object | | Initializers.cs:12:10:12:10 | exit M | Initializers.cs:12:10:12:10 | exit M (normal) | | Initializers.cs:12:10:12:10 | exit M (normal) | Initializers.cs:15:13:15:63 | Initializers[] iz = ... | | Initializers.cs:13:5:16:5 | {...} | Initializers.cs:12:10:12:10 | enter M | @@ -5672,26 +5777,31 @@ postDominance | Initializers.cs:18:16:18:16 | exit H (normal) | Initializers.cs:18:16:18:20 | ... = ... | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:20:18:20 | 1 | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:16 | enter H | -| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | enter NoConstructor | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to method | +| Initializers.cs:20:11:20:23 | call to method | Initializers.cs:20:11:20:23 | this access | +| Initializers.cs:20:11:20:23 | exit | Initializers.cs:20:11:20:23 | exit (normal) | +| Initializers.cs:20:11:20:23 | exit (normal) | Initializers.cs:23:23:23:27 | ... = ... | | Initializers.cs:20:11:20:23 | exit NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | {...} | -| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:23:23:23:27 | ... = ... | -| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | call to constructor Object | +| Initializers.cs:20:11:20:23 | this access | Initializers.cs:20:11:20:23 | enter NoConstructor | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | call to constructor Object | +| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | enter | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:27:22:27 | 0 | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:23:23:23:23 | this access | Initializers.cs:22:23:22:27 | ... = ... | | Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:23:27:23:27 | 1 | | Initializers.cs:23:27:23:27 | 1 | Initializers.cs:23:23:23:23 | this access | -| Initializers.cs:28:13:28:13 | this access | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | -| Initializers.cs:28:13:28:13 | this access | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:28:17:28:17 | 2 | +| Initializers.cs:26:11:26:13 | exit | Initializers.cs:26:11:26:13 | exit (normal) | +| Initializers.cs:26:11:26:13 | exit (normal) | Initializers.cs:28:13:28:17 | ... = ... | +| Initializers.cs:28:13:28:13 | this access | Initializers.cs:26:11:26:13 | enter | | Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:28:17:28:17 | 2 | | Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:13 | this access | -| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:13 | this access | +| Initializers.cs:31:9:31:11 | call to method | Initializers.cs:31:9:31:11 | this access | | Initializers.cs:31:9:31:11 | exit Sub | Initializers.cs:31:9:31:11 | exit Sub (normal) | | Initializers.cs:31:9:31:11 | exit Sub (normal) | Initializers.cs:31:26:31:30 | ... = ... | -| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:9:31:11 | enter Sub | -| Initializers.cs:31:24:31:33 | {...} | Initializers.cs:28:13:28:17 | ... = ... | +| Initializers.cs:31:9:31:11 | this access | Initializers.cs:31:9:31:11 | enter Sub | +| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:9:31:11 | call to method | +| Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | | Initializers.cs:31:26:31:26 | this access | Initializers.cs:31:26:31:31 | ...; | | Initializers.cs:31:26:31:30 | ... = ... | Initializers.cs:31:30:31:30 | 3 | | Initializers.cs:31:26:31:31 | ...; | Initializers.cs:31:24:31:33 | {...} | @@ -5704,23 +5814,29 @@ postDominance | Initializers.cs:33:31:33:35 | ... = ... | Initializers.cs:33:35:33:35 | access to parameter i | | Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:29:33:38 | {...} | | Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:31:33:31 | this access | -| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:9:35:11 | enter Sub | +| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:9:35:11 | call to method | +| Initializers.cs:35:9:35:11 | call to method | Initializers.cs:35:9:35:11 | this access | | Initializers.cs:35:9:35:11 | exit Sub | Initializers.cs:35:9:35:11 | exit Sub (normal) | | Initializers.cs:35:9:35:11 | exit Sub (normal) | Initializers.cs:35:29:35:37 | ... = ... | -| Initializers.cs:35:27:35:40 | {...} | Initializers.cs:28:13:28:17 | ... = ... | +| Initializers.cs:35:9:35:11 | this access | Initializers.cs:35:9:35:11 | enter Sub | +| Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | | Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:29:35:38 | ...; | | Initializers.cs:35:29:35:37 | ... = ... | Initializers.cs:35:33:35:37 | ... + ... | | Initializers.cs:35:29:35:38 | ...; | Initializers.cs:35:27:35:40 | {...} | | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:29:35:29 | this access | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:37:35:37 | access to parameter j | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:33 | access to parameter i | -| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | enter IndexInitializers | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to method | +| Initializers.cs:39:7:39:23 | call to method | Initializers.cs:39:7:39:23 | this access | | Initializers.cs:39:7:39:23 | exit IndexInitializers | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | {...} | +| Initializers.cs:39:7:39:23 | this access | Initializers.cs:39:7:39:23 | enter IndexInitializers | | Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | call to constructor Object | -| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | enter Compound | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to method | +| Initializers.cs:41:11:41:18 | call to method | Initializers.cs:41:11:41:18 | this access | | Initializers.cs:41:11:41:18 | exit Compound | Initializers.cs:41:11:41:18 | exit Compound (normal) | | Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | {...} | +| Initializers.cs:41:11:41:18 | this access | Initializers.cs:41:11:41:18 | enter Compound | | Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | call to constructor Object | | Initializers.cs:51:10:51:13 | exit Test | Initializers.cs:51:10:51:13 | exit Test (normal) | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:57:13:65:9 | Compound compound = ... | @@ -5826,9 +5942,11 @@ postDominance | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:54:64:54 | 0 | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:50 | access to parameter i | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:50:64:54 | ... + ... | -| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to method | +| LoopUnrolling.cs:5:7:5:19 | call to method | LoopUnrolling.cs:5:7:5:19 | this access | | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | {...} | +| LoopUnrolling.cs:5:7:5:19 | this access | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | | LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | | LoopUnrolling.cs:7:10:7:11 | exit M1 | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:10:13:10:19 | return ...; | @@ -6021,6 +6139,8 @@ postDominance | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:98:9:100:9 | {...} | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:33 | ...; | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to method | +| MultiImplementationA.cs:4:7:4:8 | call to method | MultiImplementationA.cs:4:7:4:8 | this access | | MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | {...} | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | {...} | @@ -6039,7 +6159,9 @@ postDominance | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | MultiImplementationA.cs:8:23:8:32 | throw ... | | MultiImplementationA.cs:8:16:8:16 | exit M (normal) | MultiImplementationB.cs:5:23:5:23 | 2 | | MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:29:8:32 | null | -| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | +| MultiImplementationA.cs:11:7:11:8 | exit | MultiImplementationA.cs:11:7:11:8 | exit (normal) | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:24:32:24:34 | ... = ... | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationB.cs:22:32:22:34 | ... = ... | | MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:13:20:13:20 | 0 | | MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:13:16:13:16 | this access | | MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | enter get_Item | @@ -6060,10 +6182,12 @@ postDominance | MultiImplementationA.cs:18:9:18:22 | exit M2 | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | MultiImplementationA.cs:18:21:18:21 | 0 | | MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:9:18:22 | enter M2 | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | enter C2 | +| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | call to method | +| MultiImplementationA.cs:20:12:20:13 | call to method | MultiImplementationA.cs:20:12:20:13 | this access | | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | MultiImplementationB.cs:18:24:18:34 | throw ...; | | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | MultiImplementationA.cs:20:24:20:28 | ... = ... | -| MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:24:32:24:34 | ... = ... | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | enter C2 | +| MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | | MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:24:20:29 | ...; | | MultiImplementationA.cs:20:24:20:28 | ... = ... | MultiImplementationA.cs:20:28:20:28 | access to parameter i | | MultiImplementationA.cs:20:24:20:29 | ...; | MultiImplementationA.cs:20:22:20:31 | {...} | @@ -6083,6 +6207,8 @@ postDominance | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:13:16:13:20 | ... = ... | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:16:24:16 | access to property P | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | this access | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to method | +| MultiImplementationA.cs:28:7:28:8 | call to method | MultiImplementationA.cs:28:7:28:8 | this access | | MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | {...} | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | {...} | @@ -6091,6 +6217,8 @@ postDominance | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:28:30:37 | throw ... | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to method | +| MultiImplementationA.cs:34:15:34:16 | call to method | MultiImplementationA.cs:34:15:34:16 | this access | | MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | {...} | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | {...} | @@ -6104,6 +6232,8 @@ postDominance | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:9:37:10 | enter M2 | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:14:37:28 | {...} | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to method | +| MultiImplementationB.cs:1:7:1:8 | call to method | MultiImplementationB.cs:1:7:1:8 | this access | | MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationA.cs:7:21:7:23 | enter get_P2 | @@ -6111,7 +6241,6 @@ postDominance | MultiImplementationB.cs:4:34:4:34 | 1 | MultiImplementationB.cs:4:25:4:37 | {...} | | MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationA.cs:7:41:7:43 | enter set_P2 | | MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationA.cs:8:16:8:16 | enter M | -| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | | MultiImplementationB.cs:11:16:11:20 | ... = ... | MultiImplementationB.cs:11:20:11:20 | 1 | | MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationB.cs:11:16:11:16 | this access | | MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationB.cs:12:37:12:40 | null | @@ -6122,7 +6251,9 @@ postDominance | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | MultiImplementationB.cs:16:21:16:30 | throw ... | | MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:27:16:30 | null | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:9:16:31 | enter M2 | -| MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:22:32:22:34 | ... = ... | +| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:12:18:13 | call to method | +| MultiImplementationB.cs:18:12:18:13 | call to method | MultiImplementationB.cs:18:12:18:13 | this access | +| MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | | MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationB.cs:18:30:18:33 | null | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:22:18:36 | {...} | | MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | MultiImplementationB.cs:19:24:19:24 | 1 | @@ -6134,12 +6265,18 @@ postDominance | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:11:16:11:20 | ... = ... | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:16:22:16 | access to property P | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | this access | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to method | +| MultiImplementationB.cs:25:7:25:8 | call to method | MultiImplementationB.cs:25:7:25:8 | this access | | MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to method | +| MultiImplementationB.cs:30:15:30:16 | call to method | MultiImplementationB.cs:30:15:30:16 | this access | | MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | enter M1 | -| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to method | +| NullCoalescing.cs:1:7:1:20 | call to method | NullCoalescing.cs:1:7:1:20 | this access | | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | {...} | +| NullCoalescing.cs:1:7:1:20 | this access | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | | NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | call to constructor Object | | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:23:3:28 | ... ?? ... | @@ -6195,31 +6332,32 @@ postDominance | NullCoalescing.cs:17:13:17:19 | (...) ... | NullCoalescing.cs:17:19:17:19 | access to parameter i | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:19 | (...) ... | | NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:17:9:17:25 | ...; | -| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:12:3:18 | enter Partial | +| PartialImplementationA.cs:1:15:1:21 | exit | PartialImplementationA.cs:1:15:1:21 | exit (normal) | +| PartialImplementationA.cs:1:15:1:21 | exit (normal) | PartialImplementationB.cs:5:32:5:34 | ... = ... | +| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:12:3:18 | call to method | +| PartialImplementationA.cs:3:12:3:18 | call to method | PartialImplementationA.cs:3:12:3:18 | this access | | PartialImplementationA.cs:3:12:3:18 | exit Partial | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | PartialImplementationA.cs:3:27:3:29 | {...} | -| PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationB.cs:5:32:5:34 | ... = ... | -| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | -| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | -| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:3:20:3:20 | 0 | +| PartialImplementationA.cs:3:12:3:18 | this access | PartialImplementationA.cs:3:12:3:18 | enter Partial | +| PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | +| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationA.cs:1:15:1:21 | enter | | PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:3:20:3:20 | 0 | | PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:16 | this access | -| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:16 | this access | -| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:12:4:18 | enter Partial | +| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:12:4:18 | call to method | +| PartialImplementationB.cs:4:12:4:18 | call to method | PartialImplementationB.cs:4:12:4:18 | this access | | PartialImplementationB.cs:4:12:4:18 | exit Partial | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | PartialImplementationB.cs:4:22:4:24 | {...} | -| PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:5:32:5:34 | ... = ... | -| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:34:5:34 | 0 | +| PartialImplementationB.cs:4:12:4:18 | this access | PartialImplementationB.cs:4:12:4:18 | enter Partial | +| PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | | PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:34:5:34 | 0 | | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:3:16:3:20 | ... = ... | -| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:3:16:3:20 | ... = ... | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:16:5:16 | access to property P | | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:16:5:16 | access to property P | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | this access | -| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | this access | -| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | enter Patterns | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to method | +| Patterns.cs:3:7:3:14 | call to method | Patterns.cs:3:7:3:14 | this access | | Patterns.cs:3:7:3:14 | exit Patterns | Patterns.cs:3:7:3:14 | exit Patterns (normal) | | Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | {...} | +| Patterns.cs:3:7:3:14 | this access | Patterns.cs:3:7:3:14 | enter Patterns | | Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | call to constructor Object | | Patterns.cs:5:10:5:11 | exit M1 | Patterns.cs:5:10:5:11 | exit M1 (normal) | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:40:17:40:17 | access to local variable o | @@ -6404,9 +6542,11 @@ postDominance | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:96:9:98:9 | {...} | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:39 | ...; | -| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | enter PostDominance | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to method | +| PostDominance.cs:3:7:3:19 | call to method | PostDominance.cs:3:7:3:19 | this access | | PostDominance.cs:3:7:3:19 | exit PostDominance | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | {...} | +| PostDominance.cs:3:7:3:19 | this access | PostDominance.cs:3:7:3:19 | enter PostDominance | | PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | call to constructor Object | | PostDominance.cs:5:10:5:11 | exit M1 | PostDominance.cs:5:10:5:11 | exit M1 (normal) | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:7:9:7:28 | call to method WriteLine | @@ -6437,9 +6577,11 @@ postDominance | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:19:13:19:21 | [false] ... is ... | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:29 | ...; | -| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | enter Qualifiers | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to method | +| Qualifiers.cs:1:7:1:16 | call to method | Qualifiers.cs:1:7:1:16 | this access | | Qualifiers.cs:1:7:1:16 | exit Qualifiers | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | {...} | +| Qualifiers.cs:1:7:1:16 | this access | Qualifiers.cs:1:7:1:16 | enter Qualifiers | | Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | call to constructor Object | | Qualifiers.cs:7:16:7:21 | exit Method | Qualifiers.cs:7:16:7:21 | exit Method (normal) | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:28:7:31 | null | @@ -6504,9 +6646,11 @@ postDominance | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:29:9:29:46 | ... = ... | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:9:30:47 | ...; | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | -| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | enter Switch | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to method | +| Switch.cs:3:7:3:12 | call to method | Switch.cs:3:7:3:12 | this access | | Switch.cs:3:7:3:12 | exit Switch | Switch.cs:3:7:3:12 | exit Switch (normal) | | Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | {...} | +| Switch.cs:3:7:3:12 | this access | Switch.cs:3:7:3:12 | enter Switch | | Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | call to constructor Object | | Switch.cs:5:10:5:11 | exit M1 | Switch.cs:5:10:5:11 | exit M1 (normal) | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:7:17:7:17 | access to parameter o | @@ -6756,9 +6900,11 @@ postDominance | Switch.cs:175:17:175:48 | ...; | Switch.cs:174:13:174:20 | default: | | Switch.cs:175:42:175:46 | "def" | Switch.cs:175:17:175:48 | ...; | | Switch.cs:176:17:176:22 | break; | Switch.cs:175:17:175:47 | call to method WriteLine | -| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to method | +| TypeAccesses.cs:1:7:1:18 | call to method | TypeAccesses.cs:1:7:1:18 | this access | | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | {...} | +| TypeAccesses.cs:1:7:1:18 | this access | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | | TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | call to constructor Object | | TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:3:10:3:10 | exit M (normal) | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:8:13:8:27 | Type t = ... | @@ -6779,9 +6925,11 @@ postDominance | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:9:8:28 | ... ...; | -| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | enter VarDecls | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to method | +| VarDecls.cs:3:7:3:14 | call to method | VarDecls.cs:3:7:3:14 | this access | | VarDecls.cs:3:7:3:14 | exit VarDecls | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | {...} | +| VarDecls.cs:3:7:3:14 | this access | VarDecls.cs:3:7:3:14 | enter VarDecls | | VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | call to constructor Object | | VarDecls.cs:5:18:5:19 | exit M1 | VarDecls.cs:5:18:5:19 | exit M1 (normal) | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:9:13:9:29 | return ...; | @@ -6828,9 +6976,11 @@ postDominance | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:24:31:24:41 | C y = ... | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:28:25:28 | access to local variable y | -| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | enter C | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to method | +| VarDecls.cs:28:11:28:11 | call to method | VarDecls.cs:28:11:28:11 | this access | | VarDecls.cs:28:11:28:11 | exit C | VarDecls.cs:28:11:28:11 | exit C (normal) | | VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | {...} | +| VarDecls.cs:28:11:28:11 | this access | VarDecls.cs:28:11:28:11 | enter C | | VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | call to constructor Object | | VarDecls.cs:28:41:28:47 | exit Dispose | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:51:28:53 | {...} | @@ -7087,9 +7237,11 @@ postDominance | cflow.cs:127:68:127:80 | ... = ... | cflow.cs:127:76:127:80 | access to parameter value | | cflow.cs:127:68:127:81 | ...; | cflow.cs:127:66:127:83 | {...} | | cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:68:127:72 | this access | -| cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:129:5:129:15 | enter ControlFlow | +| cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:129:5:129:15 | call to method | +| cflow.cs:129:5:129:15 | call to method | cflow.cs:129:5:129:15 | this access | | cflow.cs:129:5:129:15 | exit ControlFlow | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | cflow.cs:131:9:131:17 | ... = ... | +| cflow.cs:129:5:129:15 | this access | cflow.cs:129:5:129:15 | enter ControlFlow | | cflow.cs:130:5:132:5 | {...} | cflow.cs:129:5:129:15 | call to constructor Object | | cflow.cs:131:9:131:13 | this access | cflow.cs:131:9:131:18 | ...; | | cflow.cs:131:9:131:17 | ... = ... | cflow.cs:131:17:131:17 | access to parameter s | @@ -7421,9 +7573,11 @@ postDominance | cflow.cs:275:13:275:41 | call to method WriteLine | cflow.cs:275:31:275:40 | "not dead" | | cflow.cs:275:13:275:42 | ...; | cflow.cs:274:9:276:9 | {...} | | cflow.cs:275:31:275:40 | "not dead" | cflow.cs:275:13:275:42 | ...; | +| cflow.cs:282:5:282:18 | call to method | cflow.cs:282:5:282:18 | this access | | cflow.cs:282:5:282:18 | exit ControlFlowSub | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | cflow.cs:282:31:282:33 | {...} | -| cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:5:282:18 | enter ControlFlowSub | +| cflow.cs:282:5:282:18 | this access | cflow.cs:282:5:282:18 | enter ControlFlowSub | +| cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:5:282:18 | call to method | | cflow.cs:282:31:282:33 | {...} | cflow.cs:282:24:282:27 | call to constructor ControlFlow | | cflow.cs:284:5:284:18 | exit ControlFlowSub | cflow.cs:284:5:284:18 | exit ControlFlowSub (normal) | | cflow.cs:284:5:284:18 | exit ControlFlowSub (normal) | cflow.cs:284:39:284:41 | {...} | @@ -7435,18 +7589,22 @@ postDominance | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:5:286:18 | enter ControlFlowSub | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | -| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | enter DelegateCall | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to method | +| cflow.cs:289:7:289:18 | call to method | cflow.cs:289:7:289:18 | this access | | cflow.cs:289:7:289:18 | exit DelegateCall | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | {...} | +| cflow.cs:289:7:289:18 | this access | cflow.cs:289:7:289:18 | enter DelegateCall | | cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | call to constructor Object | | cflow.cs:291:12:291:12 | exit M | cflow.cs:291:12:291:12 | exit M (normal) | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:38:291:41 | delegate call | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:12:291:12 | enter M | | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:40:291:40 | 0 | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:38:291:38 | access to parameter f | -| cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:5:296:25 | enter NegationInConstructor | +| cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:5:296:25 | call to method | +| cflow.cs:296:5:296:25 | call to method | cflow.cs:296:5:296:25 | this access | | cflow.cs:296:5:296:25 | exit NegationInConstructor | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | cflow.cs:296:52:296:54 | {...} | +| cflow.cs:296:5:296:25 | this access | cflow.cs:296:5:296:25 | enter NegationInConstructor | | cflow.cs:296:52:296:54 | {...} | cflow.cs:296:5:296:25 | call to constructor Object | | cflow.cs:298:10:298:10 | exit M | cflow.cs:298:10:298:10 | exit M (normal) | | cflow.cs:298:10:298:10 | exit M (normal) | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | @@ -7463,9 +7621,11 @@ postDominance | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:61:300:64 | null | | cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:44:300:64 | ... && ... | -| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | enter LambdaGetter | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to method | +| cflow.cs:304:7:304:18 | call to method | cflow.cs:304:7:304:18 | this access | | cflow.cs:304:7:304:18 | exit LambdaGetter | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | {...} | +| cflow.cs:304:7:304:18 | this access | cflow.cs:304:7:304:18 | enter LambdaGetter | | cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | call to constructor Object | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | enter get__getter | | cflow.cs:306:60:310:5 | exit (...) => ... | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | @@ -9459,12 +9619,15 @@ blockDominance | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | +| Initializers.cs:3:7:3:18 | enter | Initializers.cs:3:7:3:18 | enter | | Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | enter Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | enter Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | enter M | | Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:16:18:16 | enter H | +| Initializers.cs:20:11:20:23 | enter | Initializers.cs:20:11:20:23 | enter | | Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | enter NoConstructor | +| Initializers.cs:26:11:26:13 | enter | Initializers.cs:26:11:26:13 | enter | | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | enter Sub | @@ -9619,12 +9782,12 @@ blockDominance | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:22:97:22 | String x | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:22:97:22 | String x | -| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | -| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | | MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | | MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | -| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | this access | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | this access | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | this access | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | @@ -9649,6 +9812,12 @@ blockDominance | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationB.cs:5:23:5:23 | 2 | | MultiImplementationA.cs:8:16:8:16 | exit M | MultiImplementationA.cs:8:16:8:16 | exit M | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:29:8:32 | null | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:11:7:11:8 | enter | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:11:7:11:8 | exit (normal) | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:13:16:13:16 | this access | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationB.cs:11:16:11:16 | this access | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | exit (normal) | +| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:16:13:16 | this access | | MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | access to parameter i | | MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | access to parameter i | | MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | enter get_Item | @@ -9674,12 +9843,12 @@ blockDominance | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | | MultiImplementationA.cs:17:5:19:5 | {...} | MultiImplementationA.cs:17:5:19:5 | {...} | | MultiImplementationA.cs:18:9:18:22 | enter M2 | MultiImplementationA.cs:18:9:18:22 | enter M2 | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | -| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | | MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | enter C2 | | MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | exit C2 | -| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | +| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | this access | +| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | this access | | MultiImplementationA.cs:20:12:20:13 | exit C2 | MultiImplementationA.cs:20:12:20:13 | exit C2 | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | this access | | MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationA.cs:21:12:21:13 | enter C2 | | MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | | MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationA.cs:21:24:21:24 | 0 | @@ -9698,19 +9867,19 @@ blockDominance | MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:50:23:53 | null | -| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | -| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | | MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | | MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | -| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | this access | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | this access | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | this access | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | -| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | -| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | | MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | -| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | this access | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | this access | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | this access | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | @@ -9718,22 +9887,23 @@ blockDominance | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | enter M2 | -| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | this access | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:25:4:37 | {...} | | MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationB.cs:4:43:4:45 | {...} | | MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationB.cs:5:23:5:23 | 2 | +| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:11:16:11:16 | this access | | MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationB.cs:12:37:12:40 | null | | MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationB.cs:13:40:13:54 | {...} | | MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationB.cs:13:60:13:62 | {...} | | MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:15:5:17:5 | {...} | | MultiImplementationB.cs:16:9:16:31 | enter M2 | MultiImplementationB.cs:16:9:16:31 | enter M2 | -| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | this access | | MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationB.cs:19:24:19:24 | 1 | | MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationB.cs:20:11:20:25 | {...} | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:56:21:59 | null | -| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | -| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | this access | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | this access | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | @@ -9820,6 +9990,7 @@ blockDominance | NullCoalescing.cs:16:17:16:25 | ... ?? ... | NullCoalescing.cs:16:17:16:25 | ... ?? ... | | NullCoalescing.cs:16:17:16:25 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | +| PartialImplementationA.cs:1:15:1:21 | enter | PartialImplementationA.cs:1:15:1:21 | enter | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | enter Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | enter Partial | | Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | enter Patterns | @@ -13132,12 +13303,15 @@ postBlockDominance | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | +| Initializers.cs:3:7:3:18 | enter | Initializers.cs:3:7:3:18 | enter | | Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | enter Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | enter Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | enter M | | Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:16:18:16 | enter H | +| Initializers.cs:20:11:20:23 | enter | Initializers.cs:20:11:20:23 | enter | | Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | enter NoConstructor | +| Initializers.cs:26:11:26:13 | enter | Initializers.cs:26:11:26:13 | enter | | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | enter Sub | @@ -13282,12 +13456,12 @@ postBlockDominance | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:22:97:22 | String x | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:22:97:22 | String x | -| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | | MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | -| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | enter C1 | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | -| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | this access | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | this access | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | this access | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | @@ -13300,6 +13474,12 @@ postBlockDominance | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationA.cs:8:16:8:16 | enter M | | MultiImplementationA.cs:8:16:8:16 | exit M | MultiImplementationA.cs:8:16:8:16 | exit M | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:29:8:32 | null | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:11:7:11:8 | enter | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | enter | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | exit (normal) | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:13:16:13:16 | this access | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationB.cs:11:16:11:16 | this access | +| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:16:13:16 | this access | | MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | access to parameter i | | MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | enter get_Item | | MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | enter get_Item | @@ -13321,10 +13501,10 @@ postBlockDominance | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | MultiImplementationB.cs:15:5:17:5 | {...} | | MultiImplementationA.cs:17:5:19:5 | {...} | MultiImplementationA.cs:17:5:19:5 | {...} | | MultiImplementationA.cs:18:9:18:22 | enter M2 | MultiImplementationA.cs:18:9:18:22 | enter M2 | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | enter C2 | | MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | enter C2 | | MultiImplementationA.cs:20:12:20:13 | exit C2 | MultiImplementationA.cs:20:12:20:13 | exit C2 | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | enter C2 | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | this access | | MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationA.cs:21:12:21:13 | enter C2 | | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | MultiImplementationA.cs:21:12:21:13 | enter C2 | | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | @@ -13339,24 +13519,24 @@ postBlockDominance | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:50:23:53 | null | -| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | | MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | -| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | enter C3 | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | -| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | this access | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | this access | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | this access | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | -| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | -| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | enter C4 | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | -| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | this access | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | this access | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | this access | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | enter M2 | -| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | this access | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationA.cs:7:21:7:23 | enter get_P2 | @@ -13365,17 +13545,18 @@ postBlockDominance | MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationB.cs:4:43:4:45 | {...} | | MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationA.cs:8:16:8:16 | enter M | | MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationB.cs:5:23:5:23 | 2 | +| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:11:16:11:16 | this access | | MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationB.cs:12:37:12:40 | null | | MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationB.cs:13:40:13:54 | {...} | | MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationB.cs:13:60:13:62 | {...} | | MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:15:5:17:5 | {...} | | MultiImplementationB.cs:16:9:16:31 | enter M2 | MultiImplementationB.cs:16:9:16:31 | enter M2 | -| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | this access | | MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationB.cs:19:24:19:24 | 1 | | MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationB.cs:20:11:20:25 | {...} | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:56:21:59 | null | -| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | -| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | this access | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | this access | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | @@ -13465,6 +13646,7 @@ postBlockDominance | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:15:31:15:31 | 0 | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:16:17:16:25 | ... ?? ... | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | +| PartialImplementationA.cs:1:15:1:21 | enter | PartialImplementationA.cs:1:15:1:21 | enter | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | enter Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | enter Partial | | Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | enter Patterns | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index 4a4631e454d..14dcdb56b26 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -1,8 +1,10 @@ nodeEnclosing | AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | call to method | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | this access | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | | AccessorCalls.cs:5:23:5:25 | exit get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | @@ -319,9 +321,11 @@ nodeEnclosing | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:66:10:66:11 | M9 | | ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | call to method | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | this access | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | M1 | | ArrayCreation.cs:3:11:3:12 | exit M1 | ArrayCreation.cs:3:11:3:12 | M1 | @@ -356,9 +360,11 @@ nodeEnclosing | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:12:9:13 | M4 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:12:9:13 | M4 | | Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | call to method | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:5:7:5:17 | exit AssertTests | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | this access | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | M1 | @@ -777,9 +783,11 @@ nodeEnclosing | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | M13 | | Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | call to method | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:1:7:1:17 | exit Assignments | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | this access | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | M | | Assignments.cs:3:10:3:10 | exit M | Assignments.cs:3:10:3:10 | M | @@ -826,9 +834,11 @@ nodeEnclosing | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | + | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:17:40:17:40 | + | | BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | call to method | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:1:7:1:16 | exit BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | this access | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | M1 | @@ -917,9 +927,11 @@ nodeEnclosing | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | M4 | | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | call to method | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | this access | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | Default | | CompileTimeOperators.cs:5:9:5:15 | exit Default | CompileTimeOperators.cs:5:9:5:15 | Default | @@ -946,9 +958,11 @@ nodeEnclosing | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | Nameof | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:20:12:20:17 | Nameof | | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | call to method | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | this access | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | M | @@ -970,9 +984,11 @@ nodeEnclosing | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:28:10:28:10 | M | | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | call to method | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | this access | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | M1 | @@ -1064,9 +1080,11 @@ nodeEnclosing | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | | Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | call to method | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:1:7:1:16 | exit Conditions | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | this access | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | @@ -1384,9 +1402,11 @@ nodeEnclosing | Conditions.cs:149:44:149:46 | {...} | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:143:10:143:12 | M11 | | ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | call to method | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:6:7:6:17 | exit ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | this access | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | M1 | | ExitMethods.cs:8:10:8:11 | exit M1 | ExitMethods.cs:8:10:8:11 | M1 | @@ -1616,9 +1636,11 @@ nodeEnclosing | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:20:17:20:20 | Main | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:20:17:20:20 | Main | | Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | call to method | Finally.cs:3:14:3:20 | Finally | | Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | Finally | | Finally.cs:3:14:3:20 | exit Finally | Finally.cs:3:14:3:20 | Finally | | Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | this access | Finally.cs:3:14:3:20 | Finally | | Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | M1 | @@ -1852,19 +1874,25 @@ nodeEnclosing | Finally.cs:167:17:167:38 | ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:35:167:36 | "" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | call to method | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | this access | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | call to method | Finally.cs:173:11:173:20 | ExceptionB | | Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | | Finally.cs:173:11:173:20 | exit ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | this access | Finally.cs:173:11:173:20 | ExceptionB | | Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | ExceptionB | | Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | call to method | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:174:11:174:20 | exit ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | this access | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | M9 | @@ -1997,9 +2025,11 @@ nodeEnclosing | Finally.cs:272:13:272:19 | ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | 3 | Finally.cs:263:10:263:12 | M13 | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | this access | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | M1 | @@ -2058,41 +2088,37 @@ nodeEnclosing | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:3:7:3:18 | enter | Initializers.cs:3:7:3:18 | | | Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | Initializers | +| Initializers.cs:3:7:3:18 | exit | Initializers.cs:3:7:3:18 | | +| Initializers.cs:3:7:3:18 | exit (normal) | Initializers.cs:3:7:3:18 | | | Initializers.cs:3:7:3:18 | exit Initializers | Initializers.cs:3:7:3:18 | Initializers | | Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | Initializers | | Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | Initializers | -| Initializers.cs:5:9:5:9 | this access | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:5:9:5:9 | this access | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:6:9:6:9 | this access | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:6:9:6:9 | this access | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:10:5:10:16 | Initializers | -| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:8:5:8:16 | Initializers | -| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:10:5:10:16 | Initializers | +| Initializers.cs:5:9:5:9 | this access | Initializers.cs:3:7:3:18 | | +| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:3:7:3:18 | | +| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:3:7:3:18 | | +| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:3:7:3:18 | | +| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:3:7:3:18 | | +| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:3:7:3:18 | | +| Initializers.cs:6:9:6:9 | this access | Initializers.cs:3:7:3:18 | | +| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:3:7:3:18 | | +| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:3:7:3:18 | | +| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:3:7:3:18 | | +| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:3:7:3:18 | | | Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:8:5:8:16 | call to method | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:8:5:8:16 | exit Initializers | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:8:5:8:16 | exit Initializers (normal) | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:8:5:8:16 | this access | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:5:10:16 | Initializers | +| Initializers.cs:10:5:10:16 | call to method | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:10:5:10:16 | exit Initializers | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:10:5:10:16 | exit Initializers (normal) | Initializers.cs:10:5:10:16 | Initializers | +| Initializers.cs:10:5:10:16 | this access | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | M | | Initializers.cs:12:10:12:10 | exit M | Initializers.cs:12:10:12:10 | M | @@ -2117,25 +2143,32 @@ nodeEnclosing | Initializers.cs:15:42:15:61 | object creation of type Initializers | Initializers.cs:12:10:12:10 | M | | Initializers.cs:15:59:15:60 | "" | Initializers.cs:12:10:12:10 | M | | Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | NoConstructor | +| Initializers.cs:20:11:20:23 | call to method | Initializers.cs:20:11:20:23 | NoConstructor | +| Initializers.cs:20:11:20:23 | enter | Initializers.cs:20:11:20:23 | | | Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | NoConstructor | +| Initializers.cs:20:11:20:23 | exit | Initializers.cs:20:11:20:23 | | +| Initializers.cs:20:11:20:23 | exit (normal) | Initializers.cs:20:11:20:23 | | | Initializers.cs:20:11:20:23 | exit NoConstructor | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | NoConstructor | +| Initializers.cs:20:11:20:23 | this access | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | NoConstructor | -| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | NoConstructor | -| Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:20:11:20:23 | NoConstructor | -| Initializers.cs:22:27:22:27 | 0 | Initializers.cs:20:11:20:23 | NoConstructor | -| Initializers.cs:23:23:23:23 | this access | Initializers.cs:20:11:20:23 | NoConstructor | -| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | NoConstructor | -| Initializers.cs:23:27:23:27 | 1 | Initializers.cs:20:11:20:23 | NoConstructor | -| Initializers.cs:28:13:28:13 | this access | Initializers.cs:31:9:31:11 | Sub | -| Initializers.cs:28:13:28:13 | this access | Initializers.cs:35:9:35:11 | Sub | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:31:9:31:11 | Sub | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:35:9:35:11 | Sub | -| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:31:9:31:11 | Sub | -| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:35:9:35:11 | Sub | +| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | | +| Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:20:11:20:23 | | +| Initializers.cs:22:27:22:27 | 0 | Initializers.cs:20:11:20:23 | | +| Initializers.cs:23:23:23:23 | this access | Initializers.cs:20:11:20:23 | | +| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | | +| Initializers.cs:23:27:23:27 | 1 | Initializers.cs:20:11:20:23 | | +| Initializers.cs:26:11:26:13 | enter | Initializers.cs:26:11:26:13 | | +| Initializers.cs:26:11:26:13 | exit | Initializers.cs:26:11:26:13 | | +| Initializers.cs:26:11:26:13 | exit (normal) | Initializers.cs:26:11:26:13 | | +| Initializers.cs:28:13:28:13 | this access | Initializers.cs:26:11:26:13 | | +| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:26:11:26:13 | | +| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:26:11:26:13 | | +| Initializers.cs:31:9:31:11 | call to method | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:31:9:31:11 | exit Sub | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:31:9:31:11 | exit Sub (normal) | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:9:31:11 | this access | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:31:26:31:26 | this access | Initializers.cs:31:9:31:11 | Sub | @@ -2152,9 +2185,11 @@ nodeEnclosing | Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:9:33:11 | Sub | | Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:9:33:11 | Sub | | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:9:35:11 | Sub | +| Initializers.cs:35:9:35:11 | call to method | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:9:35:11 | exit Sub | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:9:35:11 | exit Sub (normal) | Initializers.cs:35:9:35:11 | Sub | +| Initializers.cs:35:9:35:11 | this access | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:29:35:37 | ... = ... | Initializers.cs:35:9:35:11 | Sub | @@ -2163,14 +2198,18 @@ nodeEnclosing | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | call to method | Initializers.cs:39:7:39:23 | IndexInitializers | | Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | | Initializers.cs:39:7:39:23 | exit IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | this access | Initializers.cs:39:7:39:23 | IndexInitializers | | Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | IndexInitializers | | Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | call to method | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:41:11:41:18 | exit Compound | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | this access | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:51:10:51:13 | exit Test | Initializers.cs:51:10:51:13 | Test | @@ -2278,9 +2317,11 @@ nodeEnclosing | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:51:10:51:13 | Test | | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | call to method | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | this access | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 | LoopUnrolling.cs:7:10:7:11 | M1 | @@ -2489,9 +2530,11 @@ nodeEnclosing | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:94:10:94:12 | M11 | | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | call to method | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -2519,9 +2562,12 @@ nodeEnclosing | MultiImplementationA.cs:8:16:8:16 | exit M (normal) | MultiImplementationA.cs:8:16:8:16 | M | | MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | M | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:16:8:16 | M | -| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:11:7:11:8 | exit | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:11:7:11:8 | | | MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | get_Item | | MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | get_Item | | MultiImplementationA.cs:14:31:14:31 | exit get_Item | MultiImplementationA.cs:14:31:14:31 | get_Item | @@ -2548,10 +2594,12 @@ nodeEnclosing | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | MultiImplementationA.cs:18:9:18:22 | M2 | | MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:9:18:22 | M2 | | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationA.cs:20:12:20:13 | call to method | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:12:20:13 | exit C2 | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:24:20:28 | ... = ... | MultiImplementationA.cs:20:12:20:13 | C2 | @@ -2573,14 +2621,16 @@ nodeEnclosing | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | -| MultiImplementationA.cs:24:16:24:16 | access to property P | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationA.cs:24:16:24:16 | access to property P | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:11:7:11:8 | | | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | call to method | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | @@ -2588,9 +2638,11 @@ nodeEnclosing | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | call to method | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | @@ -2606,6 +2658,8 @@ nodeEnclosing | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | M2 | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:9:37:10 | M2 | | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | call to method | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationA.cs:7:21:7:23 | get_P2 | @@ -2613,9 +2667,9 @@ nodeEnclosing | MultiImplementationB.cs:4:34:4:34 | 1 | MultiImplementationA.cs:7:21:7:23 | get_P2 | | MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationA.cs:7:41:7:43 | set_P2 | | MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationA.cs:8:16:8:16 | M | -| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationB.cs:11:16:11:20 | ... = ... | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationB.cs:11:16:11:20 | ... = ... | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationA.cs:11:7:11:8 | | | MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationA.cs:14:31:14:31 | get_Item | | MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationA.cs:14:31:14:31 | get_Item | | MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationA.cs:15:36:15:38 | get_Item | @@ -2630,6 +2684,8 @@ nodeEnclosing | MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | M2 | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:9:16:31 | M2 | | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationB.cs:18:12:18:13 | call to method | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationA.cs:20:12:20:13 | C2 | @@ -2641,19 +2697,25 @@ nodeEnclosing | MultiImplementationB.cs:20:19:20:22 | null | MultiImplementationA.cs:22:6:22:7 | ~C2 | | MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | -| MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationA.cs:20:12:20:13 | C2 | -| MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationA.cs:11:7:11:8 | | | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | call to method | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | call to method | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | M1 | | NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | call to method | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | this access | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | M1 | @@ -2722,34 +2784,36 @@ nodeEnclosing | NullCoalescing.cs:17:13:17:19 | (...) ... | NullCoalescing.cs:13:10:13:11 | M6 | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | | NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:13:10:13:11 | M6 | +| PartialImplementationA.cs:1:15:1:21 | enter | PartialImplementationA.cs:1:15:1:21 | | +| PartialImplementationA.cs:1:15:1:21 | exit | PartialImplementationA.cs:1:15:1:21 | | +| PartialImplementationA.cs:1:15:1:21 | exit (normal) | PartialImplementationA.cs:1:15:1:21 | | | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:12:3:18 | Partial | +| PartialImplementationA.cs:3:12:3:18 | call to method | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationA.cs:3:12:3:18 | exit Partial | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | PartialImplementationA.cs:3:12:3:18 | Partial | +| PartialImplementationA.cs:3:12:3:18 | this access | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:4:12:4:18 | Partial | -| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:4:12:4:18 | Partial | -| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:4:12:4:18 | Partial | +| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationA.cs:1:15:1:21 | | +| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationA.cs:1:15:1:21 | | +| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationA.cs:1:15:1:21 | | | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:12:4:18 | Partial | +| PartialImplementationB.cs:4:12:4:18 | call to method | PartialImplementationB.cs:4:12:4:18 | Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | Partial | | PartialImplementationB.cs:4:12:4:18 | exit Partial | PartialImplementationB.cs:4:12:4:18 | Partial | | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | PartialImplementationB.cs:4:12:4:18 | Partial | +| PartialImplementationB.cs:4:12:4:18 | this access | PartialImplementationB.cs:4:12:4:18 | Partial | | PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:12:4:18 | Partial | -| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:4:12:4:18 | Partial | -| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:4:12:4:18 | Partial | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:12:4:18 | Partial | -| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationA.cs:3:12:3:18 | Partial | -| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:4:12:4:18 | Partial | +| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationA.cs:1:15:1:21 | | +| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationA.cs:1:15:1:21 | | +| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationA.cs:1:15:1:21 | | +| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationA.cs:1:15:1:21 | | | Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | call to method | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:3:7:3:14 | exit Patterns | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | this access | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:5:10:5:11 | exit M1 | Patterns.cs:5:10:5:11 | M1 | @@ -2966,9 +3030,11 @@ nodeEnclosing | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:93:17:93:19 | M10 | | PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | call to method | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:3:7:3:19 | exit PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | this access | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | M1 | | PostDominance.cs:5:10:5:11 | exit M1 | PostDominance.cs:5:10:5:11 | M1 | @@ -3007,9 +3073,11 @@ nodeEnclosing | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:17:10:17:11 | M3 | | Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | call to method | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:1:7:1:16 | exit Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | this access | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | Method | | Qualifiers.cs:7:16:7:21 | exit Method | Qualifiers.cs:7:16:7:21 | Method | @@ -3078,9 +3146,11 @@ nodeEnclosing | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:10:10:10:10 | M | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:10:10:10:10 | M | | Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | call to method | Switch.cs:3:7:3:12 | Switch | | Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | Switch | | Switch.cs:3:7:3:12 | exit Switch | Switch.cs:3:7:3:12 | Switch | | Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | this access | Switch.cs:3:7:3:12 | Switch | | Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | M1 | | Switch.cs:5:10:5:11 | exit M1 | Switch.cs:5:10:5:11 | M1 | @@ -3385,9 +3455,11 @@ nodeEnclosing | Switch.cs:175:42:175:46 | "def" | Switch.cs:163:10:163:12 | M16 | | Switch.cs:176:17:176:22 | break; | Switch.cs:163:10:163:12 | M16 | | TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | call to method | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | this access | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:3:10:3:10 | M | @@ -3411,9 +3483,11 @@ nodeEnclosing | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:3:10:3:10 | M | | VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | call to method | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:3:7:3:14 | exit VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | this access | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | M1 | | VarDecls.cs:5:18:5:19 | exit M1 | VarDecls.cs:5:18:5:19 | M1 | @@ -3465,9 +3539,11 @@ nodeEnclosing | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | call to method | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:11:28:11 | exit C | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | this access | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | Dispose | | VarDecls.cs:28:41:28:47 | exit Dispose | VarDecls.cs:28:41:28:47 | Dispose | @@ -3753,9 +3829,11 @@ nodeEnclosing | cflow.cs:127:68:127:81 | ...; | cflow.cs:127:62:127:64 | set_Prop | | cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:62:127:64 | set_Prop | | cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:129:5:129:15 | call to method | cflow.cs:129:5:129:15 | ControlFlow | | cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | ControlFlow | | cflow.cs:129:5:129:15 | exit ControlFlow | cflow.cs:129:5:129:15 | ControlFlow | | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:129:5:129:15 | this access | cflow.cs:129:5:129:15 | ControlFlow | | cflow.cs:130:5:132:5 | {...} | cflow.cs:129:5:129:15 | ControlFlow | | cflow.cs:131:9:131:13 | this access | cflow.cs:129:5:129:15 | ControlFlow | | cflow.cs:131:9:131:17 | ... = ... | cflow.cs:129:5:129:15 | ControlFlow | @@ -4121,9 +4199,11 @@ nodeEnclosing | cflow.cs:275:13:275:41 | call to method WriteLine | cflow.cs:261:49:261:53 | Yield | | cflow.cs:275:13:275:42 | ...; | cflow.cs:261:49:261:53 | Yield | | cflow.cs:275:31:275:40 | "not dead" | cflow.cs:261:49:261:53 | Yield | +| cflow.cs:282:5:282:18 | call to method | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:282:5:282:18 | exit ControlFlowSub | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | cflow.cs:282:5:282:18 | ControlFlowSub | +| cflow.cs:282:5:282:18 | this access | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:282:31:282:33 | {...} | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | ControlFlowSub | @@ -4139,9 +4219,11 @@ nodeEnclosing | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:5:286:18 | ControlFlowSub | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | ControlFlowSub | | cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | call to method | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:289:7:289:18 | exit DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | this access | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | M | | cflow.cs:291:12:291:12 | exit M | cflow.cs:291:12:291:12 | M | @@ -4150,9 +4232,11 @@ nodeEnclosing | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:12:291:12 | M | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:12:291:12 | M | | cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:5:296:25 | NegationInConstructor | +| cflow.cs:296:5:296:25 | call to method | cflow.cs:296:5:296:25 | NegationInConstructor | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | NegationInConstructor | | cflow.cs:296:5:296:25 | exit NegationInConstructor | cflow.cs:296:5:296:25 | NegationInConstructor | | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | cflow.cs:296:5:296:25 | NegationInConstructor | +| cflow.cs:296:5:296:25 | this access | cflow.cs:296:5:296:25 | NegationInConstructor | | cflow.cs:296:52:296:54 | {...} | cflow.cs:296:5:296:25 | NegationInConstructor | | cflow.cs:298:10:298:10 | enter M | cflow.cs:298:10:298:10 | M | | cflow.cs:298:10:298:10 | exit M | cflow.cs:298:10:298:10 | M | @@ -4172,9 +4256,11 @@ nodeEnclosing | cflow.cs:300:61:300:64 | null | cflow.cs:298:10:298:10 | M | | cflow.cs:300:70:300:71 | "" | cflow.cs:298:10:298:10 | M | | cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | call to method | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:304:7:304:18 | exit LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | this access | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | get__getter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | @@ -4731,11 +4817,14 @@ blockEnclosing | Foreach.cs:36:10:36:11 | exit M6 (normal) | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:3:7:3:18 | enter | Initializers.cs:3:7:3:18 | | | Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | M | +| Initializers.cs:20:11:20:23 | enter | Initializers.cs:20:11:20:23 | | | Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | NoConstructor | +| Initializers.cs:26:11:26:13 | enter | Initializers.cs:26:11:26:13 | | | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | Sub | @@ -4800,9 +4889,9 @@ blockEnclosing | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:94:10:94:12 | M11 | -| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -4815,6 +4904,9 @@ blockEnclosing | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationA.cs:8:16:8:16 | M | | MultiImplementationA.cs:8:16:8:16 | exit M | MultiImplementationA.cs:8:16:8:16 | M | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:16:8:16 | M | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | | +| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:11:7:11:8 | | | MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | get_Item | | MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | get_Item | | MultiImplementationA.cs:14:31:14:31 | exit get_Item | MultiImplementationA.cs:14:31:14:31 | get_Item | @@ -4828,9 +4920,9 @@ blockEnclosing | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | MultiImplementationA.cs:16:17:16:18 | M1 | | MultiImplementationA.cs:17:5:19:5 | {...} | MultiImplementationA.cs:16:17:16:18 | M1 | | MultiImplementationA.cs:18:9:18:22 | enter M2 | MultiImplementationA.cs:18:9:18:22 | M2 | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:20:12:20:13 | exit C2 | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationA.cs:21:12:21:13 | C2 | | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | MultiImplementationA.cs:21:12:21:13 | C2 | | MultiImplementationA.cs:21:24:21:24 | 0 | MultiImplementationA.cs:21:12:21:13 | C2 | @@ -4840,33 +4932,34 @@ blockEnclosing | MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | -| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | -| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | M2 | -| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationA.cs:4:7:4:8 | C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationA.cs:7:21:7:23 | get_P2 | | MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationA.cs:7:41:7:43 | set_P2 | | MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationA.cs:8:16:8:16 | M | +| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationA.cs:11:7:11:8 | | | MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationA.cs:14:31:14:31 | get_Item | | MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationA.cs:15:36:15:38 | get_Item | | MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationA.cs:15:54:15:56 | set_Item | | MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationA.cs:16:17:16:18 | M1 | | MultiImplementationB.cs:16:9:16:31 | enter M2 | MultiImplementationB.cs:16:9:16:31 | M2 | -| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | C2 | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationA.cs:21:12:21:13 | C2 | | MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationA.cs:22:6:22:7 | ~C2 | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | -| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | -| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationA.cs:34:15:34:16 | C4 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | M1 | | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | @@ -4906,6 +4999,7 @@ blockEnclosing | NullCoalescing.cs:15:31:15:31 | 0 | NullCoalescing.cs:13:10:13:11 | M6 | | NullCoalescing.cs:16:17:16:25 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | +| PartialImplementationA.cs:1:15:1:21 | enter | PartialImplementationA.cs:1:15:1:21 | | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | Partial | | Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | Patterns | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected index ea7ade106ea..da8fe4664f5 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected @@ -1,4 +1,6 @@ | AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | call to method | AccessorCalls.cs:1:7:1:19 | this access | +| AccessorCalls.cs:1:7:1:19 | this access | AccessorCalls.cs:1:7:1:19 | this access | | AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | {...} | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:37:5:39 | {...} | @@ -290,6 +292,8 @@ | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:78:73:78 | access to local variable d | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:80:73:80 | 1 | | ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | call to method | ArrayCreation.cs:1:7:1:19 | this access | +| ArrayCreation.cs:1:7:1:19 | this access | ArrayCreation.cs:1:7:1:19 | this access | | ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | {...} | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:27:3:27 | 0 | @@ -312,6 +316,8 @@ | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:45:9:45 | 2 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:48:9:48 | 3 | | Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | call to method | Assert.cs:5:7:5:17 | this access | +| Assert.cs:5:7:5:17 | this access | Assert.cs:5:7:5:17 | this access | | Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | {...} | | Assert.cs:8:5:12:5 | {...} | Assert.cs:8:5:12:5 | {...} | | Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:9:9:33 | ... ...; | @@ -675,6 +681,8 @@ | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:33:140:34 | access to parameter b3 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:141:9:141:15 | return ...; | | Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | call to method | Assignments.cs:1:7:1:17 | this access | +| Assignments.cs:1:7:1:17 | this access | Assignments.cs:1:7:1:17 | this access | | Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | {...} | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:9:5:18 | ... ...; | @@ -715,6 +723,8 @@ | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:16:19:16 | access to parameter x | | BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | call to method | BreakInTry.cs:1:7:1:16 | this access | +| BreakInTry.cs:1:7:1:16 | this access | BreakInTry.cs:1:7:1:16 | this access | | BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | {...} | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:5:9:17:9 | try {...} ... | @@ -791,6 +801,8 @@ | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:28:67:31 | null | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | call to method | CompileTimeOperators.cs:3:7:3:26 | this access | +| CompileTimeOperators.cs:3:7:3:26 | this access | CompileTimeOperators.cs:3:7:3:26 | this access | | CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | {...} | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:7:16:7:27 | default(...) | @@ -806,6 +818,8 @@ | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | call to method | CompileTimeOperators.cs:26:7:26:22 | this access | +| CompileTimeOperators.cs:26:7:26:22 | this access | CompileTimeOperators.cs:26:7:26:22 | this access | | CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | {...} | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | @@ -826,6 +840,8 @@ | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:14:40:38 | ...; | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:32:40:36 | "End" | | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | call to method | ConditionalAccess.cs:1:7:1:23 | this access | +| ConditionalAccess.cs:1:7:1:23 | this access | ConditionalAccess.cs:1:7:1:23 | this access | | ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | {...} | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:26:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:26 | access to parameter i | @@ -886,6 +902,8 @@ | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:75:41:78 | ", " | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | | Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | call to method | Conditions.cs:1:7:1:16 | this access | +| Conditions.cs:1:7:1:16 | this access | Conditions.cs:1:7:1:16 | this access | | Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | {...} | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:5:9:6:16 | if (...) ... | @@ -1167,6 +1185,8 @@ | Conditions.cs:149:44:149:46 | {...} | Conditions.cs:149:45:149:45 | access to local variable s | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:45:149:45 | access to local variable s | | ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | call to method | ExitMethods.cs:6:7:6:17 | this access | +| ExitMethods.cs:6:7:6:17 | this access | ExitMethods.cs:6:7:6:17 | this access | | ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | {...} | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:10:20:10:23 | true | @@ -1336,6 +1356,8 @@ | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | access to method Parse | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | access to method Parse | | Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | call to method | Finally.cs:3:14:3:20 | this access | +| Finally.cs:3:14:3:20 | this access | Finally.cs:3:14:3:20 | this access | | Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | {...} | | Finally.cs:8:5:17:5 | {...} | Finally.cs:8:5:17:5 | {...} | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:9:9:16:9 | try {...} ... | @@ -1547,10 +1569,16 @@ | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:17:167:38 | ...; | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:35:167:36 | "" | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | call to method | Finally.cs:172:11:172:20 | this access | +| Finally.cs:172:11:172:20 | this access | Finally.cs:172:11:172:20 | this access | | Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | {...} | | Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | call to method | Finally.cs:173:11:173:20 | this access | +| Finally.cs:173:11:173:20 | this access | Finally.cs:173:11:173:20 | this access | | Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | {...} | | Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | call to method | Finally.cs:174:11:174:20 | this access | +| Finally.cs:174:11:174:20 | this access | Finally.cs:174:11:174:20 | this access | | Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | {...} | | Finally.cs:177:5:193:5 | {...} | Finally.cs:177:5:193:5 | {...} | | Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | @@ -1667,6 +1695,8 @@ | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:19 | ...; | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | this access | +| Foreach.cs:4:7:4:13 | this access | Foreach.cs:4:7:4:13 | this access | | Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | {...} | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:29:8:32 | access to parameter args | @@ -1721,8 +1751,12 @@ | Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:27:6:27 | access to field H | | Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:31:6:31 | 2 | | Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:5:8:16 | call to constructor Object | +| Initializers.cs:8:5:8:16 | call to method | Initializers.cs:8:5:8:16 | this access | +| Initializers.cs:8:5:8:16 | this access | Initializers.cs:8:5:8:16 | this access | | Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:20:8:22 | {...} | | Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:5:10:16 | call to constructor Object | +| Initializers.cs:10:5:10:16 | call to method | Initializers.cs:10:5:10:16 | this access | +| Initializers.cs:10:5:10:16 | this access | Initializers.cs:10:5:10:16 | this access | | Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:28:10:30 | {...} | | Initializers.cs:13:5:16:5 | {...} | Initializers.cs:13:5:16:5 | {...} | | Initializers.cs:14:9:14:54 | ... ...; | Initializers.cs:14:9:14:54 | ... ...; | @@ -1745,6 +1779,8 @@ | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:20:18:20 | 1 | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 | | Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to constructor Object | +| Initializers.cs:20:11:20:23 | call to method | Initializers.cs:20:11:20:23 | this access | +| Initializers.cs:20:11:20:23 | this access | Initializers.cs:20:11:20:23 | this access | | Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | {...} | | Initializers.cs:22:23:22:23 | access to field F | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:23:22:23 | this access | @@ -1758,6 +1794,8 @@ | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:13:28:13 | this access | | Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:28:13:28:13 | this access | | Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:17:28:17 | 2 | +| Initializers.cs:31:9:31:11 | call to method | Initializers.cs:31:9:31:11 | this access | +| Initializers.cs:31:9:31:11 | this access | Initializers.cs:31:9:31:11 | this access | | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | | Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:24:31:33 | {...} | | Initializers.cs:31:26:31:26 | access to field I | Initializers.cs:31:26:31:26 | this access | @@ -1773,6 +1811,8 @@ | Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:31:33:36 | ...; | | Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:35:33:35 | access to parameter i | | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | +| Initializers.cs:35:9:35:11 | call to method | Initializers.cs:35:9:35:11 | this access | +| Initializers.cs:35:9:35:11 | this access | Initializers.cs:35:9:35:11 | this access | | Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:27:35:40 | {...} | | Initializers.cs:35:29:35:29 | access to field I | Initializers.cs:35:29:35:29 | this access | | Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:29:35:29 | this access | @@ -1782,8 +1822,12 @@ | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:33:35:33 | access to parameter i | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:37:35:37 | access to parameter j | | Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:39:7:39:23 | call to method | Initializers.cs:39:7:39:23 | this access | +| Initializers.cs:39:7:39:23 | this access | Initializers.cs:39:7:39:23 | this access | | Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | {...} | | Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:41:11:41:18 | call to method | Initializers.cs:41:11:41:18 | this access | +| Initializers.cs:41:11:41:18 | this access | Initializers.cs:41:11:41:18 | this access | | Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | {...} | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:52:5:66:5 | {...} | | Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:9:54:96 | ... ...; | @@ -1893,6 +1937,8 @@ | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:54:64:54 | 0 | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:59:64:61 | "1" | | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | call to method | LoopUnrolling.cs:5:7:5:19 | this access | +| LoopUnrolling.cs:5:7:5:19 | this access | LoopUnrolling.cs:5:7:5:19 | this access | | LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | {...} | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:9:9:10:19 | if (...) ... | @@ -2067,6 +2113,8 @@ | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:13:99:33 | ...; | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | call to method | MultiImplementationA.cs:4:7:4:8 | this access | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | this access | | MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | {...} | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | @@ -2092,6 +2140,8 @@ | MultiImplementationA.cs:18:9:18:22 | M2(...) | MultiImplementationA.cs:18:9:18:22 | M2(...) | | MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:21:18:21 | 0 | | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | +| MultiImplementationA.cs:20:12:20:13 | call to method | MultiImplementationA.cs:20:12:20:13 | this access | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | this access | | MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:22:20:31 | {...} | | MultiImplementationA.cs:20:24:20:24 | access to field F | MultiImplementationA.cs:20:24:20:24 | this access | | MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:24:20:24 | this access | @@ -2108,10 +2158,14 @@ | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:34:24:34 | 0 | | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | call to method | MultiImplementationA.cs:28:7:28:8 | this access | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | this access | | MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | {...} | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | call to method | MultiImplementationA.cs:34:15:34:16 | this access | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | this access | | MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | {...} | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:22:36:25 | null | @@ -2120,6 +2174,8 @@ | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | call to method | MultiImplementationB.cs:1:7:1:8 | this access | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | this access | | MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | {...} | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:25:4:37 | {...} | @@ -2143,6 +2199,8 @@ | MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:27:16:30 | null | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:27:16:30 | null | | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | +| MultiImplementationB.cs:18:12:18:13 | call to method | MultiImplementationB.cs:18:12:18:13 | this access | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | this access | | MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:22:18:36 | {...} | | MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationB.cs:18:30:18:33 | null | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:30:18:33 | null | @@ -2159,11 +2217,17 @@ | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:16:22:16 | this access | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:34:22:34 | 1 | | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | call to method | MultiImplementationB.cs:25:7:25:8 | this access | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | this access | | MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | {...} | | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | call to method | MultiImplementationB.cs:30:15:30:16 | this access | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | this access | | MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | {...} | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | | NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | call to method | NullCoalescing.cs:1:7:1:20 | this access | +| NullCoalescing.cs:1:7:1:20 | this access | NullCoalescing.cs:1:7:1:20 | this access | | NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | {...} | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:23 | access to parameter i | @@ -2214,18 +2278,24 @@ | NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:17:19:17:19 | access to parameter i | | NullCoalescing.cs:17:24:17:24 | 1 | NullCoalescing.cs:17:24:17:24 | 1 | | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | +| PartialImplementationA.cs:3:12:3:18 | call to method | PartialImplementationA.cs:3:12:3:18 | this access | +| PartialImplementationA.cs:3:12:3:18 | this access | PartialImplementationA.cs:3:12:3:18 | this access | | PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:27:3:29 | {...} | | PartialImplementationB.cs:3:16:3:16 | access to field F | PartialImplementationB.cs:3:16:3:16 | this access | | PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:16:3:16 | this access | | PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:3:16:3:16 | this access | | PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:20:3:20 | 0 | | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | +| PartialImplementationB.cs:4:12:4:18 | call to method | PartialImplementationB.cs:4:12:4:18 | this access | +| PartialImplementationB.cs:4:12:4:18 | this access | PartialImplementationB.cs:4:12:4:18 | this access | | PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:22:4:24 | {...} | | PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:34:5:34 | 0 | | Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to constructor Object | +| Patterns.cs:3:7:3:14 | call to method | Patterns.cs:3:7:3:14 | this access | +| Patterns.cs:3:7:3:14 | this access | Patterns.cs:3:7:3:14 | this access | | Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | {...} | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:9:7:24 | ... ...; | @@ -2398,6 +2468,8 @@ | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:13:97:39 | ...; | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:31:97:37 | "not C" | | PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | call to method | PostDominance.cs:3:7:3:19 | this access | +| PostDominance.cs:3:7:3:19 | this access | PostDominance.cs:3:7:3:19 | this access | | PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | {...} | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:7:27:7:27 | access to parameter s | @@ -2425,6 +2497,8 @@ | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:29 | ...; | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:27:21:27 | access to parameter s | | Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | call to method | Qualifiers.cs:1:7:1:16 | this access | +| Qualifiers.cs:1:7:1:16 | this access | Qualifiers.cs:1:7:1:16 | this access | | Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | {...} | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:41:8:44 | null | @@ -2484,6 +2558,8 @@ | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | | Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | call to method | Switch.cs:3:7:3:12 | this access | +| Switch.cs:3:7:3:12 | this access | Switch.cs:3:7:3:12 | this access | | Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | {...} | | Switch.cs:6:5:8:5 | {...} | Switch.cs:6:5:8:5 | {...} | | Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:9:7:22 | switch (...) {...} | @@ -2734,6 +2810,8 @@ | Switch.cs:175:42:175:46 | "def" | Switch.cs:175:42:175:46 | "def" | | Switch.cs:176:17:176:22 | break; | Switch.cs:176:17:176:22 | break; | | TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | call to method | TypeAccesses.cs:1:7:1:18 | this access | +| TypeAccesses.cs:1:7:1:18 | this access | TypeAccesses.cs:1:7:1:18 | this access | | TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:4:5:9:5 | {...} | | TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:9:5:26 | ... ...; | @@ -2753,6 +2831,8 @@ | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:17:8:27 | typeof(...) | | VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | call to method | VarDecls.cs:3:7:3:14 | this access | +| VarDecls.cs:3:7:3:14 | this access | VarDecls.cs:3:7:3:14 | this access | | VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | {...} | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | @@ -2795,6 +2875,8 @@ | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | | VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | call to method | VarDecls.cs:28:11:28:11 | this access | +| VarDecls.cs:28:11:28:11 | this access | VarDecls.cs:28:11:28:11 | this access | | VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | {...} | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:51:28:53 | {...} | | cflow.cs:6:5:35:5 | {...} | cflow.cs:6:5:35:5 | {...} | @@ -3049,6 +3131,8 @@ | cflow.cs:127:68:127:81 | ...; | cflow.cs:127:68:127:81 | ...; | | cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:76:127:80 | access to parameter value | | cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:129:5:129:15 | call to constructor Object | +| cflow.cs:129:5:129:15 | call to method | cflow.cs:129:5:129:15 | this access | +| cflow.cs:129:5:129:15 | this access | cflow.cs:129:5:129:15 | this access | | cflow.cs:130:5:132:5 | {...} | cflow.cs:130:5:132:5 | {...} | | cflow.cs:131:9:131:13 | access to field Field | cflow.cs:131:9:131:13 | this access | | cflow.cs:131:9:131:13 | this access | cflow.cs:131:9:131:13 | this access | @@ -3372,6 +3456,8 @@ | cflow.cs:275:13:275:41 | call to method WriteLine | cflow.cs:275:31:275:40 | "not dead" | | cflow.cs:275:13:275:42 | ...; | cflow.cs:275:13:275:42 | ...; | | cflow.cs:275:31:275:40 | "not dead" | cflow.cs:275:31:275:40 | "not dead" | +| cflow.cs:282:5:282:18 | call to method | cflow.cs:282:5:282:18 | this access | +| cflow.cs:282:5:282:18 | this access | cflow.cs:282:5:282:18 | this access | | cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:24:282:27 | call to constructor ControlFlow | | cflow.cs:282:31:282:33 | {...} | cflow.cs:282:31:282:33 | {...} | | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | @@ -3381,11 +3467,15 @@ | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:48:286:50 | {...} | | cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | call to method | cflow.cs:289:7:289:18 | this access | +| cflow.cs:289:7:289:18 | this access | cflow.cs:289:7:289:18 | this access | | cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | {...} | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:40:291:40 | 0 | | cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:5:296:25 | call to constructor Object | +| cflow.cs:296:5:296:25 | call to method | cflow.cs:296:5:296:25 | this access | +| cflow.cs:296:5:296:25 | this access | cflow.cs:296:5:296:25 | this access | | cflow.cs:296:52:296:54 | {...} | cflow.cs:296:52:296:54 | {...} | | cflow.cs:299:5:301:5 | {...} | cflow.cs:299:5:301:5 | {...} | | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | cflow.cs:300:38:300:38 | 0 | @@ -3401,6 +3491,8 @@ | cflow.cs:300:61:300:64 | null | cflow.cs:300:61:300:64 | null | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:70:300:71 | "" | | cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | call to method | cflow.cs:304:7:304:18 | this access | +| cflow.cs:304:7:304:18 | this access | cflow.cs:304:7:304:18 | this access | | cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | {...} | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:307:5:310:5 | {...} | cflow.cs:307:5:310:5 | {...} | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected index 11880f4f825..e3d13701cff 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected @@ -1,4 +1,6 @@ | AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to constructor Object | normal | +| AccessorCalls.cs:1:7:1:19 | call to method | AccessorCalls.cs:1:7:1:19 | call to method | normal | +| AccessorCalls.cs:1:7:1:19 | this access | AccessorCalls.cs:1:7:1:19 | this access | normal | | AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | {...} | normal | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:30:5:30 | access to parameter i | normal | | AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:37:5:39 | {...} | normal | @@ -290,6 +292,8 @@ | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:78:73:81 | dynamic access to element | normal | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:80:73:80 | 1 | normal | | ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to constructor Object | normal | +| ArrayCreation.cs:1:7:1:19 | call to method | ArrayCreation.cs:1:7:1:19 | call to method | normal | +| ArrayCreation.cs:1:7:1:19 | this access | ArrayCreation.cs:1:7:1:19 | this access | normal | | ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | {...} | normal | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | normal | | ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:27:3:27 | 0 | normal | @@ -312,6 +316,8 @@ | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:45:9:45 | 2 | normal | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:48:9:48 | 3 | normal | | Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to constructor Object | normal | +| Assert.cs:5:7:5:17 | call to method | Assert.cs:5:7:5:17 | call to method | normal | +| Assert.cs:5:7:5:17 | this access | Assert.cs:5:7:5:17 | this access | normal | | Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | {...} | normal | | Assert.cs:8:5:12:5 | {...} | Assert.cs:10:9:10:31 | call to method Assert | exit | | Assert.cs:8:5:12:5 | {...} | Assert.cs:11:9:11:35 | call to method WriteLine | normal | @@ -774,6 +780,8 @@ | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:33:140:34 | access to parameter b3 | normal | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:141:9:141:15 | return ...; | return | | Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to constructor Object | normal | +| Assignments.cs:1:7:1:17 | call to method | Assignments.cs:1:7:1:17 | call to method | normal | +| Assignments.cs:1:7:1:17 | this access | Assignments.cs:1:7:1:17 | this access | normal | | Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | {...} | normal | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:14:9:14:35 | ... += ... | normal | | Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | @@ -814,6 +822,8 @@ | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:9:19:17 | return ...; | return | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:16:19:16 | access to parameter x | normal | | BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to constructor Object | normal | +| BreakInTry.cs:1:7:1:16 | call to method | BreakInTry.cs:1:7:1:16 | call to method | normal | +| BreakInTry.cs:1:7:1:16 | this access | BreakInTry.cs:1:7:1:16 | this access | normal | | BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | {...} | normal | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:15:17:15:28 | ... == ... | false | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:16:17:16:17 | ; | normal | @@ -941,6 +951,8 @@ | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:28:67:31 | null | normal | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | break | | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | normal | +| CompileTimeOperators.cs:3:7:3:26 | call to method | CompileTimeOperators.cs:3:7:3:26 | call to method | normal | +| CompileTimeOperators.cs:3:7:3:26 | this access | CompileTimeOperators.cs:3:7:3:26 | this access | normal | | CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | {...} | normal | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | | CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | @@ -956,6 +968,8 @@ | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | normal | | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | normal | | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | normal | +| CompileTimeOperators.cs:26:7:26:22 | call to method | CompileTimeOperators.cs:26:7:26:22 | call to method | normal | +| CompileTimeOperators.cs:26:7:26:22 | this access | CompileTimeOperators.cs:26:7:26:22 | this access | normal | | CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | {...} | normal | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | goto(End) [normal] (0) | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | throw(Exception) [normal] (0) | @@ -984,6 +998,8 @@ | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:32:40:36 | "End" | normal | | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | normal | +| ConditionalAccess.cs:1:7:1:23 | call to method | ConditionalAccess.cs:1:7:1:23 | call to method | normal | +| ConditionalAccess.cs:1:7:1:23 | this access | ConditionalAccess.cs:1:7:1:23 | this access | normal | | ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | {...} | normal | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | non-null | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | @@ -1070,6 +1086,8 @@ | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:75:41:78 | ", " | normal | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | normal | | Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to constructor Object | normal | +| Conditions.cs:1:7:1:16 | call to method | Conditions.cs:1:7:1:16 | call to method | normal | +| Conditions.cs:1:7:1:16 | this access | Conditions.cs:1:7:1:16 | this access | normal | | Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | {...} | normal | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:7:13:7:16 | !... | false | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:8:13:8:15 | ...-- | normal | @@ -1427,6 +1445,8 @@ | Conditions.cs:149:44:149:46 | {...} | Conditions.cs:149:44:149:46 | {...} | normal | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:45:149:45 | access to local variable s | normal | | ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to constructor Object | normal | +| ExitMethods.cs:6:7:6:17 | call to method | ExitMethods.cs:6:7:6:17 | call to method | normal | +| ExitMethods.cs:6:7:6:17 | this access | ExitMethods.cs:6:7:6:17 | this access | normal | | ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | {...} | normal | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:11:9:11:15 | return ...; | return | | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | normal | @@ -1629,6 +1649,8 @@ | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | access to method Parse | normal | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | delegate creation of type Func | normal | | Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to constructor Object | normal | +| Finally.cs:3:14:3:20 | call to method | Finally.cs:3:14:3:20 | call to method | normal | +| Finally.cs:3:14:3:20 | this access | Finally.cs:3:14:3:20 | this access | normal | | Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | {...} | normal | | Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | normal | | Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | throw(Exception) [normal] (0) | @@ -2018,10 +2040,16 @@ | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:17:167:37 | call to method WriteLine | normal | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:35:167:36 | "" | normal | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to constructor Exception | normal | +| Finally.cs:172:11:172:20 | call to method | Finally.cs:172:11:172:20 | call to method | normal | +| Finally.cs:172:11:172:20 | this access | Finally.cs:172:11:172:20 | this access | normal | | Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | {...} | normal | | Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to constructor Exception | normal | +| Finally.cs:173:11:173:20 | call to method | Finally.cs:173:11:173:20 | call to method | normal | +| Finally.cs:173:11:173:20 | this access | Finally.cs:173:11:173:20 | this access | normal | | Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | {...} | normal | | Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to constructor Exception | normal | +| Finally.cs:174:11:174:20 | call to method | Finally.cs:174:11:174:20 | call to method | normal | +| Finally.cs:174:11:174:20 | this access | Finally.cs:174:11:174:20 | this access | normal | | Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | {...} | normal | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | false | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | throw(Exception) [false] (0) | @@ -2267,6 +2295,8 @@ | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:18 | ... = ... | normal | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | normal | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | normal | +| Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to method | normal | +| Foreach.cs:4:7:4:13 | this access | Foreach.cs:4:7:4:13 | this access | normal | | Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | {...} | normal | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | @@ -2324,8 +2354,12 @@ | Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:27:6:31 | ... + ... | normal | | Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:31:6:31 | 2 | normal | | Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:5:8:16 | call to constructor Object | normal | +| Initializers.cs:8:5:8:16 | call to method | Initializers.cs:8:5:8:16 | call to method | normal | +| Initializers.cs:8:5:8:16 | this access | Initializers.cs:8:5:8:16 | this access | normal | | Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:20:8:22 | {...} | normal | | Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:5:10:16 | call to constructor Object | normal | +| Initializers.cs:10:5:10:16 | call to method | Initializers.cs:10:5:10:16 | call to method | normal | +| Initializers.cs:10:5:10:16 | this access | Initializers.cs:10:5:10:16 | this access | normal | | Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:28:10:30 | {...} | normal | | Initializers.cs:13:5:16:5 | {...} | Initializers.cs:15:13:15:63 | Initializers[] iz = ... | normal | | Initializers.cs:14:9:14:54 | ... ...; | Initializers.cs:14:13:14:53 | Initializers i = ... | normal | @@ -2348,6 +2382,8 @@ | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:20 | ... = ... | normal | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 | normal | | Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to constructor Object | normal | +| Initializers.cs:20:11:20:23 | call to method | Initializers.cs:20:11:20:23 | call to method | normal | +| Initializers.cs:20:11:20:23 | this access | Initializers.cs:20:11:20:23 | this access | normal | | Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | {...} | normal | | Initializers.cs:22:23:22:23 | access to field F | Initializers.cs:22:23:22:23 | this access | normal | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:23:22:23 | this access | normal | @@ -2361,6 +2397,8 @@ | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:13:28:13 | this access | normal | | Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:28:13:28:17 | ... = ... | normal | | Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:17:28:17 | 2 | normal | +| Initializers.cs:31:9:31:11 | call to method | Initializers.cs:31:9:31:11 | call to method | normal | +| Initializers.cs:31:9:31:11 | this access | Initializers.cs:31:9:31:11 | this access | normal | | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | normal | | Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:26:31:30 | ... = ... | normal | | Initializers.cs:31:26:31:26 | access to field I | Initializers.cs:31:26:31:26 | this access | normal | @@ -2376,6 +2414,8 @@ | Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:31:33:35 | ... = ... | normal | | Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:35:33:35 | access to parameter i | normal | | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | normal | +| Initializers.cs:35:9:35:11 | call to method | Initializers.cs:35:9:35:11 | call to method | normal | +| Initializers.cs:35:9:35:11 | this access | Initializers.cs:35:9:35:11 | this access | normal | | Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:29:35:37 | ... = ... | normal | | Initializers.cs:35:29:35:29 | access to field I | Initializers.cs:35:29:35:29 | this access | normal | | Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:29:35:29 | this access | normal | @@ -2385,8 +2425,12 @@ | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:33:35:37 | ... + ... | normal | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:37:35:37 | access to parameter j | normal | | Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to constructor Object | normal | +| Initializers.cs:39:7:39:23 | call to method | Initializers.cs:39:7:39:23 | call to method | normal | +| Initializers.cs:39:7:39:23 | this access | Initializers.cs:39:7:39:23 | this access | normal | | Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | {...} | normal | | Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to constructor Object | normal | +| Initializers.cs:41:11:41:18 | call to method | Initializers.cs:41:11:41:18 | call to method | normal | +| Initializers.cs:41:11:41:18 | this access | Initializers.cs:41:11:41:18 | this access | normal | | Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | {...} | normal | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:57:13:65:9 | Compound compound = ... | normal | | Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:13:54:95 | Dictionary dict = ... | normal | @@ -2496,6 +2540,8 @@ | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:54:64:54 | 0 | normal | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:59:64:61 | "1" | normal | | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | normal | +| LoopUnrolling.cs:5:7:5:19 | call to method | LoopUnrolling.cs:5:7:5:19 | call to method | normal | +| LoopUnrolling.cs:5:7:5:19 | this access | LoopUnrolling.cs:5:7:5:19 | this access | normal | | LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | {...} | normal | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:10:13:10:19 | return ...; | return | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | empty | @@ -2684,6 +2730,8 @@ | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:31:99:31 | access to local variable x | normal | | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | normal | +| MultiImplementationA.cs:4:7:4:8 | call to method | MultiImplementationA.cs:4:7:4:8 | call to method | normal | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | this access | normal | | MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | {...} | normal | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | throw ... | throw(NullReferenceException) | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | normal | @@ -2709,6 +2757,8 @@ | MultiImplementationA.cs:18:9:18:22 | M2(...) | MultiImplementationA.cs:18:9:18:22 | M2(...) | normal | | MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:21:18:21 | 0 | normal | | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | normal | +| MultiImplementationA.cs:20:12:20:13 | call to method | MultiImplementationA.cs:20:12:20:13 | call to method | normal | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | this access | normal | | MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:24:20:28 | ... = ... | normal | | MultiImplementationA.cs:20:24:20:24 | access to field F | MultiImplementationA.cs:20:24:20:24 | this access | normal | | MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:24:20:24 | this access | normal | @@ -2725,10 +2775,14 @@ | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:32:24:34 | ... = ... | normal | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:34:24:34 | 0 | normal | | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | normal | +| MultiImplementationA.cs:28:7:28:8 | call to method | MultiImplementationA.cs:28:7:28:8 | call to method | normal | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | this access | normal | | MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | {...} | normal | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:28:30:37 | throw ... | throw(NullReferenceException) | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:34:30:37 | null | normal | | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | normal | +| MultiImplementationA.cs:34:15:34:16 | call to method | MultiImplementationA.cs:34:15:34:16 | call to method | normal | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | this access | normal | | MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | {...} | normal | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | @@ -2737,6 +2791,8 @@ | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:16:37:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:22:37:25 | null | normal | | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | normal | +| MultiImplementationB.cs:1:7:1:8 | call to method | MultiImplementationB.cs:1:7:1:8 | call to method | normal | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | this access | normal | | MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | {...} | normal | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | normal | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:27:4:35 | return ...; | return | @@ -2760,6 +2816,8 @@ | MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:21:16:30 | throw ... | throw(NullReferenceException) | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:27:16:30 | null | normal | | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | normal | +| MultiImplementationB.cs:18:12:18:13 | call to method | MultiImplementationB.cs:18:12:18:13 | call to method | normal | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | this access | normal | | MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:24:18:34 | throw ...; | throw(NullReferenceException) | | MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationB.cs:18:24:18:34 | throw ...; | throw(NullReferenceException) | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:30:18:33 | null | normal | @@ -2776,11 +2834,17 @@ | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:32:22:34 | ... = ... | normal | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:34:22:34 | 1 | normal | | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | normal | +| MultiImplementationB.cs:25:7:25:8 | call to method | MultiImplementationB.cs:25:7:25:8 | call to method | normal | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | this access | normal | | MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | {...} | normal | | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | normal | +| MultiImplementationB.cs:30:15:30:16 | call to method | MultiImplementationB.cs:30:15:30:16 | call to method | normal | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | this access | normal | | MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | {...} | normal | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | normal | | NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to constructor Object | normal | +| NullCoalescing.cs:1:7:1:20 | call to method | NullCoalescing.cs:1:7:1:20 | call to method | normal | +| NullCoalescing.cs:1:7:1:20 | this access | NullCoalescing.cs:1:7:1:20 | this access | normal | | NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | {...} | normal | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | non-null | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | null | @@ -2847,18 +2911,24 @@ | NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:17:19:17:19 | access to parameter i | normal | | NullCoalescing.cs:17:24:17:24 | 1 | NullCoalescing.cs:17:24:17:24 | 1 | normal | | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | normal | +| PartialImplementationA.cs:3:12:3:18 | call to method | PartialImplementationA.cs:3:12:3:18 | call to method | normal | +| PartialImplementationA.cs:3:12:3:18 | this access | PartialImplementationA.cs:3:12:3:18 | this access | normal | | PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:27:3:29 | {...} | normal | | PartialImplementationB.cs:3:16:3:16 | access to field F | PartialImplementationB.cs:3:16:3:16 | this access | normal | | PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:16:3:16 | this access | normal | | PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:3:16:3:20 | ... = ... | normal | | PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:20:3:20 | 0 | normal | | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | normal | +| PartialImplementationB.cs:4:12:4:18 | call to method | PartialImplementationB.cs:4:12:4:18 | call to method | normal | +| PartialImplementationB.cs:4:12:4:18 | this access | PartialImplementationB.cs:4:12:4:18 | this access | normal | | PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:22:4:24 | {...} | normal | | PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:16:5:16 | this access | normal | | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:16:5:16 | this access | normal | | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:32:5:34 | ... = ... | normal | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:34:5:34 | 0 | normal | | Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to constructor Object | normal | +| Patterns.cs:3:7:3:14 | call to method | Patterns.cs:3:7:3:14 | call to method | normal | +| Patterns.cs:3:7:3:14 | this access | Patterns.cs:3:7:3:14 | this access | normal | | Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | {...} | normal | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:40:17:40:17 | access to local variable o | normal | | Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:16:7:23 | Object o = ... | normal | @@ -3091,6 +3161,8 @@ | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:31:97:37 | "not C" | normal | | PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to constructor Object | normal | +| PostDominance.cs:3:7:3:19 | call to method | PostDominance.cs:3:7:3:19 | call to method | normal | +| PostDominance.cs:3:7:3:19 | this access | PostDominance.cs:3:7:3:19 | this access | normal | | PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | {...} | normal | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | | PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | @@ -3126,6 +3198,8 @@ | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:27:21:27 | access to parameter s | normal | | Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to constructor Object | normal | +| Qualifiers.cs:1:7:1:16 | call to method | Qualifiers.cs:1:7:1:16 | call to method | normal | +| Qualifiers.cs:1:7:1:16 | this access | Qualifiers.cs:1:7:1:16 | this access | normal | | Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | {...} | normal | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:28:7:31 | null | normal | | Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:41:8:44 | null | normal | @@ -3185,6 +3259,8 @@ | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | normal | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:46 | call to method Method | normal | | Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to constructor Object | normal | +| Switch.cs:3:7:3:12 | call to method | Switch.cs:3:7:3:12 | call to method | normal | +| Switch.cs:3:7:3:12 | this access | Switch.cs:3:7:3:12 | this access | normal | | Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | {...} | normal | | Switch.cs:6:5:8:5 | {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | | Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | @@ -3579,6 +3655,8 @@ | Switch.cs:175:42:175:46 | "def" | Switch.cs:175:42:175:46 | "def" | normal | | Switch.cs:176:17:176:22 | break; | Switch.cs:176:17:176:22 | break; | break | | TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object | normal | +| TypeAccesses.cs:1:7:1:18 | call to method | TypeAccesses.cs:1:7:1:18 | call to method | normal | +| TypeAccesses.cs:1:7:1:18 | this access | TypeAccesses.cs:1:7:1:18 | this access | normal | | TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} | normal | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:13:5:25 | String s = ... | normal | @@ -3601,6 +3679,8 @@ | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:17:8:27 | typeof(...) | normal | | VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to constructor Object | normal | +| VarDecls.cs:3:7:3:14 | call to method | VarDecls.cs:3:7:3:14 | call to method | normal | +| VarDecls.cs:3:7:3:14 | this access | VarDecls.cs:3:7:3:14 | this access | normal | | VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | {...} | normal | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:9:13:9:29 | return ...; | return | | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:9:13:9:29 | return ...; | return | @@ -3644,6 +3724,8 @@ | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | normal | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | normal | | VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to constructor Object | normal | +| VarDecls.cs:28:11:28:11 | call to method | VarDecls.cs:28:11:28:11 | call to method | normal | +| VarDecls.cs:28:11:28:11 | this access | VarDecls.cs:28:11:28:11 | this access | normal | | VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | {...} | normal | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:51:28:53 | {...} | normal | | cflow.cs:6:5:35:5 | {...} | cflow.cs:24:25:24:31 | ... <= ... | false | @@ -3959,6 +4041,8 @@ | cflow.cs:127:68:127:81 | ...; | cflow.cs:127:68:127:80 | ... = ... | normal | | cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:76:127:80 | access to parameter value | normal | | cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:129:5:129:15 | call to constructor Object | normal | +| cflow.cs:129:5:129:15 | call to method | cflow.cs:129:5:129:15 | call to method | normal | +| cflow.cs:129:5:129:15 | this access | cflow.cs:129:5:129:15 | this access | normal | | cflow.cs:130:5:132:5 | {...} | cflow.cs:131:9:131:17 | ... = ... | normal | | cflow.cs:131:9:131:13 | access to field Field | cflow.cs:131:9:131:13 | this access | normal | | cflow.cs:131:9:131:13 | this access | cflow.cs:131:9:131:13 | this access | normal | @@ -4352,6 +4436,8 @@ | cflow.cs:275:13:275:41 | call to method WriteLine | cflow.cs:275:13:275:41 | call to method WriteLine | normal | | cflow.cs:275:13:275:42 | ...; | cflow.cs:275:13:275:41 | call to method WriteLine | normal | | cflow.cs:275:31:275:40 | "not dead" | cflow.cs:275:31:275:40 | "not dead" | normal | +| cflow.cs:282:5:282:18 | call to method | cflow.cs:282:5:282:18 | call to method | normal | +| cflow.cs:282:5:282:18 | this access | cflow.cs:282:5:282:18 | this access | normal | | cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:24:282:27 | call to constructor ControlFlow | normal | | cflow.cs:282:31:282:33 | {...} | cflow.cs:282:31:282:33 | {...} | normal | | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | normal | @@ -4361,11 +4447,15 @@ | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:45 | call to method ToString | normal | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:48:286:50 | {...} | normal | | cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to constructor Object | normal | +| cflow.cs:289:7:289:18 | call to method | cflow.cs:289:7:289:18 | call to method | normal | +| cflow.cs:289:7:289:18 | this access | cflow.cs:289:7:289:18 | this access | normal | | cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | {...} | normal | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:38:291:38 | access to parameter f | normal | | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:38:291:41 | delegate call | normal | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:40:291:40 | 0 | normal | | cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:5:296:25 | call to constructor Object | normal | +| cflow.cs:296:5:296:25 | call to method | cflow.cs:296:5:296:25 | call to method | normal | +| cflow.cs:296:5:296:25 | this access | cflow.cs:296:5:296:25 | this access | normal | | cflow.cs:296:52:296:54 | {...} | cflow.cs:296:52:296:54 | {...} | normal | | cflow.cs:299:5:301:5 | {...} | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | normal | | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | normal | @@ -4383,6 +4473,8 @@ | cflow.cs:300:61:300:64 | null | cflow.cs:300:61:300:64 | null | normal | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:70:300:71 | "" | normal | | cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to constructor Object | normal | +| cflow.cs:304:7:304:18 | call to method | cflow.cs:304:7:304:18 | call to method | normal | +| cflow.cs:304:7:304:18 | this access | cflow.cs:304:7:304:18 | this access | normal | | cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | {...} | normal | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | normal | | cflow.cs:307:5:310:5 | {...} | cflow.cs:309:9:309:17 | return ...; | return | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index 63855522ba6..b764e2fb2a5 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -1,6 +1,8 @@ | AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | {...} | | -| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object | | +| AccessorCalls.cs:1:7:1:19 | call to method | AccessorCalls.cs:1:7:1:19 | call to constructor Object | | +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | this access | | | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | | +| AccessorCalls.cs:1:7:1:19 | this access | AccessorCalls.cs:1:7:1:19 | call to method | | | AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:23:5:25 | exit get_Item | | @@ -304,8 +306,10 @@ | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:74:73:82 | (..., ...) | | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:81 | dynamic access to element | | | ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | {...} | | -| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | call to constructor Object | | +| ArrayCreation.cs:1:7:1:19 | call to method | ArrayCreation.cs:1:7:1:19 | call to constructor Object | | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | this access | | | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | | +| ArrayCreation.cs:1:7:1:19 | this access | ArrayCreation.cs:1:7:1:19 | call to method | | | ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:27:3:27 | 0 | | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:11:3:12 | exit M1 | | @@ -336,8 +340,10 @@ | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:48:9:48 | 3 | | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:43:9:50 | { ..., ... } | | | Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | {...} | | -| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | call to constructor Object | | +| Assert.cs:5:7:5:17 | call to method | Assert.cs:5:7:5:17 | call to constructor Object | | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | this access | | | Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | exit AssertTests | | +| Assert.cs:5:7:5:17 | this access | Assert.cs:5:7:5:17 | call to method | | | Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | exit AssertTests (normal) | | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:8:5:12:5 | {...} | | | Assert.cs:7:10:7:11 | exit M1 (abnormal) | Assert.cs:7:10:7:11 | exit M1 | | @@ -795,8 +801,10 @@ | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | return | | Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | {...} | | -| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | call to constructor Object | | +| Assignments.cs:1:7:1:17 | call to method | Assignments.cs:1:7:1:17 | call to constructor Object | | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | this access | | | Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | exit Assignments | | +| Assignments.cs:1:7:1:17 | this access | Assignments.cs:1:7:1:17 | call to method | | | Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | exit Assignments (normal) | | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:4:5:15:5 | {...} | | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:3:10:3:10 | exit M | | @@ -840,8 +848,10 @@ | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | exit + (normal) | return | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:9:19:17 | return ...; | | | BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | {...} | | -| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | call to constructor Object | | +| BreakInTry.cs:1:7:1:16 | call to method | BreakInTry.cs:1:7:1:16 | call to constructor Object | | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | this access | | | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | exit BreakInTry | | +| BreakInTry.cs:1:7:1:16 | this access | BreakInTry.cs:1:7:1:16 | call to method | | | BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:4:5:18:5 | {...} | | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | | @@ -942,8 +952,10 @@ | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:31 | ... == ... | | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | exit M4 (normal) | break, return | | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | {...} | | -| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | | +| CompileTimeOperators.cs:3:7:3:26 | call to method | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | this access | | | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | | +| CompileTimeOperators.cs:3:7:3:26 | this access | CompileTimeOperators.cs:3:7:3:26 | call to method | | | CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:6:5:8:5 | {...} | | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:5:9:5:15 | exit Default | | @@ -966,8 +978,10 @@ | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | exit Nameof (normal) | return | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:9:22:25 | return ...; | | | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | {...} | | -| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | | +| CompileTimeOperators.cs:26:7:26:22 | call to method | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | this access | | | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | | +| CompileTimeOperators.cs:26:7:26:22 | this access | CompileTimeOperators.cs:26:7:26:22 | call to method | | | CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:29:5:41:5 | {...} | | | CompileTimeOperators.cs:28:10:28:10 | exit M (abnormal) | CompileTimeOperators.cs:28:10:28:10 | exit M | | @@ -990,8 +1004,10 @@ | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:32:40:36 | "End" | | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | | | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | {...} | | -| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | | +| ConditionalAccess.cs:1:7:1:23 | call to method | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | this access | | | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | | +| ConditionalAccess.cs:1:7:1:23 | this access | ConditionalAccess.cs:1:7:1:23 | call to method | | | ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | | @@ -1085,8 +1101,10 @@ | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:78 | ... + ... | | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:83 | ... + ... | | | Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | {...} | | -| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | call to constructor Object | | +| Conditions.cs:1:7:1:16 | call to method | Conditions.cs:1:7:1:16 | call to constructor Object | | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | this access | | | Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | exit Conditions | | +| Conditions.cs:1:7:1:16 | this access | Conditions.cs:1:7:1:16 | call to method | | | Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | exit Conditions (normal) | | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | | @@ -1427,8 +1445,10 @@ | Conditions.cs:149:44:149:46 | {...} | Conditions.cs:149:38:149:47 | $"..." | | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:44:149:46 | {...} | | | ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | {...} | | -| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | call to constructor Object | | +| ExitMethods.cs:6:7:6:17 | call to method | ExitMethods.cs:6:7:6:17 | call to constructor Object | | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | this access | | | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | exit ExitMethods | | +| ExitMethods.cs:6:7:6:17 | this access | ExitMethods.cs:6:7:6:17 | call to method | | | ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:9:5:12:5 | {...} | | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:8:10:8:11 | exit M1 | | @@ -1639,8 +1659,10 @@ | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | delegate creation of type Func | | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:9:25:33 | call to method ToBool | | | Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | {...} | | -| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | call to constructor Object | | +| Finally.cs:3:14:3:20 | call to method | Finally.cs:3:14:3:20 | call to constructor Object | | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | this access | | | Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | exit Finally | | +| Finally.cs:3:14:3:20 | this access | Finally.cs:3:14:3:20 | call to method | | | Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | exit Finally (normal) | | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:8:5:17:5 | {...} | | | Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:7:10:7:11 | exit M1 | | @@ -1906,16 +1928,22 @@ | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:35:167:36 | "" | | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:37 | call to method WriteLine | | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | {...} | | -| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | | +| Finally.cs:172:11:172:20 | call to method | Finally.cs:172:11:172:20 | call to constructor Exception | | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | this access | | | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | exit ExceptionA | | +| Finally.cs:172:11:172:20 | this access | Finally.cs:172:11:172:20 | call to method | | | Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | | | Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | {...} | | -| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | call to constructor Exception | | +| Finally.cs:173:11:173:20 | call to method | Finally.cs:173:11:173:20 | call to constructor Exception | | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | this access | | | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | exit ExceptionB | | +| Finally.cs:173:11:173:20 | this access | Finally.cs:173:11:173:20 | call to method | | | Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | | | Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | {...} | | -| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | call to constructor Exception | | +| Finally.cs:174:11:174:20 | call to method | Finally.cs:174:11:174:20 | call to constructor Exception | | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | this access | | | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | exit ExceptionC | | +| Finally.cs:174:11:174:20 | this access | Finally.cs:174:11:174:20 | call to method | | | Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:177:5:193:5 | {...} | | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 | | @@ -2067,8 +2095,10 @@ | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | | -| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | | +| Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to constructor Object | | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | this access | | | Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | exit Foreach | | +| Foreach.cs:4:7:4:13 | this access | Foreach.cs:4:7:4:13 | call to method | | | Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | exit Foreach (normal) | | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:7:5:10:5 | {...} | | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | | @@ -2129,38 +2159,33 @@ | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:18:38:34 | (..., ...) | | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | +| Initializers.cs:3:7:3:18 | enter | Initializers.cs:5:9:5:9 | this access | | | Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | {...} | | +| Initializers.cs:3:7:3:18 | exit (normal) | Initializers.cs:3:7:3:18 | exit | | | Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | exit Initializers | | | Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | exit Initializers (normal) | | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | | -| Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | | -| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | | | Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:17:5:17 | 1 | | -| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:17:5:17 | 1 | | -| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:9:5:17 | ... = ... | | | Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:9:5:17 | ... = ... | | | Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:17 | ... + ... | | -| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:17 | ... + ... | | -| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:25:6:31 | ... = ... | | | Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:25:6:31 | ... = ... | | | Initializers.cs:6:9:6:9 | this access | Initializers.cs:6:27:6:27 | access to field H | | -| Initializers.cs:6:9:6:9 | this access | Initializers.cs:6:27:6:27 | access to field H | | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:8:20:8:22 | {...} | | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:10:28:10:30 | {...} | | -| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:31:6:31 | 2 | | +| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:3:7:3:18 | exit (normal) | | | Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:31:6:31 | 2 | | | Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:9:6:9 | access to property G | | -| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:9:6:9 | access to property G | | | Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:31 | ... + ... | | -| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:31 | ... + ... | | -| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:5:9:5:9 | this access | | -| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | call to constructor Object | | +| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:20:8:22 | {...} | | +| Initializers.cs:8:5:8:16 | call to method | Initializers.cs:8:5:8:16 | call to constructor Object | | +| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | this access | | | Initializers.cs:8:5:8:16 | exit Initializers (normal) | Initializers.cs:8:5:8:16 | exit Initializers | | +| Initializers.cs:8:5:8:16 | this access | Initializers.cs:8:5:8:16 | call to method | | | Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:5:8:16 | exit Initializers (normal) | | -| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:5:9:5:9 | this access | | -| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | call to constructor Object | | +| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:28:10:30 | {...} | | +| Initializers.cs:10:5:10:16 | call to method | Initializers.cs:10:5:10:16 | call to constructor Object | | +| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | this access | | | Initializers.cs:10:5:10:16 | exit Initializers (normal) | Initializers.cs:10:5:10:16 | exit Initializers | | +| Initializers.cs:10:5:10:16 | this access | Initializers.cs:10:5:10:16 | call to method | | | Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:5:10:16 | exit Initializers (normal) | | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:13:5:16:5 | {...} | | | Initializers.cs:12:10:12:10 | exit M (normal) | Initializers.cs:12:10:12:10 | exit M | | @@ -2187,25 +2212,30 @@ | Initializers.cs:18:16:18:16 | exit H (normal) | Initializers.cs:18:16:18:16 | exit H | | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:16 | exit H (normal) | | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:20 | ... = ... | | -| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:22:23:22:23 | this access | | -| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | call to constructor Object | | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | {...} | | +| Initializers.cs:20:11:20:23 | call to method | Initializers.cs:20:11:20:23 | call to constructor Object | | +| Initializers.cs:20:11:20:23 | enter | Initializers.cs:22:23:22:23 | this access | | +| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | this access | | +| Initializers.cs:20:11:20:23 | exit (normal) | Initializers.cs:20:11:20:23 | exit | | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | exit NoConstructor | | +| Initializers.cs:20:11:20:23 | this access | Initializers.cs:20:11:20:23 | call to method | | | Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:27:22:27 | 0 | | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:23:23:23:23 | this access | | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:27 | ... = ... | | | Initializers.cs:23:23:23:23 | this access | Initializers.cs:23:27:23:27 | 1 | | -| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | {...} | | +| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | exit (normal) | | | Initializers.cs:23:27:23:27 | 1 | Initializers.cs:23:23:23:27 | ... = ... | | +| Initializers.cs:26:11:26:13 | enter | Initializers.cs:28:13:28:13 | this access | | +| Initializers.cs:26:11:26:13 | exit (normal) | Initializers.cs:26:11:26:13 | exit | | | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | | -| Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:31:24:31:33 | {...} | | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:35:27:35:40 | {...} | | +| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:26:11:26:13 | exit (normal) | | | Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:17 | ... = ... | | -| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:17 | ... = ... | | -| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | | +| Initializers.cs:31:9:31:11 | call to method | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | | +| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | this access | | | Initializers.cs:31:9:31:11 | exit Sub (normal) | Initializers.cs:31:9:31:11 | exit Sub | | -| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:28:13:28:13 | this access | | +| Initializers.cs:31:9:31:11 | this access | Initializers.cs:31:9:31:11 | call to method | | +| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:24:31:33 | {...} | | | Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:26:31:31 | ...; | | | Initializers.cs:31:26:31:26 | this access | Initializers.cs:31:30:31:30 | 3 | | | Initializers.cs:31:26:31:30 | ... = ... | Initializers.cs:31:9:31:11 | exit Sub (normal) | | @@ -2219,9 +2249,11 @@ | Initializers.cs:33:31:33:35 | ... = ... | Initializers.cs:33:9:33:11 | exit Sub (normal) | | | Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:31:33:31 | this access | | | Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:31:33:35 | ... = ... | | -| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:28:13:28:13 | this access | | -| Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | | +| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:27:35:40 | {...} | | +| Initializers.cs:35:9:35:11 | call to method | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | | +| Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | this access | | | Initializers.cs:35:9:35:11 | exit Sub (normal) | Initializers.cs:35:9:35:11 | exit Sub | | +| Initializers.cs:35:9:35:11 | this access | Initializers.cs:35:9:35:11 | call to method | | | Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:29:35:38 | ...; | | | Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:33:35:33 | access to parameter i | | | Initializers.cs:35:29:35:37 | ... = ... | Initializers.cs:35:9:35:11 | exit Sub (normal) | | @@ -2230,12 +2262,16 @@ | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:29:35:37 | ... = ... | | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:37 | ... + ... | | | Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | {...} | | -| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | call to constructor Object | | +| Initializers.cs:39:7:39:23 | call to method | Initializers.cs:39:7:39:23 | call to constructor Object | | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | this access | | | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | exit IndexInitializers | | +| Initializers.cs:39:7:39:23 | this access | Initializers.cs:39:7:39:23 | call to method | | | Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | | | Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | {...} | | -| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | call to constructor Object | | +| Initializers.cs:41:11:41:18 | call to method | Initializers.cs:41:11:41:18 | call to constructor Object | | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | this access | | | Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | exit Compound | | +| Initializers.cs:41:11:41:18 | this access | Initializers.cs:41:11:41:18 | call to method | | | Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | exit Compound (normal) | | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:52:5:66:5 | {...} | | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:51:10:51:13 | exit Test | | @@ -2342,8 +2378,10 @@ | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:54 | ... + ... | | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:46:64:61 | ... = ... | | | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | {...} | | -| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | | +| LoopUnrolling.cs:5:7:5:19 | call to method | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | this access | | | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | | +| LoopUnrolling.cs:5:7:5:19 | this access | LoopUnrolling.cs:5:7:5:19 | call to method | | | LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:8:5:13:5 | {...} | | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | | @@ -2558,9 +2596,11 @@ | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | | | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | | -| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | | -| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | +| MultiImplementationA.cs:4:7:4:8 | call to method | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | this access | | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | this access | | | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | | +| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | call to method | | | MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | @@ -2588,6 +2628,9 @@ | MultiImplementationA.cs:8:16:8:16 | exit M (normal) | MultiImplementationA.cs:8:16:8:16 | exit M | | | MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | exception | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:23:8:32 | throw ... | | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationA.cs:13:16:13:16 | this access | | +| MultiImplementationA.cs:11:7:11:8 | enter | MultiImplementationB.cs:11:16:11:16 | this access | | +| MultiImplementationA.cs:11:7:11:8 | exit (normal) | MultiImplementationA.cs:11:7:11:8 | exit | | | MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:20:13:20 | 0 | | | MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | | | MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:13:16:13:20 | ... = ... | | @@ -2615,11 +2658,13 @@ | MultiImplementationA.cs:18:9:18:22 | enter M2 | MultiImplementationA.cs:18:21:18:21 | 0 | | | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | MultiImplementationA.cs:18:9:18:22 | exit M2 | | | MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:13:16:13:16 | this access | | -| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | | -| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | | +| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:22:20:31 | {...} | | +| MultiImplementationA.cs:20:12:20:13 | call to method | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | | +| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | this access | | +| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | this access | | | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | MultiImplementationA.cs:20:12:20:13 | exit C2 | | | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | MultiImplementationA.cs:20:12:20:13 | exit C2 | | +| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | call to method | | | MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:24:20:29 | ...; | | | MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:28:20:28 | access to parameter i | | | MultiImplementationA.cs:20:24:20:28 | ... = ... | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | | @@ -2643,21 +2688,25 @@ | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | | | MultiImplementationA.cs:24:16:24:16 | access to property P | MultiImplementationA.cs:24:32:24:34 | ... = ... | | | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:34:24:34 | 0 | | -| MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:20:22:20:31 | {...} | | +| MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:11:7:11:8 | exit (normal) | | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | access to property P | | | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | {...} | | -| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | | -| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | +| MultiImplementationA.cs:28:7:28:8 | call to method | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | this access | | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | this access | | | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | | +| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | call to method | | | MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | exception | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:28:30:37 | throw ... | | | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | | -| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | -| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | +| MultiImplementationA.cs:34:15:34:16 | call to method | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | this access | | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | this access | | | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | | +| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | call to method | | | MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | @@ -2672,6 +2721,8 @@ | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | exception | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:16:37:26 | throw ...; | | | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | | +| MultiImplementationB.cs:1:7:1:8 | call to method | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | +| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | call to method | | | MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:34:4:34 | 1 | | @@ -2694,7 +2745,9 @@ | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | MultiImplementationB.cs:16:9:16:31 | exit M2 | | | MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | exception | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:21:16:30 | throw ... | | -| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:11:16:11:16 | this access | | +| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:22:18:36 | {...} | | +| MultiImplementationB.cs:18:12:18:13 | call to method | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | | +| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | call to method | | | MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:30:18:33 | null | | | MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | exception | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:24:18:34 | throw ...; | | @@ -2708,16 +2761,22 @@ | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:50:21:59 | throw ... | | | MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationB.cs:22:32:22:34 | ... = ... | | | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:34:22:34 | 1 | | -| MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:18:22:18:36 | {...} | | +| MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationA.cs:11:7:11:8 | exit (normal) | | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | access to property P | | | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | {...} | | +| MultiImplementationB.cs:25:7:25:8 | call to method | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | +| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | call to method | | | MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | | | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | {...} | | +| MultiImplementationB.cs:30:15:30:16 | call to method | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | +| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | call to method | | | MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | | | NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | {...} | | -| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | call to constructor Object | | +| NullCoalescing.cs:1:7:1:20 | call to method | NullCoalescing.cs:1:7:1:20 | call to constructor Object | | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | this access | | | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | | +| NullCoalescing.cs:1:7:1:20 | this access | NullCoalescing.cs:1:7:1:20 | call to method | | | NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:9:3:10 | exit M1 | | @@ -2792,31 +2851,32 @@ | NullCoalescing.cs:17:13:17:19 | (...) ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | non-null | | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:9:17:24 | ... = ... | | | NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:17:13:17:19 | (...) ... | | -| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationB.cs:3:16:3:16 | this access | | -| PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | | +| PartialImplementationA.cs:1:15:1:21 | enter | PartialImplementationB.cs:3:16:3:16 | this access | | +| PartialImplementationA.cs:1:15:1:21 | exit (normal) | PartialImplementationA.cs:1:15:1:21 | exit | | +| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:27:3:29 | {...} | | +| PartialImplementationA.cs:3:12:3:18 | call to method | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | | +| PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | this access | | | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | PartialImplementationA.cs:3:12:3:18 | exit Partial | | +| PartialImplementationA.cs:3:12:3:18 | this access | PartialImplementationA.cs:3:12:3:18 | call to method | | | PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | | | PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:20:3:20 | 0 | | -| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:20:3:20 | 0 | | -| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | | | PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | | | PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:20 | ... = ... | | -| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:20 | ... = ... | | -| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:3:16:3:16 | this access | | -| PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | | +| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:22:4:24 | {...} | | +| PartialImplementationB.cs:4:12:4:18 | call to method | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | | +| PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | this access | | | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | PartialImplementationB.cs:4:12:4:18 | exit Partial | | +| PartialImplementationB.cs:4:12:4:18 | this access | PartialImplementationB.cs:4:12:4:18 | call to method | | | PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | | | PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:32:5:34 | ... = ... | | -| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:32:5:34 | ... = ... | | | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:34:5:34 | 0 | | -| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:34:5:34 | 0 | | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationA.cs:3:27:3:29 | {...} | | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:22:4:24 | {...} | | -| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | | +| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationA.cs:1:15:1:21 | exit (normal) | | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | | | Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | {...} | | -| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | call to constructor Object | | +| Patterns.cs:3:7:3:14 | call to method | Patterns.cs:3:7:3:14 | call to constructor Object | | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | this access | | | Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | exit Patterns | | +| Patterns.cs:3:7:3:14 | this access | Patterns.cs:3:7:3:14 | call to method | | | Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | exit Patterns (normal) | | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:6:5:43:5 | {...} | | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:5:10:5:11 | exit M1 | | @@ -3045,8 +3105,10 @@ | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:31:97:37 | "not C" | | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:38 | call to method WriteLine | | | PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | {...} | | -| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | call to constructor Object | | +| PostDominance.cs:3:7:3:19 | call to method | PostDominance.cs:3:7:3:19 | call to constructor Object | | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | this access | | | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | exit PostDominance | | +| PostDominance.cs:3:7:3:19 | this access | PostDominance.cs:3:7:3:19 | call to method | | | PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:6:5:8:5 | {...} | | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:5:10:5:11 | exit M1 | | @@ -3084,8 +3146,10 @@ | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:27:21:27 | access to parameter s | | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:28 | call to method WriteLine | | | Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | {...} | | -| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | call to constructor Object | | +| Qualifiers.cs:1:7:1:16 | call to method | Qualifiers.cs:1:7:1:16 | call to constructor Object | | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | this access | | | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | exit Qualifiers | | +| Qualifiers.cs:1:7:1:16 | this access | Qualifiers.cs:1:7:1:16 | call to method | | | Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:28:7:31 | null | | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:16:7:21 | exit Method | | @@ -3151,8 +3215,10 @@ | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:46 | call to method Method | | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:9:30:46 | ... = ... | | | Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | {...} | | -| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | call to constructor Object | | +| Switch.cs:3:7:3:12 | call to method | Switch.cs:3:7:3:12 | call to constructor Object | | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | this access | | | Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | exit Switch | | +| Switch.cs:3:7:3:12 | this access | Switch.cs:3:7:3:12 | call to method | | | Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | exit Switch (normal) | | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:6:5:8:5 | {...} | | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:5:10:5:11 | exit M1 | | @@ -3478,8 +3544,10 @@ | Switch.cs:175:42:175:46 | "def" | Switch.cs:175:17:175:47 | call to method WriteLine | | | Switch.cs:176:17:176:22 | break; | Switch.cs:163:10:163:12 | exit M16 (normal) | break | | TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | {...} | | -| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object | | +| TypeAccesses.cs:1:7:1:18 | call to method | TypeAccesses.cs:1:7:1:18 | call to constructor Object | | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | this access | | | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | | +| TypeAccesses.cs:1:7:1:18 | this access | TypeAccesses.cs:1:7:1:18 | call to method | | | TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:4:5:9:5 | {...} | | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:3:10:3:10 | exit M | | @@ -3503,8 +3571,10 @@ | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | exit M (normal) | | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:13:8:27 | Type t = ... | | | VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | {...} | | -| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | call to constructor Object | | +| VarDecls.cs:3:7:3:14 | call to method | VarDecls.cs:3:7:3:14 | call to constructor Object | | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | this access | | | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | exit VarDecls | | +| VarDecls.cs:3:7:3:14 | this access | VarDecls.cs:3:7:3:14 | call to method | | | VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:6:5:11:5 | {...} | | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:5:18:5:19 | exit M1 | | @@ -3554,8 +3624,10 @@ | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:20:25:28 | ... ? ... : ... | | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:20:25:28 | ... ? ... : ... | | | VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | {...} | | -| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | call to constructor Object | | +| VarDecls.cs:28:11:28:11 | call to method | VarDecls.cs:28:11:28:11 | call to constructor Object | | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | this access | | | VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | exit C | | +| VarDecls.cs:28:11:28:11 | this access | VarDecls.cs:28:11:28:11 | call to method | | | VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | exit C (normal) | | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:51:28:53 | {...} | | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:41:28:47 | exit Dispose | | @@ -3855,8 +3927,10 @@ | cflow.cs:127:68:127:81 | ...; | cflow.cs:127:68:127:72 | this access | | | cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:68:127:80 | ... = ... | | | cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:130:5:132:5 | {...} | | -| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | call to constructor Object | | +| cflow.cs:129:5:129:15 | call to method | cflow.cs:129:5:129:15 | call to constructor Object | | +| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | this access | | | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | cflow.cs:129:5:129:15 | exit ControlFlow | | +| cflow.cs:129:5:129:15 | this access | cflow.cs:129:5:129:15 | call to method | | | cflow.cs:130:5:132:5 | {...} | cflow.cs:131:9:131:18 | ...; | | | cflow.cs:131:9:131:13 | this access | cflow.cs:131:17:131:17 | access to parameter s | | | cflow.cs:131:9:131:17 | ... = ... | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | | @@ -4231,8 +4305,10 @@ | cflow.cs:275:13:275:41 | call to method WriteLine | cflow.cs:261:49:261:53 | exit Yield (normal) | , return | | cflow.cs:275:13:275:42 | ...; | cflow.cs:275:31:275:40 | "not dead" | | | cflow.cs:275:31:275:40 | "not dead" | cflow.cs:275:13:275:41 | call to method WriteLine | | -| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:24:282:27 | call to constructor ControlFlow | | +| cflow.cs:282:5:282:18 | call to method | cflow.cs:282:24:282:27 | call to constructor ControlFlow | | +| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | this access | | | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | cflow.cs:282:5:282:18 | exit ControlFlowSub | | +| cflow.cs:282:5:282:18 | this access | cflow.cs:282:5:282:18 | call to method | | | cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:31:282:33 | {...} | | | cflow.cs:282:31:282:33 | {...} | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | | @@ -4246,8 +4322,10 @@ | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | exit ControlFlowSub (normal) | | | cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | {...} | | -| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | call to constructor Object | | +| cflow.cs:289:7:289:18 | call to method | cflow.cs:289:7:289:18 | call to constructor Object | | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | this access | | | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | exit DelegateCall | | +| cflow.cs:289:7:289:18 | this access | cflow.cs:289:7:289:18 | call to method | | | cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:38:291:38 | access to parameter f | | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:12:291:12 | exit M | | @@ -4255,8 +4333,10 @@ | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:12:291:12 | exit M (normal) | | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:38:291:41 | delegate call | | | cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:52:296:54 | {...} | | -| cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | call to constructor Object | | +| cflow.cs:296:5:296:25 | call to method | cflow.cs:296:5:296:25 | call to constructor Object | | +| cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | this access | | | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | cflow.cs:296:5:296:25 | exit NegationInConstructor | | +| cflow.cs:296:5:296:25 | this access | cflow.cs:296:5:296:25 | call to method | | | cflow.cs:296:52:296:54 | {...} | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | | | cflow.cs:298:10:298:10 | enter M | cflow.cs:299:5:301:5 | {...} | | | cflow.cs:298:10:298:10 | exit M (normal) | cflow.cs:298:10:298:10 | exit M | | @@ -4276,8 +4356,10 @@ | cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:64 | ... != ... | | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | | | cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | {...} | | -| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | call to constructor Object | | +| cflow.cs:304:7:304:18 | call to method | cflow.cs:304:7:304:18 | call to constructor Object | | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | this access | | | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | exit LambdaGetter | | +| cflow.cs:304:7:304:18 | this access | cflow.cs:304:7:304:18 | call to method | | | cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | exit get__getter (normal) | | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:307:5:310:5 | {...} | | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected index 26e8d074b19..aff87481461 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1,4 +1,4 @@ -| AccessorCalls.cs:1:7:1:19 | AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | AccessorCalls | AccessorCalls.cs:1:7:1:19 | this access | | AccessorCalls.cs:5:23:5:25 | get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:33:5:35 | set_Item | AccessorCalls.cs:5:37:5:39 | {...} | | AccessorCalls.cs:7:32:7:34 | add_Event | AccessorCalls.cs:7:36:7:38 | {...} | @@ -12,12 +12,12 @@ | AccessorCalls.cs:56:10:56:11 | M7 | AccessorCalls.cs:57:5:59:5 | {...} | | AccessorCalls.cs:61:10:61:11 | M8 | AccessorCalls.cs:62:5:64:5 | {...} | | AccessorCalls.cs:66:10:66:11 | M9 | AccessorCalls.cs:67:5:74:5 | {...} | -| ArrayCreation.cs:1:7:1:19 | ArrayCreation | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | ArrayCreation | ArrayCreation.cs:1:7:1:19 | this access | | ArrayCreation.cs:3:11:3:12 | M1 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:5:12:5:13 | M2 | ArrayCreation.cs:5:28:5:28 | 0 | | ArrayCreation.cs:7:11:7:12 | M3 | ArrayCreation.cs:7:19:7:36 | 2 | | ArrayCreation.cs:9:12:9:13 | M4 | ArrayCreation.cs:9:20:9:52 | 2 | -| Assert.cs:5:7:5:17 | AssertTests | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | AssertTests | Assert.cs:5:7:5:17 | this access | | Assert.cs:7:10:7:11 | M1 | Assert.cs:8:5:12:5 | {...} | | Assert.cs:14:10:14:11 | M2 | Assert.cs:15:5:19:5 | {...} | | Assert.cs:21:10:21:11 | M3 | Assert.cs:22:5:26:5 | {...} | @@ -32,23 +32,23 @@ | Assert.cs:84:10:84:12 | M12 | Assert.cs:85:5:129:5 | {...} | | Assert.cs:131:18:131:32 | AssertTrueFalse | Assert.cs:135:5:136:5 | {...} | | Assert.cs:138:10:138:12 | M13 | Assert.cs:139:5:142:5 | {...} | -| Assignments.cs:1:7:1:17 | Assignments | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | Assignments | Assignments.cs:1:7:1:17 | this access | | Assignments.cs:3:10:3:10 | M | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:14:33:14:35 | {...} | | Assignments.cs:17:40:17:40 | + | Assignments.cs:18:5:20:5 | {...} | -| BreakInTry.cs:1:7:1:16 | BreakInTry | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | BreakInTry | BreakInTry.cs:1:7:1:16 | this access | | BreakInTry.cs:3:10:3:11 | M1 | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:20:10:20:11 | M2 | BreakInTry.cs:21:5:36:5 | {...} | | BreakInTry.cs:38:10:38:11 | M3 | BreakInTry.cs:39:5:54:5 | {...} | | BreakInTry.cs:56:10:56:11 | M4 | BreakInTry.cs:57:5:71:5 | {...} | -| CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | this access | | CompileTimeOperators.cs:5:9:5:15 | Default | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:10:9:10:14 | Sizeof | CompileTimeOperators.cs:11:5:13:5 | {...} | | CompileTimeOperators.cs:15:10:15:15 | Typeof | CompileTimeOperators.cs:16:5:18:5 | {...} | | CompileTimeOperators.cs:20:12:20:17 | Nameof | CompileTimeOperators.cs:21:5:23:5 | {...} | -| CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | this access | | CompileTimeOperators.cs:28:10:28:10 | M | CompileTimeOperators.cs:29:5:41:5 | {...} | -| ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | this access | | ConditionalAccess.cs:3:12:3:13 | M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:5:10:5:11 | M2 | ConditionalAccess.cs:5:26:5:26 | access to parameter s | | ConditionalAccess.cs:7:10:7:11 | M3 | ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | @@ -59,7 +59,7 @@ | ConditionalAccess.cs:30:10:30:12 | Out | ConditionalAccess.cs:30:32:30:32 | 0 | | ConditionalAccess.cs:32:10:32:11 | M8 | ConditionalAccess.cs:33:5:36:5 | {...} | | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | -| Conditions.cs:1:7:1:16 | Conditions | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | Conditions | Conditions.cs:1:7:1:16 | this access | | Conditions.cs:3:10:3:19 | IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:11:9:11:10 | M1 | Conditions.cs:12:5:20:5 | {...} | | Conditions.cs:22:9:22:10 | M2 | Conditions.cs:23:5:31:5 | {...} | @@ -72,7 +72,7 @@ | Conditions.cs:113:10:113:11 | M9 | Conditions.cs:114:5:124:5 | {...} | | Conditions.cs:129:10:129:12 | M10 | Conditions.cs:130:5:141:5 | {...} | | Conditions.cs:143:10:143:12 | M11 | Conditions.cs:144:5:150:5 | {...} | -| ExitMethods.cs:6:7:6:17 | ExitMethods | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | ExitMethods | ExitMethods.cs:6:7:6:17 | this access | | ExitMethods.cs:8:10:8:11 | M1 | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:14:10:14:11 | M2 | ExitMethods.cs:15:5:18:5 | {...} | | ExitMethods.cs:20:10:20:11 | M3 | ExitMethods.cs:21:5:24:5 | {...} | @@ -99,7 +99,7 @@ | Extensions.cs:10:24:10:29 | ToBool | Extensions.cs:11:5:13:5 | {...} | | Extensions.cs:15:23:15:33 | CallToInt32 | Extensions.cs:15:48:15:50 | "0" | | Extensions.cs:20:17:20:20 | Main | Extensions.cs:21:5:26:5 | {...} | -| Finally.cs:3:14:3:20 | Finally | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | Finally | Finally.cs:3:14:3:20 | this access | | Finally.cs:7:10:7:11 | M1 | Finally.cs:8:5:17:5 | {...} | | Finally.cs:19:10:19:11 | M2 | Finally.cs:20:5:52:5 | {...} | | Finally.cs:54:10:54:11 | M3 | Finally.cs:55:5:72:5 | {...} | @@ -108,33 +108,36 @@ | Finally.cs:121:10:121:11 | M6 | Finally.cs:122:5:131:5 | {...} | | Finally.cs:133:10:133:11 | M7 | Finally.cs:134:5:145:5 | {...} | | Finally.cs:147:10:147:11 | M8 | Finally.cs:148:5:170:5 | {...} | -| Finally.cs:172:11:172:20 | ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | -| Finally.cs:173:11:173:20 | ExceptionB | Finally.cs:173:11:173:20 | call to constructor Exception | -| Finally.cs:174:11:174:20 | ExceptionC | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | ExceptionA | Finally.cs:172:11:172:20 | this access | +| Finally.cs:173:11:173:20 | ExceptionB | Finally.cs:173:11:173:20 | this access | +| Finally.cs:174:11:174:20 | ExceptionC | Finally.cs:174:11:174:20 | this access | | Finally.cs:176:10:176:11 | M9 | Finally.cs:177:5:193:5 | {...} | | Finally.cs:195:10:195:12 | M10 | Finally.cs:196:5:214:5 | {...} | | Finally.cs:216:10:216:12 | M11 | Finally.cs:217:5:231:5 | {...} | | Finally.cs:233:10:233:12 | M12 | Finally.cs:234:5:261:5 | {...} | | Finally.cs:263:10:263:12 | M13 | Finally.cs:264:5:274:5 | {...} | -| Foreach.cs:4:7:4:13 | Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | Foreach | Foreach.cs:4:7:4:13 | this access | | Foreach.cs:6:10:6:11 | M1 | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:12:10:12:11 | M2 | Foreach.cs:13:5:16:5 | {...} | | Foreach.cs:18:10:18:11 | M3 | Foreach.cs:19:5:22:5 | {...} | | Foreach.cs:24:10:24:11 | M4 | Foreach.cs:25:5:28:5 | {...} | | Foreach.cs:30:10:30:11 | M5 | Foreach.cs:31:5:34:5 | {...} | | Foreach.cs:36:10:36:11 | M6 | Foreach.cs:37:5:40:5 | {...} | +| Initializers.cs:3:7:3:18 | | Initializers.cs:5:9:5:9 | this access | | Initializers.cs:3:7:3:18 | Initializers | Initializers.cs:3:7:3:18 | {...} | -| Initializers.cs:8:5:8:16 | Initializers | Initializers.cs:8:5:8:16 | call to constructor Object | -| Initializers.cs:10:5:10:16 | Initializers | Initializers.cs:10:5:10:16 | call to constructor Object | +| Initializers.cs:8:5:8:16 | Initializers | Initializers.cs:8:5:8:16 | this access | +| Initializers.cs:10:5:10:16 | Initializers | Initializers.cs:10:5:10:16 | this access | | Initializers.cs:12:10:12:10 | M | Initializers.cs:13:5:16:5 | {...} | -| Initializers.cs:20:11:20:23 | NoConstructor | Initializers.cs:20:11:20:23 | call to constructor Object | -| Initializers.cs:31:9:31:11 | Sub | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | +| Initializers.cs:20:11:20:23 | | Initializers.cs:22:23:22:23 | this access | +| Initializers.cs:20:11:20:23 | NoConstructor | Initializers.cs:20:11:20:23 | this access | +| Initializers.cs:26:11:26:13 | | Initializers.cs:28:13:28:13 | this access | +| Initializers.cs:31:9:31:11 | Sub | Initializers.cs:31:9:31:11 | this access | | Initializers.cs:33:9:33:11 | Sub | Initializers.cs:33:22:33:25 | call to constructor Sub | -| Initializers.cs:35:9:35:11 | Sub | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | -| Initializers.cs:39:7:39:23 | IndexInitializers | Initializers.cs:39:7:39:23 | call to constructor Object | -| Initializers.cs:41:11:41:18 | Compound | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:35:9:35:11 | Sub | Initializers.cs:35:9:35:11 | this access | +| Initializers.cs:39:7:39:23 | IndexInitializers | Initializers.cs:39:7:39:23 | this access | +| Initializers.cs:41:11:41:18 | Compound | Initializers.cs:41:11:41:18 | this access | | Initializers.cs:51:10:51:13 | Test | Initializers.cs:52:5:66:5 | {...} | -| LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | this access | | LoopUnrolling.cs:7:10:7:11 | M1 | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:15:10:15:11 | M2 | LoopUnrolling.cs:16:5:20:5 | {...} | | LoopUnrolling.cs:22:10:22:11 | M3 | LoopUnrolling.cs:23:5:27:5 | {...} | @@ -146,8 +149,8 @@ | LoopUnrolling.cs:76:10:76:11 | M9 | LoopUnrolling.cs:77:5:83:5 | {...} | | LoopUnrolling.cs:85:10:85:12 | M10 | LoopUnrolling.cs:86:5:92:5 | {...} | | LoopUnrolling.cs:94:10:94:12 | M11 | LoopUnrolling.cs:95:5:101:5 | {...} | -| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | -| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationA.cs:4:7:4:8 | this access | +| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationB.cs:1:7:1:8 | this access | | MultiImplementationA.cs:6:22:6:31 | get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:22:6:31 | get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:7:21:7:23 | get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | @@ -156,6 +159,8 @@ | MultiImplementationA.cs:7:41:7:43 | set_P2 | MultiImplementationB.cs:4:43:4:45 | {...} | | MultiImplementationA.cs:8:16:8:16 | M | MultiImplementationA.cs:8:29:8:32 | null | | MultiImplementationA.cs:8:16:8:16 | M | MultiImplementationB.cs:5:23:5:23 | 2 | +| MultiImplementationA.cs:11:7:11:8 | | MultiImplementationA.cs:13:16:13:16 | this access | +| MultiImplementationA.cs:11:7:11:8 | | MultiImplementationB.cs:11:16:11:16 | this access | | MultiImplementationA.cs:14:31:14:31 | get_Item | MultiImplementationA.cs:14:31:14:31 | access to parameter i | | MultiImplementationA.cs:14:31:14:31 | get_Item | MultiImplementationB.cs:12:37:12:40 | null | | MultiImplementationA.cs:15:36:15:38 | get_Item | MultiImplementationA.cs:15:40:15:52 | {...} | @@ -165,33 +170,34 @@ | MultiImplementationA.cs:16:17:16:18 | M1 | MultiImplementationA.cs:17:5:19:5 | {...} | | MultiImplementationA.cs:16:17:16:18 | M1 | MultiImplementationB.cs:15:5:17:5 | {...} | | MultiImplementationA.cs:18:9:18:22 | M2 | MultiImplementationA.cs:18:21:18:21 | 0 | -| MultiImplementationA.cs:20:12:20:13 | C2 | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | -| MultiImplementationA.cs:20:12:20:13 | C2 | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | +| MultiImplementationA.cs:20:12:20:13 | C2 | MultiImplementationA.cs:20:12:20:13 | this access | +| MultiImplementationA.cs:20:12:20:13 | C2 | MultiImplementationB.cs:18:12:18:13 | this access | | MultiImplementationA.cs:21:12:21:13 | C2 | MultiImplementationA.cs:21:24:21:24 | 0 | | MultiImplementationA.cs:21:12:21:13 | C2 | MultiImplementationB.cs:19:24:19:24 | 1 | | MultiImplementationA.cs:22:6:22:7 | ~C2 | MultiImplementationA.cs:22:11:22:13 | {...} | | MultiImplementationA.cs:22:6:22:7 | ~C2 | MultiImplementationB.cs:20:11:20:25 | {...} | | MultiImplementationA.cs:23:28:23:35 | implicit conversion | MultiImplementationA.cs:23:50:23:53 | null | | MultiImplementationA.cs:23:28:23:35 | implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | -| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | -| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationA.cs:28:7:28:8 | this access | +| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationB.cs:25:7:25:8 | this access | | MultiImplementationA.cs:30:21:30:23 | get_P3 | MultiImplementationA.cs:30:34:30:37 | null | -| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | -| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationA.cs:34:15:34:16 | this access | +| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationB.cs:30:15:30:16 | this access | | MultiImplementationA.cs:36:9:36:10 | M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:9:36:10 | M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:37:9:37:10 | M2 | MultiImplementationA.cs:37:14:37:28 | {...} | | MultiImplementationB.cs:16:9:16:31 | M2 | MultiImplementationB.cs:16:27:16:30 | null | -| NullCoalescing.cs:1:7:1:20 | NullCoalescing | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | NullCoalescing | NullCoalescing.cs:1:7:1:20 | this access | | NullCoalescing.cs:3:9:3:10 | M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:5:9:5:10 | M2 | NullCoalescing.cs:5:25:5:25 | access to parameter b | | NullCoalescing.cs:7:12:7:13 | M3 | NullCoalescing.cs:7:40:7:41 | access to parameter s1 | | NullCoalescing.cs:9:12:9:13 | M4 | NullCoalescing.cs:9:37:9:37 | access to parameter b | | NullCoalescing.cs:11:9:11:10 | M5 | NullCoalescing.cs:11:44:11:45 | access to parameter b1 | | NullCoalescing.cs:13:10:13:11 | M6 | NullCoalescing.cs:14:5:18:5 | {...} | -| PartialImplementationA.cs:3:12:3:18 | Partial | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | -| PartialImplementationB.cs:4:12:4:18 | Partial | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | -| Patterns.cs:3:7:3:14 | Patterns | Patterns.cs:3:7:3:14 | call to constructor Object | +| PartialImplementationA.cs:1:15:1:21 | | PartialImplementationB.cs:3:16:3:16 | this access | +| PartialImplementationA.cs:3:12:3:18 | Partial | PartialImplementationA.cs:3:12:3:18 | this access | +| PartialImplementationB.cs:4:12:4:18 | Partial | PartialImplementationB.cs:4:12:4:18 | this access | +| Patterns.cs:3:7:3:14 | Patterns | Patterns.cs:3:7:3:14 | this access | | Patterns.cs:5:10:5:11 | M1 | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:47:24:47:25 | M2 | Patterns.cs:48:9:48:9 | access to parameter c | | Patterns.cs:50:24:50:25 | M3 | Patterns.cs:51:9:51:9 | access to parameter c | @@ -202,15 +208,15 @@ | Patterns.cs:85:26:85:27 | M8 | Patterns.cs:85:39:85:39 | access to parameter i | | Patterns.cs:87:26:87:27 | M9 | Patterns.cs:87:39:87:39 | access to parameter i | | Patterns.cs:93:17:93:19 | M10 | Patterns.cs:94:5:99:5 | {...} | -| PostDominance.cs:3:7:3:19 | PostDominance | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | PostDominance | PostDominance.cs:3:7:3:19 | this access | | PostDominance.cs:5:10:5:11 | M1 | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:10:10:10:11 | M2 | PostDominance.cs:11:5:15:5 | {...} | | PostDominance.cs:17:10:17:11 | M3 | PostDominance.cs:18:5:22:5 | {...} | -| Qualifiers.cs:1:7:1:16 | Qualifiers | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | Qualifiers | Qualifiers.cs:1:7:1:16 | this access | | Qualifiers.cs:7:16:7:21 | Method | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:8:23:8:34 | StaticMethod | Qualifiers.cs:8:41:8:44 | null | | Qualifiers.cs:10:10:10:10 | M | Qualifiers.cs:11:5:31:5 | {...} | -| Switch.cs:3:7:3:12 | Switch | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | Switch | Switch.cs:3:7:3:12 | this access | | Switch.cs:5:10:5:11 | M1 | Switch.cs:6:5:8:5 | {...} | | Switch.cs:10:10:10:11 | M2 | Switch.cs:11:5:33:5 | {...} | | Switch.cs:35:10:35:11 | M3 | Switch.cs:36:5:42:5 | {...} | @@ -228,13 +234,13 @@ | Switch.cs:144:9:144:11 | M14 | Switch.cs:145:5:152:5 | {...} | | Switch.cs:154:10:154:12 | M15 | Switch.cs:155:5:161:5 | {...} | | Switch.cs:163:10:163:12 | M16 | Switch.cs:164:5:178:5 | {...} | -| TypeAccesses.cs:1:7:1:18 | TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | TypeAccesses | TypeAccesses.cs:1:7:1:18 | this access | | TypeAccesses.cs:3:10:3:10 | M | TypeAccesses.cs:4:5:9:5 | {...} | -| VarDecls.cs:3:7:3:14 | VarDecls | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | VarDecls | VarDecls.cs:3:7:3:14 | this access | | VarDecls.cs:5:18:5:19 | M1 | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:13:12:13:13 | M2 | VarDecls.cs:14:5:17:5 | {...} | | VarDecls.cs:19:7:19:8 | M3 | VarDecls.cs:20:5:26:5 | {...} | -| VarDecls.cs:28:11:28:11 | C | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | C | VarDecls.cs:28:11:28:11 | this access | | VarDecls.cs:28:41:28:47 | Dispose | VarDecls.cs:28:51:28:53 | {...} | | cflow.cs:5:17:5:20 | Main | cflow.cs:6:5:35:5 | {...} | | cflow.cs:37:17:37:22 | Switch | cflow.cs:38:5:68:5 | {...} | @@ -245,7 +251,7 @@ | cflow.cs:119:20:119:21 | M5 | cflow.cs:120:5:124:5 | {...} | | cflow.cs:127:19:127:21 | get_Prop | cflow.cs:127:23:127:60 | {...} | | cflow.cs:127:62:127:64 | set_Prop | cflow.cs:127:66:127:83 | {...} | -| cflow.cs:129:5:129:15 | ControlFlow | cflow.cs:129:5:129:15 | call to constructor Object | +| cflow.cs:129:5:129:15 | ControlFlow | cflow.cs:129:5:129:15 | this access | | cflow.cs:134:5:134:15 | ControlFlow | cflow.cs:134:31:134:31 | access to parameter i | | cflow.cs:136:12:136:22 | ControlFlow | cflow.cs:136:33:136:33 | 0 | | cflow.cs:138:40:138:40 | + | cflow.cs:139:5:142:5 | {...} | @@ -261,13 +267,13 @@ | cflow.cs:224:10:224:16 | Foreach | cflow.cs:225:5:238:5 | {...} | | cflow.cs:240:10:240:13 | Goto | cflow.cs:241:5:259:5 | {...} | | cflow.cs:261:49:261:53 | Yield | cflow.cs:262:5:277:5 | {...} | -| cflow.cs:282:5:282:18 | ControlFlowSub | cflow.cs:282:24:282:27 | call to constructor ControlFlow | +| cflow.cs:282:5:282:18 | ControlFlowSub | cflow.cs:282:5:282:18 | this access | | cflow.cs:284:5:284:18 | ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | | cflow.cs:286:5:286:18 | ControlFlowSub | cflow.cs:286:34:286:34 | access to parameter i | -| cflow.cs:289:7:289:18 | DelegateCall | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | DelegateCall | cflow.cs:289:7:289:18 | this access | | cflow.cs:291:12:291:12 | M | cflow.cs:291:38:291:38 | access to parameter f | -| cflow.cs:296:5:296:25 | NegationInConstructor | cflow.cs:296:5:296:25 | call to constructor Object | +| cflow.cs:296:5:296:25 | NegationInConstructor | cflow.cs:296:5:296:25 | this access | | cflow.cs:298:10:298:10 | M | cflow.cs:299:5:301:5 | {...} | -| cflow.cs:304:7:304:18 | LambdaGetter | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | LambdaGetter | cflow.cs:304:7:304:18 | this access | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:307:5:310:5 | {...} | | cflow.cs:306:60:310:5 | get__getter | cflow.cs:306:60:310:5 | (...) => ... | diff --git a/csharp/ql/test/library-tests/controlflow/guards/AbstractValue.expected b/csharp/ql/test/library-tests/controlflow/guards/AbstractValue.expected index a930349e930..712e379e331 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/AbstractValue.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/AbstractValue.expected @@ -117,6 +117,8 @@ | not | Guards.cs:162:24:162:24 | access to parameter o | | not | Guards.cs:285:17:285:17 | access to parameter o | | not | Guards.cs:287:17:287:17 | access to parameter o | +| not null | Assert.cs:5:7:5:17 | call to method | +| not null | Assert.cs:5:7:5:17 | this access | | not null | Assert.cs:9:20:9:20 | access to parameter b | | not null | Assert.cs:9:31:9:32 | "" | | not null | Assert.cs:10:9:10:13 | access to type Debug | @@ -228,6 +230,8 @@ | not null | Assert.cs:94:16:94:24 | ... && ... | | not null | Assert.cs:94:22:94:24 | !... | | not null | Assert.cs:94:23:94:24 | access to parameter b2 | +| not null | Collections.cs:7:14:7:24 | call to method | +| not null | Collections.cs:7:14:7:24 | this access | | not null | Collections.cs:11:13:11:13 | access to local variable b | | not null | Collections.cs:11:13:11:32 | Boolean b = ... | | not null | Collections.cs:11:17:11:20 | access to parameter args | @@ -496,6 +500,8 @@ | not null | Collections.cs:102:9:102:15 | access to type Console | | not null | Collections.cs:102:9:102:31 | call to method WriteLine | | not null | Collections.cs:102:27:102:30 | access to parameter args | +| not null | Guards.cs:3:14:3:19 | call to method | +| not null | Guards.cs:3:14:3:19 | this access | | not null | Guards.cs:10:13:10:25 | !... | | not null | Guards.cs:10:14:10:25 | !... | | not null | Guards.cs:10:16:10:24 | ... == ... | diff --git a/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected b/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected index 649e8362370..ac260924d10 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/BooleanGuardedExpr.expected @@ -27,8 +27,12 @@ | Guards.cs:36:32:36:32 | access to parameter x | Guards.cs:35:13:35:21 | ... == ... | Guards.cs:35:13:35:13 | access to parameter x | false | | Guards.cs:36:36:36:36 | access to parameter y | Guards.cs:35:26:35:34 | ... == ... | Guards.cs:35:26:35:26 | access to parameter y | false | | Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:23 | ... == ... | Guards.cs:38:15:38:15 | access to parameter x | false | +| Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:23 | ... == ... | Guards.cs:38:15:38:15 | access to parameter x | true | | Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:36 | ... == ... | Guards.cs:38:28:38:28 | access to parameter y | false | +| Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:36 | ... == ... | Guards.cs:38:28:38:28 | access to parameter y | true | +| Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:25 | ... != ... | Guards.cs:41:17:41:17 | access to parameter x | false | | Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:25 | ... != ... | Guards.cs:41:17:41:17 | access to parameter x | true | +| Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:38 | ... != ... | Guards.cs:41:30:41:30 | access to parameter y | false | | Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:38 | ... != ... | Guards.cs:41:30:41:30 | access to parameter y | true | | Guards.cs:48:31:48:40 | access to field Field | Guards.cs:47:13:47:25 | ... != ... | Guards.cs:47:13:47:17 | access to field Field | true | | Guards.cs:55:27:55:27 | access to parameter g | Guards.cs:53:13:53:27 | ... == ... | Guards.cs:53:13:53:13 | access to parameter g | false | diff --git a/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected b/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected index b34cae88b80..d322431b1df 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/GuardedControlFlowNode.expected @@ -64,12 +64,20 @@ | Guards.cs:36:36:36:36 | access to parameter y | Guards.cs:35:26:35:26 | access to parameter y | Guards.cs:35:26:35:26 | access to parameter y | not null | | Guards.cs:36:36:36:36 | access to parameter y | Guards.cs:35:26:35:34 | ... == ... | Guards.cs:35:26:35:26 | access to parameter y | false | | Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | not null | +| Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | null | | Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:23 | ... == ... | Guards.cs:38:15:38:15 | access to parameter x | false | +| Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:23 | ... == ... | Guards.cs:38:15:38:15 | access to parameter x | true | | Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | not null | +| Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | null | | Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:36 | ... == ... | Guards.cs:38:28:38:28 | access to parameter y | false | +| Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:36 | ... == ... | Guards.cs:38:28:38:28 | access to parameter y | true | | Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | not null | +| Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | null | +| Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:25 | ... != ... | Guards.cs:41:17:41:17 | access to parameter x | false | | Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:25 | ... != ... | Guards.cs:41:17:41:17 | access to parameter x | true | | Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | not null | +| Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | null | +| Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:38 | ... != ... | Guards.cs:41:30:41:30 | access to parameter y | false | | Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:38 | ... != ... | Guards.cs:41:30:41:30 | access to parameter y | true | | Guards.cs:48:31:48:40 | access to field Field | Guards.cs:47:13:47:17 | access to field Field | Guards.cs:47:13:47:17 | access to field Field | not null | | Guards.cs:48:31:48:40 | access to field Field | Guards.cs:47:13:47:25 | ... != ... | Guards.cs:47:13:47:17 | access to field Field | true | diff --git a/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected b/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected index b34cae88b80..d322431b1df 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/GuardedExpr.expected @@ -64,12 +64,20 @@ | Guards.cs:36:36:36:36 | access to parameter y | Guards.cs:35:26:35:26 | access to parameter y | Guards.cs:35:26:35:26 | access to parameter y | not null | | Guards.cs:36:36:36:36 | access to parameter y | Guards.cs:35:26:35:34 | ... == ... | Guards.cs:35:26:35:26 | access to parameter y | false | | Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | not null | +| Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | Guards.cs:38:15:38:15 | access to parameter x | null | | Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:23 | ... == ... | Guards.cs:38:15:38:15 | access to parameter x | false | +| Guards.cs:39:31:39:31 | access to parameter x | Guards.cs:38:15:38:23 | ... == ... | Guards.cs:38:15:38:15 | access to parameter x | true | | Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | not null | +| Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | Guards.cs:38:28:38:28 | access to parameter y | null | | Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:36 | ... == ... | Guards.cs:38:28:38:28 | access to parameter y | false | +| Guards.cs:39:35:39:35 | access to parameter y | Guards.cs:38:28:38:36 | ... == ... | Guards.cs:38:28:38:28 | access to parameter y | true | | Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | not null | +| Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | Guards.cs:41:17:41:17 | access to parameter x | null | +| Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:25 | ... != ... | Guards.cs:41:17:41:17 | access to parameter x | false | | Guards.cs:42:32:42:32 | access to parameter x | Guards.cs:41:17:41:25 | ... != ... | Guards.cs:41:17:41:17 | access to parameter x | true | | Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | not null | +| Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | Guards.cs:41:30:41:30 | access to parameter y | null | +| Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:38 | ... != ... | Guards.cs:41:30:41:30 | access to parameter y | false | | Guards.cs:42:36:42:36 | access to parameter y | Guards.cs:41:30:41:38 | ... != ... | Guards.cs:41:30:41:30 | access to parameter y | true | | Guards.cs:48:31:48:40 | access to field Field | Guards.cs:47:13:47:17 | access to field Field | Guards.cs:47:13:47:17 | access to field Field | not null | | Guards.cs:48:31:48:40 | access to field Field | Guards.cs:47:13:47:25 | ... != ... | Guards.cs:47:13:47:17 | access to field Field | true | diff --git a/csharp/ql/test/library-tests/controlflow/guards/Guards.cs b/csharp/ql/test/library-tests/controlflow/guards/Guards.cs index 045967d6134..8c4abb815e8 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/Guards.cs +++ b/csharp/ql/test/library-tests/controlflow/guards/Guards.cs @@ -35,10 +35,10 @@ public class Guards if (x == null || y == null) { } else Console.WriteLine(x + y); // null guarded - if (!(x == null || y == null)) + if (!(x == null || y == null)) // MISHANDLED, likely due to splitting Console.WriteLine(x + y); // null guarded - if (!!!(x != null && y != null)) { } + if (!!!(x != null && y != null)) { } // MISHANDLED, likely due to splitting else Console.WriteLine(x + y); // null guarded if (Field != null) diff --git a/csharp/ql/test/library-tests/conversion/operator/PrintAst.expected b/csharp/ql/test/library-tests/conversion/operator/PrintAst.expected index 47f1db09efe..89a12e9a170 100644 --- a/csharp/ql/test/library-tests/conversion/operator/PrintAst.expected +++ b/csharp/ql/test/library-tests/conversion/operator/PrintAst.expected @@ -1,6 +1,6 @@ Operator.cs: # 3| [Class] C -# 5| 5: [ImplicitConversionOperator] implicit conversion +# 5| 6: [ImplicitConversionOperator] implicit conversion # 5| -1: [TypeMention] C #-----| 2: (Parameters) # 5| 0: [Parameter] i @@ -8,11 +8,11 @@ Operator.cs: # 5| 4: [BlockStmt] {...} # 5| 0: [ReturnStmt] return ...; # 5| 0: [NullLiteral] null -# 7| 6: [Field] x1 +# 7| 7: [Field] x1 # 7| -1: [TypeMention] int -# 8| 7: [Field] x2 +# 8| 8: [Field] x2 # 8| -1: [TypeMention] C -# 11| 8: [Method] M +# 11| 9: [Method] M # 11| -1: [TypeMention] Void # 12| 4: [BlockStmt] {...} # 13| 0: [ExprStmt] ...; diff --git a/csharp/ql/test/library-tests/csharp10/fileScopedNamespace.expected b/csharp/ql/test/library-tests/csharp10/fileScopedNamespace.expected index 34f517f59bb..5db33c2a421 100644 --- a/csharp/ql/test/library-tests/csharp10/fileScopedNamespace.expected +++ b/csharp/ql/test/library-tests/csharp10/fileScopedNamespace.expected @@ -1,4 +1,5 @@ fileScopedNamespace +| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:3:14:3:39 | | | FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:3:14:3:39 | MyFileScopedNamespaceClass | | FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:5:29:5:35 | myField | | FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:6:19:6:24 | MyProp | diff --git a/csharp/ql/test/library-tests/csharp11/PrintAst.expected b/csharp/ql/test/library-tests/csharp11/PrintAst.expected index 1de7ff42928..391c41540ec 100644 --- a/csharp/ql/test/library-tests/csharp11/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp11/PrintAst.expected @@ -1,10 +1,10 @@ CheckedOperators.cs: # 1| [NamespaceDeclaration] namespace ... { ... } # 3| 1: [Class] Number -# 5| 4: [Property] Value +# 5| 5: [Property] Value # 5| -1: [TypeMention] int # 5| 3: [Getter] get_Value -# 7| 5: [InstanceConstructor] Number +# 7| 6: [InstanceConstructor] Number #-----| 2: (Parameters) # 7| 0: [Parameter] n # 7| -1: [TypeMention] int @@ -12,7 +12,7 @@ CheckedOperators.cs: # 7| 0: [PropertyCall] access to property Value # 7| -1: [ThisAccess] this access # 7| 1: [ParameterAccess] access to parameter n -# 9| 6: [CheckedAddOperator] checked + +# 9| 7: [CheckedAddOperator] checked + # 9| -1: [TypeMention] Number #-----| 2: (Parameters) # 9| 0: [Parameter] n1 @@ -27,7 +27,7 @@ CheckedOperators.cs: # 10| -1: [ParameterAccess] access to parameter n1 # 10| 1: [PropertyCall] access to property Value # 10| -1: [ParameterAccess] access to parameter n2 -# 12| 7: [AddOperator] + +# 12| 8: [AddOperator] + # 12| -1: [TypeMention] Number #-----| 2: (Parameters) # 12| 0: [Parameter] n1 @@ -41,7 +41,7 @@ CheckedOperators.cs: # 13| -1: [ParameterAccess] access to parameter n1 # 13| 1: [PropertyCall] access to property Value # 13| -1: [ParameterAccess] access to parameter n2 -# 15| 8: [CheckedSubOperator] checked - +# 15| 9: [CheckedSubOperator] checked - # 15| -1: [TypeMention] Number #-----| 2: (Parameters) # 15| 0: [Parameter] n1 @@ -56,7 +56,7 @@ CheckedOperators.cs: # 16| -1: [ParameterAccess] access to parameter n1 # 16| 1: [PropertyCall] access to property Value # 16| -1: [ParameterAccess] access to parameter n2 -# 18| 9: [SubOperator] - +# 18| 10: [SubOperator] - # 18| -1: [TypeMention] Number #-----| 2: (Parameters) # 18| 0: [Parameter] n1 @@ -70,7 +70,7 @@ CheckedOperators.cs: # 19| -1: [ParameterAccess] access to parameter n1 # 19| 1: [PropertyCall] access to property Value # 19| -1: [ParameterAccess] access to parameter n2 -# 21| 10: [CheckedMulOperator] checked * +# 21| 11: [CheckedMulOperator] checked * # 21| -1: [TypeMention] Number #-----| 2: (Parameters) # 21| 0: [Parameter] n1 @@ -85,7 +85,7 @@ CheckedOperators.cs: # 22| -1: [ParameterAccess] access to parameter n1 # 22| 1: [PropertyCall] access to property Value # 22| -1: [ParameterAccess] access to parameter n2 -# 24| 11: [MulOperator] * +# 24| 12: [MulOperator] * # 24| -1: [TypeMention] Number #-----| 2: (Parameters) # 24| 0: [Parameter] n1 @@ -99,7 +99,7 @@ CheckedOperators.cs: # 25| -1: [ParameterAccess] access to parameter n1 # 25| 1: [PropertyCall] access to property Value # 25| -1: [ParameterAccess] access to parameter n2 -# 27| 12: [CheckedDivOperator] checked / +# 27| 13: [CheckedDivOperator] checked / # 27| -1: [TypeMention] Number #-----| 2: (Parameters) # 27| 0: [Parameter] n1 @@ -114,7 +114,7 @@ CheckedOperators.cs: # 28| -1: [ParameterAccess] access to parameter n1 # 28| 1: [PropertyCall] access to property Value # 28| -1: [ParameterAccess] access to parameter n2 -# 30| 13: [DivOperator] / +# 30| 14: [DivOperator] / # 30| -1: [TypeMention] Number #-----| 2: (Parameters) # 30| 0: [Parameter] n1 @@ -128,7 +128,7 @@ CheckedOperators.cs: # 31| -1: [ParameterAccess] access to parameter n1 # 31| 1: [PropertyCall] access to property Value # 31| -1: [ParameterAccess] access to parameter n2 -# 33| 14: [CheckedMinusOperator] checked - +# 33| 15: [CheckedMinusOperator] checked - # 33| -1: [TypeMention] Number #-----| 2: (Parameters) # 33| 0: [Parameter] n @@ -139,7 +139,7 @@ CheckedOperators.cs: # 34| 0: [UnaryMinusExpr] -... # 34| 0: [PropertyCall] access to property Value # 34| -1: [ParameterAccess] access to parameter n -# 36| 15: [MinusOperator] - +# 36| 16: [MinusOperator] - # 36| -1: [TypeMention] Number #-----| 2: (Parameters) # 36| 0: [Parameter] n @@ -149,7 +149,7 @@ CheckedOperators.cs: # 37| 0: [UnaryMinusExpr] -... # 37| 0: [PropertyCall] access to property Value # 37| -1: [ParameterAccess] access to parameter n -# 39| 16: [CheckedIncrementOperator] checked ++ +# 39| 17: [CheckedIncrementOperator] checked ++ # 39| -1: [TypeMention] Number #-----| 2: (Parameters) # 39| 0: [Parameter] n @@ -161,7 +161,7 @@ CheckedOperators.cs: # 40| 0: [PropertyCall] access to property Value # 40| -1: [ParameterAccess] access to parameter n # 40| 1: [IntLiteral] 1 -# 42| 17: [IncrementOperator] ++ +# 42| 18: [IncrementOperator] ++ # 42| -1: [TypeMention] Number #-----| 2: (Parameters) # 42| 0: [Parameter] n @@ -172,7 +172,7 @@ CheckedOperators.cs: # 43| 0: [PropertyCall] access to property Value # 43| -1: [ParameterAccess] access to parameter n # 43| 1: [IntLiteral] 1 -# 45| 18: [CheckedDecrementOperator] checked -- +# 45| 19: [CheckedDecrementOperator] checked -- # 45| -1: [TypeMention] Number #-----| 2: (Parameters) # 45| 0: [Parameter] n @@ -184,7 +184,7 @@ CheckedOperators.cs: # 46| 0: [PropertyCall] access to property Value # 46| -1: [ParameterAccess] access to parameter n # 46| 1: [IntLiteral] 1 -# 48| 19: [DecrementOperator] -- +# 48| 20: [DecrementOperator] -- # 48| -1: [TypeMention] Number #-----| 2: (Parameters) # 48| 0: [Parameter] n @@ -195,7 +195,7 @@ CheckedOperators.cs: # 49| 0: [PropertyCall] access to property Value # 49| -1: [ParameterAccess] access to parameter n # 49| 1: [IntLiteral] 1 -# 51| 20: [ExplicitConversionOperator] explicit conversion +# 51| 21: [ExplicitConversionOperator] explicit conversion # 51| -1: [TypeMention] short #-----| 2: (Parameters) # 51| 0: [Parameter] n @@ -205,7 +205,7 @@ CheckedOperators.cs: # 52| 0: [TypeMention] short # 52| 1: [PropertyCall] access to property Value # 52| -1: [ParameterAccess] access to parameter n -# 54| 21: [CheckedExplicitConversionOperator] checked explicit conversion +# 54| 22: [CheckedExplicitConversionOperator] checked explicit conversion # 54| -1: [TypeMention] short #-----| 2: (Parameters) # 54| 0: [Parameter] n @@ -240,22 +240,22 @@ FileScoped1.cs: # 19| [Enum] E1 # 21| [DelegateType] D1 # 23| [RecordClass] R1 -# 23| 12: [NEOperator] != +# 23| 13: [NEOperator] != #-----| 2: (Parameters) # 23| 0: [Parameter] left # 23| 1: [Parameter] right -# 23| 13: [EQOperator] == +# 23| 14: [EQOperator] == #-----| 2: (Parameters) # 23| 0: [Parameter] left # 23| 1: [Parameter] right -# 23| 14: [Property] EqualityContract +# 23| 15: [Property] EqualityContract # 23| 3: [Getter] get_EqualityContract # 25| [RecordStruct] RS1 -# 25| 10: [NEOperator] != +# 25| 11: [NEOperator] != #-----| 2: (Parameters) # 25| 0: [Parameter] left # 25| 1: [Parameter] right -# 25| 11: [EQOperator] == +# 25| 12: [EQOperator] == #-----| 2: (Parameters) # 25| 0: [Parameter] left # 25| 1: [Parameter] right @@ -280,22 +280,22 @@ FileScoped2.cs: # 17| [Enum] E1 # 19| [DelegateType] D1 # 21| [RecordClass] R1 -# 21| 12: [NEOperator] != +# 21| 13: [NEOperator] != #-----| 2: (Parameters) # 21| 0: [Parameter] left # 21| 1: [Parameter] right -# 21| 13: [EQOperator] == +# 21| 14: [EQOperator] == #-----| 2: (Parameters) # 21| 0: [Parameter] left # 21| 1: [Parameter] right -# 21| 14: [Property] EqualityContract +# 21| 15: [Property] EqualityContract # 21| 3: [Getter] get_EqualityContract # 23| [RecordStruct] RS1 -# 23| 10: [NEOperator] != +# 23| 11: [NEOperator] != #-----| 2: (Parameters) # 23| 0: [Parameter] left # 23| 1: [Parameter] right -# 23| 11: [EQOperator] == +# 23| 12: [EQOperator] == #-----| 2: (Parameters) # 23| 0: [Parameter] left # 23| 1: [Parameter] right @@ -333,21 +333,21 @@ GenericAttribute.cs: #-----| 3: (Base types) # 7| 0: [TypeMention] Attribute # 9| [Class] TestGenericAttribute -# 13| 5: [Method] M1 +# 13| 6: [Method] M1 # 13| -1: [TypeMention] Void #-----| 0: (Attributes) # 12| 1: [GenericDefaultAttribute] [MyGeneric(...)] # 12| 0: [TypeMention] MyGenericAttribute # 12| 1: [TypeMention] int # 13| 4: [BlockStmt] {...} -# 16| 6: [Method] M2 +# 16| 7: [Method] M2 # 16| -1: [TypeMention] Void #-----| 0: (Attributes) # 15| 1: [GenericDefaultAttribute] [MyGeneric(...)] # 15| 0: [TypeMention] MyGenericAttribute # 15| 1: [TypeMention] string # 16| 4: [BlockStmt] {...} -# 19| 7: [Method] M3 +# 19| 8: [Method] M3 # 19| -1: [TypeMention] Void #-----| 0: (Attributes) # 18| 1: [GenericDefaultAttribute] [MyGeneric2(...)] @@ -355,7 +355,7 @@ GenericAttribute.cs: # 18| 1: [TypeMention] int # 18| 2: [TypeMention] string # 19| 4: [BlockStmt] {...} -# 22| 8: [Method] M4 +# 22| 9: [Method] M4 # 22| -1: [TypeMention] int #-----| 0: (Attributes) # 21| 1: [GenericReturnAttribute] [return: MyGeneric(...)] @@ -366,7 +366,7 @@ GenericAttribute.cs: # 22| 0: [IntLiteral] 0 ListPattern.cs: # 3| [Class] ListPattern -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] Void #-----| 2: (Parameters) # 5| 0: [Parameter] x @@ -430,7 +430,7 @@ ListPattern.cs: # 13| 1: [ConstantPatternExpr,IntLiteral] 5 # 13| 2: [ConstantPatternExpr,IntLiteral] 2 # 13| 1: [BlockStmt] {...} -# 16| 6: [Method] M2 +# 16| 7: [Method] M2 # 16| -1: [TypeMention] Void #-----| 2: (Parameters) # 16| 0: [Parameter] x @@ -482,19 +482,19 @@ ListPattern.cs: # 35| 15: [BreakStmt] break; NameofScope.cs: # 3| [Class] MyAttributeTestClass -# 5| 5: [Class] MyAttribute +# 5| 6: [Class] MyAttribute #-----| 3: (Base types) # 5| 0: [TypeMention] Attribute -# 7| 4: [Field] S +# 7| 5: [Field] S # 7| -1: [TypeMention] string -# 8| 5: [InstanceConstructor] MyAttribute +# 8| 6: [InstanceConstructor] MyAttribute #-----| 2: (Parameters) # 8| 0: [Parameter] s # 8| -1: [TypeMention] string # 8| 4: [AssignExpr] ... = ... # 8| 0: [FieldAccess] access to field S # 8| 1: [ParameterAccess] access to parameter s -# 12| 6: [Method] M1`1 +# 12| 7: [Method] M1`1 # 12| -1: [TypeMention] Void #-----| 0: (Attributes) # 11| 1: [DefaultAttribute] [My(...)] @@ -508,7 +508,7 @@ NameofScope.cs: # 12| 0: [Parameter] x # 12| -1: [TypeMention] string # 12| 4: [BlockStmt] {...} -# 15| 7: [Method] M2 +# 15| 8: [Method] M2 # 15| -1: [TypeMention] string #-----| 0: (Attributes) # 14| 1: [ReturnAttribute] [return: My(...)] @@ -519,7 +519,7 @@ NameofScope.cs: # 15| 0: [Parameter] y # 15| -1: [TypeMention] string # 15| 4: [ParameterAccess] access to parameter y -# 17| 8: [Method] M3 +# 17| 9: [Method] M3 # 17| -1: [TypeMention] object #-----| 2: (Parameters) # 17| 0: [Parameter] z @@ -530,7 +530,7 @@ NameofScope.cs: # 17| 0: [NameOfExpr] nameof(...) # 17| 0: [ParameterAccess] access to parameter z # 17| 4: [ParameterAccess] access to parameter z -# 19| 9: [Method] M4`1 +# 19| 10: [Method] M4`1 # 19| -1: [TypeMention] object #-----| 1: (Type parameters) # 19| 0: [TypeParameter] S @@ -546,7 +546,7 @@ NameofScope.cs: # 19| 4: [ParameterAccess] access to parameter z NativeInt.cs: # 1| [Class] NativeInt -# 3| 5: [Method] M1 +# 3| 6: [Method] M1 # 3| -1: [TypeMention] Void # 4| 4: [BlockStmt] {...} # 5| 0: [LocalVariableDeclStmt] ... ...; @@ -579,7 +579,7 @@ NativeInt.cs: # 9| 1: [IntLiteral] 0 Operators.cs: # 2| [Class] MyClass -# 4| 5: [Method] M1 +# 4| 6: [Method] M1 # 4| -1: [TypeMention] Void # 5| 4: [BlockStmt] {...} # 6| 0: [LocalVariableDeclStmt] ... ...; @@ -618,7 +618,7 @@ Operators.cs: # 13| 0: [LocalVariableAccess] access to local variable z # 13| 1: [IntLiteral] 5 # 17| [Class] MyOperatorClass -# 19| 5: [UnsignedRightShiftOperator] >>> +# 19| 6: [UnsignedRightShiftOperator] >>> # 19| -1: [TypeMention] MyOperatorClass #-----| 2: (Parameters) # 19| 0: [Parameter] a @@ -630,7 +630,7 @@ Operators.cs: # 19| 0: [NullLiteral] null PatternMatchSpan.cs: # 3| [Class] PatternMatchSpan -# 6| 5: [Method] M1 +# 6| 6: [Method] M1 # 6| -1: [TypeMention] Void #-----| 2: (Parameters) # 6| 0: [Parameter] x1 @@ -642,7 +642,7 @@ PatternMatchSpan.cs: # 8| 0: [ParameterAccess] access to parameter x1 # 8| 1: [ConstantPatternExpr,StringLiteralUtf16] "ABC" # 8| 1: [BlockStmt] {...} -# 11| 6: [Method] M2 +# 11| 7: [Method] M2 # 11| -1: [TypeMention] Void #-----| 2: (Parameters) # 11| 0: [Parameter] x2 @@ -687,7 +687,7 @@ RelaxedShift.cs: # 7| -1: [TypeMention] TOther # 10| [Class] Number #-----| 3: (Base types) -# 12| 5: [LeftShiftOperator] << +# 12| 6: [LeftShiftOperator] << # 12| -1: [TypeMention] Number #-----| 2: (Parameters) # 12| 0: [Parameter] value @@ -695,7 +695,7 @@ RelaxedShift.cs: # 12| 1: [Parameter] shiftAmount # 12| -1: [TypeMention] string # 12| 4: [ParameterAccess] access to parameter value -# 14| 6: [RightShiftOperator] >> +# 14| 7: [RightShiftOperator] >> # 14| -1: [TypeMention] Number #-----| 2: (Parameters) # 14| 0: [Parameter] value @@ -703,7 +703,7 @@ RelaxedShift.cs: # 14| 1: [Parameter] shiftAmount # 14| -1: [TypeMention] string # 14| 4: [ParameterAccess] access to parameter value -# 16| 7: [UnsignedRightShiftOperator] >>> +# 16| 8: [UnsignedRightShiftOperator] >>> # 16| -1: [TypeMention] Number #-----| 2: (Parameters) # 16| 0: [Parameter] value @@ -712,7 +712,7 @@ RelaxedShift.cs: # 16| -1: [TypeMention] string # 16| 4: [ParameterAccess] access to parameter value # 19| [Class] TestRelaxedShift -# 21| 5: [Method] M1 +# 21| 6: [Method] M1 # 21| -1: [TypeMention] Void # 22| 4: [BlockStmt] {...} # 23| 0: [LocalVariableDeclStmt] ... ...; @@ -756,23 +756,23 @@ RelaxedShift.cs: # 30| 1: [StringLiteralUtf16] "3" RequiredMembers.cs: # 4| [Class] ClassRequiredMembers -# 6| 4: [Field] RequiredField +# 6| 5: [Field] RequiredField # 6| -1: [TypeMention] object -# 7| 5: [Property] RequiredProperty +# 7| 6: [Property] RequiredProperty # 7| -1: [TypeMention] string # 7| 3: [Getter] get_RequiredProperty # 7| 4: [Setter] set_RequiredProperty #-----| 2: (Parameters) # 7| 0: [Parameter] value -# 8| 6: [Property] VirtualProperty +# 8| 7: [Property] VirtualProperty # 8| -1: [TypeMention] object # 8| 3: [Getter] get_VirtualProperty # 8| 4: [Setter] set_VirtualProperty #-----| 2: (Parameters) # 8| 0: [Parameter] value -# 10| 7: [InstanceConstructor] ClassRequiredMembers +# 10| 8: [InstanceConstructor] ClassRequiredMembers # 10| 4: [BlockStmt] {...} -# 13| 8: [InstanceConstructor] ClassRequiredMembers +# 13| 9: [InstanceConstructor] ClassRequiredMembers #-----| 0: (Attributes) # 12| 1: [DefaultAttribute] [SetsRequiredMembers(...)] # 12| 0: [TypeMention] SetsRequiredMembersAttribute @@ -793,16 +793,16 @@ RequiredMembers.cs: # 20| [Class] ClassRequiredMembersSub #-----| 3: (Base types) # 20| 0: [TypeMention] ClassRequiredMembers -# 22| 4: [Property] VirtualProperty +# 22| 5: [Property] VirtualProperty # 22| -1: [TypeMention] object # 22| 3: [Getter] get_VirtualProperty # 22| 4: [Setter] set_VirtualProperty #-----| 2: (Parameters) # 22| 0: [Parameter] value -# 24| 5: [InstanceConstructor] ClassRequiredMembersSub +# 24| 6: [InstanceConstructor] ClassRequiredMembersSub # 24| 3: [ConstructorInitializer] call to constructor ClassRequiredMembers # 24| 4: [BlockStmt] {...} -# 27| 6: [InstanceConstructor] ClassRequiredMembersSub +# 27| 7: [InstanceConstructor] ClassRequiredMembersSub #-----| 0: (Attributes) # 26| 1: [DefaultAttribute] [SetsRequiredMembers(...)] # 26| 0: [TypeMention] SetsRequiredMembersAttribute @@ -822,24 +822,24 @@ RequiredMembers.cs: # 29| 0: [PropertyCall] access to property VirtualProperty # 29| 1: [ParameterAccess] access to parameter virtualProperty # 33| [RecordClass] RecordRequiredMembers -# 33| 12: [NEOperator] != +# 33| 13: [NEOperator] != #-----| 2: (Parameters) # 33| 0: [Parameter] left # 33| 1: [Parameter] right -# 33| 13: [EQOperator] == +# 33| 14: [EQOperator] == #-----| 2: (Parameters) # 33| 0: [Parameter] left # 33| 1: [Parameter] right -# 33| 14: [Property] EqualityContract +# 33| 15: [Property] EqualityContract # 33| 3: [Getter] get_EqualityContract -# 35| 15: [Property] X +# 35| 16: [Property] X # 35| -1: [TypeMention] object # 35| 3: [Getter] get_X # 35| 4: [Setter] set_X #-----| 2: (Parameters) # 35| 0: [Parameter] value # 38| [Struct] StructRequiredMembers -# 40| 5: [Property] Y +# 40| 6: [Property] Y # 40| -1: [TypeMention] string # 40| 3: [Getter] get_Y # 40| 4: [Setter] set_Y @@ -849,7 +849,7 @@ Scoped.cs: # 1| [Struct] S1 # 2| [RefStruct] S2 # 7| [Class] ScopedModifierTest -# 9| 5: [Method] M1 +# 9| 6: [Method] M1 # 9| -1: [TypeMention] int #-----| 2: (Parameters) # 9| 0: [Parameter] x1 @@ -860,7 +860,7 @@ Scoped.cs: # 13| 0: [ReturnStmt] return ...; # 13| 0: [RefExpr] ref ... # 13| 0: [ParameterAccess] access to parameter y1 -# 16| 6: [Method] M2 +# 16| 7: [Method] M2 # 16| -1: [TypeMention] int #-----| 2: (Parameters) # 16| 0: [Parameter] x2 @@ -875,7 +875,7 @@ Scoped.cs: # 21| 1: [ReturnStmt] return ...; # 21| 0: [RefExpr] ref ... # 21| 0: [ParameterAccess] access to parameter y2 -# 24| 7: [Method] M3 +# 24| 8: [Method] M3 # 24| -1: [TypeMention] int #-----| 2: (Parameters) # 24| 0: [Parameter] x3 @@ -883,7 +883,7 @@ Scoped.cs: # 25| 4: [BlockStmt] {...} # 27| 0: [ReturnStmt] return ...; # 27| 0: [ParameterAccess] access to parameter x3 -# 30| 8: [Method] M4 +# 30| 9: [Method] M4 # 30| -1: [TypeMention] S1 #-----| 2: (Parameters) # 30| 0: [Parameter] x4 @@ -891,7 +891,7 @@ Scoped.cs: # 31| 4: [BlockStmt] {...} # 33| 0: [ReturnStmt] return ...; # 33| 0: [ParameterAccess] access to parameter x4 -# 36| 9: [Method] M5 +# 36| 10: [Method] M5 # 36| -1: [TypeMention] S2 #-----| 2: (Parameters) # 36| 0: [Parameter] x5 @@ -900,7 +900,7 @@ Scoped.cs: # 40| 0: [ReturnStmt] return ...; # 40| 0: [ObjectCreation] object creation of type S2 # 40| 0: [TypeMention] S2 -# 43| 10: [Method] M6 +# 43| 11: [Method] M6 # 43| -1: [TypeMention] S2 #-----| 2: (Parameters) # 43| 0: [Parameter] x6 @@ -909,7 +909,7 @@ Scoped.cs: # 47| 0: [ReturnStmt] return ...; # 47| 0: [ObjectCreation] object creation of type S2 # 47| 0: [TypeMention] S2 -# 50| 11: [Method] Locals +# 50| 12: [Method] Locals # 50| -1: [TypeMention] S2 # 51| 4: [BlockStmt] {...} # 52| 0: [LocalVariableDeclStmt] ... ...; @@ -928,7 +928,7 @@ Scoped.cs: # 56| 0: [LocalVariableAccess] access to local variable y7 SignAnalysis.cs: # 1| [Class] MySignAnalysis -# 4| 5: [Method] UnsignedRightShiftSign +# 4| 6: [Method] UnsignedRightShiftSign # 4| -1: [TypeMention] Void #-----| 2: (Parameters) # 4| 0: [Parameter] x @@ -1109,27 +1109,27 @@ StaticInterfaceMembers.cs: # 23| 0: [TypeMention] T # 26| [Class] Complex #-----| 3: (Base types) -# 28| 4: [Property] Real +# 28| 5: [Property] Real # 28| -1: [TypeMention] double # 28| 2: [DoubleLiteral] 0 # 28| 3: [Getter] get_Real # 28| 4: [Setter] set_Real #-----| 2: (Parameters) # 28| 0: [Parameter] value -# 29| 5: [Property] Imaginary +# 29| 6: [Property] Imaginary # 29| -1: [TypeMention] double # 29| 2: [DoubleLiteral] 0 # 29| 3: [Getter] get_Imaginary # 29| 4: [Setter] set_Imaginary #-----| 2: (Parameters) # 29| 0: [Parameter] value -# 31| 6: [InstanceConstructor] Complex +# 31| 7: [InstanceConstructor] Complex # 31| 4: [BlockStmt] {...} -# 33| 7: [Method] Zero +# 33| 8: [Method] Zero # 33| -1: [TypeMention] Complex # 33| 4: [ObjectCreation] object creation of type Complex # 33| 0: [TypeMention] Complex -# 35| 8: [IncrementOperator] ++ +# 35| 9: [IncrementOperator] ++ # 35| -1: [TypeMention] Complex #-----| 2: (Parameters) # 35| 0: [Parameter] other @@ -1147,7 +1147,7 @@ StaticInterfaceMembers.cs: # 36| 0: [PropertyCall] access to property Imaginary # 36| 1: [PropertyCall] access to property Imaginary # 36| -1: [ParameterAccess] access to parameter other -# 38| 9: [DecrementOperator] -- +# 38| 10: [DecrementOperator] -- # 38| -1: [TypeMention] Complex #-----| 2: (Parameters) # 38| 0: [Parameter] other @@ -1165,7 +1165,7 @@ StaticInterfaceMembers.cs: # 39| 0: [PropertyCall] access to property Imaginary # 39| 1: [PropertyCall] access to property Imaginary # 39| -1: [ParameterAccess] access to parameter other -# 41| 10: [AddOperator] + +# 41| 11: [AddOperator] + # 41| -1: [TypeMention] Complex #-----| 2: (Parameters) # 41| 0: [Parameter] left @@ -1189,7 +1189,7 @@ StaticInterfaceMembers.cs: # 42| -1: [ParameterAccess] access to parameter left # 42| 1: [PropertyCall] access to property Imaginary # 42| -1: [ParameterAccess] access to parameter right -# 44| 11: [SubOperator] - +# 44| 12: [SubOperator] - # 44| -1: [TypeMention] Complex #-----| 2: (Parameters) # 44| 0: [Parameter] left @@ -1213,7 +1213,7 @@ StaticInterfaceMembers.cs: # 45| -1: [ParameterAccess] access to parameter left # 45| 1: [PropertyCall] access to property Imaginary # 45| -1: [ParameterAccess] access to parameter right -# 47| 12: [ExplicitConversionOperator] explicit conversion +# 47| 13: [ExplicitConversionOperator] explicit conversion # 47| -1: [TypeMention] int #-----| 2: (Parameters) # 47| 0: [Parameter] n @@ -1223,7 +1223,7 @@ StaticInterfaceMembers.cs: # 47| 0: [TypeMention] int # 47| 1: [PropertyCall] access to property Real # 47| -1: [ParameterAccess] access to parameter n -# 49| 13: [ExplicitConversionOperator] explicit conversion +# 49| 14: [ExplicitConversionOperator] explicit conversion # 49| -1: [TypeMention] short #-----| 2: (Parameters) # 49| 0: [Parameter] n @@ -1233,7 +1233,7 @@ StaticInterfaceMembers.cs: # 49| 0: [TypeMention] short # 49| 1: [PropertyCall] access to property Real # 49| -1: [ParameterAccess] access to parameter n -# 51| 14: [Method] Inc +# 51| 15: [Method] Inc # 51| -1: [TypeMention] INumber # 51| 1: [TypeMention] Complex # 51| -1: [TypeMention] Complex @@ -1253,7 +1253,7 @@ StaticInterfaceMembers.cs: # 52| 0: [PropertyCall] access to property Imaginary # 52| 1: [PropertyCall] access to property Imaginary # 52| -1: [ParameterAccess] access to parameter other -# 54| 15: [Method] Dec +# 54| 16: [Method] Dec # 54| -1: [TypeMention] INumber # 54| 1: [TypeMention] Complex # 54| -1: [TypeMention] Complex @@ -1273,7 +1273,7 @@ StaticInterfaceMembers.cs: # 55| 0: [PropertyCall] access to property Imaginary # 55| 1: [PropertyCall] access to property Imaginary # 55| -1: [ParameterAccess] access to parameter other -# 57| 16: [Method] Add +# 57| 17: [Method] Add # 57| -1: [TypeMention] Complex #-----| 2: (Parameters) # 57| 0: [Parameter] left @@ -1297,7 +1297,7 @@ StaticInterfaceMembers.cs: # 58| -1: [ParameterAccess] access to parameter left # 58| 1: [PropertyCall] access to property Imaginary # 58| -1: [ParameterAccess] access to parameter right -# 60| 17: [Method] Subtract +# 60| 18: [Method] Subtract # 60| -1: [TypeMention] Complex #-----| 2: (Parameters) # 60| 0: [Parameter] left @@ -1323,7 +1323,7 @@ StaticInterfaceMembers.cs: # 61| -1: [ParameterAccess] access to parameter right Strings.cs: # 3| [Class] MyTestClass -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] string #-----| 2: (Parameters) # 5| 0: [Parameter] x @@ -1342,7 +1342,7 @@ Strings.cs: # 11| 0: [DiscardPatternExpr] _ # 11| 2: [StringLiteralUtf16] "something else" # 12| 2: [StringLiteralUtf16] "." -# 15| 6: [Method] M2 +# 15| 7: [Method] M2 # 15| -1: [TypeMention] Void # 16| 4: [BlockStmt] {...} # 18| 0: [LocalVariableDeclStmt] ... ...; @@ -1377,7 +1377,7 @@ Strings.cs: # 35| 3: [InterpolatedStringInsertExpr] {...} # 35| 0: [LocalVariableAccess] access to local variable message2 # 35| 4: [StringLiteralUtf16] "}" -# 40| 7: [Method] M3 +# 40| 8: [Method] M3 # 40| -1: [TypeMention] Void # 41| 4: [BlockStmt] {...} # 43| 0: [LocalVariableDeclStmt] ... ...; @@ -1407,30 +1407,30 @@ Struct.cs: # 1| [NamespaceDeclaration] namespace ... { ... } # 3| 1: [Class] MyEmptyClass # 5| 2: [RefStruct] RefStruct -# 7| 5: [Field] MyInt +# 7| 6: [Field] MyInt # 7| -1: [TypeMention] int -# 8| 6: [Field] MyByte +# 8| 7: [Field] MyByte # 8| -1: [TypeMention] byte -# 9| 7: [Field] MyObject +# 9| 8: [Field] MyObject # 9| -1: [TypeMention] object -# 10| 8: [Field] MyEmptyClass +# 10| 9: [Field] MyEmptyClass # 10| -1: [TypeMention] MyEmptyClass -# 11| 9: [Field] MyReadonlyByte +# 11| 10: [Field] MyReadonlyByte # 11| -1: [TypeMention] byte -# 12| 10: [Field] MyReadonlyObject +# 12| 11: [Field] MyReadonlyObject # 12| -1: [TypeMention] object -# 13| 11: [Field] MyReadonlyString +# 13| 12: [Field] MyReadonlyString # 13| -1: [TypeMention] string StructDefault.cs: # 1| [Class] MyEmptyClass # 2| [Struct] StructDefaultValue -# 4| 5: [Field] X +# 4| 6: [Field] X # 4| -1: [TypeMention] int -# 5| 6: [Field] Y +# 5| 7: [Field] Y # 5| -1: [TypeMention] int -# 6| 7: [Field] Z +# 6| 8: [Field] Z # 6| -1: [TypeMention] MyEmptyClass -# 8| 8: [InstanceConstructor] StructDefaultValue +# 8| 9: [InstanceConstructor] StructDefaultValue #-----| 2: (Parameters) # 8| 0: [Parameter] x # 8| -1: [TypeMention] int diff --git a/csharp/ql/test/library-tests/csharp6/MemberAccess.expected b/csharp/ql/test/library-tests/csharp6/MemberAccess.expected index 1eda117fadd..d54af10ffc3 100644 --- a/csharp/ql/test/library-tests/csharp6/MemberAccess.expected +++ b/csharp/ql/test/library-tests/csharp6/MemberAccess.expected @@ -4,7 +4,10 @@ memberAccess | csharp6.cs:32:38:32:70 | access to indexer | csharp6.cs:32:38:32:66 | object creation of type Dictionary | Conditional | | csharp6.cs:32:38:32:73 | access to indexer | csharp6.cs:32:38:32:70 | access to indexer | Unconditional | methodCall +| csharp6.cs:10:7:10:17 | call to method | csharp6.cs:10:7:10:17 | this access | Unconditional | | csharp6.cs:30:31:30:44 | call to method ToUpper | csharp6.cs:30:31:30:33 | access to local variable foo | Conditional | +| csharp6.cs:53:7:53:23 | call to method | csharp6.cs:53:7:53:23 | this access | Unconditional | +| csharp6.cs:55:11:55:18 | call to method | csharp6.cs:55:11:55:18 | this access | Unconditional | extensionMethodCall | csharp6.cs:29:35:29:44 | call to method Any | csharp6.cs:29:35:29:37 | access to local variable bar | Conditional | | csharp6.cs:30:31:30:66 | call to method Select | csharp6.cs:30:31:30:44 | call to method ToUpper | Unconditional | diff --git a/csharp/ql/test/library-tests/csharp6/PrintAst.expected b/csharp/ql/test/library-tests/csharp6/PrintAst.expected index 424a18bcb02..78747650190 100644 --- a/csharp/ql/test/library-tests/csharp6/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp6/PrintAst.expected @@ -1,17 +1,17 @@ csharp6.cs: # 10| [Class] TestCSharp6 -# 12| 6: [Property] Value +# 12| 7: [Property] Value # 12| -1: [TypeMention] int # 15| 2: [IntLiteral] 20 # 14| 3: [Getter] get_Value -# 17| 7: [Method] Fn +# 17| 8: [Method] Fn # 17| -1: [TypeMention] Void #-----| 2: (Parameters) # 17| 0: [Parameter] x # 17| -1: [TypeMention] string # 17| 4: [MethodCall] call to method WriteLine # 17| 0: [ParameterAccess] access to parameter x -# 19| 8: [Method] Main +# 19| 9: [Method] Main # 19| -1: [TypeMention] Void # 20| 4: [BlockStmt] {...} # 21| 0: [TryStmt] try {...} ... @@ -112,7 +112,7 @@ csharp6.cs: # 37| 1: [IntLiteral] 30 # 40| 3: [GeneralCatchClause] catch {...} # 41| 1: [BlockStmt] {...} -# 45| 9: [EQOperator] == +# 45| 10: [EQOperator] == # 45| -1: [TypeMention] bool #-----| 2: (Parameters) # 45| 0: [Parameter] t1 @@ -120,7 +120,7 @@ csharp6.cs: # 45| 1: [Parameter] t2 # 45| -1: [TypeMention] TestCSharp6 # 45| 4: [BoolLiteral] true -# 46| 10: [NEOperator] != +# 46| 11: [NEOperator] != # 46| -1: [TypeMention] bool #-----| 2: (Parameters) # 46| 0: [Parameter] t1 @@ -128,11 +128,11 @@ csharp6.cs: # 46| 1: [Parameter] t2 # 46| -1: [TypeMention] TestCSharp6 # 46| 4: [BoolLiteral] false -# 48| 11: [Property] ExprProperty +# 48| 12: [Property] ExprProperty # 48| -1: [TypeMention] int # 48| 3: [Getter] get_ExprProperty # 48| 4: [IntLiteral] 3 -# 50| 12: [Indexer] Item +# 50| 13: [Indexer] Item # 50| -1: [TypeMention] int #-----| 1: (Parameters) # 50| 0: [Parameter] i @@ -142,12 +142,12 @@ csharp6.cs: # 50| 0: [Parameter] i # 50| 4: [ParameterAccess] access to parameter i # 53| [Class] IndexInitializers -# 55| 5: [Class] Compound -# 57| 5: [Field] DictionaryField +# 55| 6: [Class] Compound +# 57| 6: [Field] DictionaryField # 57| -1: [TypeMention] Dictionary # 57| 1: [TypeMention] int # 57| 2: [TypeMention] string -# 58| 6: [Property] DictionaryProperty +# 58| 7: [Property] DictionaryProperty # 58| -1: [TypeMention] Dictionary # 58| 1: [TypeMention] int # 58| 2: [TypeMention] string @@ -155,27 +155,27 @@ csharp6.cs: # 58| 4: [Setter] set_DictionaryProperty #-----| 2: (Parameters) # 58| 0: [Parameter] value -# 59| 7: [Field] ArrayField +# 59| 8: [Field] ArrayField # 59| -1: [TypeMention] String[] # 59| 1: [TypeMention] string -# 60| 8: [Property] ArrayProperty +# 60| 9: [Property] ArrayProperty # 60| -1: [TypeMention] String[] # 60| 1: [TypeMention] string # 60| 3: [Getter] get_ArrayProperty # 60| 4: [Setter] set_ArrayProperty #-----| 2: (Parameters) # 60| 0: [Parameter] value -# 61| 9: [Field] ArrayField2 +# 61| 10: [Field] ArrayField2 # 61| -1: [TypeMention] String[,] # 61| 1: [TypeMention] string -# 62| 10: [Property] ArrayProperty2 +# 62| 11: [Property] ArrayProperty2 # 62| -1: [TypeMention] String[,] # 62| 1: [TypeMention] string # 62| 3: [Getter] get_ArrayProperty2 # 62| 4: [Setter] set_ArrayProperty2 #-----| 2: (Parameters) # 62| 0: [Parameter] value -# 65| 6: [Method] Test +# 65| 7: [Method] Test # 65| -1: [TypeMention] Void # 66| 4: [BlockStmt] {...} # 68| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/csharp7.1/PrintAst.expected b/csharp/ql/test/library-tests/csharp7.1/PrintAst.expected index 7f4e1467218..b33c09db0ec 100644 --- a/csharp/ql/test/library-tests/csharp7.1/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp7.1/PrintAst.expected @@ -1,6 +1,6 @@ csharp71.cs: # 1| [Class] DefaultLiterals -# 3| 5: [Method] f +# 3| 6: [Method] f # 3| -1: [TypeMention] Void # 4| 4: [BlockStmt] {...} # 5| 0: [LocalVariableDeclStmt] ... ...; @@ -50,7 +50,7 @@ csharp71.cs: # 15| 1: [CastExpr] (...) ... # 15| 1: [DefaultValueExpr] default # 19| [Class] IsConstants -# 21| 5: [Method] f +# 21| 6: [Method] f # 21| -1: [TypeMention] Void # 22| 4: [BlockStmt] {...} # 23| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/csharp7.2/PrintAst.expected b/csharp/ql/test/library-tests/csharp7.2/PrintAst.expected index 834b03b4471..bbfb098c3af 100644 --- a/csharp/ql/test/library-tests/csharp7.2/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp7.2/PrintAst.expected @@ -1,13 +1,13 @@ csharp72.cs: # 3| [Class] InModifiers -# 5| 5: [Struct] S -# 9| 6: [Method] F +# 5| 6: [Struct] S +# 9| 7: [Method] F # 9| -1: [TypeMention] Void #-----| 2: (Parameters) # 9| 0: [Parameter] s # 9| -1: [TypeMention] S # 10| 4: [BlockStmt] {...} -# 13| 7: [Method] CallF +# 13| 8: [Method] CallF # 13| -1: [TypeMention] Void # 14| 4: [BlockStmt] {...} # 15| 0: [LocalVariableDeclStmt] ... ...; @@ -20,26 +20,26 @@ csharp72.cs: # 16| 0: [MethodCall] call to method F # 16| 0: [LocalVariableAccess] access to local variable s # 20| [Class] RefReadonlyReturns -# 22| 5: [Field] s +# 22| 6: [Field] s # 22| -1: [TypeMention] int -# 24| 6: [Method] F +# 24| 7: [Method] F # 24| -1: [TypeMention] int # 25| 4: [BlockStmt] {...} # 26| 0: [ReturnStmt] return ...; # 26| 0: [RefExpr] ref ... # 26| 0: [FieldAccess] access to field s -# 29| 7: [DelegateType] Del +# 29| 8: [DelegateType] Del # 32| [Struct] ReadonlyStruct # 36| [RefStruct] RefStruct # 40| [RefStruct] ReadonlyRefStruct # 44| [Class] NumericLiterals -# 46| 5: [Field] binaryValue +# 46| 6: [Field] binaryValue # 46| -1: [TypeMention] int # 46| 1: [IntLiteral] 85 # 49| [Class] PrivateProtected -# 51| 5: [Field] X +# 51| 6: [Field] X # 51| -1: [TypeMention] int # 51| 1: [IntLiteral] 1 -# 53| 6: [Method] F +# 53| 7: [Method] F # 53| -1: [TypeMention] Void # 53| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/csharp7.3/PrintAst.expected b/csharp/ql/test/library-tests/csharp7.3/PrintAst.expected index 70bfee85c04..b3fa3781436 100644 --- a/csharp/ql/test/library-tests/csharp7.3/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp7.3/PrintAst.expected @@ -1,6 +1,6 @@ csharp73.cs: # 3| [Class] StackAllocs -# 5| 5: [Method] Fn +# 5| 6: [Method] Fn # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; @@ -58,7 +58,7 @@ csharp73.cs: # 12| 1: [IntLiteral] 2 # 12| 2: [IntLiteral] 3 # 16| [Class] PinnedReference -# 18| 5: [Method] F +# 18| 6: [Method] F # 18| -1: [TypeMention] Void # 19| 4: [BlockStmt] {...} # 20| 0: [LocalVariableDeclStmt] ... ...; @@ -75,8 +75,8 @@ csharp73.cs: # 22| -1: [TypeMention] Span # 22| 1: [TypeMention] int # 22| 0: [LocalVariableAccess] access to local variable t -# 22| 1: [OperatorCall] call to operator implicit conversion -# 22| 0: [ArrayCreation] array creation of type Int32[] +# 22| 1: [CastExpr] (...) ... +# 22| 1: [ArrayCreation] array creation of type Int32[] # 22| -1: [TypeMention] Int32[] # 22| 1: [TypeMention] int # 22| 0: [IntLiteral] 10 @@ -91,7 +91,7 @@ csharp73.cs: #-----| 1: (Type parameters) # 38| 0: [TypeParameter] T # 42| [Class] ExpressionVariables -# 44| 4: [InstanceConstructor] ExpressionVariables +# 44| 5: [InstanceConstructor] ExpressionVariables #-----| 2: (Parameters) # 44| 0: [Parameter] x # 44| -1: [TypeMention] int @@ -100,7 +100,7 @@ csharp73.cs: # 46| 0: [AssignExpr] ... = ... # 46| 0: [ParameterAccess] access to parameter x # 46| 1: [IntLiteral] 5 -# 49| 5: [InstanceConstructor] ExpressionVariables +# 49| 6: [InstanceConstructor] ExpressionVariables # 49| 3: [ConstructorInitializer] call to constructor ExpressionVariables # 49| 0: [LocalVariableAccess,LocalVariableDeclExpr] Int32 x # 50| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/csharp7/CSharp7.cs b/csharp/ql/test/library-tests/csharp7/CSharp7.cs index c17b4164120..d067dc66a4d 100644 --- a/csharp/ql/test/library-tests/csharp7/CSharp7.cs +++ b/csharp/ql/test/library-tests/csharp7/CSharp7.cs @@ -11,13 +11,13 @@ class Literals class ExpressionBodiedMembers { - int field = 0; - int Foo() => field; + int @field = 0; + int Foo() => @field; int P => 5; int Q { get => Foo(); - set => field = value; + set => @field = value; } ExpressionBodiedMembers() : this(1) { } ExpressionBodiedMembers(int x) => Foo(); diff --git a/csharp/ql/test/library-tests/csharp7/DefUse.expected b/csharp/ql/test/library-tests/csharp7/DefUse.expected index fb55afb5e51..ac466f9e865 100644 --- a/csharp/ql/test/library-tests/csharp7/DefUse.expected +++ b/csharp/ql/test/library-tests/csharp7/DefUse.expected @@ -1,4 +1,4 @@ -| CSharp7.cs:20:9:20:11 | value | CSharp7.cs:20:24:20:28 | access to parameter value | +| CSharp7.cs:20:9:20:11 | value | CSharp7.cs:20:25:20:29 | access to parameter value | | CSharp7.cs:29:19:29:19 | i | CSharp7.cs:31:16:31:16 | access to parameter i | | CSharp7.cs:29:19:29:19 | i | CSharp7.cs:31:24:31:24 | access to parameter i | | CSharp7.cs:42:19:42:19 | x | CSharp7.cs:44:13:44:13 | access to parameter x | diff --git a/csharp/ql/test/library-tests/csharp7/ExpressionBodies.expected b/csharp/ql/test/library-tests/csharp7/ExpressionBodies.expected index fcba5499d77..c2575373d51 100644 --- a/csharp/ql/test/library-tests/csharp7/ExpressionBodies.expected +++ b/csharp/ql/test/library-tests/csharp7/ExpressionBodies.expected @@ -1,7 +1,7 @@ -| CSharp7.cs:15:9:15:11 | Foo | CSharp7.cs:15:18:15:22 | access to field field | +| CSharp7.cs:15:9:15:11 | Foo | CSharp7.cs:15:18:15:23 | access to field field | | CSharp7.cs:16:14:16:14 | get_P | CSharp7.cs:16:14:16:14 | 5 | | CSharp7.cs:19:9:19:11 | get_Q | CSharp7.cs:19:16:19:20 | call to method Foo | -| CSharp7.cs:20:9:20:11 | set_Q | CSharp7.cs:20:16:20:28 | ... = ... | +| CSharp7.cs:20:9:20:11 | set_Q | CSharp7.cs:20:16:20:29 | ... = ... | | CSharp7.cs:23:5:23:27 | ExpressionBodiedMembers | CSharp7.cs:23:39:23:43 | call to method Foo | | CSharp7.cs:24:6:24:28 | ~ExpressionBodiedMembers | CSharp7.cs:24:35:24:39 | call to method Foo | | CSharp7.cs:135:9:135:22 | f3 | CSharp7.cs:135:21:135:21 | 2 | diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected index 0a5266ed359..ebe04faf725 100644 --- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected @@ -1,3 +1,4 @@ +| CSharp7.cs:5:7:5:14 | this | CSharp7.cs:5:7:5:14 | this access | | CSharp7.cs:5:7:5:14 | this | CSharp7.cs:7:9:7:9 | this access | | CSharp7.cs:7:9:7:9 | [post] this access | CSharp7.cs:8:9:8:9 | this access | | CSharp7.cs:7:9:7:9 | this access | CSharp7.cs:8:9:8:9 | this access | @@ -6,23 +7,26 @@ | CSharp7.cs:8:9:8:9 | this access | CSharp7.cs:9:9:9:9 | this access | | CSharp7.cs:8:13:8:19 | 123456 | CSharp7.cs:8:9:8:9 | access to field y | | CSharp7.cs:9:13:9:23 | 128 | CSharp7.cs:9:9:9:9 | access to field z | -| CSharp7.cs:14:9:14:13 | [post] this access | CSharp7.cs:23:39:23:43 | this access | -| CSharp7.cs:14:9:14:13 | this access | CSharp7.cs:23:39:23:43 | this access | -| CSharp7.cs:14:17:14:17 | 0 | CSharp7.cs:14:9:14:13 | access to field field | -| CSharp7.cs:15:9:15:11 | SSA entry def(this.field) | CSharp7.cs:15:18:15:22 | access to field field | -| CSharp7.cs:15:9:15:11 | this | CSharp7.cs:15:18:15:22 | this access | +| CSharp7.cs:12:7:12:29 | this | CSharp7.cs:14:9:14:14 | this access | +| CSharp7.cs:14:18:14:18 | 0 | CSharp7.cs:14:9:14:14 | access to field field | +| CSharp7.cs:15:9:15:11 | SSA entry def(this.field) | CSharp7.cs:15:18:15:23 | access to field field | +| CSharp7.cs:15:9:15:11 | this | CSharp7.cs:15:18:15:23 | this access | | CSharp7.cs:19:9:19:11 | this | CSharp7.cs:19:16:19:20 | this access | -| CSharp7.cs:20:9:20:11 | SSA param(value) | CSharp7.cs:20:24:20:28 | access to parameter value | -| CSharp7.cs:20:9:20:11 | this | CSharp7.cs:20:16:20:20 | this access | +| CSharp7.cs:20:9:20:11 | SSA param(value) | CSharp7.cs:20:25:20:29 | access to parameter value | +| CSharp7.cs:20:9:20:11 | this | CSharp7.cs:20:16:20:21 | this access | | CSharp7.cs:20:9:20:11 | value | CSharp7.cs:20:9:20:11 | SSA param(value) | -| CSharp7.cs:20:24:20:28 | access to parameter value | CSharp7.cs:20:16:20:20 | access to field field | -| CSharp7.cs:23:5:23:27 | this | CSharp7.cs:14:9:14:13 | this access | +| CSharp7.cs:20:25:20:29 | access to parameter value | CSharp7.cs:20:16:20:21 | access to field field | +| CSharp7.cs:23:5:23:27 | [post] this access | CSharp7.cs:23:39:23:43 | this access | +| CSharp7.cs:23:5:23:27 | this | CSharp7.cs:23:5:23:27 | this access | +| CSharp7.cs:23:5:23:27 | this access | CSharp7.cs:23:39:23:43 | this access | | CSharp7.cs:24:6:24:28 | this | CSharp7.cs:24:35:24:39 | this access | +| CSharp7.cs:27:7:27:15 | this | CSharp7.cs:27:7:27:15 | this access | | CSharp7.cs:29:19:29:19 | SSA param(i) | CSharp7.cs:31:16:31:16 | access to parameter i | | CSharp7.cs:29:19:29:19 | i | CSharp7.cs:29:19:29:19 | SSA param(i) | | CSharp7.cs:31:16:31:16 | access to parameter i | CSharp7.cs:31:16:31:20 | ... > ... | | CSharp7.cs:31:16:31:16 | access to parameter i | CSharp7.cs:31:24:31:24 | access to parameter i | | CSharp7.cs:31:24:31:24 | access to parameter i | CSharp7.cs:31:16:31:59 | ... ? ... : ... | +| CSharp7.cs:35:7:35:18 | this | CSharp7.cs:35:7:35:18 | this access | | CSharp7.cs:39:9:39:9 | access to parameter x | CSharp7.cs:39:9:39:21 | SSA def(x) | | CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:9 | access to parameter x | | CSharp7.cs:42:19:42:19 | SSA param(x) | CSharp7.cs:44:13:44:13 | access to parameter x | @@ -48,6 +52,7 @@ | CSharp7.cs:55:30:55:31 | SSA def(t4) | CSharp7.cs:56:18:56:19 | access to local variable t4 | | CSharp7.cs:55:30:55:31 | String t4 | CSharp7.cs:55:30:55:31 | SSA def(t4) | | CSharp7.cs:56:18:56:19 | access to local variable t4 | CSharp7.cs:56:13:56:14 | access to local variable t5 | +| CSharp7.cs:60:7:60:12 | this | CSharp7.cs:60:7:60:12 | this access | | CSharp7.cs:67:10:67:20 | this | CSharp7.cs:69:26:69:28 | this access | | CSharp7.cs:69:26:69:28 | [post] this access | CSharp7.cs:70:17:70:19 | this access | | CSharp7.cs:69:26:69:28 | call to method F | CSharp7.cs:69:9:69:22 | (..., ...) | @@ -136,6 +141,7 @@ | CSharp7.cs:121:22:121:36 | ... = ... | CSharp7.cs:121:16:121:18 | access to local variable m13 | | CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:24 | access to local variable m12 | | CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:36 | ... = ... | +| CSharp7.cs:125:7:125:20 | this | CSharp7.cs:125:7:125:20 | this access | | CSharp7.cs:127:9:127:12 | this | CSharp7.cs:133:24:133:25 | this access | | CSharp7.cs:129:20:129:20 | SSA param(x) | CSharp7.cs:129:32:129:32 | access to parameter x | | CSharp7.cs:129:20:129:20 | x | CSharp7.cs:129:20:129:20 | SSA param(x) | @@ -191,6 +197,7 @@ | CSharp7.cs:181:23:181:25 | [post] access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | | CSharp7.cs:181:23:181:25 | access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | | CSharp7.cs:182:21:182:26 | call to local function h | CSharp7.cs:182:13:182:17 | access to local variable sink3 | +| CSharp7.cs:186:7:186:10 | this | CSharp7.cs:186:7:186:10 | this access | | CSharp7.cs:188:10:188:11 | this | CSharp7.cs:197:14:197:23 | this access | | CSharp7.cs:190:13:190:14 | access to local variable v1 | CSharp7.cs:190:13:190:18 | SSA def(v1) | | CSharp7.cs:190:13:190:18 | SSA def(v1) | CSharp7.cs:191:26:191:27 | access to local variable v1 | @@ -224,6 +231,7 @@ | CSharp7.cs:202:24:202:24 | p | CSharp7.cs:202:24:202:24 | SSA param(p) | | CSharp7.cs:204:28:204:28 | SSA param(q) | CSharp7.cs:204:44:204:44 | access to parameter q | | CSharp7.cs:204:28:204:28 | q | CSharp7.cs:204:28:204:28 | SSA param(q) | +| CSharp7.cs:211:7:211:14 | this | CSharp7.cs:211:7:211:14 | this access | | CSharp7.cs:215:9:215:9 | access to parameter x | CSharp7.cs:215:9:215:17 | SSA def(x) | | CSharp7.cs:215:13:215:17 | false | CSharp7.cs:215:9:215:9 | access to parameter x | | CSharp7.cs:219:10:219:13 | this | CSharp7.cs:221:13:221:20 | this access | @@ -237,6 +245,7 @@ | CSharp7.cs:223:22:223:29 | call to method f | CSharp7.cs:223:9:223:18 | (..., ...) | | CSharp7.cs:223:22:223:29 | this access | CSharp7.cs:224:22:224:33 | this access | | CSharp7.cs:224:22:224:33 | call to method f | CSharp7.cs:224:9:224:18 | (..., ...) | +| CSharp7.cs:228:7:228:14 | this | CSharp7.cs:228:7:228:14 | this access | | CSharp7.cs:232:16:232:16 | access to local variable o | CSharp7.cs:232:16:232:23 | SSA def(o) | | CSharp7.cs:232:16:232:23 | SSA def(o) | CSharp7.cs:233:13:233:13 | access to local variable o | | CSharp7.cs:232:20:232:23 | null | CSharp7.cs:232:16:232:16 | access to local variable o | @@ -303,6 +312,7 @@ | CSharp7.cs:264:37:264:43 | "string " | CSharp7.cs:264:35:264:48 | $"..." | | CSharp7.cs:264:44:264:47 | {...} | CSharp7.cs:264:35:264:48 | $"..." | | CSharp7.cs:264:45:264:46 | access to local variable s2 | CSharp7.cs:264:44:264:47 | {...} | +| CSharp7.cs:278:7:278:23 | this | CSharp7.cs:278:7:278:23 | this access | | CSharp7.cs:282:13:282:16 | access to local variable dict | CSharp7.cs:282:13:282:48 | SSA def(dict) | | CSharp7.cs:282:13:282:48 | SSA def(dict) | CSharp7.cs:283:20:283:23 | access to local variable dict | | CSharp7.cs:282:20:282:48 | object creation of type Dictionary | CSharp7.cs:282:13:282:16 | access to local variable dict | @@ -316,6 +326,7 @@ | CSharp7.cs:283:51:283:54 | access to parameter item | CSharp7.cs:283:51:283:60 | access to property Value | | CSharp7.cs:285:39:285:42 | access to local variable list | CSharp7.cs:287:36:287:39 | access to local variable list | | CSharp7.cs:287:36:287:39 | access to local variable list | CSharp7.cs:289:32:289:35 | access to local variable list | +| CSharp7.cs:293:7:293:14 | this | CSharp7.cs:293:7:293:14 | this access | | CSharp7.cs:297:18:297:18 | access to local variable x | CSharp7.cs:297:18:297:22 | SSA def(x) | | CSharp7.cs:297:18:297:22 | SSA def(x) | CSharp7.cs:297:25:297:25 | access to local variable x | | CSharp7.cs:297:22:297:22 | 0 | CSharp7.cs:297:18:297:18 | access to local variable x | diff --git a/csharp/ql/test/library-tests/csharp7/PrintAst.expected b/csharp/ql/test/library-tests/csharp7/PrintAst.expected index bf0b07abbeb..47ab207bb55 100644 --- a/csharp/ql/test/library-tests/csharp7/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp7/PrintAst.expected @@ -1,26 +1,26 @@ CSharp7.cs: # 5| [Class] Literals -# 7| 5: [Field] x +# 7| 6: [Field] x # 7| -1: [TypeMention] int # 7| 1: [IntLiteral] 11 -# 8| 6: [Field] y +# 8| 7: [Field] y # 8| -1: [TypeMention] int # 8| 1: [IntLiteral] 123456 -# 9| 7: [Field] z +# 9| 8: [Field] z # 9| -1: [TypeMention] int # 9| 1: [IntLiteral] 128 # 12| [Class] ExpressionBodiedMembers -# 14| 4: [Field] field +# 14| 5: [Field] field # 14| -1: [TypeMention] int # 14| 1: [IntLiteral] 0 -# 15| 5: [Method] Foo +# 15| 6: [Method] Foo # 15| -1: [TypeMention] int # 15| 4: [FieldAccess] access to field field -# 16| 6: [Property] P +# 16| 7: [Property] P # 16| -1: [TypeMention] int # 16| 3: [Getter] get_P # 16| 4: [IntLiteral] 5 -# 17| 7: [Property] Q +# 17| 8: [Property] Q # 17| -1: [TypeMention] int # 19| 3: [Getter] get_Q # 19| 4: [MethodCall] call to method Foo @@ -30,19 +30,19 @@ CSharp7.cs: # 20| 4: [AssignExpr] ... = ... # 20| 0: [FieldAccess] access to field field # 20| 1: [ParameterAccess] access to parameter value -# 22| 8: [InstanceConstructor] ExpressionBodiedMembers +# 22| 9: [InstanceConstructor] ExpressionBodiedMembers # 22| 3: [ConstructorInitializer] call to constructor ExpressionBodiedMembers # 22| 0: [IntLiteral] 1 # 22| 4: [BlockStmt] {...} -# 23| 9: [InstanceConstructor] ExpressionBodiedMembers +# 23| 10: [InstanceConstructor] ExpressionBodiedMembers #-----| 2: (Parameters) # 23| 0: [Parameter] x # 23| -1: [TypeMention] int # 23| 4: [MethodCall] call to method Foo -# 24| 10: [Destructor] ~ExpressionBodiedMembers +# 24| 11: [Destructor] ~ExpressionBodiedMembers # 24| 4: [MethodCall] call to method Foo # 27| [Class] ThrowExpr -# 29| 5: [Method] Throw +# 29| 6: [Method] Throw # 29| -1: [TypeMention] int #-----| 2: (Parameters) # 29| 0: [Parameter] i @@ -59,7 +59,7 @@ CSharp7.cs: # 31| -1: [TypeMention] ArgumentException # 31| 0: [StringLiteralUtf16] "i" # 35| [Class] OutVariables -# 37| 5: [Method] F +# 37| 6: [Method] F # 37| -1: [TypeMention] Void #-----| 2: (Parameters) # 37| 0: [Parameter] x @@ -69,7 +69,7 @@ CSharp7.cs: # 39| 0: [AssignExpr] ... = ... # 39| 0: [ParameterAccess] access to parameter x # 39| 1: [StringLiteralUtf16] "tainted" -# 42| 6: [Method] G +# 42| 7: [Method] G # 42| -1: [TypeMention] Void #-----| 2: (Parameters) # 42| 0: [Parameter] x @@ -81,7 +81,7 @@ CSharp7.cs: # 44| 0: [AssignExpr] ... = ... # 44| 0: [ParameterAccess] access to parameter y # 44| 1: [ParameterAccess] access to parameter x -# 47| 7: [Method] G +# 47| 8: [Method] G # 47| -1: [TypeMention] Void # 48| 4: [BlockStmt] {...} # 49| 0: [ExprStmt] ...; @@ -116,7 +116,7 @@ CSharp7.cs: # 56| 0: [LocalVariableAccess] access to local variable t5 # 56| 1: [LocalVariableAccess] access to local variable t4 # 60| [Class] Tuples -# 62| 5: [Method] F +# 62| 6: [Method] F # 62| -1: [TypeMention] (int, int) # 62| 1: [TypeMention] int # 62| 2: [TypeMention] int @@ -125,7 +125,7 @@ CSharp7.cs: # 64| 0: [TupleExpr] (..., ...) # 64| 0: [IntLiteral] 1 # 64| 1: [IntLiteral] 2 -# 67| 6: [Method] Expressions +# 67| 7: [Method] Expressions # 67| -1: [TypeMention] Void # 68| 4: [BlockStmt] {...} # 69| 0: [ExprStmt] ...; @@ -203,7 +203,7 @@ CSharp7.cs: # 77| 1: [TupleExpr] (..., ...) # 77| 0: [StringLiteralUtf16] "" # 77| 1: [LocalVariableAccess] access to local variable x -# 80| 7: [Method] I +# 80| 8: [Method] I # 80| -1: [TypeMention] string #-----| 2: (Parameters) # 80| 0: [Parameter] x @@ -214,7 +214,7 @@ CSharp7.cs: # 82| -1: [TupleExpr] (..., ...) # 82| 0: [ParameterAccess] access to parameter x # 82| 1: [IntLiteral] 2 -# 85| 8: [Method] TaintFlow +# 85| 9: [Method] TaintFlow # 85| -1: [TypeMention] Void # 86| 4: [BlockStmt] {...} # 87| 0: [LocalVariableDeclStmt] ... ...; @@ -242,7 +242,7 @@ CSharp7.cs: # 90| 1: [MethodCall] call to method I # 90| 0: [FieldAccess] access to field Item1 # 90| -1: [LocalVariableAccess] access to local variable t1 -# 93| 9: [Method] TupleExprNode +# 93| 10: [Method] TupleExprNode # 93| -1: [TypeMention] Void # 94| 4: [BlockStmt] {...} # 95| 0: [LocalVariableDeclStmt] ... ...; @@ -261,7 +261,7 @@ CSharp7.cs: # 96| 1: [TupleExpr] (..., ...) # 96| 0: [StringLiteralUtf16] "TupleExprNode2" # 96| 1: [IntLiteral] 2 -# 99| 10: [Method] TupleMemberAccess +# 99| 11: [Method] TupleMemberAccess # 99| -1: [TypeMention] Void # 100| 4: [BlockStmt] {...} # 101| 0: [LocalVariableDeclStmt] ... ...; @@ -282,7 +282,7 @@ CSharp7.cs: # 102| 1: [TupleExpr] (..., ...) # 102| 0: [StringLiteralUtf16] "TupleMemberAccess2" # 102| 1: [IntLiteral] 1 -# 105| 11: [Method] DefUse +# 105| 12: [Method] DefUse # 105| -1: [TypeMention] Void # 106| 4: [BlockStmt] {...} # 107| 0: [ExprStmt] ...; @@ -361,7 +361,7 @@ CSharp7.cs: # 121| 0: [LocalVariableAccess] access to local variable m12 # 121| 1: [StringLiteralUtf16] "DefUse3" # 125| [Class] LocalFunctions -# 127| 5: [Method] Main +# 127| 6: [Method] Main # 127| -1: [TypeMention] int # 128| 4: [BlockStmt] {...} # 129| 0: [LocalFunctionStmt] f1(...) @@ -462,7 +462,7 @@ CSharp7.cs: # 154| 0: [LocalFunctionCall] call to local function f1 # 154| -1: [LocalFunctionAccess] access to local function f1 # 154| 0: [IntLiteral] 2 -# 157| 6: [Method] Generics +# 157| 7: [Method] Generics # 157| -1: [TypeMention] Void # 158| 4: [BlockStmt] {...} # 159| 0: [LocalFunctionStmt] f(...) @@ -517,7 +517,7 @@ CSharp7.cs: # 170| -1: [LocalFunctionAccess] access to local function h # 170| 0: [StringLiteralUtf16] "" # 170| 1: [BoolLiteral] true -# 173| 7: [Method] GlobalFlow +# 173| 8: [Method] GlobalFlow # 173| -1: [TypeMention] Void # 174| 4: [BlockStmt] {...} # 175| 0: [LocalVariableDeclStmt] ... ...; @@ -571,7 +571,7 @@ CSharp7.cs: # 182| -1: [LocalFunctionAccess] access to local function h # 182| 0: [LocalVariableAccess] access to local variable src # 186| [Class] Refs -# 188| 5: [Method] F1 +# 188| 6: [Method] F1 # 188| -1: [TypeMention] Void # 189| 4: [BlockStmt] {...} # 190| 0: [LocalVariableDeclStmt] ... ...; @@ -634,7 +634,7 @@ CSharp7.cs: # 199| 0: [MethodCall] call to method F2 # 199| 0: [LocalVariableAccess] access to local variable r1 # 199| 1: [IntLiteral] 3 -# 202| 6: [Method] F2 +# 202| 7: [Method] F2 # 202| -1: [TypeMention] int #-----| 2: (Parameters) # 202| 0: [Parameter] p @@ -652,12 +652,12 @@ CSharp7.cs: # 205| 1: [ReturnStmt] return ...; # 205| 0: [RefExpr] ref ... # 205| 0: [ParameterAccess] access to parameter p -# 208| 7: [DelegateType] RefFn +# 208| 8: [DelegateType] RefFn #-----| 2: (Parameters) # 208| 0: [Parameter] p # 208| -1: [TypeMention] int # 211| [Class] Discards -# 213| 5: [Method] f +# 213| 6: [Method] f # 213| -1: [TypeMention] (int, double) # 213| 1: [TypeMention] int # 213| 2: [TypeMention] double @@ -673,7 +673,7 @@ CSharp7.cs: # 216| 0: [TupleExpr] (..., ...) # 216| 0: [IntLiteral] 0 # 216| 1: [DoubleLiteral] 0 -# 219| 6: [Method] Test +# 219| 7: [Method] Test # 219| -1: [TypeMention] Void # 220| 4: [BlockStmt] {...} # 221| 0: [ExprStmt] ...; @@ -703,7 +703,7 @@ CSharp7.cs: # 224| 1: [MethodCall] call to method f # 224| 0: [LocalVariableAccess,LocalVariableDeclExpr] Boolean z # 228| [Class] Patterns -# 230| 5: [Method] Test +# 230| 6: [Method] Test # 230| -1: [TypeMention] Void # 231| 4: [BlockStmt] {...} # 232| 0: [LocalVariableDeclStmt] ... ...; @@ -839,7 +839,7 @@ CSharp7.cs: # 272| 0: [StringLiteralUtf16] "Something else" # 273| 23: [BreakStmt] break; # 278| [Class] ForeachStatements -# 280| 5: [Method] Test +# 280| 6: [Method] Test # 280| -1: [TypeMention] Void # 281| 4: [BlockStmt] {...} # 282| 0: [LocalVariableDeclStmt] ... ...; @@ -883,7 +883,7 @@ CSharp7.cs: # 289| 1: [LocalVariableAccess] access to local variable list # 289| 2: [BlockStmt] {...} # 293| [Class] ForLoops -# 295| 5: [Method] Test +# 295| 6: [Method] Test # 295| -1: [TypeMention] Void # 296| 4: [BlockStmt] {...} # 297| 0: [ForStmt] for (...;...;...) ... diff --git a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected index 6ad47e73d01..fb2ca2f1759 100644 --- a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected +++ b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected @@ -153,6 +153,7 @@ arrayElements | NullableRefTypes.cs:150:27:150:27 | k | NullableRefTypes.cs:6:7:6:13 | MyClass[,,,][][,][,,] | NullableRefTypes.cs:6:7:6:13 | MyClass[][,][,,] | | NullableRefTypes.cs:151:29:151:29 | l | NullableRefTypes.cs:6:7:6:13 | MyClass?[,,,][][,]?[,,] | NullableRefTypes.cs:6:7:6:13 | MyClass?[,,,][][,]? | returnTypes +| NullableRefTypes.cs:6:7:6:13 | | Void | | NullableRefTypes.cs:6:7:6:13 | MyClass | Void! | | NullableRefTypes.cs:13:19:13:22 | get_C | MyClass? | | NullableRefTypes.cs:14:18:14:21 | get_D | MyClass! | @@ -179,14 +180,18 @@ returnTypes | NullableRefTypes.cs:51:12:51:15 | Q | object! | | NullableRefTypes.cs:51:12:51:15 | Q`1 | object! | | NullableRefTypes.cs:54:11:54:17 | Generic | Void! | +| NullableRefTypes.cs:54:11:54:33 | | Void | | NullableRefTypes.cs:58:11:58:18 | Generic2 | Void! | +| NullableRefTypes.cs:58:11:58:26 | | Void | | NullableRefTypes.cs:67:10:67:21 | GenericFn | Void | | NullableRefTypes.cs:67:10:67:21 | GenericFn | Void! | | NullableRefTypes.cs:67:10:67:21 | GenericFn`1 | Void! | | NullableRefTypes.cs:71:14:71:18 | CallF | MyStruct! | +| NullableRefTypes.cs:80:7:80:22 | | Void | | NullableRefTypes.cs:80:7:80:22 | NullableRefTypes | Void! | | NullableRefTypes.cs:82:10:82:40 | TestSuppressNullableWarningExpr | Void! | | NullableRefTypes.cs:91:10:91:34 | FunctionInNullableContext | Void! | +| NullableRefTypes.cs:100:7:100:14 | | Void | | NullableRefTypes.cs:100:7:100:14 | RefTypes | Void! | | NullableRefTypes.cs:103:18:103:28 | ReturnsRef1 | ref MyClass? | | NullableRefTypes.cs:104:17:104:27 | ReturnsRef2 | ref MyClass! | @@ -196,12 +201,17 @@ returnTypes | NullableRefTypes.cs:108:26:108:36 | ReturnsRef6 | readonly MyClass! | | NullableRefTypes.cs:110:10:110:20 | Parameters1 | Void! | | NullableRefTypes.cs:113:32:113:44 | get_RefProperty | MyClass! | +| NullableRefTypes.cs:116:7:116:23 | | Void | | NullableRefTypes.cs:116:7:116:23 | ToStringWithTypes | Void! | +| NullableRefTypes.cs:136:7:136:24 | | Void | | NullableRefTypes.cs:136:7:136:24 | ToStringWithTypes2 | Void! | +| NullableRefTypes.cs:154:7:154:25 | | Void | | NullableRefTypes.cs:154:7:154:25 | DisabledNullability | Void! | | NullableRefTypes.cs:157:18:157:30 | get_P | MyClass | | NullableRefTypes.cs:158:13:158:14 | Fn | MyClass | +| NullableRefTypes.cs:165:8:165:15 | | Void | | NullableRefTypes.cs:165:8:165:15 | MyStruct | Void! | +| NullableRefTypes.cs:171:16:171:37 | | Void | | NullableRefTypes.cs:171:16:171:37 | TestNullableFlowStates | Void! | | NullableRefTypes.cs:173:29:173:37 | MaybeNull | string? | | NullableRefTypes.cs:175:26:175:30 | Check | Void! | @@ -245,6 +255,8 @@ annotatedTypeConstraints typeNotAnnotated expressionTypes | NullableRefTypes.cs:6:7:6:13 | call to constructor Object | object | +| NullableRefTypes.cs:6:7:6:13 | call to method | Void | +| NullableRefTypes.cs:6:7:6:13 | this access | MyClass | | NullableRefTypes.cs:13:19:13:22 | null | null | | NullableRefTypes.cs:14:18:14:21 | this access | MyClass! | | NullableRefTypes.cs:17:29:17:32 | null | null | @@ -272,7 +284,11 @@ expressionTypes | NullableRefTypes.cs:40:30:40:30 | access to local variable b | MyClass? | | NullableRefTypes.cs:51:44:51:47 | null | null | | NullableRefTypes.cs:54:11:54:17 | call to constructor Object | object | +| NullableRefTypes.cs:54:11:54:17 | call to method | Void | +| NullableRefTypes.cs:54:11:54:17 | this access | Generic | | NullableRefTypes.cs:58:11:58:18 | call to constructor Object | object | +| NullableRefTypes.cs:58:11:58:18 | call to method | Void | +| NullableRefTypes.cs:58:11:58:18 | this access | Generic2 | | NullableRefTypes.cs:73:18:73:18 | access to local variable x | MyClass! | | NullableRefTypes.cs:73:18:73:25 | MyClass x = ... | MyClass! | | NullableRefTypes.cs:73:22:73:25 | null | null | @@ -285,6 +301,8 @@ expressionTypes | NullableRefTypes.cs:76:16:76:32 | default(...) | MyStruct! | | NullableRefTypes.cs:76:24:76:31 | access to type MyStruct | MyStruct | | NullableRefTypes.cs:80:7:80:22 | call to constructor Object | object | +| NullableRefTypes.cs:80:7:80:22 | call to method | Void | +| NullableRefTypes.cs:80:7:80:22 | this access | NullableRefTypes | | NullableRefTypes.cs:84:17:84:17 | access to local variable x | string! | | NullableRefTypes.cs:84:17:84:28 | String x = ... | string! | | NullableRefTypes.cs:84:21:84:28 | "source" | string! | @@ -318,6 +336,8 @@ expressionTypes | NullableRefTypes.cs:96:9:96:28 | call to method WriteLine | Void! | | NullableRefTypes.cs:96:27:96:27 | access to local variable x | string? | | NullableRefTypes.cs:100:7:100:14 | call to constructor Object | object | +| NullableRefTypes.cs:100:7:100:14 | call to method | Void | +| NullableRefTypes.cs:100:7:100:14 | this access | RefTypes | | NullableRefTypes.cs:103:48:103:52 | ref ... | MyClass | | NullableRefTypes.cs:103:52:103:52 | access to parameter r | MyClass! | | NullableRefTypes.cs:104:48:104:52 | ref ... | MyClass | @@ -337,15 +357,25 @@ expressionTypes | NullableRefTypes.cs:113:36:113:43 | this access | RefTypes | | NullableRefTypes.cs:113:36:113:44 | ...! | MyClass? | | NullableRefTypes.cs:116:7:116:23 | call to constructor Object | object | +| NullableRefTypes.cs:116:7:116:23 | call to method | Void | +| NullableRefTypes.cs:116:7:116:23 | this access | ToStringWithTypes | | NullableRefTypes.cs:136:7:136:24 | call to constructor Object | object | +| NullableRefTypes.cs:136:7:136:24 | call to method | Void | +| NullableRefTypes.cs:136:7:136:24 | this access | ToStringWithTypes2 | | NullableRefTypes.cs:154:7:154:25 | call to constructor Object | object | +| NullableRefTypes.cs:154:7:154:25 | call to method | Void | +| NullableRefTypes.cs:154:7:154:25 | this access | DisabledNullability | | NullableRefTypes.cs:157:18:157:30 | object creation of type MyClass | MyClass | | NullableRefTypes.cs:160:17:160:17 | access to local variable a | MyClass | | NullableRefTypes.cs:160:17:160:21 | MyClass a = ... | MyClass | | NullableRefTypes.cs:160:21:160:21 | access to parameter p | MyClass | | NullableRefTypes.cs:161:16:161:16 | access to local variable a | MyClass | | NullableRefTypes.cs:165:8:165:15 | call to constructor ValueType | ValueType | +| NullableRefTypes.cs:165:8:165:15 | call to method | Void | +| NullableRefTypes.cs:165:8:165:15 | this access | MyStruct | | NullableRefTypes.cs:171:16:171:37 | call to constructor Object | object | +| NullableRefTypes.cs:171:16:171:37 | call to method | Void | +| NullableRefTypes.cs:171:16:171:37 | this access | TestNullableFlowStates | | NullableRefTypes.cs:181:17:181:17 | access to local variable x | string! | | NullableRefTypes.cs:181:17:181:31 | String x = ... | string! | | NullableRefTypes.cs:181:21:181:31 | call to method MaybeNull | string? | diff --git a/csharp/ql/test/library-tests/csharp8/PrintAst.expected b/csharp/ql/test/library-tests/csharp8/PrintAst.expected index 4ec30c915b3..f5eb7caab57 100644 --- a/csharp/ql/test/library-tests/csharp8/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp8/PrintAst.expected @@ -1,12 +1,12 @@ AlternateInterpolatedStrings.cs: # 3| [Class] AlternateInterpolatedStrings -# 5| 5: [Field] s1 +# 5| 6: [Field] s1 # 5| -1: [TypeMention] string # 5| 1: [InterpolatedStringExpr] $"..." # 5| 0: [StringLiteralUtf16] "C:" # 5| 1: [InterpolatedStringInsertExpr] {...} # 5| 0: [IntLiteral] 12 -# 6| 6: [Field] s2 +# 6| 7: [Field] s2 # 6| -1: [TypeMention] string # 6| 1: [InterpolatedStringExpr] $"..." # 6| 0: [StringLiteralUtf16] "C:" @@ -14,7 +14,7 @@ AlternateInterpolatedStrings.cs: # 6| 0: [IntLiteral] 12 AsyncStreams.cs: # 6| [Class] AsyncStreams -# 8| 5: [Method] Items +# 8| 6: [Method] Items # 8| -1: [TypeMention] IAsyncEnumerable # 8| 1: [TypeMention] int # 8| 4: [BlockStmt] {...} @@ -30,7 +30,7 @@ AsyncStreams.cs: # 11| 0: [IntLiteral] 1000 # 12| 3: [YieldReturnStmt] yield return ...; # 12| 0: [IntLiteral] 3 -# 15| 6: [Method] F +# 15| 7: [Method] F # 15| -1: [TypeMention] Void # 16| 4: [BlockStmt] {...} # 17| 0: [ForeachStmt] foreach (... ... in ...) ... @@ -103,11 +103,11 @@ DefaultInterfaceMethods.cs: # 20| [Class] Person #-----| 3: (Base types) # 20| 1: [TypeMention] IPerson -# 22| 5: [Property] Name +# 22| 6: [Property] Name # 22| -1: [TypeMention] string # 22| 3: [Getter] get_Name # 22| 4: [StringLiteralUtf16] "Petra" -# 24| 6: [Property] Greeting +# 24| 7: [Property] Greeting # 24| -1: [TypeMention] IPerson # 24| -1: [TypeMention] string # 24| 3: [Getter] get_Greeting @@ -116,14 +116,14 @@ DefaultInterfaceMethods.cs: #-----| 2: (Parameters) # 24| 0: [Parameter] value # 24| 4: [BlockStmt] {...} -# 26| 7: [Method] Greet +# 26| 8: [Method] Greet # 26| -1: [TypeMention] Void # 26| 4: [BlockStmt] {...} NameResolutionSuppressNullable.cs: # 5| [Class] MyClass2 -# 7| 5: [Field] s_signalMethod +# 7| 6: [Field] s_signalMethod # 7| -1: [TypeMention] WaitCallback -# 8| 6: [Property] SignalMethod +# 8| 7: [Property] SignalMethod # 8| -1: [TypeMention] WaitCallback # 8| 3: [Getter] get_SignalMethod # 8| 4: [MethodCall] call to method EnsureInitialized @@ -133,7 +133,7 @@ NameResolutionSuppressNullable.cs: # 8| -1: [TypeMention] WaitCallback # 8| 0: [SuppressNullableWarningExpr] ...! # 8| 0: [MethodAccess] access to method M1 -# 10| 8: [Method] EnsureInitialized`1 +# 10| 9: [Method] EnsureInitialized`1 # 10| -1: [TypeMention] T #-----| 1: (Type parameters) # 10| 0: [TypeParameter] T @@ -149,7 +149,7 @@ NameResolutionSuppressNullable.cs: # 10| 0: [ParameterAccess] access to parameter target # 10| 1: [DelegateCall] delegate call # 10| -1: [ParameterAccess] access to parameter valueFactory -# 12| 9: [Method] M1 +# 12| 10: [Method] M1 # 12| -1: [TypeMention] Void #-----| 2: (Parameters) # 12| 0: [Parameter] state @@ -157,7 +157,7 @@ NameResolutionSuppressNullable.cs: # 13| 4: [BlockStmt] {...} NullCoalescingAssignment.cs: # 3| [Class] NullCoalescingAssignment -# 5| 5: [Method] NullCoalescing +# 5| 6: [Method] NullCoalescing # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; @@ -171,19 +171,19 @@ NullCoalescingAssignment.cs: # 8| 1: [ThisAccess] this access NullableRefTypes.cs: # 6| [Class] MyClass -# 9| 5: [Field] A +# 9| 6: [Field] A # 9| -1: [TypeMention] MyClass -# 10| 6: [Field] B +# 10| 7: [Field] B # 10| -1: [TypeMention] MyClass -# 13| 7: [Property] C +# 13| 8: [Property] C # 13| -1: [TypeMention] MyClass # 13| 3: [Getter] get_C # 13| 4: [NullLiteral] null -# 14| 8: [Property] D +# 14| 9: [Property] D # 14| -1: [TypeMention] MyClass # 14| 3: [Getter] get_D # 14| 4: [ThisAccess] this access -# 17| 9: [Indexer] Item +# 17| 10: [Indexer] Item # 17| -1: [TypeMention] MyClass #-----| 1: (Parameters) # 17| 0: [Parameter] i @@ -192,7 +192,7 @@ NullableRefTypes.cs: #-----| 2: (Parameters) # 17| 0: [Parameter] i # 17| 4: [NullLiteral] null -# 18| 10: [Indexer] Item +# 18| 11: [Indexer] Item # 18| -1: [TypeMention] MyClass #-----| 1: (Parameters) # 18| 0: [Parameter] i @@ -201,7 +201,7 @@ NullableRefTypes.cs: #-----| 2: (Parameters) # 18| 0: [Parameter] i # 18| 4: [ThisAccess] this access -# 19| 11: [Indexer] Item +# 19| 12: [Indexer] Item # 19| -1: [TypeMention] MyClass #-----| 1: (Parameters) # 19| 0: [Parameter] i @@ -210,19 +210,19 @@ NullableRefTypes.cs: #-----| 2: (Parameters) # 19| 0: [Parameter] i # 19| 4: [ThisAccess] this access -# 22| 12: [Field] G1 +# 22| 13: [Field] G1 # 22| -1: [TypeMention] MyClass[] # 22| 1: [TypeMention] MyClass -# 23| 13: [Field] G2 +# 23| 14: [Field] G2 # 23| -1: [TypeMention] MyClass[] # 23| 1: [TypeMention] MyClass -# 24| 14: [Field] G3 +# 24| 15: [Field] G3 # 24| -1: [TypeMention] MyClass[] # 24| 1: [TypeMention] MyClass -# 25| 15: [Field] H +# 25| 16: [Field] H # 25| -1: [TypeMention] MyClass[][] # 25| 1: [TypeMention] MyClass -# 26| 16: [Method] ArrayFn1 +# 26| 17: [Method] ArrayFn1 # 26| -1: [TypeMention] MyClass[] # 26| 1: [TypeMention] MyClass #-----| 2: (Parameters) @@ -231,7 +231,7 @@ NullableRefTypes.cs: # 26| 1: [TypeMention] MyClass # 26| 4: [ThrowExpr] throw ... # 26| 0: [NullLiteral] null -# 27| 17: [Method] ArrayFn2 +# 27| 18: [Method] ArrayFn2 # 27| -1: [TypeMention] MyClass[] # 27| 1: [TypeMention] MyClass #-----| 2: (Parameters) @@ -240,13 +240,13 @@ NullableRefTypes.cs: # 27| 1: [TypeMention] MyClass # 27| 4: [ThrowExpr] throw ... # 27| 0: [NullLiteral] null -# 30| 18: [Method] M +# 30| 19: [Method] M # 30| -1: [TypeMention] MyClass # 30| 4: [NullLiteral] null -# 31| 19: [Method] N +# 31| 20: [Method] N # 31| -1: [TypeMention] MyClass # 31| 4: [ThisAccess] this access -# 32| 20: [Method] O +# 32| 21: [Method] O # 32| -1: [TypeMention] Void #-----| 2: (Parameters) # 32| 0: [Parameter] a @@ -254,7 +254,7 @@ NullableRefTypes.cs: # 32| 1: [Parameter] b # 32| -1: [TypeMention] MyClass # 32| 4: [BlockStmt] {...} -# 35| 21: [Method] Locals +# 35| 22: [Method] Locals # 35| -1: [TypeMention] Void # 36| 4: [BlockStmt] {...} # 37| 0: [LocalVariableDeclStmt] ... ...; @@ -280,12 +280,12 @@ NullableRefTypes.cs: # 40| 0: [LocalVariableAccess] access to local variable d # 40| 1: [RefExpr] ref ... # 40| 0: [LocalVariableAccess] access to local variable b -# 44| 22: [DelegateType] Del1 -# 47| 23: [DelegateType] Del +# 44| 23: [DelegateType] Del1 +# 47| 24: [DelegateType] Del #-----| 2: (Parameters) # 47| 0: [Parameter] x # 47| -1: [TypeMention] MyClass -# 48| 24: [Event] P +# 48| 25: [Event] P # 48| -1: [TypeMention] Del # 48| 3: [AddEventAccessor] add_P #-----| 2: (Parameters) @@ -293,7 +293,7 @@ NullableRefTypes.cs: # 48| 4: [RemoveEventAccessor] remove_P #-----| 2: (Parameters) # 48| 0: [Parameter] value -# 51| 26: [Method] Q`1 +# 51| 27: [Method] Q`1 # 51| -1: [TypeMention] object #-----| 1: (Type parameters) # 51| 0: [TypeParameter] T @@ -301,23 +301,23 @@ NullableRefTypes.cs: # 51| 0: [Parameter] t # 51| -1: [TypeMention] T # 51| 4: [NullLiteral] null -# 54| 29: [Class] Generic`4 +# 54| 30: [Class] Generic`4 #-----| 1: (Type parameters) # 54| 0: [TypeParameter] T1 # 54| 1: [TypeParameter] T2 # 54| 2: [TypeParameter] T3 # 54| 3: [TypeParameter] T4 -# 58| 30: [Class] Generic2`2 +# 58| 31: [Class] Generic2`2 #-----| 1: (Type parameters) # 58| 0: [TypeParameter] T1 # 58| 1: [TypeParameter] T2 -# 65| 31: [Field] items2 +# 65| 32: [Field] items2 # 65| -1: [TypeMention] Generic # 65| 1: [TypeMention] MyClass # 65| 2: [TypeMention] MyClass # 65| 3: [TypeMention] IDisposable # 65| 4: [TypeMention] MyClass -# 67| 33: [Method] GenericFn`1 +# 67| 34: [Method] GenericFn`1 # 67| -1: [TypeMention] Void #-----| 1: (Type parameters) # 67| 0: [TypeParameter] T @@ -325,7 +325,7 @@ NullableRefTypes.cs: # 67| 0: [Parameter] x # 67| -1: [TypeMention] T # 68| 4: [BlockStmt] {...} -# 71| 34: [Method] CallF +# 71| 35: [Method] CallF # 71| -1: [TypeMention] MyStruct # 72| 4: [BlockStmt] {...} # 73| 0: [LocalVariableDeclStmt] ... ...; @@ -344,7 +344,7 @@ NullableRefTypes.cs: # 76| 0: [TypeAccess] access to type MyStruct # 76| 0: [TypeMention] MyStruct # 80| [Class] NullableRefTypes -# 82| 5: [Method] TestSuppressNullableWarningExpr +# 82| 6: [Method] TestSuppressNullableWarningExpr # 82| -1: [TypeMention] Void # 83| 4: [BlockStmt] {...} # 84| 0: [LocalVariableDeclStmt] ... ...; @@ -372,7 +372,7 @@ NullableRefTypes.cs: # 88| 0: [LocalVariableAccess] access to local variable y # 88| 1: [SuppressNullableWarningExpr] ...! # 88| 0: [LocalVariableAccess] access to local variable x -# 91| 6: [Method] FunctionInNullableContext +# 91| 7: [Method] FunctionInNullableContext # 91| -1: [TypeMention] Void # 92| 4: [BlockStmt] {...} # 93| 0: [LocalVariableDeclStmt] ... ...; @@ -398,49 +398,49 @@ NullableRefTypes.cs: # 96| 0: [TypeMention] Console # 96| 0: [LocalVariableAccess] access to local variable x # 100| [Class] RefTypes -# 103| 5: [Method] ReturnsRef1 +# 103| 6: [Method] ReturnsRef1 # 103| -1: [TypeMention] MyClass #-----| 2: (Parameters) # 103| 0: [Parameter] r # 103| -1: [TypeMention] MyClass # 103| 4: [RefExpr] ref ... # 103| 0: [ParameterAccess] access to parameter r -# 104| 6: [Method] ReturnsRef2 +# 104| 7: [Method] ReturnsRef2 # 104| -1: [TypeMention] MyClass #-----| 2: (Parameters) # 104| 0: [Parameter] r # 104| -1: [TypeMention] MyClass # 104| 4: [RefExpr] ref ... # 104| 0: [ParameterAccess] access to parameter r -# 105| 7: [Method] ReturnsRef3 +# 105| 8: [Method] ReturnsRef3 # 105| -1: [TypeMention] MyClass #-----| 2: (Parameters) # 105| 0: [Parameter] r # 105| -1: [TypeMention] MyClass # 105| 4: [RefExpr] ref ... # 105| 0: [ParameterAccess] access to parameter r -# 106| 8: [Method] ReturnsRef4 +# 106| 9: [Method] ReturnsRef4 # 106| -1: [TypeMention] MyClass #-----| 2: (Parameters) # 106| 0: [Parameter] r # 106| -1: [TypeMention] MyClass # 106| 4: [RefExpr] ref ... # 106| 0: [ParameterAccess] access to parameter r -# 107| 9: [Method] ReturnsRef5 +# 107| 10: [Method] ReturnsRef5 # 107| -1: [TypeMention] MyClass #-----| 2: (Parameters) # 107| 0: [Parameter] r # 107| -1: [TypeMention] MyClass # 107| 4: [RefExpr] ref ... # 107| 0: [ParameterAccess] access to parameter r -# 108| 10: [Method] ReturnsRef6 +# 108| 11: [Method] ReturnsRef6 # 108| -1: [TypeMention] MyClass #-----| 2: (Parameters) # 108| 0: [Parameter] r # 108| -1: [TypeMention] MyClass # 108| 4: [RefExpr] ref ... # 108| 0: [ParameterAccess] access to parameter r -# 110| 11: [Method] Parameters1 +# 110| 12: [Method] Parameters1 # 110| -1: [TypeMention] Void #-----| 2: (Parameters) # 110| 0: [Parameter] p1 @@ -449,99 +449,99 @@ NullableRefTypes.cs: # 110| -1: [TypeMention] MyClass # 110| 4: [ThrowExpr] throw ... # 110| 0: [NullLiteral] null -# 112| 12: [Field] Property +# 112| 13: [Field] Property # 112| -1: [TypeMention] MyClass -# 113| 13: [Property] RefProperty +# 113| 14: [Property] RefProperty # 113| -1: [TypeMention] MyClass # 113| 3: [Getter] get_RefProperty # 113| 4: [RefExpr] ref ... # 113| 0: [SuppressNullableWarningExpr] ...! # 113| 0: [FieldAccess] access to field Property # 116| [Class] ToStringWithTypes -# 118| 5: [Field] a +# 118| 6: [Field] a # 118| -1: [TypeMention] MyStruct? # 118| 1: [TypeMention] MyStruct -# 119| 6: [Field] b +# 119| 7: [Field] b # 119| -1: [TypeMention] MyStruct[] # 119| 1: [TypeMention] MyStruct -# 120| 7: [Field] c +# 120| 8: [Field] c # 120| -1: [TypeMention] Nullable[] # 120| 1: [TypeMention] MyStruct? # 120| 1: [TypeMention] MyStruct -# 121| 8: [Field] d +# 121| 9: [Field] d # 121| -1: [TypeMention] Nullable[] # 121| 1: [TypeMention] MyStruct? # 121| 1: [TypeMention] MyStruct -# 123| 9: [Field] e +# 123| 10: [Field] e # 123| -1: [TypeMention] MyClass -# 124| 10: [Field] f +# 124| 11: [Field] f # 124| -1: [TypeMention] MyClass[] # 124| 1: [TypeMention] MyClass -# 125| 11: [Field] g +# 125| 12: [Field] g # 125| -1: [TypeMention] MyClass[] # 125| 1: [TypeMention] MyClass -# 126| 12: [Field] h +# 126| 13: [Field] h # 126| -1: [TypeMention] MyClass[] # 126| 1: [TypeMention] MyClass -# 128| 13: [Field] i +# 128| 14: [Field] i # 128| -1: [TypeMention] MyClass[,][][,,] # 128| 1: [TypeMention] MyClass -# 129| 14: [Field] j +# 129| 15: [Field] j # 129| -1: [TypeMention] MyClass[,,][,][] # 129| 1: [TypeMention] MyClass -# 130| 15: [Field] k +# 130| 16: [Field] k # 130| -1: [TypeMention] MyClass[,,,][][,][,,] # 130| 1: [TypeMention] MyClass -# 131| 16: [Field] l +# 131| 17: [Field] l # 131| -1: [TypeMention] MyClass[,,][,,,][][,] # 131| 1: [TypeMention] MyClass # 136| [Class] ToStringWithTypes2 -# 138| 5: [Field] a +# 138| 6: [Field] a # 138| -1: [TypeMention] MyStruct? # 138| 1: [TypeMention] MyStruct -# 139| 6: [Field] b +# 139| 7: [Field] b # 139| -1: [TypeMention] MyStruct[] # 139| 1: [TypeMention] MyStruct -# 140| 7: [Field] c +# 140| 8: [Field] c # 140| -1: [TypeMention] Nullable[] # 140| 1: [TypeMention] MyStruct? # 140| 1: [TypeMention] MyStruct -# 141| 8: [Field] d +# 141| 9: [Field] d # 141| -1: [TypeMention] Nullable[] # 141| 1: [TypeMention] MyStruct? # 141| 1: [TypeMention] MyStruct -# 143| 9: [Field] e +# 143| 10: [Field] e # 143| -1: [TypeMention] MyClass -# 144| 10: [Field] f +# 144| 11: [Field] f # 144| -1: [TypeMention] MyClass[] # 144| 1: [TypeMention] MyClass -# 145| 11: [Field] g +# 145| 12: [Field] g # 145| -1: [TypeMention] MyClass[] # 145| 1: [TypeMention] MyClass -# 146| 12: [Field] h +# 146| 13: [Field] h # 146| -1: [TypeMention] MyClass[] # 146| 1: [TypeMention] MyClass -# 148| 13: [Field] i +# 148| 14: [Field] i # 148| -1: [TypeMention] MyClass[,][][,,] # 148| 1: [TypeMention] MyClass -# 149| 14: [Field] j +# 149| 15: [Field] j # 149| -1: [TypeMention] MyClass[,,][,][] # 149| 1: [TypeMention] MyClass -# 150| 15: [Field] k +# 150| 16: [Field] k # 150| -1: [TypeMention] MyClass[,,,][][,][,,] # 150| 1: [TypeMention] MyClass -# 151| 16: [Field] l +# 151| 17: [Field] l # 151| -1: [TypeMention] MyClass[,,][,,,][][,] # 151| 1: [TypeMention] MyClass # 154| [Class] DisabledNullability -# 156| 5: [Field] f1 +# 156| 6: [Field] f1 # 156| -1: [TypeMention] MyClass -# 157| 6: [Property] P +# 157| 7: [Property] P # 157| -1: [TypeMention] MyClass # 157| 3: [Getter] get_P # 157| 4: [ObjectCreation] object creation of type MyClass # 157| 0: [TypeMention] MyClass -# 158| 7: [Method] Fn +# 158| 8: [Method] Fn # 158| -1: [TypeMention] MyClass #-----| 2: (Parameters) # 158| 0: [Parameter] p @@ -556,16 +556,16 @@ NullableRefTypes.cs: # 161| 0: [LocalVariableAccess] access to local variable a # 165| [Struct] MyStruct # 171| [Class] TestNullableFlowStates -# 173| 5: [Method] MaybeNull +# 173| 6: [Method] MaybeNull # 173| -1: [TypeMention] string -# 175| 6: [Method] Check +# 175| 7: [Method] Check # 175| -1: [TypeMention] Void #-----| 2: (Parameters) # 175| 0: [Parameter] isNull # 175| -1: [TypeMention] string -# 177| 7: [Method] Count +# 177| 8: [Method] Count # 177| -1: [TypeMention] int -# 179| 8: [Method] LoopUnrolling +# 179| 9: [Method] LoopUnrolling # 179| -1: [TypeMention] Void # 180| 4: [BlockStmt] {...} # 181| 0: [LocalVariableDeclStmt] ... ...; @@ -594,7 +594,7 @@ NullableRefTypes.cs: # 190| 3: [ExprStmt] ...; # 190| 0: [MethodCall] call to method Check # 190| 0: [LocalVariableAccess] access to local variable x -# 193| 9: [Method] ExceptionFlow +# 193| 10: [Method] ExceptionFlow # 193| -1: [TypeMention] Void # 194| 4: [BlockStmt] {...} # 195| 0: [LocalVariableDeclStmt] ... ...; @@ -615,7 +615,7 @@ NullableRefTypes.cs: # 206| 2: [ExprStmt] ...; # 206| 0: [MethodCall] call to method Check # 206| 0: [LocalVariableAccess] access to local variable y -# 209| 10: [Method] InvocationTest +# 209| 11: [Method] InvocationTest # 209| -1: [TypeMention] string #-----| 2: (Parameters) # 209| 0: [Parameter] o @@ -630,7 +630,7 @@ NullableRefTypes.cs: # 212| 1: [ReturnStmt] return ...; # 212| 0: [MethodCall] call to method ToString # 212| -1: [LocalVariableAccess] access to local variable t -# 215| 11: [Method] ElementTest +# 215| 12: [Method] ElementTest # 215| -1: [TypeMention] Void #-----| 2: (Parameters) # 215| 0: [Parameter] list @@ -663,13 +663,13 @@ NullableRefTypes.cs: # 220| 0: [LocalVariableAccess] access to local variable d # 220| 1: [FieldAccess] access to field Field # 220| -1: [MethodCall] call to method GetSelf -# 223| 12: [Method] GetSelf +# 223| 13: [Method] GetSelf # 223| -1: [TypeMention] TestNullableFlowStates -# 225| 13: [Field] Field +# 225| 14: [Field] Field # 225| -1: [TypeMention] string StaticLocalFunctions.cs: # 3| [Class] StaticLocalFunctions -# 5| 5: [Method] Fn +# 5| 6: [Method] Fn # 5| -1: [TypeMention] int #-----| 2: (Parameters) # 5| 0: [Parameter] x @@ -702,15 +702,15 @@ UnmanagedGenericStructs.cs: #-----| 1: (Type parameters) # 3| 0: [TypeParameter] T # 3| 1: [TypeParameter] U -# 5| 5: [Field] id +# 5| 6: [Field] id # 5| -1: [TypeMention] int -# 6| 6: [Field] value1 +# 6| 7: [Field] value1 # 6| -1: [TypeMention] T -# 7| 7: [Field] value2 +# 7| 8: [Field] value2 # 7| -1: [TypeMention] U UsingDeclarations.cs: # 4| [Class] UsingDeclarations -# 6| 5: [Method] TestUsingDeclarations +# 6| 6: [Method] TestUsingDeclarations # 6| -1: [TypeMention] Void # 7| 4: [BlockStmt] {...} # 8| 0: [UsingDeclStmt] using ... ...; @@ -762,7 +762,7 @@ UsingDeclarations.cs: # 15| 1: [EmptyStmt] ; patterns.cs: # 3| [Class] Patterns -# 5| 5: [Method] IsPatterns +# 5| 6: [Method] IsPatterns # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; @@ -836,7 +836,7 @@ patterns.cs: # 27| 3: [PropertyPatternExpr] { ... } # 27| 0: [DiscardPatternExpr,LabeledPatternExpr] _ # 28| 1: [BlockStmt] {...} -# 32| 6: [Method] SwitchStatements +# 32| 7: [Method] SwitchStatements # 32| -1: [TypeMention] Void # 33| 4: [BlockStmt] {...} # 34| 0: [LocalVariableDeclStmt] ... ...; @@ -1019,7 +1019,7 @@ patterns.cs: # 94| 0: [ConstantPatternExpr,IntLiteral] 2 # 94| 1: [DiscardPatternExpr] _ # 94| 3: [BreakStmt] break; -# 98| 7: [Method] Expressions +# 98| 8: [Method] Expressions # 98| -1: [TypeMention] Void #-----| 2: (Parameters) # 98| 0: [Parameter] x @@ -1108,7 +1108,7 @@ patterns.cs: # 119| 2: [TupleExpr] (..., ...) # 119| 0: [IntLiteral] 0 # 119| 1: [IntLiteral] 0 -# 123| 8: [Method] Expressions2 +# 123| 9: [Method] Expressions2 # 123| -1: [TypeMention] Void #-----| 2: (Parameters) # 123| 0: [Parameter] o @@ -1203,18 +1203,18 @@ patterns.cs: # 147| -1: [TypeAccess] access to type Console # 147| 0: [TypeMention] Console # 147| 0: [StringLiteralUtf16] "Invalid operation" -# 151| 9: [Struct] MyStruct -# 153| 5: [Field] X +# 151| 10: [Struct] MyStruct +# 153| 6: [Field] X # 153| -1: [TypeMention] int -# 154| 6: [Property] Y +# 154| 7: [Property] Y # 154| -1: [TypeMention] int # 154| 3: [Getter] get_Y # 154| 4: [IntLiteral] 10 -# 156| 7: [Property] S +# 156| 8: [Property] S # 156| -1: [TypeMention] MyStruct # 156| 3: [Getter] get_S # 156| 4: [ThisAccess] this access -# 158| 8: [Method] Deconstruct +# 158| 9: [Method] Deconstruct # 158| -1: [TypeMention] Void #-----| 2: (Parameters) # 158| 0: [Parameter] x @@ -1230,12 +1230,12 @@ patterns.cs: # 161| 0: [AssignExpr] ... = ... # 161| 0: [ParameterAccess] access to parameter y # 161| 1: [PropertyCall] access to property Y -# 164| 9: [Method] Deconstruct +# 164| 10: [Method] Deconstruct # 164| -1: [TypeMention] Void # 165| 4: [BlockStmt] {...} ranges.cs: # 3| [Class] Ranges -# 5| 5: [Method] F +# 5| 6: [Method] F # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected b/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected index eaa01512c18..a8db6605f8d 100644 --- a/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected +++ b/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected @@ -7,4 +7,6 @@ globalBlock | GlobalStmt.cs:5:1:24:0 | {...} | GlobalStmt.cs:5:1:24:0 |
$ | GlobalStmt.cs:1:1:1:0 | args | GlobalStmt.cs:5:1:24:0 | Program | methods | GlobalStmt.cs:5:1:24:0 |
$ | entry | +| GlobalStmt.cs:5:1:24:0 | | non-entry | +| GlobalStmt.cs:17:14:17:17 | | non-entry | | GlobalStmt.cs:19:8:19:9 | M1 | non-entry | diff --git a/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected b/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected index 1bf279341ce..6d7e7ca40ef 100644 --- a/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected +++ b/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected @@ -10,6 +10,7 @@ type | file://:0:0:0:0 | delegate* stdcall | Void | StdCallCallingConvention | | file://:0:0:0:0 | delegate* unmanaged | int | UnmanagedCallingConvention | | file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | +| file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | | file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | unmanagedCallingConvention parameter @@ -28,6 +29,7 @@ parameter | file://:0:0:0:0 | delegate* stdcall | 2 | file://:0:0:0:0 | `2 | T | | file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | IntPtr! | | file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | IntPtr! | +| file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | MarkCrossReferencesArgs*! | invocation | FunctionPointer.cs:17:21:17:43 | function pointer call | | FunctionPointer.cs:23:13:23:44 | function pointer call | diff --git a/csharp/ql/test/library-tests/csharp9/PrintAst.expected b/csharp/ql/test/library-tests/csharp9/PrintAst.expected index e3b89de2009..459349fb9fc 100644 --- a/csharp/ql/test/library-tests/csharp9/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp9/PrintAst.expected @@ -1,17 +1,17 @@ AnonymousObjectCreation.cs: # 5| [Class] AnonObj -# 7| 5: [Field] l +# 7| 6: [Field] l # 7| -1: [TypeMention] List # 7| 1: [TypeMention] AnonObj # 7| 1: [CastExpr] (...) ... # 7| 1: [ObjectCreation] object creation of type List -# 9| 6: [Property] Prop1 +# 9| 7: [Property] Prop1 # 9| -1: [TypeMention] int # 9| 3: [Getter] get_Prop1 # 9| 4: [Setter] set_Prop1 #-----| 2: (Parameters) # 9| 0: [Parameter] value -# 11| 7: [Method] M1 +# 11| 8: [Method] M1 # 11| -1: [TypeMention] AnonObj #-----| 2: (Parameters) # 11| 0: [Parameter] t @@ -29,17 +29,17 @@ AnonymousObjectCreation.cs: # 14| 1: [ReturnStmt] return ...; # 14| 0: [CastExpr] (...) ... # 14| 1: [ObjectCreation] object creation of type AnonObj -# 17| 8: [DelegateType] D +# 17| 9: [DelegateType] D #-----| 2: (Parameters) # 17| 0: [Parameter] x # 17| -1: [TypeMention] int -# 19| 9: [Method] M2 +# 19| 10: [Method] M2 # 19| -1: [TypeMention] Void #-----| 2: (Parameters) # 19| 0: [Parameter] x # 19| -1: [TypeMention] int # 19| 4: [BlockStmt] {...} -# 21| 10: [Method] GetM +# 21| 11: [Method] GetM # 21| -1: [TypeMention] D # 21| 4: [BlockStmt] {...} # 21| 0: [ReturnStmt] return ...; @@ -47,7 +47,7 @@ AnonymousObjectCreation.cs: # 21| 1: [ExplicitDelegateCreation] delegate creation of type D # 21| 0: [ImplicitDelegateCreation] delegate creation of type D # 21| 0: [MethodAccess] access to method M2 -# 23| 11: [Method] MethodAdd +# 23| 12: [Method] MethodAdd # 23| -1: [TypeMention] Void # 24| 4: [BlockStmt] {...} # 25| 0: [LocalVariableDeclStmt] ... ...; @@ -59,13 +59,13 @@ AnonymousObjectCreation.cs: # 25| 1: [ObjectCreation] object creation of type List BinaryPattern.cs: # 3| [Class] BinaryPattern -# 5| 5: [Property] P1 +# 5| 6: [Property] P1 # 5| -1: [TypeMention] int # 5| 3: [Getter] get_P1 # 5| 4: [Setter] set_P1 #-----| 2: (Parameters) # 5| 0: [Parameter] value -# 7| 6: [Method] M1 +# 7| 7: [Method] M1 # 7| -1: [TypeMention] bool #-----| 2: (Parameters) # 7| 0: [Parameter] c @@ -75,7 +75,7 @@ BinaryPattern.cs: # 8| 1: [OrPatternExpr] ... or ... # 8| 0: [CharLiteral,ConstantPatternExpr] a # 8| 1: [CharLiteral,ConstantPatternExpr] b -# 9| 7: [Method] M2 +# 9| 8: [Method] M2 # 9| -1: [TypeMention] bool #-----| 2: (Parameters) # 9| 0: [Parameter] c @@ -91,7 +91,7 @@ BinaryPattern.cs: # 10| 0: [TypeMention] BinaryPattern # 10| 3: [PropertyPatternExpr] { ... } # 10| 0: [ConstantPatternExpr,IntLiteral,LabeledPatternExpr] 1 -# 11| 8: [Method] M3 +# 11| 9: [Method] M3 # 11| -1: [TypeMention] bool #-----| 2: (Parameters) # 11| 0: [Parameter] c @@ -103,7 +103,7 @@ BinaryPattern.cs: # 12| 0: [TypeMention] object # 12| 1: [VariablePatternExpr] BinaryPattern u # 12| 0: [TypeMention] BinaryPattern -# 14| 9: [Method] M4 +# 14| 10: [Method] M4 # 14| -1: [TypeMention] string #-----| 2: (Parameters) # 14| 0: [Parameter] i @@ -122,7 +122,7 @@ BinaryPattern.cs: # 19| 2: [StringLiteralUtf16] "other" CovariantReturn.cs: # 1| [Class] A -# 3| 5: [Method] M1 +# 3| 6: [Method] M1 # 3| -1: [TypeMention] A # 3| 4: [BlockStmt] {...} # 3| 0: [ThrowStmt] throw ...; @@ -130,14 +130,14 @@ CovariantReturn.cs: # 6| [Class] B #-----| 3: (Base types) # 6| 0: [TypeMention] A -# 8| 5: [Method] M1 +# 8| 6: [Method] M1 # 8| -1: [TypeMention] B # 8| 4: [BlockStmt] {...} # 8| 0: [ThrowStmt] throw ...; # 8| 0: [NullLiteral] null Discard.cs: # 3| [Class] Discard -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; @@ -227,7 +227,7 @@ ForeachExtension.cs: # 14| 0: [YieldReturnStmt] yield return ...; # 14| 0: [LocalVariableAccess] access to local variable i # 19| [Class] Program -# 21| 5: [Method] Main +# 21| 6: [Method] Main # 21| -1: [TypeMention] Task # 22| 4: [BlockStmt] {...} # 23| 0: [LocalVariableDeclStmt] ... ...; @@ -273,7 +273,7 @@ ForeachExtension.cs: # 37| 1: [IntLiteral] 2 # 37| 2: [IntLiteral] 3 # 38| 2: [BlockStmt] {...} -# 42| 6: [Method] GetAsyncEnumerator +# 42| 7: [Method] GetAsyncEnumerator # 42| -1: [TypeMention] IAsyncEnumerator # 42| 1: [TypeMention] int # 43| 4: [BlockStmt] {...} @@ -289,7 +289,7 @@ ForeachExtension.cs: # 46| 0: [IntLiteral] 1 FunctionPointer.cs: # 3| [Class] FnPointer -# 5| 5: [Class] Program +# 5| 6: [Class] Program # 7| 5: [Field] pointer # 7| -1: [TypeMention] delegate* default # 7| 1: [AddressOfExpr] &... @@ -407,7 +407,7 @@ FunctionPointer.cs: # 48| 0: [TypeMention] A InitOnlyProperty.cs: # 3| [Class] Base -# 5| 5: [Property] Prop0 +# 5| 6: [Property] Prop0 # 5| -1: [TypeMention] int # 5| 3: [Getter] get_Prop0 # 5| 4: [BlockStmt] {...} @@ -421,13 +421,13 @@ InitOnlyProperty.cs: # 5| 0: [AssignExpr] ... = ... # 5| 0: [PropertyCall] access to property Prop1 # 5| 1: [ParameterAccess] access to parameter value -# 6| 6: [Property] Prop1 +# 6| 7: [Property] Prop1 # 6| -1: [TypeMention] int # 6| 3: [Getter] get_Prop1 # 6| 4: [Setter] set_Prop1 #-----| 2: (Parameters) # 6| 0: [Parameter] value -# 7| 7: [Property] Prop2 +# 7| 8: [Property] Prop2 # 7| -1: [TypeMention] int # 7| 3: [Getter] get_Prop2 # 7| 4: [Setter] set_Prop2 @@ -436,13 +436,13 @@ InitOnlyProperty.cs: # 11| [Class] Derived #-----| 3: (Base types) # 11| 0: [TypeMention] Base -# 13| 5: [Property] Prop1 +# 13| 6: [Property] Prop1 # 13| -1: [TypeMention] int # 13| 3: [Getter] get_Prop1 # 13| 4: [Setter] set_Prop1 #-----| 2: (Parameters) # 13| 0: [Parameter] value -# 14| 6: [Property] Prop2 +# 14| 7: [Property] Prop2 # 14| -1: [TypeMention] int # 16| 3: [Getter] get_Prop2 # 16| 4: [BlockStmt] {...} @@ -466,7 +466,7 @@ InitOnlyProperty.cs: # 21| 0: [PropertyCall] access to property Prop0 # 21| 1: [ParameterAccess] access to parameter value # 26| [Class] C1 -# 28| 5: [Method] M1 +# 28| 6: [Method] M1 # 28| -1: [TypeMention] Void # 29| 4: [BlockStmt] {...} # 30| 0: [LocalVariableDeclStmt] ... ...; @@ -490,7 +490,7 @@ IsExternalInit.cs: # 6| 1: [Class] IsExternalInit LambdaModifier.cs: # 4| [Class] Class1 -# 6| 5: [Method] M1 +# 6| 6: [Method] M1 # 6| -1: [TypeMention] Task # 7| 4: [BlockStmt] {...} # 8| 0: [LocalFunctionStmt] m(...) @@ -550,7 +550,7 @@ LambdaModifier.cs: # 15| 0: [TypeMention] Task LocalFunction.cs: # 4| [Class] LocalFunction -# 6| 5: [Method] M1 +# 6| 6: [Method] M1 # 6| -1: [TypeMention] Task # 7| 4: [BlockStmt] {...} # 8| 0: [LocalVariableDeclStmt] ... ...; @@ -578,7 +578,7 @@ LocalFunction.cs: # 14| 0: [IntLiteral] 2 # 16| 3: [LocalFunctionStmt] localExtern(...) # 16| 0: [LocalFunction] localExtern -# 19| 6: [Method] M2 +# 19| 7: [Method] M2 # 19| -1: [TypeMention] Void # 20| 4: [BlockStmt] {...} # 21| 0: [LocalFunctionStmt] dup(...) @@ -610,7 +610,7 @@ LocalFunction.cs: # 27| 1: [IntLiteral] 42 NativeInt.cs: # 3| [Class] NativeInt -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] Void #-----| 2: (Parameters) # 5| 0: [Parameter] j @@ -654,7 +654,7 @@ NativeInt.cs: # 12| 0: [TypeAccess] access to type IntPtr # 12| 0: [TypeMention] IntPtr # 12| 1: [IntLiteral] 42 -# 15| 6: [Method] M2 +# 15| 7: [Method] M2 # 15| -1: [TypeMention] Void # 16| 4: [BlockStmt] {...} # 17| 0: [LocalVariableDeclStmt] ... ...; @@ -718,7 +718,7 @@ NativeInt.cs: ParenthesizedPattern.cs: # 3| [Class] T # 5| [Class] ParenthesizedPattern -# 7| 5: [Method] M1 +# 7| 6: [Method] M1 # 7| -1: [TypeMention] Void #-----| 2: (Parameters) # 7| 0: [Parameter] o @@ -738,7 +738,7 @@ ParenthesizedPattern.cs: # 13| 0: [VariablePatternExpr] Object p2 # 13| 3: [PropertyPatternExpr] { ... } # 14| 1: [BlockStmt] {...} -# 18| 6: [Method] M2 +# 18| 7: [Method] M2 # 18| -1: [TypeMention] Void #-----| 2: (Parameters) # 18| 0: [Parameter] o @@ -778,23 +778,23 @@ ParenthesizedPattern.cs: # 26| 2: [IntLiteral] 5 Record.cs: # 4| [RecordClass] Person -# 4| 11: [NEOperator] != +# 4| 12: [NEOperator] != #-----| 2: (Parameters) # 4| 0: [Parameter] left # 4| 1: [Parameter] right -# 4| 12: [EQOperator] == +# 4| 13: [EQOperator] == #-----| 2: (Parameters) # 4| 0: [Parameter] left # 4| 1: [Parameter] right -# 4| 13: [Property] EqualityContract +# 4| 14: [Property] EqualityContract # 4| 3: [Getter] get_EqualityContract -# 6| 14: [Property] LastName +# 6| 15: [Property] LastName # 6| -1: [TypeMention] string # 6| 3: [Getter] get_LastName -# 7| 15: [Property] FirstName +# 7| 16: [Property] FirstName # 7| -1: [TypeMention] string # 7| 3: [Getter] get_FirstName -# 9| 16: [InstanceConstructor] Person +# 9| 17: [InstanceConstructor] Person #-----| 2: (Parameters) # 9| 0: [Parameter] first # 9| -1: [TypeMention] string @@ -808,20 +808,20 @@ Record.cs: # 9| 0: [ParameterAccess] access to parameter first # 9| 1: [ParameterAccess] access to parameter last # 12| [RecordClass] Teacher -# 12| 12: [NEOperator] != +# 12| 13: [NEOperator] != #-----| 2: (Parameters) # 12| 0: [Parameter] left # 12| 1: [Parameter] right -# 12| 13: [EQOperator] == +# 12| 14: [EQOperator] == #-----| 2: (Parameters) # 12| 0: [Parameter] left # 12| 1: [Parameter] right -# 12| 14: [Property] EqualityContract +# 12| 15: [Property] EqualityContract # 12| 3: [Getter] get_EqualityContract -# 14| 15: [Property] Subject +# 14| 16: [Property] Subject # 14| -1: [TypeMention] string # 14| 3: [Getter] get_Subject -# 16| 16: [InstanceConstructor] Teacher +# 16| 17: [InstanceConstructor] Teacher #-----| 2: (Parameters) # 16| 0: [Parameter] first # 16| -1: [TypeMention] string @@ -836,20 +836,20 @@ Record.cs: # 17| 0: [PropertyCall] access to property Subject # 17| 1: [ParameterAccess] access to parameter sub # 20| [RecordClass] Student -# 20| 12: [NEOperator] != +# 20| 13: [NEOperator] != #-----| 2: (Parameters) # 20| 0: [Parameter] left # 20| 1: [Parameter] right -# 20| 13: [EQOperator] == +# 20| 14: [EQOperator] == #-----| 2: (Parameters) # 20| 0: [Parameter] left # 20| 1: [Parameter] right -# 20| 14: [Property] EqualityContract +# 20| 15: [Property] EqualityContract # 20| 3: [Getter] get_EqualityContract -# 22| 15: [Property] Level +# 22| 16: [Property] Level # 22| -1: [TypeMention] int # 22| 3: [Getter] get_Level -# 24| 16: [InstanceConstructor] Student +# 24| 17: [InstanceConstructor] Student #-----| 2: (Parameters) # 24| 0: [Parameter] first # 24| -1: [TypeMention] string @@ -864,44 +864,44 @@ Record.cs: # 24| 0: [PropertyCall] access to property Level # 24| 1: [ParameterAccess] access to parameter level # 27| [RecordClass] Person1 -# 27| 12: [NEOperator] != +# 27| 13: [NEOperator] != #-----| 2: (Parameters) # 27| 0: [Parameter] left # 27| 1: [Parameter] right -# 27| 13: [EQOperator] == +# 27| 14: [EQOperator] == #-----| 2: (Parameters) # 27| 0: [Parameter] left # 27| 1: [Parameter] right -# 27| 14: [Property] EqualityContract +# 27| 15: [Property] EqualityContract # 27| 3: [Getter] get_EqualityContract -# 27| 15: [InstanceConstructor,PrimaryConstructor] Person1 +# 27| 16: [InstanceConstructor,PrimaryConstructor] Person1 #-----| 2: (Parameters) # 27| 0: [Parameter] FirstName # 27| -1: [TypeMention] string # 27| 1: [Parameter] LastName # 27| -1: [TypeMention] string -# 27| 16: [Property] FirstName +# 27| 17: [Property] FirstName # 27| 3: [Getter] get_FirstName # 27| 4: [Setter] set_FirstName #-----| 2: (Parameters) # 27| 0: [Parameter] value -# 27| 17: [Property] LastName +# 27| 18: [Property] LastName # 27| 3: [Getter] get_LastName # 27| 4: [Setter] set_LastName #-----| 2: (Parameters) # 27| 0: [Parameter] value # 29| [RecordClass] Teacher1 -# 29| 13: [NEOperator] != +# 29| 14: [NEOperator] != #-----| 2: (Parameters) # 29| 0: [Parameter] left # 29| 1: [Parameter] right -# 29| 14: [EQOperator] == +# 29| 15: [EQOperator] == #-----| 2: (Parameters) # 29| 0: [Parameter] left # 29| 1: [Parameter] right -# 29| 15: [Property] EqualityContract +# 29| 16: [Property] EqualityContract # 29| 3: [Getter] get_EqualityContract -# 29| 16: [InstanceConstructor,PrimaryConstructor] Teacher1 +# 29| 17: [InstanceConstructor,PrimaryConstructor] Teacher1 #-----| 2: (Parameters) # 29| 0: [Parameter] FirstName # 29| -1: [TypeMention] string @@ -912,23 +912,23 @@ Record.cs: # 30| 3: [ConstructorInitializer] call to constructor Person1 # 30| 0: [ParameterAccess] access to parameter FirstName # 30| 1: [ParameterAccess] access to parameter LastName -# 29| 17: [Property] Subject +# 29| 18: [Property] Subject # 29| 3: [Getter] get_Subject # 29| 4: [Setter] set_Subject #-----| 2: (Parameters) # 29| 0: [Parameter] value # 32| [RecordClass] Student1 -# 32| 13: [NEOperator] != +# 32| 14: [NEOperator] != #-----| 2: (Parameters) # 32| 0: [Parameter] left # 32| 1: [Parameter] right -# 32| 14: [EQOperator] == +# 32| 15: [EQOperator] == #-----| 2: (Parameters) # 32| 0: [Parameter] left # 32| 1: [Parameter] right -# 32| 15: [Property] EqualityContract +# 32| 16: [Property] EqualityContract # 32| 3: [Getter] get_EqualityContract -# 32| 16: [InstanceConstructor,PrimaryConstructor] Student1 +# 32| 17: [InstanceConstructor,PrimaryConstructor] Student1 #-----| 2: (Parameters) # 32| 0: [Parameter] FirstName # 32| -1: [TypeMention] string @@ -939,61 +939,61 @@ Record.cs: # 33| 3: [ConstructorInitializer] call to constructor Person1 # 33| 0: [ParameterAccess] access to parameter FirstName # 33| 1: [ParameterAccess] access to parameter LastName -# 32| 17: [Property] Level +# 32| 18: [Property] Level # 32| 3: [Getter] get_Level # 32| 4: [Setter] set_Level #-----| 2: (Parameters) # 32| 0: [Parameter] value # 35| [RecordClass] Pet -# 35| 12: [NEOperator] != +# 35| 13: [NEOperator] != #-----| 2: (Parameters) # 35| 0: [Parameter] left # 35| 1: [Parameter] right -# 35| 13: [EQOperator] == +# 35| 14: [EQOperator] == #-----| 2: (Parameters) # 35| 0: [Parameter] left # 35| 1: [Parameter] right -# 35| 14: [Property] EqualityContract +# 35| 15: [Property] EqualityContract # 35| 3: [Getter] get_EqualityContract -# 35| 15: [InstanceConstructor,PrimaryConstructor] Pet +# 35| 16: [InstanceConstructor,PrimaryConstructor] Pet #-----| 2: (Parameters) # 35| 0: [Parameter] Name # 35| -1: [TypeMention] string -# 35| 16: [Property] Name +# 35| 17: [Property] Name # 35| 3: [Getter] get_Name # 35| 4: [Setter] set_Name #-----| 2: (Parameters) # 35| 0: [Parameter] value -# 37| 17: [Method] ShredTheFurniture +# 37| 18: [Method] ShredTheFurniture # 37| -1: [TypeMention] Void # 38| 4: [MethodCall] call to method WriteLine # 38| -1: [TypeAccess] access to type Console # 38| 0: [TypeMention] Console # 38| 0: [StringLiteralUtf16] "Shredding furniture" # 41| [RecordClass] Dog -# 41| 12: [NEOperator] != +# 41| 13: [NEOperator] != #-----| 2: (Parameters) # 41| 0: [Parameter] left # 41| 1: [Parameter] right -# 41| 13: [EQOperator] == +# 41| 14: [EQOperator] == #-----| 2: (Parameters) # 41| 0: [Parameter] left # 41| 1: [Parameter] right -# 41| 14: [InstanceConstructor,PrimaryConstructor] Dog +# 41| 15: [InstanceConstructor,PrimaryConstructor] Dog #-----| 2: (Parameters) # 41| 0: [Parameter] Name # 41| -1: [TypeMention] string # 41| 3: [ConstructorInitializer] call to constructor Pet # 41| 0: [ParameterAccess] access to parameter Name -# 41| 15: [Property] EqualityContract +# 41| 16: [Property] EqualityContract # 41| 3: [Getter] get_EqualityContract -# 43| 16: [Method] WagTail +# 43| 17: [Method] WagTail # 43| -1: [TypeMention] Void # 44| 4: [MethodCall] call to method WriteLine # 44| -1: [TypeAccess] access to type Console # 44| 0: [TypeMention] Console # 44| 0: [StringLiteralUtf16] "It's tail wagging time" -# 46| 17: [Method] ToString +# 46| 18: [Method] ToString # 46| -1: [TypeMention] string # 47| 4: [BlockStmt] {...} # 48| 0: [LocalVariableDeclStmt] ... ...; @@ -1013,37 +1013,37 @@ Record.cs: # 50| -1: [LocalVariableAccess] access to local variable s # 50| 1: [StringLiteralUtf16] " is a dog" # 54| [RecordClass] R1 -# 54| 12: [NEOperator] != +# 54| 13: [NEOperator] != #-----| 2: (Parameters) # 54| 0: [Parameter] left # 54| 1: [Parameter] right -# 54| 13: [EQOperator] == +# 54| 14: [EQOperator] == #-----| 2: (Parameters) # 54| 0: [Parameter] left # 54| 1: [Parameter] right -# 54| 14: [Property] EqualityContract +# 54| 15: [Property] EqualityContract # 54| 3: [Getter] get_EqualityContract -# 54| 15: [InstanceConstructor,PrimaryConstructor] R1 +# 54| 16: [InstanceConstructor,PrimaryConstructor] R1 #-----| 2: (Parameters) # 54| 0: [Parameter] A # 54| -1: [TypeMention] string -# 54| 16: [Property] A +# 54| 17: [Property] A # 54| 3: [Getter] get_A # 54| 4: [Setter] set_A #-----| 2: (Parameters) # 54| 0: [Parameter] value # 56| [RecordClass] R2 -# 56| 13: [NEOperator] != +# 56| 14: [NEOperator] != #-----| 2: (Parameters) # 56| 0: [Parameter] left # 56| 1: [Parameter] right -# 56| 14: [EQOperator] == +# 56| 15: [EQOperator] == #-----| 2: (Parameters) # 56| 0: [Parameter] left # 56| 1: [Parameter] right -# 56| 15: [Property] EqualityContract +# 56| 16: [Property] EqualityContract # 56| 3: [Getter] get_EqualityContract -# 56| 16: [InstanceConstructor,PrimaryConstructor] R2 +# 56| 17: [InstanceConstructor,PrimaryConstructor] R2 #-----| 2: (Parameters) # 56| 0: [Parameter] A # 56| -1: [TypeMention] string @@ -1051,13 +1051,13 @@ Record.cs: # 56| -1: [TypeMention] string # 56| 3: [ConstructorInitializer] call to constructor R1 # 56| 0: [ParameterAccess] access to parameter A -# 56| 17: [Property] B +# 56| 18: [Property] B # 56| 3: [Getter] get_B # 56| 4: [Setter] set_B #-----| 2: (Parameters) # 56| 0: [Parameter] value # 58| [Class] Record1 -# 60| 5: [Method] M1 +# 60| 6: [Method] M1 # 60| -1: [TypeMention] Void # 61| 4: [BlockStmt] {...} # 62| 0: [LocalVariableDeclStmt] ... ...; @@ -1084,7 +1084,7 @@ Record.cs: # 65| 0: [OperatorCall] call to operator == # 65| 0: [LocalVariableAccess] access to local variable student # 65| 1: [LocalVariableAccess] access to local variable person -# 68| 6: [Method] M2 +# 68| 7: [Method] M2 # 68| -1: [TypeMention] Void # 69| 4: [BlockStmt] {...} # 70| 0: [LocalVariableDeclStmt] ... ...; @@ -1140,7 +1140,7 @@ Record.cs: # 77| 1: [WithExpr] ... with { ... } # 77| 0: [LocalVariableAccess] access to local variable p1 # 77| 1: [ObjectInitializer] { ..., ... } -# 80| 7: [Method] M3 +# 80| 8: [Method] M3 # 80| -1: [TypeMention] Void # 81| 4: [BlockStmt] {...} # 82| 0: [LocalVariableDeclStmt] ... ...; @@ -1168,7 +1168,7 @@ Record.cs: # 84| 1: [StringLiteralUtf16] "C" RelationalPattern.cs: # 3| [Class] RelationalPattern -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] bool #-----| 2: (Parameters) # 5| 0: [Parameter] c @@ -1177,7 +1177,7 @@ RelationalPattern.cs: # 6| 0: [ParameterAccess] access to parameter c # 6| 1: [GEPattern] >= ... # 6| 0: [CharLiteral] a -# 7| 6: [Method] M2 +# 7| 7: [Method] M2 # 7| -1: [TypeMention] bool #-----| 2: (Parameters) # 7| 0: [Parameter] c @@ -1186,7 +1186,7 @@ RelationalPattern.cs: # 8| 0: [ParameterAccess] access to parameter c # 8| 1: [GTPattern] > ... # 8| 0: [CharLiteral] a -# 9| 7: [Method] M3 +# 9| 8: [Method] M3 # 9| -1: [TypeMention] bool #-----| 2: (Parameters) # 9| 0: [Parameter] c @@ -1195,7 +1195,7 @@ RelationalPattern.cs: # 10| 0: [ParameterAccess] access to parameter c # 10| 1: [LEPattern] <= ... # 10| 0: [CharLiteral] a -# 11| 8: [Method] M4 +# 11| 9: [Method] M4 # 11| -1: [TypeMention] bool #-----| 2: (Parameters) # 11| 0: [Parameter] c @@ -1204,7 +1204,7 @@ RelationalPattern.cs: # 12| 0: [ParameterAccess] access to parameter c # 12| 1: [LTPattern] < ... # 12| 0: [CharLiteral] a -# 14| 9: [Method] M5 +# 14| 10: [Method] M5 # 14| -1: [TypeMention] string #-----| 2: (Parameters) # 14| 0: [Parameter] i @@ -1225,7 +1225,7 @@ RelationalPattern.cs: # 20| 2: [StringLiteralUtf16] "other" TargetType.cs: # 5| [Class] TargetType -# 7| 5: [Method] M2 +# 7| 6: [Method] M2 # 7| -1: [TypeMention] Void # 8| 4: [BlockStmt] {...} # 9| 0: [LocalVariableDeclStmt] ... ...; @@ -1356,7 +1356,7 @@ TargetType.cs: # 36| 0: [ObjectCreation] object creation of type TargetType # 36| 0: [TypeMention] TargetType # 37| 2: [IntLiteral] 12 -# 40| 6: [ImplicitConversionOperator] implicit conversion +# 40| 7: [ImplicitConversionOperator] implicit conversion # 40| -1: [TypeMention] int #-----| 2: (Parameters) # 40| 0: [Parameter] d @@ -1365,14 +1365,14 @@ TargetType.cs: TypeParameterNullability.cs: # 1| [Interface] I1 # 3| [Class] A2 -# 5| 5: [Method] F1`1 +# 5| 6: [Method] F1`1 # 5| -1: [TypeMention] Void #-----| 1: (Type parameters) # 5| 0: [TypeParameter] T #-----| 2: (Parameters) # 5| 0: [Parameter] t # 5| 4: [BlockStmt] {...} -# 6| 6: [Method] F2`1 +# 6| 7: [Method] F2`1 # 6| -1: [TypeMention] Void #-----| 1: (Type parameters) # 6| 0: [TypeParameter] T @@ -1381,28 +1381,28 @@ TypeParameterNullability.cs: # 6| -1: [TypeMention] T? # 6| 1: [TypeMention] T # 6| 4: [BlockStmt] {...} -# 7| 7: [Method] F3`1 +# 7| 8: [Method] F3`1 # 7| -1: [TypeMention] Void #-----| 1: (Type parameters) # 7| 0: [TypeParameter] T #-----| 2: (Parameters) # 7| 0: [Parameter] t # 7| 4: [BlockStmt] {...} -# 8| 8: [Method] F4`1 +# 8| 9: [Method] F4`1 # 8| -1: [TypeMention] Void #-----| 1: (Type parameters) # 8| 0: [TypeParameter] T #-----| 2: (Parameters) # 8| 0: [Parameter] t # 8| 4: [BlockStmt] {...} -# 9| 9: [Method] F5`1 +# 9| 10: [Method] F5`1 # 9| -1: [TypeMention] Void #-----| 1: (Type parameters) # 9| 0: [TypeParameter] T #-----| 2: (Parameters) # 9| 0: [Parameter] t # 9| 4: [BlockStmt] {...} -# 10| 10: [Method] F6`1 +# 10| 11: [Method] F6`1 # 10| -1: [TypeMention] Void #-----| 1: (Type parameters) # 10| 0: [TypeParameter] T @@ -1414,14 +1414,14 @@ TypeParameterNullability.cs: # 13| [Class] B2 #-----| 3: (Base types) # 13| 0: [TypeMention] A2 -# 15| 5: [Method] F1`1 +# 15| 6: [Method] F1`1 # 15| -1: [TypeMention] Void #-----| 1: (Type parameters) # 15| 0: [TypeParameter] T #-----| 2: (Parameters) # 15| 0: [Parameter] t # 15| 4: [BlockStmt] {...} -# 16| 6: [Method] F2`1 +# 16| 7: [Method] F2`1 # 16| -1: [TypeMention] Void #-----| 1: (Type parameters) # 16| 0: [TypeParameter] T @@ -1430,21 +1430,21 @@ TypeParameterNullability.cs: # 16| -1: [TypeMention] T? # 16| 1: [TypeMention] T # 16| 4: [BlockStmt] {...} -# 17| 7: [Method] F3`1 +# 17| 8: [Method] F3`1 # 17| -1: [TypeMention] Void #-----| 1: (Type parameters) # 17| 0: [TypeParameter] T #-----| 2: (Parameters) # 17| 0: [Parameter] t # 17| 4: [BlockStmt] {...} -# 18| 8: [Method] F4`1 +# 18| 9: [Method] F4`1 # 18| -1: [TypeMention] Void #-----| 1: (Type parameters) # 18| 0: [TypeParameter] T #-----| 2: (Parameters) # 18| 0: [Parameter] t # 18| 4: [BlockStmt] {...} -# 19| 9: [Method] F6`1 +# 19| 10: [Method] F6`1 # 19| -1: [TypeMention] Void #-----| 1: (Type parameters) # 19| 0: [TypeParameter] T @@ -1456,7 +1456,7 @@ TypeParameterNullability.cs: # 22| [Class] B3 #-----| 3: (Base types) # 22| 0: [TypeMention] A2 -# 24| 5: [Method] F2`1 +# 24| 6: [Method] F2`1 # 24| -1: [TypeMention] Void #-----| 1: (Type parameters) # 24| 0: [TypeParameter] T @@ -1467,7 +1467,7 @@ TypeParameterNullability.cs: # 24| 4: [BlockStmt] {...} TypePattern.cs: # 3| [Class] TypePattern -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] object #-----| 2: (Parameters) # 5| 0: [Parameter] o1 @@ -1516,13 +1516,13 @@ TypePattern.cs: # 14| 2: [LocalVariableAccess] access to local variable o UnaryPattern.cs: # 3| [Class] UnaryPattern -# 5| 5: [Property] P1 +# 5| 6: [Property] P1 # 5| -1: [TypeMention] int # 5| 3: [Getter] get_P1 # 5| 4: [Setter] set_P1 #-----| 2: (Parameters) # 5| 0: [Parameter] value -# 7| 6: [Method] M1 +# 7| 7: [Method] M1 # 7| -1: [TypeMention] bool #-----| 2: (Parameters) # 7| 0: [Parameter] c @@ -1531,7 +1531,7 @@ UnaryPattern.cs: # 8| 0: [ParameterAccess] access to parameter c # 8| 1: [NotPatternExpr] not ... # 8| 0: [CharLiteral,ConstantPatternExpr] a -# 9| 7: [Method] M2 +# 9| 8: [Method] M2 # 9| -1: [TypeMention] bool #-----| 2: (Parameters) # 9| 0: [Parameter] c @@ -1540,7 +1540,7 @@ UnaryPattern.cs: # 10| 0: [ParameterAccess] access to parameter c # 10| 1: [NotPatternExpr] not ... # 10| 0: [ConstantPatternExpr,NullLiteral] null -# 11| 8: [Method] M3 +# 11| 9: [Method] M3 # 11| -1: [TypeMention] bool #-----| 2: (Parameters) # 11| 0: [Parameter] c @@ -1554,7 +1554,7 @@ UnaryPattern.cs: # 12| 0: [TypeMention] UnaryPattern # 12| 3: [PropertyPatternExpr] { ... } # 12| 0: [ConstantPatternExpr,IntLiteral,LabeledPatternExpr] 1 -# 14| 9: [Method] M4 +# 14| 10: [Method] M4 # 14| -1: [TypeMention] string #-----| 2: (Parameters) # 14| 0: [Parameter] i diff --git a/csharp/ql/test/library-tests/csharp9/nativeInt.expected b/csharp/ql/test/library-tests/csharp9/nativeInt.expected index 2c63241e1fe..7809e4f9487 100644 --- a/csharp/ql/test/library-tests/csharp9/nativeInt.expected +++ b/csharp/ql/test/library-tests/csharp9/nativeInt.expected @@ -1,4 +1,6 @@ | NativeInt.cs:3:14:3:22 | call to constructor Object | Object | +| NativeInt.cs:3:14:3:22 | call to method | Void | +| NativeInt.cs:3:14:3:22 | this access | NativeInt | | NativeInt.cs:7:14:7:14 | access to local variable x | IntPtr | | NativeInt.cs:7:14:7:18 | IntPtr x = ... | IntPtr | | NativeInt.cs:7:18:7:18 | (...) ... | IntPtr | diff --git a/csharp/ql/test/library-tests/csharp9/record.expected b/csharp/ql/test/library-tests/csharp9/record.expected index 9b6b5c00571..b34815c4f1a 100644 --- a/csharp/ql/test/library-tests/csharp9/record.expected +++ b/csharp/ql/test/library-tests/csharp9/record.expected @@ -12,6 +12,7 @@ records members | Record.cs:4:1:10:1 | Person | Person.!=(Person, Person) | Record.cs:4:15:4:20 | | Record.cs:4:1:10:1 | Person | Person.$() | no location | +| Record.cs:4:1:10:1 | Person | Person.() | no location | | Record.cs:4:1:10:1 | Person | Person.==(Person, Person) | Record.cs:4:15:4:20 | | Record.cs:4:1:10:1 | Person | Person.EqualityContract | Record.cs:4:15:4:20 | | Record.cs:4:1:10:1 | Person | Person.Equals(Person) | no location | @@ -30,6 +31,7 @@ members | Record.cs:4:1:10:1 | Person | System.Object.ReferenceEquals(object, object) | no location | | Record.cs:4:1:10:1 | Person | System.Object.~Object() | no location | | Record.cs:12:1:18:1 | Teacher | Person.!=(Person, Person) | Record.cs:4:15:4:20 | +| Record.cs:12:1:18:1 | Teacher | Person.() | no location | | Record.cs:12:1:18:1 | Teacher | Person.==(Person, Person) | Record.cs:4:15:4:20 | | Record.cs:12:1:18:1 | Teacher | Person.FirstName | Record.cs:7:19:7:27 | | Record.cs:12:1:18:1 | Teacher | Person.LastName | Record.cs:6:19:6:26 | @@ -43,6 +45,7 @@ members | Record.cs:12:1:18:1 | Teacher | System.Object.~Object() | no location | | Record.cs:12:1:18:1 | Teacher | Teacher.!=(Teacher, Teacher) | Record.cs:12:15:12:21 | | Record.cs:12:1:18:1 | Teacher | Teacher.$() | no location | +| Record.cs:12:1:18:1 | Teacher | Teacher.() | no location | | Record.cs:12:1:18:1 | Teacher | Teacher.==(Teacher, Teacher) | Record.cs:12:15:12:21 | | Record.cs:12:1:18:1 | Teacher | Teacher.EqualityContract | Record.cs:12:15:12:21 | | Record.cs:12:1:18:1 | Teacher | Teacher.Equals(Person) | no location | @@ -55,6 +58,7 @@ members | Record.cs:12:1:18:1 | Teacher | Teacher.Teacher(string, string, string) | Record.cs:16:12:16:18 | | Record.cs:12:1:18:1 | Teacher | Teacher.ToString() | no location | | Record.cs:20:1:25:1 | Student | Person.!=(Person, Person) | Record.cs:4:15:4:20 | +| Record.cs:20:1:25:1 | Student | Person.() | no location | | Record.cs:20:1:25:1 | Student | Person.==(Person, Person) | Record.cs:4:15:4:20 | | Record.cs:20:1:25:1 | Student | Person.FirstName | Record.cs:7:19:7:27 | | Record.cs:20:1:25:1 | Student | Person.LastName | Record.cs:6:19:6:26 | @@ -62,6 +66,7 @@ members | Record.cs:20:1:25:1 | Student | Person.Person(string, string) | Record.cs:9:12:9:17 | | Record.cs:20:1:25:1 | Student | Student.!=(Student, Student) | Record.cs:20:22:20:28 | | Record.cs:20:1:25:1 | Student | Student.$() | no location | +| Record.cs:20:1:25:1 | Student | Student.() | no location | | Record.cs:20:1:25:1 | Student | Student.==(Student, Student) | Record.cs:20:22:20:28 | | Record.cs:20:1:25:1 | Student | Student.EqualityContract | Record.cs:20:22:20:28 | | Record.cs:20:1:25:1 | Student | Student.Equals(Person) | no location | @@ -81,6 +86,7 @@ members | Record.cs:20:1:25:1 | Student | System.Object.~Object() | no location | | Record.cs:27:1:27:57 | Person1 | Person1.!=(Person1, Person1) | Record.cs:27:15:27:21 | | Record.cs:27:1:27:57 | Person1 | Person1.$() | no location | +| Record.cs:27:1:27:57 | Person1 | Person1.() | no location | | Record.cs:27:1:27:57 | Person1 | Person1.==(Person1, Person1) | Record.cs:27:15:27:21 | | Record.cs:27:1:27:57 | Person1 | Person1.Deconstruct(out string, out string) | no location | | Record.cs:27:1:27:57 | Person1 | Person1.EqualityContract | Record.cs:27:15:27:21 | @@ -100,6 +106,7 @@ members | Record.cs:27:1:27:57 | Person1 | System.Object.ReferenceEquals(object, object) | no location | | Record.cs:27:1:27:57 | Person1 | System.Object.~Object() | no location | | Record.cs:29:1:30:35 | Teacher1 | Person1.!=(Person1, Person1) | Record.cs:27:15:27:21 | +| Record.cs:29:1:30:35 | Teacher1 | Person1.() | no location | | Record.cs:29:1:30:35 | Teacher1 | Person1.==(Person1, Person1) | Record.cs:27:15:27:21 | | Record.cs:29:1:30:35 | Teacher1 | Person1.Deconstruct(out string, out string) | no location | | Record.cs:29:1:30:35 | Teacher1 | Person1.FirstName | Record.cs:27:30:27:38 | @@ -114,6 +121,7 @@ members | Record.cs:29:1:30:35 | Teacher1 | System.Object.~Object() | no location | | Record.cs:29:1:30:35 | Teacher1 | Teacher1.!=(Teacher1, Teacher1) | Record.cs:29:15:29:22 | | Record.cs:29:1:30:35 | Teacher1 | Teacher1.$() | no location | +| Record.cs:29:1:30:35 | Teacher1 | Teacher1.() | no location | | Record.cs:29:1:30:35 | Teacher1 | Teacher1.==(Teacher1, Teacher1) | Record.cs:29:15:29:22 | | Record.cs:29:1:30:35 | Teacher1 | Teacher1.Deconstruct(out string, out string, out string) | no location | | Record.cs:29:1:30:35 | Teacher1 | Teacher1.EqualityContract | Record.cs:29:15:29:22 | @@ -127,6 +135,7 @@ members | Record.cs:29:1:30:35 | Teacher1 | Teacher1.Teacher1(string, string, string) | Record.cs:29:15:29:22 | | Record.cs:29:1:30:35 | Teacher1 | Teacher1.ToString() | no location | | Record.cs:32:1:33:35 | Student1 | Person1.!=(Person1, Person1) | Record.cs:27:15:27:21 | +| Record.cs:32:1:33:35 | Student1 | Person1.() | no location | | Record.cs:32:1:33:35 | Student1 | Person1.==(Person1, Person1) | Record.cs:27:15:27:21 | | Record.cs:32:1:33:35 | Student1 | Person1.Deconstruct(out string, out string) | no location | | Record.cs:32:1:33:35 | Student1 | Person1.FirstName | Record.cs:27:30:27:38 | @@ -135,6 +144,7 @@ members | Record.cs:32:1:33:35 | Student1 | Person1.Person1(string, string) | Record.cs:27:15:27:21 | | Record.cs:32:1:33:35 | Student1 | Student1.!=(Student1, Student1) | Record.cs:32:22:32:29 | | Record.cs:32:1:33:35 | Student1 | Student1.$() | no location | +| Record.cs:32:1:33:35 | Student1 | Student1.() | no location | | Record.cs:32:1:33:35 | Student1 | Student1.==(Student1, Student1) | Record.cs:32:22:32:29 | | Record.cs:32:1:33:35 | Student1 | Student1.Deconstruct(out string, out string, out int) | no location | | Record.cs:32:1:33:35 | Student1 | Student1.EqualityContract | Record.cs:32:22:32:29 | @@ -155,6 +165,7 @@ members | Record.cs:32:1:33:35 | Student1 | System.Object.~Object() | no location | | Record.cs:35:1:39:1 | Pet | Pet.!=(Pet, Pet) | Record.cs:35:15:35:17 | | Record.cs:35:1:39:1 | Pet | Pet.$() | no location | +| Record.cs:35:1:39:1 | Pet | Pet.() | no location | | Record.cs:35:1:39:1 | Pet | Pet.==(Pet, Pet) | Record.cs:35:15:35:17 | | Record.cs:35:1:39:1 | Pet | Pet.Deconstruct(out string) | no location | | Record.cs:35:1:39:1 | Pet | Pet.EqualityContract | Record.cs:35:15:35:17 | @@ -175,6 +186,7 @@ members | Record.cs:35:1:39:1 | Pet | System.Object.~Object() | no location | | Record.cs:41:1:52:1 | Dog | Dog.!=(Dog, Dog) | Record.cs:41:15:41:17 | | Record.cs:41:1:52:1 | Dog | Dog.$() | no location | +| Record.cs:41:1:52:1 | Dog | Dog.() | no location | | Record.cs:41:1:52:1 | Dog | Dog.==(Dog, Dog) | Record.cs:41:15:41:17 | | Record.cs:41:1:52:1 | Dog | Dog.Deconstruct(out string) | no location | | Record.cs:41:1:52:1 | Dog | Dog.Dog(Dog) | no location | @@ -188,6 +200,7 @@ members | Record.cs:41:1:52:1 | Dog | Dog.ToString() | Record.cs:46:28:46:35 | | Record.cs:41:1:52:1 | Dog | Dog.WagTail() | Record.cs:43:17:43:23 | | Record.cs:41:1:52:1 | Dog | Pet.!=(Pet, Pet) | Record.cs:35:15:35:17 | +| Record.cs:41:1:52:1 | Dog | Pet.() | no location | | Record.cs:41:1:52:1 | Dog | Pet.==(Pet, Pet) | Record.cs:35:15:35:17 | | Record.cs:41:1:52:1 | Dog | Pet.Deconstruct(out string) | no location | | Record.cs:41:1:52:1 | Dog | Pet.Name | Record.cs:35:26:35:29 | @@ -202,6 +215,7 @@ members | Record.cs:41:1:52:1 | Dog | System.Object.~Object() | no location | | Record.cs:54:1:54:39 | R1 | R1.!=(R1, R1) | Record.cs:54:24:54:25 | | Record.cs:54:1:54:39 | R1 | R1.$() | no location | +| Record.cs:54:1:54:39 | R1 | R1.() | no location | | Record.cs:54:1:54:39 | R1 | R1.==(R1, R1) | Record.cs:54:24:54:25 | | Record.cs:54:1:54:39 | R1 | R1.A | Record.cs:54:34:54:34 | | Record.cs:54:1:54:39 | R1 | R1.Deconstruct(out string) | no location | @@ -220,6 +234,7 @@ members | Record.cs:54:1:54:39 | R1 | System.Object.ReferenceEquals(object, object) | no location | | Record.cs:54:1:54:39 | R1 | System.Object.~Object() | no location | | Record.cs:56:1:56:48 | R2 | R1.!=(R1, R1) | Record.cs:54:24:54:25 | +| Record.cs:56:1:56:48 | R2 | R1.() | no location | | Record.cs:56:1:56:48 | R2 | R1.==(R1, R1) | Record.cs:54:24:54:25 | | Record.cs:56:1:56:48 | R2 | R1.A | Record.cs:54:34:54:34 | | Record.cs:56:1:56:48 | R2 | R1.Deconstruct(out string) | no location | @@ -227,6 +242,7 @@ members | Record.cs:56:1:56:48 | R2 | R1.R1(string) | Record.cs:54:24:54:25 | | Record.cs:56:1:56:48 | R2 | R2.!=(R2, R2) | Record.cs:56:15:56:16 | | Record.cs:56:1:56:48 | R2 | R2.$() | no location | +| Record.cs:56:1:56:48 | R2 | R2.() | no location | | Record.cs:56:1:56:48 | R2 | R2.==(R2, R2) | Record.cs:56:15:56:16 | | Record.cs:56:1:56:48 | R2 | R2.B | Record.cs:56:35:56:35 | | Record.cs:56:1:56:48 | R2 | R2.Deconstruct(out string, out string) | no location | diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionDataFlow.expected b/csharp/ql/test/library-tests/dataflow/collections/CollectionDataFlow.expected new file mode 100644 index 00000000000..373e8938b91 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionDataFlow.expected @@ -0,0 +1,840 @@ +models +| 1 | Summary: System.Collections.Generic; Dictionary; false; get_Keys; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; ReturnValue.Element; value; manual | +| 2 | Summary: System.Collections.Generic; Dictionary; false; get_Values; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; ReturnValue.Element; value; manual | +| 3 | Summary: System.Collections.Generic; ICollection; true; Add; (T); ; Argument[0]; Argument[this].Element; value; manual | +| 4 | Summary: System.Collections.Generic; IDictionary; true; Add; (TKey,TValue); ; Argument[0]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; value; manual | +| 5 | Summary: System.Collections.Generic; IDictionary; true; Add; (TKey,TValue); ; Argument[1]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; value; manual | +| 6 | Summary: System.Collections.Generic; IDictionary; true; get_Item; (TKey); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; ReturnValue; value; manual | +| 7 | Summary: System.Collections.Generic; IDictionary; true; get_Keys; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; ReturnValue.Element; value; manual | +| 8 | Summary: System.Collections.Generic; IDictionary; true; get_Values; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; ReturnValue.Element; value; manual | +| 9 | Summary: System.Collections.Generic; IDictionary; true; set_Item; (TKey,TValue); ; Argument[0]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; value; manual | +| 10 | Summary: System.Collections.Generic; IDictionary; true; set_Item; (TKey,TValue); ; Argument[1]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; value; manual | +| 11 | Summary: System.Collections.Generic; IList; true; get_Item; (System.Int32); ; Argument[this].Element; ReturnValue; value; manual | +| 12 | Summary: System.Collections.Generic; IList; true; set_Item; (System.Int32,T); ; Argument[1]; Argument[this].Element; value; manual | +| 13 | Summary: System.Collections.Generic; KeyValuePair; false; KeyValuePair; (TKey,TValue); ; Argument[0]; Argument[this].Property[System.Collections.Generic.KeyValuePair`2.Key]; value; manual | +| 14 | Summary: System.Collections.Generic; List+Enumerator; false; get_Current; (); ; Argument[this].Property[System.Collections.Generic.List`1+Enumerator.Current]; ReturnValue; value; dfc-generated | +| 15 | Summary: System.Collections.Generic; List; false; GetEnumerator; (); ; Argument[this].Element; ReturnValue.Property[System.Collections.Generic.List`1+Enumerator.Current]; value; manual | +| 16 | Summary: System.Collections; IEnumerable; true; GetEnumerator; (); ; Argument[this].Element; ReturnValue.Property[System.Collections.IEnumerator.Current]; value; manual | +| 17 | Summary: System.Linq; Enumerable; false; First; (System.Collections.Generic.IEnumerable); ; Argument[0].Element; ReturnValue; value; manual | +| 18 | Summary: System.Linq; Enumerable; false; Select; (System.Collections.Generic.IEnumerable,System.Func); ; Argument[0].Element; Argument[1].Parameter[0]; value; manual | +| 19 | Summary: System; ReadOnlySpan; false; ReadOnlySpan; (T[]); ; Argument[0].Element; Argument[this].Element; value; manual | +| 20 | Summary: System; ReadOnlySpan; false; get_Item; (System.Int32); ; Argument[this].Element; ReturnValue; value; manual | +| 21 | Summary: System; Span; false; CopyTo; (System.Span); ; Argument[this].Element; Argument[0].Element; value; manual | +| 22 | Summary: System; Span; false; Fill; (T); ; Argument[0]; Argument[this].Element; value; manual | +| 23 | Summary: System; Span; false; Span; (T); ; Argument[0]; Argument[this].Element; value; manual | +| 24 | Summary: System; Span; false; Span; (T[]); ; Argument[0].Element; Argument[this].Element; value; manual | +| 25 | Summary: System; Span; false; ToArray; (); ; Argument[this].Element; ReturnValue.Element; value; manual | +| 26 | Summary: System; Span; false; get_Item; (System.Int32); ; Argument[this].Element; ReturnValue; value; manual | +edges +| CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | CollectionFlow.cs:14:52:14:53 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | CollectionFlow.cs:14:52:14:53 | access to parameter ts : null [element] : A | provenance | | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:14:52:14:56 | access to array element | provenance | | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : null [element] : A | CollectionFlow.cs:14:52:14:56 | access to array element | provenance | | +| CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | CollectionFlow.cs:16:56:16:57 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:16:56:16:57 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:16:56:16:61 | access to array element | provenance | | +| CollectionFlow.cs:18:49:18:52 | list : List [element] : A | CollectionFlow.cs:18:63:18:66 | access to parameter list : List [element] : A | provenance | | +| CollectionFlow.cs:18:63:18:66 | access to parameter list : List [element] : A | CollectionFlow.cs:18:63:18:69 | access to indexer | provenance | MaD:11 | +| CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:75:20:78 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:20:75:20:78 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:75:20:81 | access to indexer | provenance | MaD:6 | +| CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | provenance | MaD:7 | +| CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | CollectionFlow.cs:22:73:22:89 | call to method First | provenance | MaD:17 | +| CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:42 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | CollectionFlow.cs:24:41:24:42 | access to parameter ts : null [element] : A | provenance | | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | provenance | | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : null [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | provenance | | +| CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | CollectionFlow.cs:26:40:26:41 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:26:40:26:41 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:26:40:26:45 | access to array element : A | provenance | | +| CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:55 | access to parameter list : List [element] : A | provenance | | +| CollectionFlow.cs:28:52:28:55 | access to parameter list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | provenance | MaD:11 | +| CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:70 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:30:67:30:70 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | provenance | MaD:6 | +| CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair [property Value] : A | provenance | MaD:17 | +| CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair [property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | provenance | | +| CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | provenance | MaD:2 | +| CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | provenance | MaD:8 | +| CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | provenance | MaD:17 | +| CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | provenance | MaD:7 | +| CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | CollectionFlow.cs:36:67:36:83 | call to method First : A | provenance | MaD:17 | +| CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair [property Key] : A | provenance | MaD:17 | +| CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair [property Key] : A | CollectionFlow.cs:38:66:38:81 | access to property Key : A | provenance | | +| CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | CollectionFlow.cs:40:63:40:66 | access to parameter args : A[] [element] : A | provenance | | +| CollectionFlow.cs:40:49:40:52 | args : null [element] : A | CollectionFlow.cs:40:63:40:66 | access to parameter args : null [element] : A | provenance | | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : A[] [element] : A | CollectionFlow.cs:40:63:40:69 | access to array element | provenance | | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : null [element] : A | CollectionFlow.cs:40:63:40:69 | access to array element | provenance | | +| CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | CollectionFlow.cs:42:84:42:87 | access to parameter args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:42:84:42:87 | access to parameter args : IEnumerable [element] : A | CollectionFlow.cs:42:84:42:95 | call to method First | provenance | MaD:17 | +| CollectionFlow.cs:46:13:46:13 | access to local variable a : A | CollectionFlow.cs:47:27:47:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:13:46:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | CollectionFlow.cs:48:14:48:16 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | CollectionFlow.cs:49:18:49:20 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:25:47:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:27:47:27 | access to local variable a : A | CollectionFlow.cs:47:25:47:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:48:14:48:16 | access to local variable as : null [element] : A | CollectionFlow.cs:48:14:48:19 | access to array element | provenance | | +| CollectionFlow.cs:49:18:49:20 | access to local variable as : null [element] : A | CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | provenance | | +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | provenance | | +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | CollectionFlow.cs:50:14:50:23 | call to method First | provenance | | +| CollectionFlow.cs:64:13:64:13 | access to local variable a : A | CollectionFlow.cs:65:53:65:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:13:64:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:66:14:66:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:67:18:67:18 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:68:20:68:20 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:38:65:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:45:65:55 | { ..., ... } : A[] [element] : A | CollectionFlow.cs:65:38:65:57 | { ..., ... } : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:53:65:53 | access to local variable a : A | CollectionFlow.cs:65:45:65:55 | { ..., ... } : A[] [element] : A | provenance | | +| CollectionFlow.cs:66:14:66:14 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:66:14:66:17 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:66:14:66:17 | access to field As : A[] [element] : A | CollectionFlow.cs:66:14:66:20 | access to array element | provenance | | +| CollectionFlow.cs:67:18:67:18 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:67:18:67:21 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:67:18:67:21 | access to field As : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:68:20:68:20 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | CollectionFlow.cs:68:14:68:24 | call to method First | provenance | | +| CollectionFlow.cs:82:13:82:13 | access to local variable a : A | CollectionFlow.cs:83:54:83:54 | access to local variable a : A | provenance | | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:13:82:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:84:14:84:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:85:22:85:22 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:86:19:86:19 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:38:83:58 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:45:83:56 | { ..., ... } : A[] [element] : A | CollectionFlow.cs:83:38:83:58 | { ..., ... } : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:54:83:54 | access to local variable a : A | CollectionFlow.cs:83:45:83:56 | { ..., ... } : A[] [element] : A | provenance | | +| CollectionFlow.cs:84:14:84:14 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:84:14:84:17 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:84:14:84:17 | access to field As : A[] [element] : A | CollectionFlow.cs:84:14:84:21 | access to array element | provenance | | +| CollectionFlow.cs:85:22:85:22 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:85:22:85:25 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:85:22:85:25 | access to field As : A[] [element] : A | CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:86:19:86:19 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | CollectionFlow.cs:86:14:86:23 | call to method Last | provenance | | +| CollectionFlow.cs:91:13:91:13 | access to local variable a : A | CollectionFlow.cs:93:18:93:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:13:91:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:94:14:94:16 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:95:18:95:20 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:93:18:93:18 | access to local variable a : A | CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:94:14:94:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:94:14:94:19 | access to array element | provenance | | +| CollectionFlow.cs:95:18:95:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:96:14:96:23 | call to method First | provenance | | +| CollectionFlow.cs:111:13:111:13 | access to local variable a : A | CollectionFlow.cs:113:19:113:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:13:111:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:114:14:114:16 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:115:22:115:24 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:113:19:113:19 | access to local variable a : A | CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:114:14:114:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:114:14:114:20 | access to array element | provenance | | +| CollectionFlow.cs:115:22:115:24 | access to local variable as : A[] [element] : A | CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | CollectionFlow.cs:116:14:116:22 | call to method Last | provenance | | +| CollectionFlow.cs:121:13:121:13 | access to local variable a : A | CollectionFlow.cs:123:19:123:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:13:121:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:124:14:124:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:125:22:125:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:123:19:123:19 | access to local variable a : A | CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | provenance | MaD:12 | +| CollectionFlow.cs:124:14:124:17 | access to local variable list : List [element] : A | CollectionFlow.cs:124:14:124:20 | access to indexer | provenance | MaD:11 | +| CollectionFlow.cs:125:22:125:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | provenance | MaD:11 | +| CollectionFlow.cs:140:13:140:13 | access to local variable a : A | CollectionFlow.cs:141:36:141:36 | access to local variable a : A | provenance | | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:13:140:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | CollectionFlow.cs:142:14:142:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | CollectionFlow.cs:143:22:143:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List [element] : A | CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:36:141:36 | access to local variable a : A | CollectionFlow.cs:141:20:141:38 | object creation of type List : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:142:14:142:17 | access to local variable list : List [element] : A | CollectionFlow.cs:142:14:142:20 | access to indexer | provenance | MaD:11 | +| CollectionFlow.cs:143:22:143:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | provenance | MaD:11 | +| CollectionFlow.cs:157:13:157:13 | access to local variable a : A | CollectionFlow.cs:159:18:159:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:13:157:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:160:14:160:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:161:22:161:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:159:18:159:18 | access to local variable a : A | CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:160:14:160:17 | access to local variable list : List [element] : A | CollectionFlow.cs:160:14:160:20 | access to indexer | provenance | MaD:11 | +| CollectionFlow.cs:161:22:161:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | provenance | MaD:11 | +| CollectionFlow.cs:176:13:176:13 | access to local variable a : A | CollectionFlow.cs:178:19:178:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:13:176:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:14:179:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:19:178:19 | access to local variable a : A | CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | provenance | MaD:10 | +| CollectionFlow.cs:179:14:179:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:14:179:20 | access to indexer | provenance | MaD:6 | +| CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | provenance | MaD:6 | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | provenance | MaD:17 | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | provenance | MaD:2 | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | provenance | MaD:8 | +| CollectionFlow.cs:199:13:199:13 | access to local variable a : A | CollectionFlow.cs:200:52:200:52 | access to local variable a : A | provenance | | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:13:199:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:14:201:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:52:200:52 | access to local variable a : A | CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | MaD:5 | +| CollectionFlow.cs:201:14:201:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:14:201:20 | access to indexer | provenance | MaD:6 | +| CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | provenance | MaD:6 | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | provenance | MaD:17 | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | provenance | MaD:2 | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | provenance | MaD:8 | +| CollectionFlow.cs:220:13:220:13 | access to local variable a : A | CollectionFlow.cs:221:53:221:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:13:220:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:222:14:222:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:53:221:53 | access to local variable a : A | CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | MaD:10 | +| CollectionFlow.cs:222:14:222:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:222:14:222:20 | access to indexer | provenance | MaD:6 | +| CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | provenance | MaD:6 | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | provenance | MaD:17 | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | provenance | MaD:2 | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | provenance | MaD:8 | +| CollectionFlow.cs:242:13:242:13 | access to local variable a : A | CollectionFlow.cs:243:49:243:49 | access to local variable a : A | provenance | | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:13:242:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:244:14:244:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:245:21:245:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:49:243:49 | access to local variable a : A | CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | MaD:4 | +| CollectionFlow.cs:244:14:244:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:244:14:244:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:244:14:244:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:244:14:244:30 | call to method First | provenance | MaD:17 | +| CollectionFlow.cs:245:21:245:24 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | provenance | MaD:1 | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | provenance | MaD:7 | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | provenance | MaD:17 | +| CollectionFlow.cs:261:13:261:13 | access to local variable a : A | CollectionFlow.cs:262:48:262:48 | access to local variable a : A | provenance | | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:13:261:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:263:14:263:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:264:21:264:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:48:262:48 | access to local variable a : A | CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | MaD:9 | +| CollectionFlow.cs:263:14:263:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:263:14:263:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:263:14:263:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:263:14:263:30 | call to method First | provenance | MaD:17 | +| CollectionFlow.cs:264:21:264:24 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | provenance | MaD:1 | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | provenance | MaD:7 | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | provenance | MaD:17 | +| CollectionFlow.cs:280:13:280:13 | access to local variable a : A | CollectionFlow.cs:281:27:281:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:280:17:280:23 | object creation of type A : A | CollectionFlow.cs:280:13:280:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:281:13:281:15 | access to local variable as : null [element] : A | CollectionFlow.cs:282:27:282:29 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:281:25:281:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:281:13:281:15 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:281:27:281:27 | access to local variable a : A | CollectionFlow.cs:281:25:281:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:282:27:282:29 | access to local variable as : null [element] : A | CollectionFlow.cs:283:18:283:18 | access to local variable x | provenance | | +| CollectionFlow.cs:295:13:295:13 | access to local variable a : A | CollectionFlow.cs:296:27:296:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:295:17:295:23 | object creation of type A : A | CollectionFlow.cs:295:13:295:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:296:13:296:15 | access to local variable as : null [element] : A | CollectionFlow.cs:297:26:297:28 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:296:25:296:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:296:13:296:15 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:296:27:296:27 | access to local variable a : A | CollectionFlow.cs:296:25:296:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:297:13:297:22 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:299:18:299:27 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | +| CollectionFlow.cs:297:26:297:28 | access to local variable as : null [element] : A | CollectionFlow.cs:297:26:297:44 | call to method GetEnumerator : IEnumerator [property Current] : A | provenance | MaD:16 | +| CollectionFlow.cs:297:26:297:44 | call to method GetEnumerator : IEnumerator [property Current] : A | CollectionFlow.cs:297:13:297:22 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | +| CollectionFlow.cs:299:18:299:27 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:299:18:299:35 | access to property Current | provenance | | +| CollectionFlow.cs:312:13:312:13 | access to local variable a : A | CollectionFlow.cs:314:18:314:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:312:17:312:23 | object creation of type A : A | CollectionFlow.cs:312:13:312:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:314:9:314:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:314:18:314:18 | access to local variable a : A | CollectionFlow.cs:314:9:314:12 | [post] access to local variable list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | provenance | MaD:15 | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | provenance | MaD:15 | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | MaD:14 | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | MaD:14 | +| CollectionFlow.cs:331:13:331:13 | access to local variable a : A | CollectionFlow.cs:333:43:333:43 | access to local variable a : A | provenance | | +| CollectionFlow.cs:331:17:331:23 | object creation of type A : A | CollectionFlow.cs:331:13:331:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element, property Key] : A | CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element, property Key] : A | provenance | | +| CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element, property Key] : A | provenance | MaD:3 | +| CollectionFlow.cs:333:43:333:43 | access to local variable a : A | CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | provenance | MaD:13 | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element, property Key] : A | CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair [property Key] : A | provenance | MaD:18 | +| CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair [property Key] : A | provenance | | +| CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:336:18:336:24 | access to property Key | provenance | | +| CollectionFlow.cs:353:32:353:38 | element : A | CollectionFlow.cs:353:55:353:61 | access to parameter element : A | provenance | | +| CollectionFlow.cs:353:44:353:48 | [post] access to parameter array : A[] [element] : A | CollectionFlow.cs:353:23:353:27 | array [Return] : A[] [element] : A | provenance | | +| CollectionFlow.cs:353:55:353:61 | access to parameter element : A | CollectionFlow.cs:353:44:353:48 | [post] access to parameter array : A[] [element] : A | provenance | | +| CollectionFlow.cs:357:13:357:13 | access to local variable a : A | CollectionFlow.cs:359:23:359:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:13:357:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:360:14:360:16 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:361:18:361:20 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | CollectionFlow.cs:353:32:353:38 | element : A | provenance | | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:360:14:360:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:360:14:360:19 | access to array element | provenance | | +| CollectionFlow.cs:361:18:361:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:362:14:362:23 | call to method First | provenance | | +| CollectionFlow.cs:375:34:375:40 | element : A | CollectionFlow.cs:375:55:375:61 | access to parameter element : A | provenance | | +| CollectionFlow.cs:375:46:375:49 | [post] access to parameter list : List [element] : A | CollectionFlow.cs:375:26:375:29 | list [Return] : List [element] : A | provenance | | +| CollectionFlow.cs:375:55:375:61 | access to parameter element : A | CollectionFlow.cs:375:46:375:49 | [post] access to parameter list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:379:13:379:13 | access to local variable a : A | CollectionFlow.cs:381:23:381:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:13:379:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:382:14:382:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:383:22:383:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | CollectionFlow.cs:375:34:375:40 | element : A | provenance | | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:382:14:382:17 | access to local variable list : List [element] : A | CollectionFlow.cs:382:14:382:20 | access to indexer | provenance | MaD:11 | +| CollectionFlow.cs:383:22:383:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | provenance | MaD:11 | +| CollectionFlow.cs:398:20:398:26 | object creation of type A : A | CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | provenance | | +| CollectionFlow.cs:399:26:399:32 | object creation of type A : A | CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | provenance | | +| CollectionFlow.cs:400:26:400:32 | object creation of type A : A | CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | provenance | | +| CollectionFlow.cs:401:20:401:38 | array creation of type A[] : null [element] : A | CollectionFlow.cs:40:49:40:52 | args : null [element] : A | provenance | | +| CollectionFlow.cs:401:28:401:38 | { ..., ... } : null [element] : A | CollectionFlow.cs:401:20:401:38 | array creation of type A[] : null [element] : A | provenance | | +| CollectionFlow.cs:401:30:401:36 | object creation of type A : A | CollectionFlow.cs:401:28:401:38 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:414:30:414:36 | object creation of type A : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:415:36:415:42 | object creation of type A : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:416:36:416:42 | object creation of type A : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:417:30:417:38 | [...] : IEnumerable [element] : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:417:31:417:37 | object creation of type A : A | CollectionFlow.cs:417:30:417:38 | [...] : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:439:13:439:13 | access to local variable a : A | CollectionFlow.cs:441:20:441:20 | access to local variable a : A | provenance | | +| CollectionFlow.cs:439:17:439:23 | object creation of type A : A | CollectionFlow.cs:439:13:439:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:441:9:441:13 | [post] access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:442:14:442:18 | access to local variable array : MyInlineArray [element] : A | provenance | | +| CollectionFlow.cs:441:20:441:20 | access to local variable a : A | CollectionFlow.cs:441:9:441:13 | [post] access to local variable array : MyInlineArray [element] : A | provenance | | +| CollectionFlow.cs:442:14:442:18 | access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:442:14:442:21 | access to array element | provenance | | +| CollectionFlow.cs:460:13:460:13 | access to local variable a : A | CollectionFlow.cs:461:22:461:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:460:17:460:23 | object creation of type A : A | CollectionFlow.cs:460:13:460:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:461:13:461:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:462:14:462:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:461:21:461:23 | [...] : A[] [element] : A | CollectionFlow.cs:461:13:461:17 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:461:22:461:22 | access to local variable a : A | CollectionFlow.cs:461:21:461:23 | [...] : A[] [element] : A | provenance | | +| CollectionFlow.cs:462:14:462:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:462:14:462:21 | access to array element | provenance | | +| CollectionFlow.cs:467:13:467:13 | access to local variable a : A | CollectionFlow.cs:468:22:468:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:467:17:467:23 | object creation of type A : A | CollectionFlow.cs:467:13:467:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:468:17:468:17 | access to local variable l : List [element] : A | CollectionFlow.cs:469:14:469:14 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:468:21:468:23 | [...] : List [element] : A | CollectionFlow.cs:468:17:468:17 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:468:22:468:22 | access to local variable a : A | CollectionFlow.cs:468:21:468:23 | [...] : List [element] : A | provenance | | +| CollectionFlow.cs:469:14:469:14 | access to local variable l : List [element] : A | CollectionFlow.cs:469:14:469:17 | access to indexer | provenance | MaD:11 | +| CollectionFlow.cs:480:13:480:13 | access to local variable a : A | CollectionFlow.cs:481:21:481:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:480:17:480:23 | object creation of type A : A | CollectionFlow.cs:480:13:480:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:481:13:481:16 | access to local variable temp : A[] [element] : A | CollectionFlow.cs:482:22:482:28 | .. access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:481:20:481:22 | [...] : A[] [element] : A | CollectionFlow.cs:481:13:481:16 | access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:481:21:481:21 | access to local variable a : A | CollectionFlow.cs:481:20:481:22 | [...] : A[] [element] : A | provenance | | +| CollectionFlow.cs:482:13:482:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:483:14:483:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:482:22:482:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:482:13:482:17 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:483:14:483:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:483:14:483:21 | access to array element | provenance | | +| CollectionFlow.cs:520:13:520:13 | access to local variable a : A | CollectionFlow.cs:521:40:521:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:520:17:520:23 | object creation of type A : A | CollectionFlow.cs:520:13:520:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:521:17:521:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:522:14:522:17 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:521:17:521:20 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:521:40:521:40 | access to local variable a : A | CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span [element] : A | provenance | MaD:23 | +| CollectionFlow.cs:522:14:522:17 | access to local variable span : Span [element] : A | CollectionFlow.cs:522:14:522:20 | access to indexer | provenance | MaD:26 | +| CollectionFlow.cs:527:13:527:13 | access to local variable a : A | CollectionFlow.cs:528:40:528:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:527:17:527:23 | object creation of type A : A | CollectionFlow.cs:527:13:527:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:528:17:528:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:529:19:529:22 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:528:17:528:20 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:528:40:528:40 | access to local variable a : A | CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span [element] : A | provenance | MaD:23 | +| CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : A | provenance | | +| CollectionFlow.cs:529:19:529:22 | access to local variable span : Span [element] : A | CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : A | provenance | MaD:25 | +| CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : A | CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : A | provenance | | +| CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:530:14:530:19 | access to array element | provenance | | +| CollectionFlow.cs:535:13:535:13 | access to local variable a : A | CollectionFlow.cs:536:21:536:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:535:17:535:23 | object creation of type A : A | CollectionFlow.cs:535:13:535:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:536:9:536:14 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:537:14:537:19 | access to parameter target : Span [element] : A | provenance | | +| CollectionFlow.cs:536:21:536:21 | access to local variable a : A | CollectionFlow.cs:536:9:536:14 | [post] access to parameter target : Span [element] : A | provenance | MaD:22 | +| CollectionFlow.cs:537:14:537:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:537:14:537:22 | access to indexer | provenance | MaD:26 | +| CollectionFlow.cs:542:13:542:18 | access to local variable source : Span [element] : A | CollectionFlow.cs:543:9:543:14 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span [element] : A | CollectionFlow.cs:542:13:542:18 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:542:34:542:50 | array creation of type A[] : null [element] : A | CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span [element] : A | provenance | MaD:24 | +| CollectionFlow.cs:542:40:542:50 | { ..., ... } : null [element] : A | CollectionFlow.cs:542:34:542:50 | array creation of type A[] : null [element] : A | provenance | | +| CollectionFlow.cs:542:42:542:48 | object creation of type A : A | CollectionFlow.cs:542:40:542:50 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:543:9:543:14 | access to local variable source : Span [element] : A | CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : A | provenance | MaD:21 | +| CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : A | provenance | | +| CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:544:14:544:22 | access to indexer | provenance | MaD:26 | +| CollectionFlow.cs:549:13:549:13 | access to local variable a : A | CollectionFlow.cs:550:60:550:60 | access to local variable a : A | provenance | | +| CollectionFlow.cs:549:17:549:23 | object creation of type A : A | CollectionFlow.cs:549:13:549:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan [element] : A | CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:550:52:550:62 | array creation of type A[] : null [element] : A | CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | provenance | MaD:19 | +| CollectionFlow.cs:550:58:550:62 | { ..., ... } : null [element] : A | CollectionFlow.cs:550:52:550:62 | array creation of type A[] : null [element] : A | provenance | | +| CollectionFlow.cs:550:60:550:60 | access to local variable a : A | CollectionFlow.cs:550:58:550:62 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan [element] : A | CollectionFlow.cs:551:14:551:20 | access to indexer | provenance | MaD:20 | +nodes +| CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | semmle.label | ts : null [element] : A | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : null [element] : A | semmle.label | access to parameter ts : null [element] : A | +| CollectionFlow.cs:14:52:14:56 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:16:56:16:57 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:16:56:16:61 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:18:49:18:52 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:18:63:18:66 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:18:63:18:69 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:20:75:20:78 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:20:75:20:81 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | semmle.label | access to property Keys : ICollection [element] : A | +| CollectionFlow.cs:22:73:22:89 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | semmle.label | ts : null [element] : A | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : null [element] : A | semmle.label | access to parameter ts : null [element] : A | +| CollectionFlow.cs:24:41:24:45 | access to array element : A | semmle.label | access to array element : A | +| CollectionFlow.cs:24:41:24:45 | access to array element : A | semmle.label | access to array element : A | +| CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:26:40:26:41 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:26:40:26:45 | access to array element : A | semmle.label | access to array element : A | +| CollectionFlow.cs:28:43:28:46 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:28:52:28:55 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:28:52:28:58 | access to indexer : A | semmle.label | access to indexer : A | +| CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:30:67:30:70 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:30:67:30:73 | access to indexer : A | semmle.label | access to indexer : A | +| CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair [property Value] : A | semmle.label | call to method First> : KeyValuePair [property Value] : A | +| CollectionFlow.cs:32:68:32:85 | access to property Value : A | semmle.label | access to property Value : A | +| CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | semmle.label | access to property Values : ICollection [element] : A | +| CollectionFlow.cs:34:69:34:87 | call to method First : A | semmle.label | call to method First : A | +| CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | semmle.label | access to property Keys : ICollection [element] : A | +| CollectionFlow.cs:36:67:36:83 | call to method First : A | semmle.label | call to method First : A | +| CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair [property Key] : A | semmle.label | call to method First> : KeyValuePair [property Key] : A | +| CollectionFlow.cs:38:66:38:81 | access to property Key : A | semmle.label | access to property Key : A | +| CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | semmle.label | args : A[] [element] : A | +| CollectionFlow.cs:40:49:40:52 | args : null [element] : A | semmle.label | args : null [element] : A | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : A[] [element] : A | semmle.label | access to parameter args : A[] [element] : A | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : null [element] : A | semmle.label | access to parameter args : null [element] : A | +| CollectionFlow.cs:40:63:40:69 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | semmle.label | args : IEnumerable [element] : A | +| CollectionFlow.cs:42:84:42:87 | access to parameter args : IEnumerable [element] : A | semmle.label | access to parameter args : IEnumerable [element] : A | +| CollectionFlow.cs:42:84:42:95 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:46:13:46:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:47:25:47:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:47:27:47:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:48:14:48:16 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:48:14:48:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:49:18:49:20 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:50:14:50:23 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:64:13:64:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:65:38:65:57 | { ..., ... } : CollectionFlow [field As, element] : A | semmle.label | { ..., ... } : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:65:45:65:55 | { ..., ... } : A[] [element] : A | semmle.label | { ..., ... } : A[] [element] : A | +| CollectionFlow.cs:65:53:65:53 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:66:14:66:14 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:66:14:66:17 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:66:14:66:20 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:67:18:67:18 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:67:18:67:21 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:68:14:68:24 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:68:20:68:20 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:82:13:82:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:83:38:83:58 | { ..., ... } : CollectionFlow [field As, element] : A | semmle.label | { ..., ... } : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:83:45:83:56 | { ..., ... } : A[] [element] : A | semmle.label | { ..., ... } : A[] [element] : A | +| CollectionFlow.cs:83:54:83:54 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:84:14:84:14 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:84:14:84:17 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:84:14:84:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:85:22:85:22 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:85:22:85:25 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:86:14:86:23 | call to method Last | semmle.label | call to method Last | +| CollectionFlow.cs:86:19:86:19 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:91:13:91:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:93:18:93:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:94:14:94:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:94:14:94:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:95:18:95:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:96:14:96:23 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:111:13:111:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:113:19:113:19 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:114:14:114:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:114:14:114:20 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:115:22:115:24 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:116:14:116:22 | call to method Last | semmle.label | call to method Last | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:121:13:121:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:123:19:123:19 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:124:14:124:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:124:14:124:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:125:22:125:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:126:14:126:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:140:13:140:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List [element] : A | semmle.label | object creation of type List : List [element] : A | +| CollectionFlow.cs:141:36:141:36 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:142:14:142:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:142:14:142:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:143:22:143:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:144:14:144:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:157:13:157:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:159:18:159:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:160:14:160:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:160:14:160:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:161:22:161:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:162:14:162:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:176:13:176:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | semmle.label | [post] access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:178:19:178:19 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:179:14:179:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:179:14:179:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:199:13:199:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | +| CollectionFlow.cs:200:52:200:52 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:201:14:201:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:201:14:201:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:220:13:220:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | +| CollectionFlow.cs:221:53:221:53 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:222:14:222:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:222:14:222:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:242:13:242:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | +| CollectionFlow.cs:243:49:243:49 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:244:14:244:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:244:14:244:22 | access to property Keys : Dictionary.KeyCollection [element] : A | semmle.label | access to property Keys : Dictionary.KeyCollection [element] : A | +| CollectionFlow.cs:244:14:244:30 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:245:21:245:24 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | semmle.label | call to method DictKeysFirst | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:261:13:261:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | +| CollectionFlow.cs:262:48:262:48 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:263:14:263:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:263:14:263:22 | access to property Keys : Dictionary.KeyCollection [element] : A | semmle.label | access to property Keys : Dictionary.KeyCollection [element] : A | +| CollectionFlow.cs:263:14:263:30 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:264:21:264:24 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | semmle.label | call to method DictKeysFirst | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:280:13:280:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:280:17:280:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:281:13:281:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:281:25:281:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:281:27:281:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:282:27:282:29 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:283:18:283:18 | access to local variable x | semmle.label | access to local variable x | +| CollectionFlow.cs:295:13:295:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:295:17:295:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:296:13:296:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:296:25:296:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:296:27:296:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:297:13:297:22 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:297:26:297:28 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:297:26:297:44 | call to method GetEnumerator : IEnumerator [property Current] : A | semmle.label | call to method GetEnumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:299:18:299:27 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:299:18:299:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:312:13:312:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:312:17:312:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:314:9:314:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:314:18:314:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:317:18:317:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:331:13:331:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:331:17:331:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element, property Key] : A | semmle.label | [post] access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | semmle.label | object creation of type KeyValuePair : KeyValuePair [property Key] : A | +| CollectionFlow.cs:333:43:333:43 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element, property Key] : A | semmle.label | access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair [property Key] : A | semmle.label | kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair [property Key] : A | semmle.label | access to parameter kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:336:18:336:24 | access to property Key | semmle.label | access to property Key | +| CollectionFlow.cs:353:23:353:27 | array [Return] : A[] [element] : A | semmle.label | array [Return] : A[] [element] : A | +| CollectionFlow.cs:353:32:353:38 | element : A | semmle.label | element : A | +| CollectionFlow.cs:353:44:353:48 | [post] access to parameter array : A[] [element] : A | semmle.label | [post] access to parameter array : A[] [element] : A | +| CollectionFlow.cs:353:55:353:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:357:13:357:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:360:14:360:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:360:14:360:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:361:18:361:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:362:14:362:23 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:375:26:375:29 | list [Return] : List [element] : A | semmle.label | list [Return] : List [element] : A | +| CollectionFlow.cs:375:34:375:40 | element : A | semmle.label | element : A | +| CollectionFlow.cs:375:46:375:49 | [post] access to parameter list : List [element] : A | semmle.label | [post] access to parameter list : List [element] : A | +| CollectionFlow.cs:375:55:375:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:379:13:379:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:382:14:382:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:382:14:382:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:383:22:383:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:384:14:384:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:398:20:398:26 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:399:26:399:32 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:400:26:400:32 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:401:20:401:38 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:401:28:401:38 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:401:30:401:36 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:414:30:414:36 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:415:36:415:42 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:416:36:416:42 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:417:30:417:38 | [...] : IEnumerable [element] : A | semmle.label | [...] : IEnumerable [element] : A | +| CollectionFlow.cs:417:31:417:37 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:439:13:439:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:439:17:439:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:441:9:441:13 | [post] access to local variable array : MyInlineArray [element] : A | semmle.label | [post] access to local variable array : MyInlineArray [element] : A | +| CollectionFlow.cs:441:20:441:20 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:442:14:442:18 | access to local variable array : MyInlineArray [element] : A | semmle.label | access to local variable array : MyInlineArray [element] : A | +| CollectionFlow.cs:442:14:442:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:460:13:460:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:460:17:460:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:461:13:461:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:461:21:461:23 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | +| CollectionFlow.cs:461:22:461:22 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:462:14:462:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:462:14:462:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:467:13:467:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:467:17:467:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:468:17:468:17 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | +| CollectionFlow.cs:468:21:468:23 | [...] : List [element] : A | semmle.label | [...] : List [element] : A | +| CollectionFlow.cs:468:22:468:22 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:469:14:469:14 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | +| CollectionFlow.cs:469:14:469:17 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:480:13:480:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:480:17:480:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:481:13:481:16 | access to local variable temp : A[] [element] : A | semmle.label | access to local variable temp : A[] [element] : A | +| CollectionFlow.cs:481:20:481:22 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | +| CollectionFlow.cs:481:21:481:21 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:482:13:482:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:482:22:482:28 | .. access to local variable temp : A[] [element] : A | semmle.label | .. access to local variable temp : A[] [element] : A | +| CollectionFlow.cs:483:14:483:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:483:14:483:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:520:13:520:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:520:17:520:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:521:17:521:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | +| CollectionFlow.cs:521:40:521:40 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:522:14:522:17 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:522:14:522:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:527:13:527:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:527:17:527:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:528:17:528:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | +| CollectionFlow.cs:528:40:528:40 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | +| CollectionFlow.cs:529:19:529:22 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : A | semmle.label | call to method ToArray : T[] [element] : A | +| CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | +| CollectionFlow.cs:530:14:530:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:535:13:535:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:535:17:535:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:536:9:536:14 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | +| CollectionFlow.cs:536:21:536:21 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:537:14:537:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | +| CollectionFlow.cs:537:14:537:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:542:13:542:18 | access to local variable source : Span [element] : A | semmle.label | access to local variable source : Span [element] : A | +| CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | +| CollectionFlow.cs:542:34:542:50 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:542:40:542:50 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:542:42:542:48 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:543:9:543:14 | access to local variable source : Span [element] : A | semmle.label | access to local variable source : Span [element] : A | +| CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | +| CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | +| CollectionFlow.cs:544:14:544:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:549:13:549:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:549:17:549:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan [element] : A | semmle.label | access to local variable span : ReadOnlySpan [element] : A | +| CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | semmle.label | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | +| CollectionFlow.cs:550:52:550:62 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:550:58:550:62 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:550:60:550:60 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan [element] : A | semmle.label | access to local variable span : ReadOnlySpan [element] : A | +| CollectionFlow.cs:551:14:551:20 | access to indexer | semmle.label | access to indexer | +subpaths +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:50:14:50:23 | call to method First | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:68:14:68:24 | call to method First | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | CollectionFlow.cs:26:40:26:45 | access to array element : A | CollectionFlow.cs:86:14:86:23 | call to method Last | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:96:14:96:23 | call to method First | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | CollectionFlow.cs:26:40:26:45 | access to array element : A | CollectionFlow.cs:116:14:116:22 | call to method Last | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:83 | call to method First : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:81 | access to property Key : A | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:83 | call to method First : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:81 | access to property Key : A | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | CollectionFlow.cs:353:32:353:38 | element : A | CollectionFlow.cs:353:23:353:27 | array [Return] : A[] [element] : A | CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:362:14:362:23 | call to method First | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | CollectionFlow.cs:375:34:375:40 | element : A | CollectionFlow.cs:375:26:375:29 | list [Return] : List [element] : A | CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | +#select +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:48:14:48:19 | access to array element | $@ | CollectionFlow.cs:48:14:48:19 | access to array element | access to array element | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:50:14:50:23 | call to method First | $@ | CollectionFlow.cs:50:14:50:23 | call to method First | call to method First | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:66:14:66:20 | access to array element | $@ | CollectionFlow.cs:66:14:66:20 | access to array element | access to array element | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:68:14:68:24 | call to method First | $@ | CollectionFlow.cs:68:14:68:24 | call to method First | call to method First | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:16:56:16:61 | access to array element | $@ | CollectionFlow.cs:16:56:16:61 | access to array element | access to array element | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:84:14:84:21 | access to array element | $@ | CollectionFlow.cs:84:14:84:21 | access to array element | access to array element | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:86:14:86:23 | call to method Last | $@ | CollectionFlow.cs:86:14:86:23 | call to method Last | call to method Last | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:94:14:94:19 | access to array element | $@ | CollectionFlow.cs:94:14:94:19 | access to array element | access to array element | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:96:14:96:23 | call to method First | $@ | CollectionFlow.cs:96:14:96:23 | call to method First | call to method First | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:16:56:16:61 | access to array element | $@ | CollectionFlow.cs:16:56:16:61 | access to array element | access to array element | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:114:14:114:20 | access to array element | $@ | CollectionFlow.cs:114:14:114:20 | access to array element | access to array element | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:116:14:116:22 | call to method Last | $@ | CollectionFlow.cs:116:14:116:22 | call to method Last | call to method Last | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:124:14:124:20 | access to indexer | $@ | CollectionFlow.cs:124:14:124:20 | access to indexer | access to indexer | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | $@ | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:142:14:142:20 | access to indexer | $@ | CollectionFlow.cs:142:14:142:20 | access to indexer | access to indexer | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | $@ | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:160:14:160:20 | access to indexer | $@ | CollectionFlow.cs:160:14:160:20 | access to indexer | access to indexer | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | $@ | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:179:14:179:20 | access to indexer | $@ | CollectionFlow.cs:179:14:179:20 | access to indexer | access to indexer | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | $@ | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | call to method DictValuesFirst | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:201:14:201:20 | access to indexer | $@ | CollectionFlow.cs:201:14:201:20 | access to indexer | access to indexer | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | $@ | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | call to method DictValuesFirst | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:222:14:222:20 | access to indexer | $@ | CollectionFlow.cs:222:14:222:20 | access to indexer | access to indexer | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | $@ | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | call to method DictValuesFirst | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:22:73:22:89 | call to method First | $@ | CollectionFlow.cs:22:73:22:89 | call to method First | call to method First | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:244:14:244:30 | call to method First | $@ | CollectionFlow.cs:244:14:244:30 | call to method First | call to method First | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | $@ | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | call to method DictKeysFirst | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:22:73:22:89 | call to method First | $@ | CollectionFlow.cs:22:73:22:89 | call to method First | call to method First | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:263:14:263:30 | call to method First | $@ | CollectionFlow.cs:263:14:263:30 | call to method First | call to method First | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | $@ | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | call to method DictKeysFirst | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:280:17:280:23 | object creation of type A : A | CollectionFlow.cs:280:17:280:23 | object creation of type A : A | CollectionFlow.cs:283:18:283:18 | access to local variable x | $@ | CollectionFlow.cs:283:18:283:18 | access to local variable x | access to local variable x | +| CollectionFlow.cs:295:17:295:23 | object creation of type A : A | CollectionFlow.cs:295:17:295:23 | object creation of type A : A | CollectionFlow.cs:299:18:299:35 | access to property Current | $@ | CollectionFlow.cs:299:18:299:35 | access to property Current | access to property Current | +| CollectionFlow.cs:312:17:312:23 | object creation of type A : A | CollectionFlow.cs:312:17:312:23 | object creation of type A : A | CollectionFlow.cs:317:18:317:35 | access to property Current | $@ | CollectionFlow.cs:317:18:317:35 | access to property Current | access to property Current | +| CollectionFlow.cs:331:17:331:23 | object creation of type A : A | CollectionFlow.cs:331:17:331:23 | object creation of type A : A | CollectionFlow.cs:336:18:336:24 | access to property Key | $@ | CollectionFlow.cs:336:18:336:24 | access to property Key | access to property Key | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:360:14:360:19 | access to array element | $@ | CollectionFlow.cs:360:14:360:19 | access to array element | access to array element | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:362:14:362:23 | call to method First | $@ | CollectionFlow.cs:362:14:362:23 | call to method First | call to method First | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:382:14:382:20 | access to indexer | $@ | CollectionFlow.cs:382:14:382:20 | access to indexer | access to indexer | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | $@ | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:398:20:398:26 | object creation of type A : A | CollectionFlow.cs:398:20:398:26 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:399:26:399:32 | object creation of type A : A | CollectionFlow.cs:399:26:399:32 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:400:26:400:32 | object creation of type A : A | CollectionFlow.cs:400:26:400:32 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:401:30:401:36 | object creation of type A : A | CollectionFlow.cs:401:30:401:36 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:414:30:414:36 | object creation of type A : A | CollectionFlow.cs:414:30:414:36 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:415:36:415:42 | object creation of type A : A | CollectionFlow.cs:415:36:415:42 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:416:36:416:42 | object creation of type A : A | CollectionFlow.cs:416:36:416:42 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:417:31:417:37 | object creation of type A : A | CollectionFlow.cs:417:31:417:37 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:439:17:439:23 | object creation of type A : A | CollectionFlow.cs:439:17:439:23 | object creation of type A : A | CollectionFlow.cs:442:14:442:21 | access to array element | $@ | CollectionFlow.cs:442:14:442:21 | access to array element | access to array element | +| CollectionFlow.cs:460:17:460:23 | object creation of type A : A | CollectionFlow.cs:460:17:460:23 | object creation of type A : A | CollectionFlow.cs:462:14:462:21 | access to array element | $@ | CollectionFlow.cs:462:14:462:21 | access to array element | access to array element | +| CollectionFlow.cs:467:17:467:23 | object creation of type A : A | CollectionFlow.cs:467:17:467:23 | object creation of type A : A | CollectionFlow.cs:469:14:469:17 | access to indexer | $@ | CollectionFlow.cs:469:14:469:17 | access to indexer | access to indexer | +| CollectionFlow.cs:480:17:480:23 | object creation of type A : A | CollectionFlow.cs:480:17:480:23 | object creation of type A : A | CollectionFlow.cs:483:14:483:21 | access to array element | $@ | CollectionFlow.cs:483:14:483:21 | access to array element | access to array element | +| CollectionFlow.cs:520:17:520:23 | object creation of type A : A | CollectionFlow.cs:520:17:520:23 | object creation of type A : A | CollectionFlow.cs:522:14:522:20 | access to indexer | $@ | CollectionFlow.cs:522:14:522:20 | access to indexer | access to indexer | +| CollectionFlow.cs:527:17:527:23 | object creation of type A : A | CollectionFlow.cs:527:17:527:23 | object creation of type A : A | CollectionFlow.cs:530:14:530:19 | access to array element | $@ | CollectionFlow.cs:530:14:530:19 | access to array element | access to array element | +| CollectionFlow.cs:535:17:535:23 | object creation of type A : A | CollectionFlow.cs:535:17:535:23 | object creation of type A : A | CollectionFlow.cs:537:14:537:22 | access to indexer | $@ | CollectionFlow.cs:537:14:537:22 | access to indexer | access to indexer | +| CollectionFlow.cs:542:42:542:48 | object creation of type A : A | CollectionFlow.cs:542:42:542:48 | object creation of type A : A | CollectionFlow.cs:544:14:544:22 | access to indexer | $@ | CollectionFlow.cs:544:14:544:22 | access to indexer | access to indexer | +| CollectionFlow.cs:549:17:549:23 | object creation of type A : A | CollectionFlow.cs:549:17:549:23 | object creation of type A : A | CollectionFlow.cs:551:14:551:20 | access to indexer | $@ | CollectionFlow.cs:551:14:551:20 | access to indexer | access to indexer | diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql b/csharp/ql/test/library-tests/dataflow/collections/CollectionDataFlow.ql similarity index 50% rename from csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql rename to csharp/ql/test/library-tests/dataflow/collections/CollectionDataFlow.ql index 67553b5cbc9..d167fcdb638 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.ql +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionDataFlow.ql @@ -2,20 +2,9 @@ * @kind path-problem */ -import csharp +import CollectionFlowCommon import utils.test.ProvenancePathGraph::ShowProvenance -module ArrayFlowConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } - - predicate isSink(DataFlow::Node sink) { - exists(MethodCall mc | - mc.getTarget().hasUndecoratedName("Sink") and - mc.getAnArgument() = sink.asExpr() - ) - } -} - module ArrayFlow = DataFlow::Global; from ArrayFlow::PathNode source, ArrayFlow::PathNode sink diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.cs b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.cs index c0a7900461f..c95ab58bdb8 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.cs +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.cs @@ -550,4 +550,10 @@ public class CollectionFlow ReadOnlySpan span = new ReadOnlySpan(new[] { a }); Sink(span[0]); // flow } + + public void ImplicitMapValueRead(Dictionary dict) { + var a = new A(); + dict[0] = a; + Sink(dict); // taint flow + } } diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlowCommon.qll b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlowCommon.qll new file mode 100644 index 00000000000..bfbd22773e1 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlowCommon.qll @@ -0,0 +1,12 @@ +import csharp + +module ArrayFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } + + predicate isSink(DataFlow::Node sink) { + exists(MethodCall mc | + mc.getTarget().hasUndecoratedName("Sink") and + mc.getAnArgument() = sink.asExpr() + ) + } +} diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionTaintFlow.expected b/csharp/ql/test/library-tests/dataflow/collections/CollectionTaintFlow.expected new file mode 100644 index 00000000000..c54b7f84e6a --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionTaintFlow.expected @@ -0,0 +1,1384 @@ +models +| 1 | Summary: System.Collections.Generic; Dictionary; false; get_Keys; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; ReturnValue.Element; value; manual | +| 2 | Summary: System.Collections.Generic; Dictionary; false; get_Values; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; ReturnValue.Element; value; manual | +| 3 | Summary: System.Collections.Generic; ICollection; true; Add; (T); ; Argument[0]; Argument[this].Element; value; manual | +| 4 | Summary: System.Collections.Generic; ICollection; true; Clear; (); ; Argument[this].WithoutElement; Argument[this]; value; manual | +| 5 | Summary: System.Collections.Generic; IDictionary; true; Add; (TKey,TValue); ; Argument[0]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; value; manual | +| 6 | Summary: System.Collections.Generic; IDictionary; true; Add; (TKey,TValue); ; Argument[1]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; value; manual | +| 7 | Summary: System.Collections.Generic; IDictionary; true; get_Item; (TKey); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; ReturnValue; value; manual | +| 8 | Summary: System.Collections.Generic; IDictionary; true; get_Keys; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; ReturnValue.Element; value; manual | +| 9 | Summary: System.Collections.Generic; IDictionary; true; get_Values; (); ; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; ReturnValue.Element; value; manual | +| 10 | Summary: System.Collections.Generic; IDictionary; true; set_Item; (TKey,TValue); ; Argument[0]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]; value; manual | +| 11 | Summary: System.Collections.Generic; IDictionary; true; set_Item; (TKey,TValue); ; Argument[1]; Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Value]; value; manual | +| 12 | Summary: System.Collections.Generic; IList; true; get_Item; (System.Int32); ; Argument[this].Element; ReturnValue; value; manual | +| 13 | Summary: System.Collections.Generic; IList; true; set_Item; (System.Int32,T); ; Argument[1]; Argument[this].Element; value; manual | +| 14 | Summary: System.Collections.Generic; KeyValuePair; false; KeyValuePair; (TKey,TValue); ; Argument[0]; Argument[this].Property[System.Collections.Generic.KeyValuePair`2.Key]; value; manual | +| 15 | Summary: System.Collections.Generic; KeyValuePair; false; get_Key; (); ; Argument[this]; ReturnValue; taint; df-generated | +| 16 | Summary: System.Collections.Generic; KeyValuePair; false; get_Value; (); ; Argument[this]; ReturnValue; taint; df-generated | +| 17 | Summary: System.Collections.Generic; List+Enumerator; false; get_Current; (); ; Argument[this].Property[System.Collections.Generic.List`1+Enumerator.Current]; ReturnValue; value; dfc-generated | +| 18 | Summary: System.Collections.Generic; List; false; GetEnumerator; (); ; Argument[this].Element; ReturnValue.Property[System.Collections.Generic.List`1+Enumerator.Current]; value; manual | +| 19 | Summary: System.Collections; IEnumerable; true; GetEnumerator; (); ; Argument[this].Element; ReturnValue.Property[System.Collections.IEnumerator.Current]; value; manual | +| 20 | Summary: System.Collections; IList; true; Clear; (); ; Argument[this].WithoutElement; Argument[this]; value; manual | +| 21 | Summary: System.Linq; Enumerable; false; First; (System.Collections.Generic.IEnumerable); ; Argument[0].Element; ReturnValue; value; manual | +| 22 | Summary: System.Linq; Enumerable; false; Select; (System.Collections.Generic.IEnumerable,System.Func); ; Argument[0].Element; Argument[1].Parameter[0]; value; manual | +| 23 | Summary: System; ReadOnlySpan; false; ReadOnlySpan; (T[]); ; Argument[0].Element; Argument[this].Element; value; manual | +| 24 | Summary: System; ReadOnlySpan; false; get_Item; (System.Int32); ; Argument[this].Element; ReturnValue; value; manual | +| 25 | Summary: System; Span; false; CopyTo; (System.Span); ; Argument[this].Element; Argument[0].Element; value; manual | +| 26 | Summary: System; Span; false; Fill; (T); ; Argument[0]; Argument[this].Element; value; manual | +| 27 | Summary: System; Span; false; Span; (T); ; Argument[0]; Argument[this].Element; value; manual | +| 28 | Summary: System; Span; false; Span; (T[]); ; Argument[0].Element; Argument[this].Element; value; manual | +| 29 | Summary: System; Span; false; ToArray; (); ; Argument[this].Element; ReturnValue.Element; value; manual | +| 30 | Summary: System; Span; false; get_Item; (System.Int32); ; Argument[this].Element; ReturnValue; value; manual | +edges +| CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | CollectionFlow.cs:14:52:14:53 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | CollectionFlow.cs:14:52:14:53 | access to parameter ts : null [element] : A | provenance | | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:14:52:14:56 | access to array element | provenance | | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : null [element] : A | CollectionFlow.cs:14:52:14:56 | access to array element | provenance | | +| CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | CollectionFlow.cs:16:56:16:57 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:16:56:16:57 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:16:56:16:61 | access to array element | provenance | | +| CollectionFlow.cs:18:49:18:52 | list : List | CollectionFlow.cs:18:63:18:66 | access to parameter list : List | provenance | | +| CollectionFlow.cs:18:49:18:52 | list : List | CollectionFlow.cs:18:63:18:69 | access to indexer | provenance | | +| CollectionFlow.cs:18:49:18:52 | list : List [element] : A | CollectionFlow.cs:18:63:18:66 | access to parameter list : List [element] : A | provenance | | +| CollectionFlow.cs:18:63:18:66 | access to parameter list : List | CollectionFlow.cs:18:63:18:69 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:18:63:18:66 | access to parameter list : List [element] : A | CollectionFlow.cs:18:63:18:69 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:20:61:20:64 | dict : Dictionary | CollectionFlow.cs:20:75:20:81 | access to indexer | provenance | | +| CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:75:20:78 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:20:75:20:78 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:75:20:81 | access to indexer | provenance | MaD:7 | +| CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | provenance | MaD:8 | +| CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | CollectionFlow.cs:22:73:22:89 | call to method First | provenance | MaD:21 | +| CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:42 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | CollectionFlow.cs:24:41:24:42 | access to parameter ts : null [element] : A | provenance | | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | provenance | | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : null [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | provenance | | +| CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | CollectionFlow.cs:26:40:26:41 | access to parameter ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:26:40:26:41 | access to parameter ts : A[] [element] : A | CollectionFlow.cs:26:40:26:45 | access to array element : A | provenance | | +| CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:55 | access to parameter list : List | provenance | | +| CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | provenance | | +| CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:55 | access to parameter list : List [element] : A | provenance | | +| CollectionFlow.cs:28:52:28:55 | access to parameter list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | provenance | MaD:12 | +| CollectionFlow.cs:28:52:28:55 | access to parameter list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | provenance | MaD:12 | +| CollectionFlow.cs:30:58:30:61 | dict : Dictionary | CollectionFlow.cs:30:67:30:73 | access to indexer : T | provenance | | +| CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:70 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:30:67:30:70 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | provenance | MaD:7 | +| CollectionFlow.cs:32:59:32:62 | dict : Dictionary | CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary | provenance | | +| CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary | CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair | provenance | MaD:21 | +| CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair [property Value] : A | provenance | MaD:21 | +| CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair | CollectionFlow.cs:32:68:32:85 | access to property Value : T | provenance | MaD:16 | +| CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair [property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | provenance | | +| CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | provenance | MaD:2 | +| CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | provenance | MaD:9 | +| CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | provenance | MaD:21 | +| CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | provenance | MaD:8 | +| CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | CollectionFlow.cs:36:67:36:83 | call to method First : A | provenance | MaD:21 | +| CollectionFlow.cs:38:57:38:60 | dict : Dictionary | CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary | provenance | | +| CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary | CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair | provenance | MaD:21 | +| CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair [property Key] : A | provenance | MaD:21 | +| CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair | CollectionFlow.cs:38:66:38:81 | access to property Key : T | provenance | MaD:15 | +| CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair [property Key] : A | CollectionFlow.cs:38:66:38:81 | access to property Key : A | provenance | | +| CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | CollectionFlow.cs:40:63:40:66 | access to parameter args : A[] [element] : A | provenance | | +| CollectionFlow.cs:40:49:40:52 | args : null [element] : A | CollectionFlow.cs:40:63:40:66 | access to parameter args : null [element] : A | provenance | | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : A[] [element] : A | CollectionFlow.cs:40:63:40:69 | access to array element | provenance | | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : null [element] : A | CollectionFlow.cs:40:63:40:69 | access to array element | provenance | | +| CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | CollectionFlow.cs:42:84:42:87 | access to parameter args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:42:84:42:87 | access to parameter args : IEnumerable [element] : A | CollectionFlow.cs:42:84:42:95 | call to method First | provenance | MaD:21 | +| CollectionFlow.cs:46:13:46:13 | access to local variable a : A | CollectionFlow.cs:47:27:47:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:13:46:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | CollectionFlow.cs:48:14:48:16 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | CollectionFlow.cs:49:18:49:20 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:25:47:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:47:27:47:27 | access to local variable a : A | CollectionFlow.cs:47:25:47:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:48:14:48:16 | access to local variable as : null [element] : A | CollectionFlow.cs:48:14:48:19 | access to array element | provenance | | +| CollectionFlow.cs:49:18:49:20 | access to local variable as : null [element] : A | CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | provenance | | +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | provenance | | +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | CollectionFlow.cs:50:14:50:23 | call to method First | provenance | | +| CollectionFlow.cs:64:13:64:13 | access to local variable a : A | CollectionFlow.cs:65:53:65:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:13:64:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:66:14:66:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:67:18:67:18 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:68:20:68:20 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:38:65:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:45:65:55 | { ..., ... } : A[] [element] : A | CollectionFlow.cs:65:38:65:57 | { ..., ... } : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:65:53:65:53 | access to local variable a : A | CollectionFlow.cs:65:45:65:55 | { ..., ... } : A[] [element] : A | provenance | | +| CollectionFlow.cs:66:14:66:14 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:66:14:66:17 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:66:14:66:17 | access to field As : A[] [element] : A | CollectionFlow.cs:66:14:66:20 | access to array element | provenance | | +| CollectionFlow.cs:67:18:67:18 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:67:18:67:21 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:67:18:67:21 | access to field As : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:68:20:68:20 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | CollectionFlow.cs:68:14:68:24 | call to method First | provenance | | +| CollectionFlow.cs:82:13:82:13 | access to local variable a : A | CollectionFlow.cs:83:54:83:54 | access to local variable a : A | provenance | | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:13:82:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:84:14:84:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:85:22:85:22 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:86:19:86:19 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:38:83:58 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:45:83:56 | { ..., ... } : A[] [element] : A | CollectionFlow.cs:83:38:83:58 | { ..., ... } : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:83:54:83:54 | access to local variable a : A | CollectionFlow.cs:83:45:83:56 | { ..., ... } : A[] [element] : A | provenance | | +| CollectionFlow.cs:84:14:84:14 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:84:14:84:17 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:84:14:84:17 | access to field As : A[] [element] : A | CollectionFlow.cs:84:14:84:21 | access to array element | provenance | | +| CollectionFlow.cs:85:22:85:22 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:85:22:85:25 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:85:22:85:25 | access to field As : A[] [element] : A | CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:86:19:86:19 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | provenance | | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | CollectionFlow.cs:86:14:86:23 | call to method Last | provenance | | +| CollectionFlow.cs:91:13:91:13 | access to local variable a : A | CollectionFlow.cs:93:18:93:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:13:91:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:94:14:94:16 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:95:18:95:20 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:93:18:93:18 | access to local variable a : A | CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:94:14:94:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:94:14:94:19 | access to array element | provenance | | +| CollectionFlow.cs:95:18:95:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:96:14:96:23 | call to method First | provenance | | +| CollectionFlow.cs:111:13:111:13 | access to local variable a : A | CollectionFlow.cs:113:19:113:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:13:111:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:114:14:114:16 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:115:22:115:24 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:113:19:113:19 | access to local variable a : A | CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:114:14:114:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:114:14:114:20 | access to array element | provenance | | +| CollectionFlow.cs:115:22:115:24 | access to local variable as : A[] [element] : A | CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | CollectionFlow.cs:116:14:116:22 | call to method Last | provenance | | +| CollectionFlow.cs:121:13:121:13 | access to local variable a : A | CollectionFlow.cs:123:19:123:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:13:121:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:122:13:122:16 | access to local variable list : List | CollectionFlow.cs:124:14:124:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:122:13:122:16 | access to local variable list : List | CollectionFlow.cs:124:14:124:20 | access to indexer | provenance | | +| CollectionFlow.cs:122:13:122:16 | access to local variable list : List | CollectionFlow.cs:125:22:125:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:122:13:122:16 | access to local variable list : List | CollectionFlow.cs:126:24:126:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:122:20:122:32 | object creation of type List : List | CollectionFlow.cs:122:13:122:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:124:14:124:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:125:22:125:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:123:19:123:19 | access to local variable a : A | CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | provenance | MaD:13 | +| CollectionFlow.cs:124:14:124:17 | access to local variable list : List | CollectionFlow.cs:124:14:124:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:124:14:124:17 | access to local variable list : List [element] : A | CollectionFlow.cs:124:14:124:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:125:22:125:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:125:22:125:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:131:13:131:16 | access to local variable list : List | CollectionFlow.cs:133:14:133:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:131:13:131:16 | access to local variable list : List | CollectionFlow.cs:133:14:133:20 | access to indexer | provenance | | +| CollectionFlow.cs:131:13:131:16 | access to local variable list : List | CollectionFlow.cs:134:22:134:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:131:13:131:16 | access to local variable list : List | CollectionFlow.cs:135:24:135:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:131:20:131:32 | object creation of type List : List | CollectionFlow.cs:131:13:131:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:133:14:133:17 | access to local variable list : List | CollectionFlow.cs:133:14:133:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:134:22:134:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:135:24:135:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:135:24:135:27 | access to local variable list : List | CollectionFlow.cs:135:14:135:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:135:24:135:27 | access to local variable list : List | CollectionFlow.cs:135:14:135:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:140:13:140:13 | access to local variable a : A | CollectionFlow.cs:141:36:141:36 | access to local variable a : A | provenance | | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:13:140:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List | CollectionFlow.cs:142:14:142:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List | CollectionFlow.cs:142:14:142:20 | access to indexer | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List | CollectionFlow.cs:143:22:143:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List | CollectionFlow.cs:144:24:144:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | CollectionFlow.cs:142:14:142:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | CollectionFlow.cs:143:22:143:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List | CollectionFlow.cs:141:13:141:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List [element] : A | CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:141:36:141:36 | access to local variable a : A | CollectionFlow.cs:141:20:141:38 | object creation of type List : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:142:14:142:17 | access to local variable list : List | CollectionFlow.cs:142:14:142:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:142:14:142:17 | access to local variable list : List [element] : A | CollectionFlow.cs:142:14:142:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:143:22:143:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:143:22:143:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:149:13:149:16 | access to local variable list : List | CollectionFlow.cs:150:14:150:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:149:13:149:16 | access to local variable list : List | CollectionFlow.cs:150:14:150:20 | access to indexer | provenance | | +| CollectionFlow.cs:149:13:149:16 | access to local variable list : List | CollectionFlow.cs:151:22:151:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:149:13:149:16 | access to local variable list : List | CollectionFlow.cs:152:24:152:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:149:20:149:42 | object creation of type List : List | CollectionFlow.cs:149:13:149:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:150:14:150:17 | access to local variable list : List | CollectionFlow.cs:150:14:150:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:151:22:151:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:152:24:152:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:152:24:152:27 | access to local variable list : List | CollectionFlow.cs:152:14:152:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:152:24:152:27 | access to local variable list : List | CollectionFlow.cs:152:14:152:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:157:13:157:13 | access to local variable a : A | CollectionFlow.cs:159:18:159:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:13:157:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:158:13:158:16 | access to local variable list : List | CollectionFlow.cs:160:14:160:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:158:13:158:16 | access to local variable list : List | CollectionFlow.cs:160:14:160:20 | access to indexer | provenance | | +| CollectionFlow.cs:158:13:158:16 | access to local variable list : List | CollectionFlow.cs:161:22:161:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:158:13:158:16 | access to local variable list : List | CollectionFlow.cs:162:24:162:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:158:20:158:32 | object creation of type List : List | CollectionFlow.cs:158:13:158:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:160:14:160:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:161:22:161:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:159:18:159:18 | access to local variable a : A | CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:160:14:160:17 | access to local variable list : List | CollectionFlow.cs:160:14:160:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:160:14:160:17 | access to local variable list : List [element] : A | CollectionFlow.cs:160:14:160:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:161:22:161:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:161:22:161:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:167:13:167:16 | access to local variable list : List | CollectionFlow.cs:169:14:169:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:167:13:167:16 | access to local variable list : List | CollectionFlow.cs:169:14:169:20 | access to indexer | provenance | | +| CollectionFlow.cs:167:13:167:16 | access to local variable list : List | CollectionFlow.cs:170:22:170:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:167:13:167:16 | access to local variable list : List | CollectionFlow.cs:171:24:171:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:167:20:167:32 | object creation of type List : List | CollectionFlow.cs:167:13:167:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:169:14:169:17 | access to local variable list : List | CollectionFlow.cs:169:14:169:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:170:22:170:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:171:24:171:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:171:24:171:27 | access to local variable list : List | CollectionFlow.cs:171:14:171:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:171:24:171:27 | access to local variable list : List | CollectionFlow.cs:171:14:171:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:176:13:176:13 | access to local variable a : A | CollectionFlow.cs:178:19:178:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:13:176:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:177:13:177:16 | access to local variable dict : Dictionary | CollectionFlow.cs:179:14:179:20 | access to indexer | provenance | | +| CollectionFlow.cs:177:13:177:16 | access to local variable dict : Dictionary | CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:177:13:177:16 | access to local variable dict : Dictionary | CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:177:13:177:16 | access to local variable dict : Dictionary | CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:177:13:177:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:14:179:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:178:19:178:19 | access to local variable a : A | CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | provenance | MaD:11 | +| CollectionFlow.cs:179:14:179:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:14:179:20 | access to indexer | provenance | MaD:7 | +| CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary | CollectionFlow.cs:20:61:20:64 | dict : Dictionary | provenance | | +| CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | provenance | | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | provenance | | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | provenance | MaD:7 | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | provenance | | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | provenance | MaD:2 | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | provenance | MaD:9 | +| CollectionFlow.cs:188:13:188:16 | access to local variable dict : Dictionary | CollectionFlow.cs:190:14:190:20 | access to indexer | provenance | | +| CollectionFlow.cs:188:13:188:16 | access to local variable dict : Dictionary | CollectionFlow.cs:191:23:191:26 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:188:13:188:16 | access to local variable dict : Dictionary | CollectionFlow.cs:192:28:192:31 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:188:13:188:16 | access to local variable dict : Dictionary | CollectionFlow.cs:193:29:193:32 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:188:13:188:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:191:23:191:26 | access to local variable dict : Dictionary | CollectionFlow.cs:20:61:20:64 | dict : Dictionary | provenance | | +| CollectionFlow.cs:192:28:192:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | provenance | | +| CollectionFlow.cs:192:28:192:31 | access to local variable dict : Dictionary | CollectionFlow.cs:192:14:192:32 | call to method DictIndexZero | provenance | | +| CollectionFlow.cs:193:29:193:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | provenance | | +| CollectionFlow.cs:193:29:193:32 | access to local variable dict : Dictionary | CollectionFlow.cs:193:14:193:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:199:13:199:13 | access to local variable a : A | CollectionFlow.cs:200:52:200:52 | access to local variable a : A | provenance | | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:13:199:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary | CollectionFlow.cs:201:14:201:20 | access to indexer | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary | CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary | CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary | CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:14:201:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:200:52:200:52 | access to local variable a : A | CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | MaD:6 | +| CollectionFlow.cs:201:14:201:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:14:201:20 | access to indexer | provenance | MaD:7 | +| CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary | CollectionFlow.cs:20:61:20:64 | dict : Dictionary | provenance | | +| CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | provenance | | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | provenance | | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | provenance | MaD:7 | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | provenance | | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | provenance | MaD:2 | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | provenance | MaD:9 | +| CollectionFlow.cs:210:13:210:16 | access to local variable dict : Dictionary | CollectionFlow.cs:211:14:211:20 | access to indexer | provenance | | +| CollectionFlow.cs:210:13:210:16 | access to local variable dict : Dictionary | CollectionFlow.cs:212:23:212:26 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:210:13:210:16 | access to local variable dict : Dictionary | CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:210:13:210:16 | access to local variable dict : Dictionary | CollectionFlow.cs:214:29:214:32 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:210:13:210:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:212:23:212:26 | access to local variable dict : Dictionary | CollectionFlow.cs:20:61:20:64 | dict : Dictionary | provenance | | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | provenance | | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary | CollectionFlow.cs:213:14:213:32 | call to method DictIndexZero | provenance | | +| CollectionFlow.cs:214:29:214:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | provenance | | +| CollectionFlow.cs:214:29:214:32 | access to local variable dict : Dictionary | CollectionFlow.cs:214:14:214:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:220:13:220:13 | access to local variable a : A | CollectionFlow.cs:221:53:221:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:13:220:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary | CollectionFlow.cs:222:14:222:20 | access to indexer | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary | CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary | CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary | CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:222:14:222:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:221:53:221:53 | access to local variable a : A | CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | MaD:11 | +| CollectionFlow.cs:222:14:222:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:222:14:222:20 | access to indexer | provenance | MaD:7 | +| CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary | CollectionFlow.cs:20:61:20:64 | dict : Dictionary | provenance | | +| CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | provenance | | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | provenance | | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | provenance | MaD:7 | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | provenance | | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | provenance | MaD:2 | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | provenance | MaD:9 | +| CollectionFlow.cs:232:13:232:16 | access to local variable dict : Dictionary | CollectionFlow.cs:233:14:233:20 | access to indexer | provenance | | +| CollectionFlow.cs:232:13:232:16 | access to local variable dict : Dictionary | CollectionFlow.cs:234:23:234:26 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:232:13:232:16 | access to local variable dict : Dictionary | CollectionFlow.cs:235:28:235:31 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:232:13:232:16 | access to local variable dict : Dictionary | CollectionFlow.cs:236:29:236:32 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:232:13:232:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:234:23:234:26 | access to local variable dict : Dictionary | CollectionFlow.cs:20:61:20:64 | dict : Dictionary | provenance | | +| CollectionFlow.cs:235:28:235:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | provenance | | +| CollectionFlow.cs:235:28:235:31 | access to local variable dict : Dictionary | CollectionFlow.cs:235:14:235:32 | call to method DictIndexZero | provenance | | +| CollectionFlow.cs:236:29:236:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | provenance | | +| CollectionFlow.cs:236:29:236:32 | access to local variable dict : Dictionary | CollectionFlow.cs:236:14:236:33 | call to method DictFirstValue | provenance | MaD:21 | +| CollectionFlow.cs:242:13:242:13 | access to local variable a : A | CollectionFlow.cs:243:49:243:49 | access to local variable a : A | provenance | | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:13:242:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary | CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:244:14:244:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:245:21:245:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:243:49:243:49 | access to local variable a : A | CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | MaD:5 | +| CollectionFlow.cs:244:14:244:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:244:14:244:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:244:14:244:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:244:14:244:30 | call to method First | provenance | MaD:21 | +| CollectionFlow.cs:245:21:245:24 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | provenance | MaD:1 | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | provenance | MaD:8 | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | provenance | | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | provenance | MaD:21 | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | provenance | MaD:21 | +| CollectionFlow.cs:252:13:252:16 | access to local variable dict : Dictionary | CollectionFlow.cs:256:27:256:30 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:252:20:252:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:252:13:252:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:256:27:256:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | provenance | | +| CollectionFlow.cs:256:27:256:30 | access to local variable dict : Dictionary | CollectionFlow.cs:256:14:256:31 | call to method DictFirstKey | provenance | MaD:21 | +| CollectionFlow.cs:261:13:261:13 | access to local variable a : A | CollectionFlow.cs:262:48:262:48 | access to local variable a : A | provenance | | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:13:261:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary | CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:263:14:263:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:264:21:264:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:262:48:262:48 | access to local variable a : A | CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | MaD:10 | +| CollectionFlow.cs:263:14:263:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:263:14:263:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | MaD:1 | +| CollectionFlow.cs:263:14:263:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:263:14:263:30 | call to method First | provenance | MaD:21 | +| CollectionFlow.cs:264:21:264:24 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | provenance | MaD:1 | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | provenance | MaD:8 | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | provenance | | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | provenance | MaD:21 | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | provenance | MaD:21 | +| CollectionFlow.cs:271:13:271:16 | access to local variable dict : Dictionary | CollectionFlow.cs:275:27:275:30 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:271:20:271:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:271:13:271:16 | access to local variable dict : Dictionary | provenance | | +| CollectionFlow.cs:275:27:275:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | provenance | | +| CollectionFlow.cs:275:27:275:30 | access to local variable dict : Dictionary | CollectionFlow.cs:275:14:275:31 | call to method DictFirstKey | provenance | MaD:21 | +| CollectionFlow.cs:280:13:280:13 | access to local variable a : A | CollectionFlow.cs:281:27:281:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:280:17:280:23 | object creation of type A : A | CollectionFlow.cs:280:13:280:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:281:13:281:15 | access to local variable as : null [element] : A | CollectionFlow.cs:282:27:282:29 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:281:25:281:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:281:13:281:15 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:281:27:281:27 | access to local variable a : A | CollectionFlow.cs:281:25:281:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:282:27:282:29 | access to local variable as : null [element] : A | CollectionFlow.cs:283:18:283:18 | access to local variable x | provenance | | +| CollectionFlow.cs:295:13:295:13 | access to local variable a : A | CollectionFlow.cs:296:27:296:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:295:17:295:23 | object creation of type A : A | CollectionFlow.cs:295:13:295:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:296:13:296:15 | access to local variable as : null [element] : A | CollectionFlow.cs:297:26:297:28 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:296:25:296:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:296:13:296:15 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:296:27:296:27 | access to local variable a : A | CollectionFlow.cs:296:25:296:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:297:13:297:22 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:299:18:299:27 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | +| CollectionFlow.cs:297:26:297:28 | access to local variable as : null [element] : A | CollectionFlow.cs:297:26:297:44 | call to method GetEnumerator : IEnumerator [property Current] : A | provenance | MaD:19 | +| CollectionFlow.cs:297:26:297:44 | call to method GetEnumerator : IEnumerator [property Current] : A | CollectionFlow.cs:297:13:297:22 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | +| CollectionFlow.cs:299:18:299:27 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:299:18:299:35 | access to property Current | provenance | | +| CollectionFlow.cs:312:13:312:13 | access to local variable a : A | CollectionFlow.cs:314:18:314:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:312:17:312:23 | object creation of type A : A | CollectionFlow.cs:312:13:312:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:313:13:313:16 | access to local variable list : List | CollectionFlow.cs:315:26:315:29 | access to local variable list : List | provenance | | +| CollectionFlow.cs:313:20:313:32 | object creation of type List : List | CollectionFlow.cs:313:13:313:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:314:9:314:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:314:18:314:18 | access to local variable a : A | CollectionFlow.cs:314:9:314:12 | [post] access to local variable list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List | CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | provenance | MaD:18 | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List | CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | provenance | MaD:18 | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | provenance | MaD:18 | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | provenance | MaD:18 | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | MaD:17 | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | MaD:17 | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | MaD:17 | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:317:18:317:35 | access to property Current | provenance | MaD:17 | +| CollectionFlow.cs:322:13:322:16 | access to local variable list : List | CollectionFlow.cs:324:26:324:29 | access to local variable list : List | provenance | | +| CollectionFlow.cs:322:20:322:32 | object creation of type List : List | CollectionFlow.cs:322:13:322:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:324:13:324:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:326:18:326:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:324:13:324:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:326:18:326:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:324:26:324:29 | access to local variable list : List | CollectionFlow.cs:324:26:324:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | provenance | MaD:18 | +| CollectionFlow.cs:324:26:324:29 | access to local variable list : List | CollectionFlow.cs:324:26:324:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | provenance | MaD:18 | +| CollectionFlow.cs:324:26:324:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:324:13:324:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:324:26:324:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:324:13:324:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | provenance | | +| CollectionFlow.cs:326:18:326:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:326:18:326:35 | access to property Current | provenance | | +| CollectionFlow.cs:326:18:326:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:326:18:326:35 | access to property Current | provenance | MaD:17 | +| CollectionFlow.cs:326:18:326:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | CollectionFlow.cs:326:18:326:35 | access to property Current | provenance | MaD:17 | +| CollectionFlow.cs:331:13:331:13 | access to local variable a : A | CollectionFlow.cs:333:43:333:43 | access to local variable a : A | provenance | | +| CollectionFlow.cs:331:17:331:23 | object creation of type A : A | CollectionFlow.cs:331:13:331:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:332:13:332:16 | access to local variable list : List> | CollectionFlow.cs:334:9:334:12 | access to local variable list : List> | provenance | | +| CollectionFlow.cs:332:20:332:51 | object creation of type List> : List> | CollectionFlow.cs:332:13:332:16 | access to local variable list : List> | provenance | | +| CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element, property Key] : A | CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element, property Key] : A | provenance | | +| CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element] : KeyValuePair | CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element] : KeyValuePair | provenance | | +| CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair | CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element] : KeyValuePair | provenance | MaD:3 | +| CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element, property Key] : A | provenance | MaD:3 | +| CollectionFlow.cs:333:43:333:43 | access to local variable a : A | CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | provenance | MaD:14 | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List> | CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair | provenance | MaD:22 | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element, property Key] : A | CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair [property Key] : A | provenance | MaD:22 | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element] : KeyValuePair | CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair | provenance | MaD:22 | +| CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair | CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair | provenance | | +| CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair [property Key] : A | provenance | | +| CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair | CollectionFlow.cs:336:18:336:24 | access to property Key | provenance | MaD:15 | +| CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:336:18:336:24 | access to property Key | provenance | | +| CollectionFlow.cs:344:13:344:16 | access to local variable list : List> | CollectionFlow.cs:346:9:346:12 | access to local variable list : List> | provenance | | +| CollectionFlow.cs:344:20:344:51 | object creation of type List> : List> | CollectionFlow.cs:344:13:344:16 | access to local variable list : List> | provenance | | +| CollectionFlow.cs:345:9:345:12 | [post] access to local variable list : List [element] : KeyValuePair | CollectionFlow.cs:346:9:346:12 | access to local variable list : List [element] : KeyValuePair | provenance | | +| CollectionFlow.cs:345:18:345:47 | object creation of type KeyValuePair : KeyValuePair | CollectionFlow.cs:345:9:345:12 | [post] access to local variable list : List [element] : KeyValuePair | provenance | MaD:3 | +| CollectionFlow.cs:346:9:346:12 | access to local variable list : List> | CollectionFlow.cs:346:21:346:23 | kvp : KeyValuePair | provenance | MaD:22 | +| CollectionFlow.cs:346:9:346:12 | access to local variable list : List [element] : KeyValuePair | CollectionFlow.cs:346:21:346:23 | kvp : KeyValuePair | provenance | MaD:22 | +| CollectionFlow.cs:346:21:346:23 | kvp : KeyValuePair | CollectionFlow.cs:348:18:348:20 | access to parameter kvp : KeyValuePair | provenance | | +| CollectionFlow.cs:348:18:348:20 | access to parameter kvp : KeyValuePair | CollectionFlow.cs:348:18:348:26 | access to property Value | provenance | MaD:16 | +| CollectionFlow.cs:353:32:353:38 | element : A | CollectionFlow.cs:353:55:353:61 | access to parameter element : A | provenance | | +| CollectionFlow.cs:353:44:353:48 | [post] access to parameter array : A[] [element] : A | CollectionFlow.cs:353:23:353:27 | array [Return] : A[] [element] : A | provenance | | +| CollectionFlow.cs:353:55:353:61 | access to parameter element : A | CollectionFlow.cs:353:44:353:48 | [post] access to parameter array : A[] [element] : A | provenance | | +| CollectionFlow.cs:357:13:357:13 | access to local variable a : A | CollectionFlow.cs:359:23:359:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:13:357:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:360:14:360:16 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:361:18:361:20 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | CollectionFlow.cs:353:32:353:38 | element : A | provenance | | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | provenance | | +| CollectionFlow.cs:360:14:360:16 | access to local variable as : A[] [element] : A | CollectionFlow.cs:360:14:360:19 | access to array element | provenance | | +| CollectionFlow.cs:361:18:361:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | provenance | | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:362:14:362:23 | call to method First | provenance | | +| CollectionFlow.cs:375:34:375:40 | element : A | CollectionFlow.cs:375:55:375:61 | access to parameter element : A | provenance | | +| CollectionFlow.cs:375:46:375:49 | [post] access to parameter list : List [element] : A | CollectionFlow.cs:375:26:375:29 | list [Return] : List [element] : A | provenance | | +| CollectionFlow.cs:375:55:375:61 | access to parameter element : A | CollectionFlow.cs:375:46:375:49 | [post] access to parameter list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:379:13:379:13 | access to local variable a : A | CollectionFlow.cs:381:23:381:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:13:379:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:380:13:380:16 | access to local variable list : List | CollectionFlow.cs:382:14:382:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:380:13:380:16 | access to local variable list : List | CollectionFlow.cs:382:14:382:20 | access to indexer | provenance | | +| CollectionFlow.cs:380:13:380:16 | access to local variable list : List | CollectionFlow.cs:383:22:383:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:380:13:380:16 | access to local variable list : List | CollectionFlow.cs:384:24:384:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:380:20:380:32 | object creation of type List : List | CollectionFlow.cs:380:13:380:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:382:14:382:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:383:22:383:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | CollectionFlow.cs:375:34:375:40 | element : A | provenance | | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | provenance | MaD:3 | +| CollectionFlow.cs:382:14:382:17 | access to local variable list : List | CollectionFlow.cs:382:14:382:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:382:14:382:17 | access to local variable list : List [element] : A | CollectionFlow.cs:382:14:382:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:383:22:383:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:383:22:383:25 | access to local variable list : List [element] : A | CollectionFlow.cs:18:49:18:52 | list : List [element] : A | provenance | | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | provenance | | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:389:13:389:16 | access to local variable list : List | CollectionFlow.cs:391:14:391:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:389:13:389:16 | access to local variable list : List | CollectionFlow.cs:391:14:391:20 | access to indexer | provenance | | +| CollectionFlow.cs:389:13:389:16 | access to local variable list : List | CollectionFlow.cs:392:22:392:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:389:13:389:16 | access to local variable list : List | CollectionFlow.cs:393:24:393:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:389:20:389:32 | object creation of type List : List | CollectionFlow.cs:389:13:389:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:391:14:391:17 | access to local variable list : List | CollectionFlow.cs:391:14:391:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:392:22:392:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:393:24:393:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:393:24:393:27 | access to local variable list : List | CollectionFlow.cs:393:14:393:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:393:24:393:27 | access to local variable list : List | CollectionFlow.cs:393:14:393:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:398:20:398:26 | object creation of type A : A | CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | provenance | | +| CollectionFlow.cs:399:26:399:32 | object creation of type A : A | CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | provenance | | +| CollectionFlow.cs:400:26:400:32 | object creation of type A : A | CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | provenance | | +| CollectionFlow.cs:401:20:401:38 | array creation of type A[] : null [element] : A | CollectionFlow.cs:40:49:40:52 | args : null [element] : A | provenance | | +| CollectionFlow.cs:401:28:401:38 | { ..., ... } : null [element] : A | CollectionFlow.cs:401:20:401:38 | array creation of type A[] : null [element] : A | provenance | | +| CollectionFlow.cs:401:30:401:36 | object creation of type A : A | CollectionFlow.cs:401:28:401:38 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:414:30:414:36 | object creation of type A : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:415:36:415:42 | object creation of type A : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:416:36:416:42 | object creation of type A : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:417:30:417:38 | [...] : IEnumerable [element] : A | CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:417:31:417:37 | object creation of type A : A | CollectionFlow.cs:417:30:417:38 | [...] : IEnumerable [element] : A | provenance | | +| CollectionFlow.cs:423:13:423:16 | access to local variable list : List | CollectionFlow.cs:425:9:425:12 | access to local variable list : List | provenance | | +| CollectionFlow.cs:423:20:423:32 | object creation of type List : List | CollectionFlow.cs:423:13:423:16 | access to local variable list : List | provenance | | +| CollectionFlow.cs:425:9:425:12 | [post] access to local variable list : List | CollectionFlow.cs:426:14:426:17 | access to local variable list : List | provenance | | +| CollectionFlow.cs:425:9:425:12 | [post] access to local variable list : List | CollectionFlow.cs:426:14:426:20 | access to indexer | provenance | | +| CollectionFlow.cs:425:9:425:12 | [post] access to local variable list : List | CollectionFlow.cs:427:22:427:25 | access to local variable list : List | provenance | | +| CollectionFlow.cs:425:9:425:12 | [post] access to local variable list : List | CollectionFlow.cs:428:24:428:27 | access to local variable list : List | provenance | | +| CollectionFlow.cs:425:9:425:12 | access to local variable list : List | CollectionFlow.cs:425:9:425:12 | [post] access to local variable list : List | provenance | MaD:4 | +| CollectionFlow.cs:425:9:425:12 | access to local variable list : List | CollectionFlow.cs:425:9:425:12 | [post] access to local variable list : List | provenance | MaD:20 | +| CollectionFlow.cs:426:14:426:17 | access to local variable list : List | CollectionFlow.cs:426:14:426:20 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:427:22:427:25 | access to local variable list : List | CollectionFlow.cs:18:49:18:52 | list : List | provenance | | +| CollectionFlow.cs:428:24:428:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | provenance | | +| CollectionFlow.cs:428:24:428:27 | access to local variable list : List | CollectionFlow.cs:428:14:428:28 | call to method ListFirst | provenance | | +| CollectionFlow.cs:428:24:428:27 | access to local variable list : List | CollectionFlow.cs:428:14:428:28 | call to method ListFirst | provenance | MaD:12 | +| CollectionFlow.cs:439:13:439:13 | access to local variable a : A | CollectionFlow.cs:441:20:441:20 | access to local variable a : A | provenance | | +| CollectionFlow.cs:439:17:439:23 | object creation of type A : A | CollectionFlow.cs:439:13:439:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:440:13:440:17 | access to local variable array : MyInlineArray | CollectionFlow.cs:442:14:442:21 | access to array element | provenance | | +| CollectionFlow.cs:440:21:440:39 | object creation of type MyInlineArray : MyInlineArray | CollectionFlow.cs:440:13:440:17 | access to local variable array : MyInlineArray | provenance | | +| CollectionFlow.cs:441:9:441:13 | [post] access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:442:14:442:18 | access to local variable array : MyInlineArray [element] : A | provenance | | +| CollectionFlow.cs:441:20:441:20 | access to local variable a : A | CollectionFlow.cs:441:9:441:13 | [post] access to local variable array : MyInlineArray [element] : A | provenance | | +| CollectionFlow.cs:442:14:442:18 | access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:442:14:442:21 | access to array element | provenance | | +| CollectionFlow.cs:447:13:447:17 | access to local variable array : MyInlineArray | CollectionFlow.cs:449:14:449:21 | access to array element | provenance | | +| CollectionFlow.cs:447:21:447:39 | object creation of type MyInlineArray : MyInlineArray | CollectionFlow.cs:447:13:447:17 | access to local variable array : MyInlineArray | provenance | | +| CollectionFlow.cs:460:13:460:13 | access to local variable a : A | CollectionFlow.cs:461:22:461:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:460:17:460:23 | object creation of type A : A | CollectionFlow.cs:460:13:460:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:461:13:461:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:462:14:462:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:461:21:461:23 | [...] : A[] [element] : A | CollectionFlow.cs:461:13:461:17 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:461:22:461:22 | access to local variable a : A | CollectionFlow.cs:461:21:461:23 | [...] : A[] [element] : A | provenance | | +| CollectionFlow.cs:462:14:462:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:462:14:462:21 | access to array element | provenance | | +| CollectionFlow.cs:467:13:467:13 | access to local variable a : A | CollectionFlow.cs:468:22:468:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:467:17:467:23 | object creation of type A : A | CollectionFlow.cs:467:13:467:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:468:17:468:17 | access to local variable l : List [element] : A | CollectionFlow.cs:469:14:469:14 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:468:21:468:23 | [...] : List [element] : A | CollectionFlow.cs:468:17:468:17 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:468:22:468:22 | access to local variable a : A | CollectionFlow.cs:468:21:468:23 | [...] : List [element] : A | provenance | | +| CollectionFlow.cs:469:14:469:14 | access to local variable l : List [element] : A | CollectionFlow.cs:469:14:469:17 | access to indexer | provenance | MaD:12 | +| CollectionFlow.cs:480:13:480:13 | access to local variable a : A | CollectionFlow.cs:481:21:481:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:480:17:480:23 | object creation of type A : A | CollectionFlow.cs:480:13:480:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:481:13:481:16 | access to local variable temp : A[] [element] : A | CollectionFlow.cs:482:22:482:28 | .. access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:481:20:481:22 | [...] : A[] [element] : A | CollectionFlow.cs:481:13:481:16 | access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:481:21:481:21 | access to local variable a : A | CollectionFlow.cs:481:20:481:22 | [...] : A[] [element] : A | provenance | | +| CollectionFlow.cs:482:13:482:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:483:14:483:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:482:22:482:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:482:13:482:17 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:483:14:483:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:483:14:483:21 | access to array element | provenance | | +| CollectionFlow.cs:520:13:520:13 | access to local variable a : A | CollectionFlow.cs:521:40:521:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:520:17:520:23 | object creation of type A : A | CollectionFlow.cs:520:13:520:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:521:17:521:20 | access to local variable span : Span | CollectionFlow.cs:522:14:522:17 | access to local variable span : Span | provenance | | +| CollectionFlow.cs:521:17:521:20 | access to local variable span : Span | CollectionFlow.cs:522:14:522:20 | access to indexer | provenance | | +| CollectionFlow.cs:521:17:521:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:522:14:522:17 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span | CollectionFlow.cs:521:17:521:20 | access to local variable span : Span | provenance | | +| CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:521:17:521:20 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:521:40:521:40 | access to local variable a : A | CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span [element] : A | provenance | MaD:27 | +| CollectionFlow.cs:522:14:522:17 | access to local variable span : Span | CollectionFlow.cs:522:14:522:20 | access to indexer | provenance | MaD:30 | +| CollectionFlow.cs:522:14:522:17 | access to local variable span : Span [element] : A | CollectionFlow.cs:522:14:522:20 | access to indexer | provenance | MaD:30 | +| CollectionFlow.cs:527:13:527:13 | access to local variable a : A | CollectionFlow.cs:528:40:528:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:527:17:527:23 | object creation of type A : A | CollectionFlow.cs:527:13:527:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:528:17:528:20 | access to local variable span : Span | CollectionFlow.cs:529:19:529:22 | access to local variable span : Span | provenance | | +| CollectionFlow.cs:528:17:528:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:529:19:529:22 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span | CollectionFlow.cs:528:17:528:20 | access to local variable span : Span | provenance | | +| CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:528:17:528:20 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:528:40:528:40 | access to local variable a : A | CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span [element] : A | provenance | MaD:27 | +| CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : A | provenance | | +| CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : Object | CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : Object | provenance | | +| CollectionFlow.cs:529:19:529:22 | access to local variable span : Span | CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : Object | provenance | MaD:29 | +| CollectionFlow.cs:529:19:529:22 | access to local variable span : Span [element] : A | CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : A | provenance | MaD:29 | +| CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : A | CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : A | provenance | | +| CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : Object | CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : Object | provenance | | +| CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:530:14:530:19 | access to array element | provenance | | +| CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : Object | CollectionFlow.cs:530:14:530:19 | access to array element | provenance | | +| CollectionFlow.cs:535:13:535:13 | access to local variable a : A | CollectionFlow.cs:536:21:536:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:535:17:535:23 | object creation of type A : A | CollectionFlow.cs:535:13:535:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:536:9:536:14 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:537:14:537:19 | access to parameter target : Span [element] : A | provenance | | +| CollectionFlow.cs:536:21:536:21 | access to local variable a : A | CollectionFlow.cs:536:9:536:14 | [post] access to parameter target : Span [element] : A | provenance | MaD:26 | +| CollectionFlow.cs:537:14:537:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:537:14:537:22 | access to indexer | provenance | MaD:30 | +| CollectionFlow.cs:542:13:542:18 | access to local variable source : Span | CollectionFlow.cs:543:9:543:14 | access to local variable source : Span | provenance | | +| CollectionFlow.cs:542:13:542:18 | access to local variable source : Span [element] : A | CollectionFlow.cs:543:9:543:14 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span | CollectionFlow.cs:542:13:542:18 | access to local variable source : Span | provenance | | +| CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span [element] : A | CollectionFlow.cs:542:13:542:18 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:542:34:542:50 | array creation of type A[] : null [element] : A | CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span [element] : A | provenance | MaD:28 | +| CollectionFlow.cs:542:40:542:50 | { ..., ... } : null [element] : A | CollectionFlow.cs:542:34:542:50 | array creation of type A[] : null [element] : A | provenance | | +| CollectionFlow.cs:542:42:542:48 | object creation of type A : A | CollectionFlow.cs:542:40:542:50 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:543:9:543:14 | access to local variable source : Span | CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : Object | provenance | MaD:25 | +| CollectionFlow.cs:543:9:543:14 | access to local variable source : Span [element] : A | CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : A | provenance | MaD:25 | +| CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : A | provenance | | +| CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : Object | CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : Object | provenance | | +| CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:544:14:544:22 | access to indexer | provenance | MaD:30 | +| CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : Object | CollectionFlow.cs:544:14:544:22 | access to indexer | provenance | MaD:30 | +| CollectionFlow.cs:549:13:549:13 | access to local variable a : A | CollectionFlow.cs:550:60:550:60 | access to local variable a : A | provenance | | +| CollectionFlow.cs:549:17:549:23 | object creation of type A : A | CollectionFlow.cs:549:13:549:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan | CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan | provenance | | +| CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan | CollectionFlow.cs:551:14:551:20 | access to indexer | provenance | | +| CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan [element] : A | CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan | CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan | provenance | | +| CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:550:52:550:62 | array creation of type A[] : null [element] : A | CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | provenance | MaD:23 | +| CollectionFlow.cs:550:58:550:62 | { ..., ... } : null [element] : A | CollectionFlow.cs:550:52:550:62 | array creation of type A[] : null [element] : A | provenance | | +| CollectionFlow.cs:550:60:550:60 | access to local variable a : A | CollectionFlow.cs:550:58:550:62 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan | CollectionFlow.cs:551:14:551:20 | access to indexer | provenance | MaD:24 | +| CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan [element] : A | CollectionFlow.cs:551:14:551:20 | access to indexer | provenance | MaD:24 | +| CollectionFlow.cs:555:13:555:13 | access to local variable a : A | CollectionFlow.cs:556:19:556:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:555:17:555:23 | object creation of type A : A | CollectionFlow.cs:555:13:555:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:556:9:556:12 | [post] access to parameter dict : Dictionary [element, property Value] : A | CollectionFlow.cs:557:14:557:17 | access to parameter dict | provenance | | +| CollectionFlow.cs:556:19:556:19 | access to local variable a : A | CollectionFlow.cs:556:9:556:12 | [post] access to parameter dict : Dictionary [element, property Value] : A | provenance | MaD:11 | +nodes +| CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | semmle.label | ts : null [element] : A | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:14:52:14:53 | access to parameter ts : null [element] : A | semmle.label | access to parameter ts : null [element] : A | +| CollectionFlow.cs:14:52:14:56 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:16:44:16:45 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:16:56:16:57 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:16:56:16:61 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:18:49:18:52 | list : List | semmle.label | list : List | +| CollectionFlow.cs:18:49:18:52 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:18:63:18:66 | access to parameter list : List | semmle.label | access to parameter list : List | +| CollectionFlow.cs:18:63:18:66 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:18:63:18:69 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:20:61:20:64 | dict : Dictionary | semmle.label | dict : Dictionary | +| CollectionFlow.cs:20:61:20:64 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:20:75:20:78 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:20:75:20:81 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:22:59:22:62 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:22:73:22:76 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:22:73:22:81 | access to property Keys : ICollection [element] : A | semmle.label | access to property Keys : ICollection [element] : A | +| CollectionFlow.cs:22:73:22:89 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | semmle.label | ts : null [element] : A | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:24:41:24:42 | access to parameter ts : null [element] : A | semmle.label | access to parameter ts : null [element] : A | +| CollectionFlow.cs:24:41:24:45 | access to array element : A | semmle.label | access to array element : A | +| CollectionFlow.cs:24:41:24:45 | access to array element : A | semmle.label | access to array element : A | +| CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | +| CollectionFlow.cs:26:40:26:41 | access to parameter ts : A[] [element] : A | semmle.label | access to parameter ts : A[] [element] : A | +| CollectionFlow.cs:26:40:26:45 | access to array element : A | semmle.label | access to array element : A | +| CollectionFlow.cs:28:43:28:46 | list : List | semmle.label | list : List | +| CollectionFlow.cs:28:43:28:46 | list : List [element] : A | semmle.label | list : List [element] : A | +| CollectionFlow.cs:28:52:28:55 | access to parameter list : List | semmle.label | access to parameter list : List | +| CollectionFlow.cs:28:52:28:55 | access to parameter list : List [element] : A | semmle.label | access to parameter list : List [element] : A | +| CollectionFlow.cs:28:52:28:58 | access to indexer : A | semmle.label | access to indexer : A | +| CollectionFlow.cs:28:52:28:58 | access to indexer : Object | semmle.label | access to indexer : Object | +| CollectionFlow.cs:28:52:28:58 | access to indexer : T | semmle.label | access to indexer : T | +| CollectionFlow.cs:30:58:30:61 | dict : Dictionary | semmle.label | dict : Dictionary | +| CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:30:67:30:70 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:30:67:30:73 | access to indexer : A | semmle.label | access to indexer : A | +| CollectionFlow.cs:30:67:30:73 | access to indexer : T | semmle.label | access to indexer : T | +| CollectionFlow.cs:32:59:32:62 | dict : Dictionary | semmle.label | dict : Dictionary | +| CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary | semmle.label | access to parameter dict : Dictionary | +| CollectionFlow.cs:32:68:32:71 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair | semmle.label | call to method First> : KeyValuePair | +| CollectionFlow.cs:32:68:32:79 | call to method First> : KeyValuePair [property Value] : A | semmle.label | call to method First> : KeyValuePair [property Value] : A | +| CollectionFlow.cs:32:68:32:85 | access to property Value : A | semmle.label | access to property Value : A | +| CollectionFlow.cs:32:68:32:85 | access to property Value : T | semmle.label | access to property Value : T | +| CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | semmle.label | dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:34:69:34:72 | access to parameter dict : Dictionary [element, property Value] : A | semmle.label | access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:34:69:34:79 | access to property Values : ICollection [element] : A | semmle.label | access to property Values : ICollection [element] : A | +| CollectionFlow.cs:34:69:34:87 | call to method First : A | semmle.label | call to method First : A | +| CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:36:67:36:70 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:36:67:36:75 | access to property Keys : ICollection [element] : A | semmle.label | access to property Keys : ICollection [element] : A | +| CollectionFlow.cs:36:67:36:83 | call to method First : A | semmle.label | call to method First : A | +| CollectionFlow.cs:38:57:38:60 | dict : Dictionary | semmle.label | dict : Dictionary | +| CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | semmle.label | dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary | semmle.label | access to parameter dict : Dictionary | +| CollectionFlow.cs:38:66:38:69 | access to parameter dict : Dictionary [element, property Key] : A | semmle.label | access to parameter dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair | semmle.label | call to method First> : KeyValuePair | +| CollectionFlow.cs:38:66:38:77 | call to method First> : KeyValuePair [property Key] : A | semmle.label | call to method First> : KeyValuePair [property Key] : A | +| CollectionFlow.cs:38:66:38:81 | access to property Key : A | semmle.label | access to property Key : A | +| CollectionFlow.cs:38:66:38:81 | access to property Key : T | semmle.label | access to property Key : T | +| CollectionFlow.cs:40:49:40:52 | args : A[] [element] : A | semmle.label | args : A[] [element] : A | +| CollectionFlow.cs:40:49:40:52 | args : null [element] : A | semmle.label | args : null [element] : A | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : A[] [element] : A | semmle.label | access to parameter args : A[] [element] : A | +| CollectionFlow.cs:40:63:40:66 | access to parameter args : null [element] : A | semmle.label | access to parameter args : null [element] : A | +| CollectionFlow.cs:40:63:40:69 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:42:70:42:73 | args : IEnumerable [element] : A | semmle.label | args : IEnumerable [element] : A | +| CollectionFlow.cs:42:84:42:87 | access to parameter args : IEnumerable [element] : A | semmle.label | access to parameter args : IEnumerable [element] : A | +| CollectionFlow.cs:42:84:42:95 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:46:13:46:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:47:13:47:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:47:25:47:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:47:27:47:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:48:14:48:16 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:48:14:48:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:49:18:49:20 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:50:14:50:23 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:64:13:64:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:65:13:65:13 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:65:38:65:57 | { ..., ... } : CollectionFlow [field As, element] : A | semmle.label | { ..., ... } : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:65:45:65:55 | { ..., ... } : A[] [element] : A | semmle.label | { ..., ... } : A[] [element] : A | +| CollectionFlow.cs:65:53:65:53 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:66:14:66:14 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:66:14:66:17 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:66:14:66:20 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:67:18:67:18 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:67:18:67:21 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:68:14:68:24 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:68:20:68:20 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:82:13:82:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:83:13:83:13 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:83:38:83:58 | { ..., ... } : CollectionFlow [field As, element] : A | semmle.label | { ..., ... } : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:83:45:83:56 | { ..., ... } : A[] [element] : A | semmle.label | { ..., ... } : A[] [element] : A | +| CollectionFlow.cs:83:54:83:54 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:84:14:84:14 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:84:14:84:17 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:84:14:84:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:85:22:85:22 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:85:22:85:25 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:86:14:86:23 | call to method Last | semmle.label | call to method Last | +| CollectionFlow.cs:86:19:86:19 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:91:13:91:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:93:9:93:11 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:93:18:93:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:94:14:94:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:94:14:94:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:95:18:95:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:96:14:96:23 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:111:13:111:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:113:9:113:11 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:113:19:113:19 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:114:14:114:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:114:14:114:20 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:115:22:115:24 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:116:14:116:22 | call to method Last | semmle.label | call to method Last | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:121:13:121:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:122:13:122:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:122:20:122:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:123:9:123:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:123:19:123:19 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:124:14:124:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:124:14:124:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:124:14:124:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:125:22:125:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:125:22:125:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:126:14:126:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:131:13:131:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:131:20:131:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:133:14:133:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:133:14:133:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:134:22:134:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:135:14:135:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:135:24:135:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:140:13:140:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:141:13:141:16 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List [element] : A | semmle.label | object creation of type List : List [element] : A | +| CollectionFlow.cs:141:36:141:36 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:142:14:142:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:142:14:142:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:142:14:142:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:143:22:143:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:143:22:143:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:144:14:144:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:149:13:149:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:149:20:149:42 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:150:14:150:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:150:14:150:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:151:22:151:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:152:14:152:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:152:24:152:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:157:13:157:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:158:13:158:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:158:20:158:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:159:9:159:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:159:18:159:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:160:14:160:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:160:14:160:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:160:14:160:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:161:22:161:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:161:22:161:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:162:14:162:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:167:13:167:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:167:20:167:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:169:14:169:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:169:14:169:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:170:22:170:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:171:14:171:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:171:24:171:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:176:13:176:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:177:13:177:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:178:9:178:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | semmle.label | [post] access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:178:19:178:19 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:179:14:179:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:179:14:179:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:180:23:180:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:188:13:188:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:190:14:190:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:191:23:191:26 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:192:14:192:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:192:28:192:31 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:193:14:193:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:193:29:193:32 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:199:13:199:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:200:13:200:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | +| CollectionFlow.cs:200:52:200:52 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:201:14:201:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:201:14:201:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:202:23:202:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:210:13:210:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:211:14:211:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:212:23:212:26 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:213:14:213:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:214:14:214:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:214:29:214:32 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:220:13:220:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:221:13:221:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | +| CollectionFlow.cs:221:53:221:53 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:222:14:222:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:222:14:222:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:223:23:223:26 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:232:13:232:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:233:14:233:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:234:23:234:26 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:235:14:235:32 | call to method DictIndexZero | semmle.label | call to method DictIndexZero | +| CollectionFlow.cs:235:28:235:31 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:236:14:236:33 | call to method DictFirstValue | semmle.label | call to method DictFirstValue | +| CollectionFlow.cs:236:29:236:32 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:242:13:242:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:243:13:243:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | +| CollectionFlow.cs:243:49:243:49 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:244:14:244:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:244:14:244:22 | access to property Keys : Dictionary.KeyCollection [element] : A | semmle.label | access to property Keys : Dictionary.KeyCollection [element] : A | +| CollectionFlow.cs:244:14:244:30 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:245:21:245:24 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | semmle.label | call to method DictKeysFirst | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:252:13:252:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:252:20:252:60 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:256:14:256:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | +| CollectionFlow.cs:256:27:256:30 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:261:13:261:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:262:13:262:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | +| CollectionFlow.cs:262:48:262:48 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:263:14:263:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:263:14:263:22 | access to property Keys : Dictionary.KeyCollection [element] : A | semmle.label | access to property Keys : Dictionary.KeyCollection [element] : A | +| CollectionFlow.cs:263:14:263:30 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:264:21:264:24 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | semmle.label | call to method DictKeysFirst | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:271:13:271:16 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:271:20:271:59 | object creation of type Dictionary : Dictionary | semmle.label | object creation of type Dictionary : Dictionary | +| CollectionFlow.cs:275:14:275:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | +| CollectionFlow.cs:275:27:275:30 | access to local variable dict : Dictionary | semmle.label | access to local variable dict : Dictionary | +| CollectionFlow.cs:280:13:280:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:280:17:280:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:281:13:281:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:281:25:281:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:281:27:281:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:282:27:282:29 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:283:18:283:18 | access to local variable x | semmle.label | access to local variable x | +| CollectionFlow.cs:295:13:295:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:295:17:295:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:296:13:296:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:296:25:296:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:296:27:296:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:297:13:297:22 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:297:26:297:28 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:297:26:297:44 | call to method GetEnumerator : IEnumerator [property Current] : A | semmle.label | call to method GetEnumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:299:18:299:27 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | +| CollectionFlow.cs:299:18:299:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:312:13:312:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:312:17:312:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:313:13:313:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:313:20:313:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:314:9:314:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:314:18:314:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:315:13:315:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:315:26:315:29 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:315:26:315:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:317:18:317:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:317:18:317:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:322:13:322:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:322:20:322:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:324:13:324:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:324:13:324:22 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:324:26:324:29 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:324:26:324:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:324:26:324:45 | call to method GetEnumerator : List.Enumerator [property Current] : Object | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:326:18:326:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:326:18:326:27 | access to local variable enumerator : List.Enumerator [property Current] : Object | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : Object | +| CollectionFlow.cs:326:18:326:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:331:13:331:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:331:17:331:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:332:13:332:16 | access to local variable list : List> | semmle.label | access to local variable list : List> | +| CollectionFlow.cs:332:20:332:51 | object creation of type List> : List> | semmle.label | object creation of type List> : List> | +| CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element, property Key] : A | semmle.label | [post] access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:333:9:333:12 | [post] access to local variable list : List [element] : KeyValuePair | semmle.label | [post] access to local variable list : List [element] : KeyValuePair | +| CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair | semmle.label | object creation of type KeyValuePair : KeyValuePair | +| CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | semmle.label | object creation of type KeyValuePair : KeyValuePair [property Key] : A | +| CollectionFlow.cs:333:43:333:43 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List> | semmle.label | access to local variable list : List> | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element, property Key] : A | semmle.label | access to local variable list : List [element, property Key] : A | +| CollectionFlow.cs:334:9:334:12 | access to local variable list : List [element] : KeyValuePair | semmle.label | access to local variable list : List [element] : KeyValuePair | +| CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair | semmle.label | kvp : KeyValuePair | +| CollectionFlow.cs:334:21:334:23 | kvp : KeyValuePair [property Key] : A | semmle.label | kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair | semmle.label | access to parameter kvp : KeyValuePair | +| CollectionFlow.cs:336:18:336:20 | access to parameter kvp : KeyValuePair [property Key] : A | semmle.label | access to parameter kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:336:18:336:24 | access to property Key | semmle.label | access to property Key | +| CollectionFlow.cs:344:13:344:16 | access to local variable list : List> | semmle.label | access to local variable list : List> | +| CollectionFlow.cs:344:20:344:51 | object creation of type List> : List> | semmle.label | object creation of type List> : List> | +| CollectionFlow.cs:345:9:345:12 | [post] access to local variable list : List [element] : KeyValuePair | semmle.label | [post] access to local variable list : List [element] : KeyValuePair | +| CollectionFlow.cs:345:18:345:47 | object creation of type KeyValuePair : KeyValuePair | semmle.label | object creation of type KeyValuePair : KeyValuePair | +| CollectionFlow.cs:346:9:346:12 | access to local variable list : List> | semmle.label | access to local variable list : List> | +| CollectionFlow.cs:346:9:346:12 | access to local variable list : List [element] : KeyValuePair | semmle.label | access to local variable list : List [element] : KeyValuePair | +| CollectionFlow.cs:346:21:346:23 | kvp : KeyValuePair | semmle.label | kvp : KeyValuePair | +| CollectionFlow.cs:348:18:348:20 | access to parameter kvp : KeyValuePair | semmle.label | access to parameter kvp : KeyValuePair | +| CollectionFlow.cs:348:18:348:26 | access to property Value | semmle.label | access to property Value | +| CollectionFlow.cs:353:23:353:27 | array [Return] : A[] [element] : A | semmle.label | array [Return] : A[] [element] : A | +| CollectionFlow.cs:353:32:353:38 | element : A | semmle.label | element : A | +| CollectionFlow.cs:353:44:353:48 | [post] access to parameter array : A[] [element] : A | semmle.label | [post] access to parameter array : A[] [element] : A | +| CollectionFlow.cs:353:55:353:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:357:13:357:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:360:14:360:16 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:360:14:360:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:361:18:361:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:362:14:362:23 | call to method First | semmle.label | call to method First | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:375:26:375:29 | list [Return] : List [element] : A | semmle.label | list [Return] : List [element] : A | +| CollectionFlow.cs:375:34:375:40 | element : A | semmle.label | element : A | +| CollectionFlow.cs:375:46:375:49 | [post] access to parameter list : List [element] : A | semmle.label | [post] access to parameter list : List [element] : A | +| CollectionFlow.cs:375:55:375:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:379:13:379:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:380:13:380:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:380:20:380:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:382:14:382:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:382:14:382:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:382:14:382:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:383:22:383:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:383:22:383:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:384:14:384:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:389:13:389:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:389:20:389:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:391:14:391:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:391:14:391:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:392:22:392:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:393:14:393:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:393:24:393:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:398:20:398:26 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:399:26:399:32 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:400:26:400:32 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:401:20:401:38 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:401:28:401:38 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:401:30:401:36 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:414:30:414:36 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:415:36:415:42 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:416:36:416:42 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:417:30:417:38 | [...] : IEnumerable [element] : A | semmle.label | [...] : IEnumerable [element] : A | +| CollectionFlow.cs:417:31:417:37 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:423:13:423:16 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:423:20:423:32 | object creation of type List : List | semmle.label | object creation of type List : List | +| CollectionFlow.cs:425:9:425:12 | [post] access to local variable list : List | semmle.label | [post] access to local variable list : List | +| CollectionFlow.cs:425:9:425:12 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:426:14:426:17 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:426:14:426:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:427:22:427:25 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:428:14:428:28 | call to method ListFirst | semmle.label | call to method ListFirst | +| CollectionFlow.cs:428:24:428:27 | access to local variable list : List | semmle.label | access to local variable list : List | +| CollectionFlow.cs:439:13:439:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:439:17:439:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:440:13:440:17 | access to local variable array : MyInlineArray | semmle.label | access to local variable array : MyInlineArray | +| CollectionFlow.cs:440:21:440:39 | object creation of type MyInlineArray : MyInlineArray | semmle.label | object creation of type MyInlineArray : MyInlineArray | +| CollectionFlow.cs:441:9:441:13 | [post] access to local variable array : MyInlineArray [element] : A | semmle.label | [post] access to local variable array : MyInlineArray [element] : A | +| CollectionFlow.cs:441:20:441:20 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:442:14:442:18 | access to local variable array : MyInlineArray [element] : A | semmle.label | access to local variable array : MyInlineArray [element] : A | +| CollectionFlow.cs:442:14:442:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:447:13:447:17 | access to local variable array : MyInlineArray | semmle.label | access to local variable array : MyInlineArray | +| CollectionFlow.cs:447:21:447:39 | object creation of type MyInlineArray : MyInlineArray | semmle.label | object creation of type MyInlineArray : MyInlineArray | +| CollectionFlow.cs:449:14:449:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:460:13:460:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:460:17:460:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:461:13:461:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:461:21:461:23 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | +| CollectionFlow.cs:461:22:461:22 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:462:14:462:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:462:14:462:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:467:13:467:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:467:17:467:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:468:17:468:17 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | +| CollectionFlow.cs:468:21:468:23 | [...] : List [element] : A | semmle.label | [...] : List [element] : A | +| CollectionFlow.cs:468:22:468:22 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:469:14:469:14 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | +| CollectionFlow.cs:469:14:469:17 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:480:13:480:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:480:17:480:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:481:13:481:16 | access to local variable temp : A[] [element] : A | semmle.label | access to local variable temp : A[] [element] : A | +| CollectionFlow.cs:481:20:481:22 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | +| CollectionFlow.cs:481:21:481:21 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:482:13:482:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:482:22:482:28 | .. access to local variable temp : A[] [element] : A | semmle.label | .. access to local variable temp : A[] [element] : A | +| CollectionFlow.cs:483:14:483:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | +| CollectionFlow.cs:483:14:483:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:520:13:520:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:520:17:520:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:521:17:521:20 | access to local variable span : Span | semmle.label | access to local variable span : Span | +| CollectionFlow.cs:521:17:521:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span | semmle.label | object creation of type Span : Span | +| CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | +| CollectionFlow.cs:521:40:521:40 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:522:14:522:17 | access to local variable span : Span | semmle.label | access to local variable span : Span | +| CollectionFlow.cs:522:14:522:17 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:522:14:522:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:527:13:527:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:527:17:527:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:528:17:528:20 | access to local variable span : Span | semmle.label | access to local variable span : Span | +| CollectionFlow.cs:528:17:528:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span | semmle.label | object creation of type Span : Span | +| CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | +| CollectionFlow.cs:528:40:528:40 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | +| CollectionFlow.cs:529:13:529:15 | access to local variable arr : T[] [element] : Object | semmle.label | access to local variable arr : T[] [element] : Object | +| CollectionFlow.cs:529:19:529:22 | access to local variable span : Span | semmle.label | access to local variable span : Span | +| CollectionFlow.cs:529:19:529:22 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | +| CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : A | semmle.label | call to method ToArray : T[] [element] : A | +| CollectionFlow.cs:529:19:529:32 | call to method ToArray : T[] [element] : Object | semmle.label | call to method ToArray : T[] [element] : Object | +| CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | +| CollectionFlow.cs:530:14:530:16 | access to local variable arr : T[] [element] : Object | semmle.label | access to local variable arr : T[] [element] : Object | +| CollectionFlow.cs:530:14:530:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:535:13:535:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:535:17:535:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:536:9:536:14 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | +| CollectionFlow.cs:536:21:536:21 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:537:14:537:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | +| CollectionFlow.cs:537:14:537:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:542:13:542:18 | access to local variable source : Span | semmle.label | access to local variable source : Span | +| CollectionFlow.cs:542:13:542:18 | access to local variable source : Span [element] : A | semmle.label | access to local variable source : Span [element] : A | +| CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span | semmle.label | object creation of type Span : Span | +| CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | +| CollectionFlow.cs:542:34:542:50 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:542:40:542:50 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:542:42:542:48 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:543:9:543:14 | access to local variable source : Span | semmle.label | access to local variable source : Span | +| CollectionFlow.cs:543:9:543:14 | access to local variable source : Span [element] : A | semmle.label | access to local variable source : Span [element] : A | +| CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | +| CollectionFlow.cs:543:23:543:28 | [post] access to parameter target : Span [element] : Object | semmle.label | [post] access to parameter target : Span [element] : Object | +| CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | +| CollectionFlow.cs:544:14:544:19 | access to parameter target : Span [element] : Object | semmle.label | access to parameter target : Span [element] : Object | +| CollectionFlow.cs:544:14:544:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:549:13:549:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:549:17:549:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan | semmle.label | access to local variable span : ReadOnlySpan | +| CollectionFlow.cs:550:25:550:28 | access to local variable span : ReadOnlySpan [element] : A | semmle.label | access to local variable span : ReadOnlySpan [element] : A | +| CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan | semmle.label | object creation of type ReadOnlySpan : ReadOnlySpan | +| CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | semmle.label | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | +| CollectionFlow.cs:550:52:550:62 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | +| CollectionFlow.cs:550:58:550:62 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | +| CollectionFlow.cs:550:60:550:60 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan | semmle.label | access to local variable span : ReadOnlySpan | +| CollectionFlow.cs:551:14:551:17 | access to local variable span : ReadOnlySpan [element] : A | semmle.label | access to local variable span : ReadOnlySpan [element] : A | +| CollectionFlow.cs:551:14:551:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:555:13:555:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:555:17:555:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:556:9:556:12 | [post] access to parameter dict : Dictionary [element, property Value] : A | semmle.label | [post] access to parameter dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:556:19:556:19 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:557:14:557:17 | access to parameter dict | semmle.label | access to parameter dict | +subpaths +| CollectionFlow.cs:50:20:50:22 | access to local variable as : null [element] : A | CollectionFlow.cs:24:34:24:35 | ts : null [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:50:14:50:23 | call to method First | +| CollectionFlow.cs:68:20:68:23 | access to field As : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:68:14:68:24 | call to method First | +| CollectionFlow.cs:86:19:86:22 | access to field As : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | CollectionFlow.cs:26:40:26:45 | access to array element : A | CollectionFlow.cs:86:14:86:23 | call to method Last | +| CollectionFlow.cs:96:20:96:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:96:14:96:23 | call to method First | +| CollectionFlow.cs:116:19:116:21 | access to local variable as : A[] [element] : A | CollectionFlow.cs:26:33:26:34 | ts : A[] [element] : A | CollectionFlow.cs:26:40:26:45 | access to array element : A | CollectionFlow.cs:116:14:116:22 | call to method Last | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | +| CollectionFlow.cs:126:24:126:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | +| CollectionFlow.cs:135:24:135:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:135:14:135:28 | call to method ListFirst | +| CollectionFlow.cs:135:24:135:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:135:14:135:28 | call to method ListFirst | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | +| CollectionFlow.cs:144:24:144:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | +| CollectionFlow.cs:152:24:152:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:152:14:152:28 | call to method ListFirst | +| CollectionFlow.cs:152:24:152:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:152:14:152:28 | call to method ListFirst | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | +| CollectionFlow.cs:162:24:162:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | +| CollectionFlow.cs:171:24:171:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:171:14:171:28 | call to method ListFirst | +| CollectionFlow.cs:171:24:171:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:171:14:171:28 | call to method ListFirst | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | CollectionFlow.cs:30:67:30:73 | access to indexer : T | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | +| CollectionFlow.cs:181:28:181:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | CollectionFlow.cs:32:68:32:85 | access to property Value : T | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | +| CollectionFlow.cs:182:29:182:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | +| CollectionFlow.cs:183:30:183:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | +| CollectionFlow.cs:192:28:192:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | CollectionFlow.cs:30:67:30:73 | access to indexer : T | CollectionFlow.cs:192:14:192:32 | call to method DictIndexZero | +| CollectionFlow.cs:193:29:193:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | CollectionFlow.cs:32:68:32:85 | access to property Value : T | CollectionFlow.cs:193:14:193:33 | call to method DictFirstValue | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | CollectionFlow.cs:30:67:30:73 | access to indexer : T | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | +| CollectionFlow.cs:203:28:203:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | CollectionFlow.cs:32:68:32:85 | access to property Value : T | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | +| CollectionFlow.cs:204:29:204:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | +| CollectionFlow.cs:205:30:205:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | +| CollectionFlow.cs:213:28:213:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | CollectionFlow.cs:30:67:30:73 | access to indexer : T | CollectionFlow.cs:213:14:213:32 | call to method DictIndexZero | +| CollectionFlow.cs:214:29:214:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | CollectionFlow.cs:32:68:32:85 | access to property Value : T | CollectionFlow.cs:214:14:214:33 | call to method DictFirstValue | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | CollectionFlow.cs:30:67:30:73 | access to indexer : T | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | +| CollectionFlow.cs:224:28:224:31 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:58:30:61 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:67:30:73 | access to indexer : A | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | CollectionFlow.cs:32:68:32:85 | access to property Value : T | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | +| CollectionFlow.cs:225:29:225:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:59:32:62 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:32:68:32:85 | access to property Value : A | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | +| CollectionFlow.cs:226:30:226:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:60:34:63 | dict : Dictionary [element, property Value] : A | CollectionFlow.cs:34:69:34:87 | call to method First : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | +| CollectionFlow.cs:235:28:235:31 | access to local variable dict : Dictionary | CollectionFlow.cs:30:58:30:61 | dict : Dictionary | CollectionFlow.cs:30:67:30:73 | access to indexer : T | CollectionFlow.cs:235:14:235:32 | call to method DictIndexZero | +| CollectionFlow.cs:236:29:236:32 | access to local variable dict : Dictionary | CollectionFlow.cs:32:59:32:62 | dict : Dictionary | CollectionFlow.cs:32:68:32:85 | access to property Value : T | CollectionFlow.cs:236:14:236:33 | call to method DictFirstValue | +| CollectionFlow.cs:246:28:246:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:83 | call to method First : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | CollectionFlow.cs:38:66:38:81 | access to property Key : T | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | +| CollectionFlow.cs:247:27:247:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:81 | access to property Key : A | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | +| CollectionFlow.cs:256:27:256:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | CollectionFlow.cs:38:66:38:81 | access to property Key : T | CollectionFlow.cs:256:14:256:31 | call to method DictFirstKey | +| CollectionFlow.cs:265:28:265:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:58:36:61 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:36:67:36:83 | call to method First : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | CollectionFlow.cs:38:66:38:81 | access to property Key : T | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | +| CollectionFlow.cs:266:27:266:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:57:38:60 | dict : Dictionary [element, property Key] : A | CollectionFlow.cs:38:66:38:81 | access to property Key : A | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | +| CollectionFlow.cs:275:27:275:30 | access to local variable dict : Dictionary | CollectionFlow.cs:38:57:38:60 | dict : Dictionary | CollectionFlow.cs:38:66:38:81 | access to property Key : T | CollectionFlow.cs:275:14:275:31 | call to method DictFirstKey | +| CollectionFlow.cs:359:23:359:23 | access to local variable a : A | CollectionFlow.cs:353:32:353:38 | element : A | CollectionFlow.cs:353:23:353:27 | array [Return] : A[] [element] : A | CollectionFlow.cs:359:18:359:20 | [post] access to local variable as : A[] [element] : A | +| CollectionFlow.cs:362:20:362:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:24:34:24:35 | ts : A[] [element] : A | CollectionFlow.cs:24:41:24:45 | access to array element : A | CollectionFlow.cs:362:14:362:23 | call to method First | +| CollectionFlow.cs:381:23:381:23 | access to local variable a : A | CollectionFlow.cs:375:34:375:40 | element : A | CollectionFlow.cs:375:26:375:29 | list [Return] : List [element] : A | CollectionFlow.cs:381:17:381:20 | [post] access to local variable list : List [element] : A | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | +| CollectionFlow.cs:384:24:384:27 | access to local variable list : List [element] : A | CollectionFlow.cs:28:43:28:46 | list : List [element] : A | CollectionFlow.cs:28:52:28:58 | access to indexer : A | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | +| CollectionFlow.cs:393:24:393:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:393:14:393:28 | call to method ListFirst | +| CollectionFlow.cs:393:24:393:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:393:14:393:28 | call to method ListFirst | +| CollectionFlow.cs:428:24:428:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : Object | CollectionFlow.cs:428:14:428:28 | call to method ListFirst | +| CollectionFlow.cs:428:24:428:27 | access to local variable list : List | CollectionFlow.cs:28:43:28:46 | list : List | CollectionFlow.cs:28:52:28:58 | access to indexer : T | CollectionFlow.cs:428:14:428:28 | call to method ListFirst | +#select +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:48:14:48:19 | access to array element | $@ | CollectionFlow.cs:48:14:48:19 | access to array element | access to array element | +| CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:46:17:46:23 | object creation of type A : A | CollectionFlow.cs:50:14:50:23 | call to method First | $@ | CollectionFlow.cs:50:14:50:23 | call to method First | call to method First | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:66:14:66:20 | access to array element | $@ | CollectionFlow.cs:66:14:66:20 | access to array element | access to array element | +| CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:64:17:64:23 | object creation of type A : A | CollectionFlow.cs:68:14:68:24 | call to method First | $@ | CollectionFlow.cs:68:14:68:24 | call to method First | call to method First | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:16:56:16:61 | access to array element | $@ | CollectionFlow.cs:16:56:16:61 | access to array element | access to array element | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:84:14:84:21 | access to array element | $@ | CollectionFlow.cs:84:14:84:21 | access to array element | access to array element | +| CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:82:17:82:23 | object creation of type A : A | CollectionFlow.cs:86:14:86:23 | call to method Last | $@ | CollectionFlow.cs:86:14:86:23 | call to method Last | call to method Last | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:94:14:94:19 | access to array element | $@ | CollectionFlow.cs:94:14:94:19 | access to array element | access to array element | +| CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:91:17:91:23 | object creation of type A : A | CollectionFlow.cs:96:14:96:23 | call to method First | $@ | CollectionFlow.cs:96:14:96:23 | call to method First | call to method First | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:16:56:16:61 | access to array element | $@ | CollectionFlow.cs:16:56:16:61 | access to array element | access to array element | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:114:14:114:20 | access to array element | $@ | CollectionFlow.cs:114:14:114:20 | access to array element | access to array element | +| CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:111:17:111:23 | object creation of type A : A | CollectionFlow.cs:116:14:116:22 | call to method Last | $@ | CollectionFlow.cs:116:14:116:22 | call to method Last | call to method Last | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:124:14:124:20 | access to indexer | $@ | CollectionFlow.cs:124:14:124:20 | access to indexer | access to indexer | +| CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:121:17:121:23 | object creation of type A : A | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | $@ | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:122:20:122:32 | object creation of type List : List | CollectionFlow.cs:122:20:122:32 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:122:20:122:32 | object creation of type List : List | CollectionFlow.cs:122:20:122:32 | object creation of type List : List | CollectionFlow.cs:124:14:124:20 | access to indexer | $@ | CollectionFlow.cs:124:14:124:20 | access to indexer | access to indexer | +| CollectionFlow.cs:122:20:122:32 | object creation of type List : List | CollectionFlow.cs:122:20:122:32 | object creation of type List : List | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | $@ | CollectionFlow.cs:126:14:126:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:131:20:131:32 | object creation of type List : List | CollectionFlow.cs:131:20:131:32 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:131:20:131:32 | object creation of type List : List | CollectionFlow.cs:131:20:131:32 | object creation of type List : List | CollectionFlow.cs:133:14:133:20 | access to indexer | $@ | CollectionFlow.cs:133:14:133:20 | access to indexer | access to indexer | +| CollectionFlow.cs:131:20:131:32 | object creation of type List : List | CollectionFlow.cs:131:20:131:32 | object creation of type List : List | CollectionFlow.cs:135:14:135:28 | call to method ListFirst | $@ | CollectionFlow.cs:135:14:135:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:142:14:142:20 | access to indexer | $@ | CollectionFlow.cs:142:14:142:20 | access to indexer | access to indexer | +| CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:140:17:140:23 | object creation of type A : A | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | $@ | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List | CollectionFlow.cs:141:20:141:38 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List | CollectionFlow.cs:141:20:141:38 | object creation of type List : List | CollectionFlow.cs:142:14:142:20 | access to indexer | $@ | CollectionFlow.cs:142:14:142:20 | access to indexer | access to indexer | +| CollectionFlow.cs:141:20:141:38 | object creation of type List : List | CollectionFlow.cs:141:20:141:38 | object creation of type List : List | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | $@ | CollectionFlow.cs:144:14:144:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:149:20:149:42 | object creation of type List : List | CollectionFlow.cs:149:20:149:42 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:149:20:149:42 | object creation of type List : List | CollectionFlow.cs:149:20:149:42 | object creation of type List : List | CollectionFlow.cs:150:14:150:20 | access to indexer | $@ | CollectionFlow.cs:150:14:150:20 | access to indexer | access to indexer | +| CollectionFlow.cs:149:20:149:42 | object creation of type List : List | CollectionFlow.cs:149:20:149:42 | object creation of type List : List | CollectionFlow.cs:152:14:152:28 | call to method ListFirst | $@ | CollectionFlow.cs:152:14:152:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:160:14:160:20 | access to indexer | $@ | CollectionFlow.cs:160:14:160:20 | access to indexer | access to indexer | +| CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:157:17:157:23 | object creation of type A : A | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | $@ | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:158:20:158:32 | object creation of type List : List | CollectionFlow.cs:158:20:158:32 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:158:20:158:32 | object creation of type List : List | CollectionFlow.cs:158:20:158:32 | object creation of type List : List | CollectionFlow.cs:160:14:160:20 | access to indexer | $@ | CollectionFlow.cs:160:14:160:20 | access to indexer | access to indexer | +| CollectionFlow.cs:158:20:158:32 | object creation of type List : List | CollectionFlow.cs:158:20:158:32 | object creation of type List : List | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | $@ | CollectionFlow.cs:162:14:162:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:167:20:167:32 | object creation of type List : List | CollectionFlow.cs:167:20:167:32 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:167:20:167:32 | object creation of type List : List | CollectionFlow.cs:167:20:167:32 | object creation of type List : List | CollectionFlow.cs:169:14:169:20 | access to indexer | $@ | CollectionFlow.cs:169:14:169:20 | access to indexer | access to indexer | +| CollectionFlow.cs:167:20:167:32 | object creation of type List : List | CollectionFlow.cs:167:20:167:32 | object creation of type List : List | CollectionFlow.cs:171:14:171:28 | call to method ListFirst | $@ | CollectionFlow.cs:171:14:171:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:179:14:179:20 | access to indexer | $@ | CollectionFlow.cs:179:14:179:20 | access to indexer | access to indexer | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:176:17:176:23 | object creation of type A : A | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | $@ | CollectionFlow.cs:183:14:183:34 | call to method DictValuesFirst | call to method DictValuesFirst | +| CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:179:14:179:20 | access to indexer | $@ | CollectionFlow.cs:179:14:179:20 | access to indexer | access to indexer | +| CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:181:14:181:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:177:20:177:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:182:14:182:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:190:14:190:20 | access to indexer | $@ | CollectionFlow.cs:190:14:190:20 | access to indexer | access to indexer | +| CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:192:14:192:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:192:14:192:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:188:20:188:43 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:193:14:193:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:193:14:193:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:201:14:201:20 | access to indexer | $@ | CollectionFlow.cs:201:14:201:20 | access to indexer | access to indexer | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:199:17:199:23 | object creation of type A : A | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | $@ | CollectionFlow.cs:205:14:205:34 | call to method DictValuesFirst | call to method DictValuesFirst | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:201:14:201:20 | access to indexer | $@ | CollectionFlow.cs:201:14:201:20 | access to indexer | access to indexer | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:203:14:203:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:200:20:200:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:204:14:204:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:211:14:211:20 | access to indexer | $@ | CollectionFlow.cs:211:14:211:20 | access to indexer | access to indexer | +| CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:213:14:213:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:213:14:213:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:210:20:210:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:214:14:214:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:214:14:214:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:222:14:222:20 | access to indexer | $@ | CollectionFlow.cs:222:14:222:20 | access to indexer | access to indexer | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:220:17:220:23 | object creation of type A : A | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | $@ | CollectionFlow.cs:226:14:226:34 | call to method DictValuesFirst | call to method DictValuesFirst | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:222:14:222:20 | access to indexer | $@ | CollectionFlow.cs:222:14:222:20 | access to indexer | access to indexer | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:224:14:224:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:221:20:221:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:225:14:225:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:20:75:20:81 | access to indexer | $@ | CollectionFlow.cs:20:75:20:81 | access to indexer | access to indexer | +| CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:233:14:233:20 | access to indexer | $@ | CollectionFlow.cs:233:14:233:20 | access to indexer | access to indexer | +| CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:235:14:235:32 | call to method DictIndexZero | $@ | CollectionFlow.cs:235:14:235:32 | call to method DictIndexZero | call to method DictIndexZero | +| CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:232:20:232:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:236:14:236:33 | call to method DictFirstValue | $@ | CollectionFlow.cs:236:14:236:33 | call to method DictFirstValue | call to method DictFirstValue | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:22:73:22:89 | call to method First | $@ | CollectionFlow.cs:22:73:22:89 | call to method First | call to method First | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:244:14:244:30 | call to method First | $@ | CollectionFlow.cs:244:14:244:30 | call to method First | call to method First | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | $@ | CollectionFlow.cs:246:14:246:32 | call to method DictKeysFirst | call to method DictKeysFirst | +| CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:242:17:242:23 | object creation of type A : A | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:243:20:243:56 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:247:14:247:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:252:20:252:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:252:20:252:60 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:256:14:256:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:256:14:256:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:22:73:22:89 | call to method First | $@ | CollectionFlow.cs:22:73:22:89 | call to method First | call to method First | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:263:14:263:30 | call to method First | $@ | CollectionFlow.cs:263:14:263:30 | call to method First | call to method First | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | $@ | CollectionFlow.cs:265:14:265:32 | call to method DictKeysFirst | call to method DictKeysFirst | +| CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:261:17:261:23 | object creation of type A : A | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:262:20:262:55 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:266:14:266:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:271:20:271:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:271:20:271:59 | object creation of type Dictionary : Dictionary | CollectionFlow.cs:275:14:275:31 | call to method DictFirstKey | $@ | CollectionFlow.cs:275:14:275:31 | call to method DictFirstKey | call to method DictFirstKey | +| CollectionFlow.cs:280:17:280:23 | object creation of type A : A | CollectionFlow.cs:280:17:280:23 | object creation of type A : A | CollectionFlow.cs:283:18:283:18 | access to local variable x | $@ | CollectionFlow.cs:283:18:283:18 | access to local variable x | access to local variable x | +| CollectionFlow.cs:295:17:295:23 | object creation of type A : A | CollectionFlow.cs:295:17:295:23 | object creation of type A : A | CollectionFlow.cs:299:18:299:35 | access to property Current | $@ | CollectionFlow.cs:299:18:299:35 | access to property Current | access to property Current | +| CollectionFlow.cs:312:17:312:23 | object creation of type A : A | CollectionFlow.cs:312:17:312:23 | object creation of type A : A | CollectionFlow.cs:317:18:317:35 | access to property Current | $@ | CollectionFlow.cs:317:18:317:35 | access to property Current | access to property Current | +| CollectionFlow.cs:313:20:313:32 | object creation of type List : List | CollectionFlow.cs:313:20:313:32 | object creation of type List : List | CollectionFlow.cs:317:18:317:35 | access to property Current | $@ | CollectionFlow.cs:317:18:317:35 | access to property Current | access to property Current | +| CollectionFlow.cs:322:20:322:32 | object creation of type List : List | CollectionFlow.cs:322:20:322:32 | object creation of type List : List | CollectionFlow.cs:326:18:326:35 | access to property Current | $@ | CollectionFlow.cs:326:18:326:35 | access to property Current | access to property Current | +| CollectionFlow.cs:331:17:331:23 | object creation of type A : A | CollectionFlow.cs:331:17:331:23 | object creation of type A : A | CollectionFlow.cs:336:18:336:24 | access to property Key | $@ | CollectionFlow.cs:336:18:336:24 | access to property Key | access to property Key | +| CollectionFlow.cs:332:20:332:51 | object creation of type List> : List> | CollectionFlow.cs:332:20:332:51 | object creation of type List> : List> | CollectionFlow.cs:336:18:336:24 | access to property Key | $@ | CollectionFlow.cs:336:18:336:24 | access to property Key | access to property Key | +| CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair | CollectionFlow.cs:333:18:333:47 | object creation of type KeyValuePair : KeyValuePair | CollectionFlow.cs:336:18:336:24 | access to property Key | $@ | CollectionFlow.cs:336:18:336:24 | access to property Key | access to property Key | +| CollectionFlow.cs:344:20:344:51 | object creation of type List> : List> | CollectionFlow.cs:344:20:344:51 | object creation of type List> : List> | CollectionFlow.cs:348:18:348:26 | access to property Value | $@ | CollectionFlow.cs:348:18:348:26 | access to property Value | access to property Value | +| CollectionFlow.cs:345:18:345:47 | object creation of type KeyValuePair : KeyValuePair | CollectionFlow.cs:345:18:345:47 | object creation of type KeyValuePair : KeyValuePair | CollectionFlow.cs:348:18:348:26 | access to property Value | $@ | CollectionFlow.cs:348:18:348:26 | access to property Value | access to property Value | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:14:52:14:56 | access to array element | $@ | CollectionFlow.cs:14:52:14:56 | access to array element | access to array element | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:360:14:360:19 | access to array element | $@ | CollectionFlow.cs:360:14:360:19 | access to array element | access to array element | +| CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:357:17:357:23 | object creation of type A : A | CollectionFlow.cs:362:14:362:23 | call to method First | $@ | CollectionFlow.cs:362:14:362:23 | call to method First | call to method First | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:382:14:382:20 | access to indexer | $@ | CollectionFlow.cs:382:14:382:20 | access to indexer | access to indexer | +| CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:379:17:379:23 | object creation of type A : A | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | $@ | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:380:20:380:32 | object creation of type List : List | CollectionFlow.cs:380:20:380:32 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:380:20:380:32 | object creation of type List : List | CollectionFlow.cs:380:20:380:32 | object creation of type List : List | CollectionFlow.cs:382:14:382:20 | access to indexer | $@ | CollectionFlow.cs:382:14:382:20 | access to indexer | access to indexer | +| CollectionFlow.cs:380:20:380:32 | object creation of type List : List | CollectionFlow.cs:380:20:380:32 | object creation of type List : List | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | $@ | CollectionFlow.cs:384:14:384:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:389:20:389:32 | object creation of type List : List | CollectionFlow.cs:389:20:389:32 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:389:20:389:32 | object creation of type List : List | CollectionFlow.cs:389:20:389:32 | object creation of type List : List | CollectionFlow.cs:391:14:391:20 | access to indexer | $@ | CollectionFlow.cs:391:14:391:20 | access to indexer | access to indexer | +| CollectionFlow.cs:389:20:389:32 | object creation of type List : List | CollectionFlow.cs:389:20:389:32 | object creation of type List : List | CollectionFlow.cs:393:14:393:28 | call to method ListFirst | $@ | CollectionFlow.cs:393:14:393:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:398:20:398:26 | object creation of type A : A | CollectionFlow.cs:398:20:398:26 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:399:26:399:32 | object creation of type A : A | CollectionFlow.cs:399:26:399:32 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:400:26:400:32 | object creation of type A : A | CollectionFlow.cs:400:26:400:32 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:401:30:401:36 | object creation of type A : A | CollectionFlow.cs:401:30:401:36 | object creation of type A : A | CollectionFlow.cs:40:63:40:69 | access to array element | $@ | CollectionFlow.cs:40:63:40:69 | access to array element | access to array element | +| CollectionFlow.cs:414:30:414:36 | object creation of type A : A | CollectionFlow.cs:414:30:414:36 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:415:36:415:42 | object creation of type A : A | CollectionFlow.cs:415:36:415:42 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:416:36:416:42 | object creation of type A : A | CollectionFlow.cs:416:36:416:42 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:417:31:417:37 | object creation of type A : A | CollectionFlow.cs:417:31:417:37 | object creation of type A : A | CollectionFlow.cs:42:84:42:95 | call to method First | $@ | CollectionFlow.cs:42:84:42:95 | call to method First | call to method First | +| CollectionFlow.cs:423:20:423:32 | object creation of type List : List | CollectionFlow.cs:423:20:423:32 | object creation of type List : List | CollectionFlow.cs:18:63:18:69 | access to indexer | $@ | CollectionFlow.cs:18:63:18:69 | access to indexer | access to indexer | +| CollectionFlow.cs:423:20:423:32 | object creation of type List : List | CollectionFlow.cs:423:20:423:32 | object creation of type List : List | CollectionFlow.cs:426:14:426:20 | access to indexer | $@ | CollectionFlow.cs:426:14:426:20 | access to indexer | access to indexer | +| CollectionFlow.cs:423:20:423:32 | object creation of type List : List | CollectionFlow.cs:423:20:423:32 | object creation of type List : List | CollectionFlow.cs:428:14:428:28 | call to method ListFirst | $@ | CollectionFlow.cs:428:14:428:28 | call to method ListFirst | call to method ListFirst | +| CollectionFlow.cs:439:17:439:23 | object creation of type A : A | CollectionFlow.cs:439:17:439:23 | object creation of type A : A | CollectionFlow.cs:442:14:442:21 | access to array element | $@ | CollectionFlow.cs:442:14:442:21 | access to array element | access to array element | +| CollectionFlow.cs:440:21:440:39 | object creation of type MyInlineArray : MyInlineArray | CollectionFlow.cs:440:21:440:39 | object creation of type MyInlineArray : MyInlineArray | CollectionFlow.cs:442:14:442:21 | access to array element | $@ | CollectionFlow.cs:442:14:442:21 | access to array element | access to array element | +| CollectionFlow.cs:447:21:447:39 | object creation of type MyInlineArray : MyInlineArray | CollectionFlow.cs:447:21:447:39 | object creation of type MyInlineArray : MyInlineArray | CollectionFlow.cs:449:14:449:21 | access to array element | $@ | CollectionFlow.cs:449:14:449:21 | access to array element | access to array element | +| CollectionFlow.cs:460:17:460:23 | object creation of type A : A | CollectionFlow.cs:460:17:460:23 | object creation of type A : A | CollectionFlow.cs:462:14:462:21 | access to array element | $@ | CollectionFlow.cs:462:14:462:21 | access to array element | access to array element | +| CollectionFlow.cs:467:17:467:23 | object creation of type A : A | CollectionFlow.cs:467:17:467:23 | object creation of type A : A | CollectionFlow.cs:469:14:469:17 | access to indexer | $@ | CollectionFlow.cs:469:14:469:17 | access to indexer | access to indexer | +| CollectionFlow.cs:480:17:480:23 | object creation of type A : A | CollectionFlow.cs:480:17:480:23 | object creation of type A : A | CollectionFlow.cs:483:14:483:21 | access to array element | $@ | CollectionFlow.cs:483:14:483:21 | access to array element | access to array element | +| CollectionFlow.cs:520:17:520:23 | object creation of type A : A | CollectionFlow.cs:520:17:520:23 | object creation of type A : A | CollectionFlow.cs:522:14:522:20 | access to indexer | $@ | CollectionFlow.cs:522:14:522:20 | access to indexer | access to indexer | +| CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span | CollectionFlow.cs:521:24:521:41 | object creation of type Span : Span | CollectionFlow.cs:522:14:522:20 | access to indexer | $@ | CollectionFlow.cs:522:14:522:20 | access to indexer | access to indexer | +| CollectionFlow.cs:527:17:527:23 | object creation of type A : A | CollectionFlow.cs:527:17:527:23 | object creation of type A : A | CollectionFlow.cs:530:14:530:19 | access to array element | $@ | CollectionFlow.cs:530:14:530:19 | access to array element | access to array element | +| CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span | CollectionFlow.cs:528:24:528:41 | object creation of type Span : Span | CollectionFlow.cs:530:14:530:19 | access to array element | $@ | CollectionFlow.cs:530:14:530:19 | access to array element | access to array element | +| CollectionFlow.cs:535:17:535:23 | object creation of type A : A | CollectionFlow.cs:535:17:535:23 | object creation of type A : A | CollectionFlow.cs:537:14:537:22 | access to indexer | $@ | CollectionFlow.cs:537:14:537:22 | access to indexer | access to indexer | +| CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span | CollectionFlow.cs:542:22:542:51 | object creation of type Span : Span | CollectionFlow.cs:544:14:544:22 | access to indexer | $@ | CollectionFlow.cs:544:14:544:22 | access to indexer | access to indexer | +| CollectionFlow.cs:542:42:542:48 | object creation of type A : A | CollectionFlow.cs:542:42:542:48 | object creation of type A : A | CollectionFlow.cs:544:14:544:22 | access to indexer | $@ | CollectionFlow.cs:544:14:544:22 | access to indexer | access to indexer | +| CollectionFlow.cs:549:17:549:23 | object creation of type A : A | CollectionFlow.cs:549:17:549:23 | object creation of type A : A | CollectionFlow.cs:551:14:551:20 | access to indexer | $@ | CollectionFlow.cs:551:14:551:20 | access to indexer | access to indexer | +| CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan | CollectionFlow.cs:550:32:550:63 | object creation of type ReadOnlySpan : ReadOnlySpan | CollectionFlow.cs:551:14:551:20 | access to indexer | $@ | CollectionFlow.cs:551:14:551:20 | access to indexer | access to indexer | +| CollectionFlow.cs:555:17:555:23 | object creation of type A : A | CollectionFlow.cs:555:17:555:23 | object creation of type A : A | CollectionFlow.cs:557:14:557:17 | access to parameter dict | $@ | CollectionFlow.cs:557:14:557:17 | access to parameter dict | access to parameter dict | diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionTaintFlow.ql b/csharp/ql/test/library-tests/dataflow/collections/CollectionTaintFlow.ql new file mode 100644 index 00000000000..7292e0dd0d6 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionTaintFlow.ql @@ -0,0 +1,12 @@ +/** + * @kind path-problem + */ + +import CollectionFlowCommon +import utils.test.ProvenancePathGraph::ShowProvenance + +module ArrayFlow = TaintTracking::Global; + +from ArrayFlow::PathNode source, ArrayFlow::PathNode sink +where ArrayFlow::flowPath(source, sink) +select source, source, sink, "$@", sink, sink.toString() diff --git a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected index 574ef53eae6..678dca279ff 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected @@ -1,27 +1,30 @@ models edges -| Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | provenance | | +| Constructors.cs:3:18:3:26 | [post] this access : C_no_ctor [field s1] : Object | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | provenance | | +| Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | Constructors.cs:3:18:3:26 | [post] this access : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:5:29:5:45 | call to method Source : Object | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | Constructors.cs:15:18:15:19 | access to field s1 | provenance | | -| Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | Constructors.cs:29:16:29:26 | this [Return] : C_with_ctor [field s1] : Object | provenance | | +| Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | Constructors.cs:29:16:29:26 | [post] this access : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:21:29:21:45 | call to method Source : Object | Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | provenance | | +| Constructors.cs:29:16:29:26 | [post] this access : C_with_ctor [field s1] : Object | Constructors.cs:29:16:29:26 | this [Return] : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:29:16:29:26 | this [Return] : C_with_ctor [field s1] : Object | Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | Constructors.cs:33:18:33:19 | this access : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:33:18:33:19 | this access : C_with_ctor [field s1] : Object | Constructors.cs:33:18:33:19 | access to field s1 | provenance | | | Constructors.cs:41:26:41:26 | o : Object | Constructors.cs:41:38:41:38 | access to parameter o : Object | provenance | | | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | Constructors.cs:41:16:41:17 | this [Return] : C1 [field Obj] : Object | provenance | | | Constructors.cs:41:38:41:38 | access to parameter o : Object | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | provenance | | -| Constructors.cs:44:28:44:35 | o21param : Object | Constructors.cs:46:23:46:27 | this access : C2 [parameter o21param] : Object | provenance | | -| Constructors.cs:44:28:44:35 | o21param : Object | Constructors.cs:46:31:46:38 | access to parameter o21param : Object | provenance | | +| Constructors.cs:44:18:44:19 | [post] this access : C2 [field Obj21] : Object | Constructors.cs:44:18:44:19 | this [Return] : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:44:18:44:19 | this access : C2 [parameter o21param] : Object | Constructors.cs:44:18:44:19 | [post] this access : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:44:18:44:19 | this access : C2 [parameter o21param] : Object | Constructors.cs:46:23:46:27 | this access : C2 [parameter o21param] : Object | provenance | | +| Constructors.cs:44:28:44:35 | o21param : Object | Constructors.cs:44:18:44:19 | this access : C2 [parameter o21param] : Object | provenance | | | Constructors.cs:44:45:44:52 | o22param : Object | Constructors.cs:44:18:44:19 | this [Return] : C2 [parameter o22param] : Object | provenance | | -| Constructors.cs:46:23:46:27 | [post] this access : C2 [field Obj21] : Object | Constructors.cs:44:18:44:19 | this [Return] : C2 [field Obj21] : Object | provenance | | | Constructors.cs:46:23:46:27 | this access : C2 [parameter o21param] : Object | Constructors.cs:46:31:46:38 | access to parameter o21param : Object | provenance | | | Constructors.cs:46:31:46:38 | access to parameter o21param : Object | Constructors.cs:46:23:46:27 | [post] this access : C2 [field Obj21] : Object | provenance | | | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | provenance | | @@ -120,6 +123,7 @@ edges | Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | provenance | | | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | provenance | | nodes +| Constructors.cs:3:18:3:26 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object | | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object | | Constructors.cs:5:29:5:45 | call to method Source : Object | semmle.label | call to method Source : Object | | Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | semmle.label | access to local variable c : C_no_ctor [field s1] : Object | @@ -133,6 +137,7 @@ nodes | Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | semmle.label | access to local variable c : C_with_ctor [field s1] : Object | | Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | semmle.label | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | semmle.label | access to local variable c : C_with_ctor [field s1] : Object | +| Constructors.cs:29:16:29:26 | [post] this access : C_with_ctor [field s1] : Object | semmle.label | [post] this access : C_with_ctor [field s1] : Object | | Constructors.cs:29:16:29:26 | this [Return] : C_with_ctor [field s1] : Object | semmle.label | this [Return] : C_with_ctor [field s1] : Object | | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | semmle.label | this : C_with_ctor [field s1] : Object | | Constructors.cs:33:18:33:19 | access to field s1 | semmle.label | access to field s1 | @@ -141,8 +146,10 @@ nodes | Constructors.cs:41:26:41:26 | o : Object | semmle.label | o : Object | | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | semmle.label | [post] this access : C1 [field Obj] : Object | | Constructors.cs:41:38:41:38 | access to parameter o : Object | semmle.label | access to parameter o : Object | +| Constructors.cs:44:18:44:19 | [post] this access : C2 [field Obj21] : Object | semmle.label | [post] this access : C2 [field Obj21] : Object | | Constructors.cs:44:18:44:19 | this [Return] : C2 [field Obj21] : Object | semmle.label | this [Return] : C2 [field Obj21] : Object | | Constructors.cs:44:18:44:19 | this [Return] : C2 [parameter o22param] : Object | semmle.label | this [Return] : C2 [parameter o22param] : Object | +| Constructors.cs:44:18:44:19 | this access : C2 [parameter o21param] : Object | semmle.label | this access : C2 [parameter o21param] : Object | | Constructors.cs:44:28:44:35 | o21param : Object | semmle.label | o21param : Object | | Constructors.cs:44:45:44:52 | o22param : Object | semmle.label | o22param : Object | | Constructors.cs:46:23:46:27 | [post] this access : C2 [field Obj21] : Object | semmle.label | [post] this access : C2 [field Obj21] : Object | @@ -249,6 +256,7 @@ nodes | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | | Constructors.cs:145:14:145:20 | access to property Obj2 | semmle.label | access to property Obj2 | subpaths +| Constructors.cs:44:18:44:19 | this access : C2 [parameter o21param] : Object | Constructors.cs:46:23:46:27 | this access : C2 [parameter o21param] : Object | Constructors.cs:46:23:46:27 | [post] this access : C2 [field Obj21] : Object | Constructors.cs:44:18:44:19 | [post] this access : C2 [field Obj21] : Object | | Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:14 | access to parameter o1 : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | Constructors.cs:41:16:41:17 | this [Return] : C1 [field Obj] : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | Constructors.cs:44:28:44:35 | o21param : Object | Constructors.cs:44:18:44:19 | this [Return] : C2 [field Obj21] : Object | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | diff --git a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql index 0f278c9df1c..f6aaf07485e 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql @@ -1,9 +1,9 @@ import csharp -private import semmle.code.csharp.controlflow.internal.PreSsa +private import semmle.code.csharp.dataflow.internal.BaseSSA /** "Naive" def-use implementation. */ predicate defReaches( - AssignableDefinition def, PreSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn + AssignableDefinition def, BaseSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn ) { def.getTarget() = v and cfn = def.getExpr().getAControlFlowNode().getASuccessor() or diff --git a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql index 88b93ceedfd..87c26e32259 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql @@ -1,10 +1,10 @@ import csharp -private import semmle.code.csharp.controlflow.internal.PreSsa +private import semmle.code.csharp.dataflow.internal.BaseSSA /** "Naive" parameter-use implementation. */ predicate parameterReaches(Parameter p, ControlFlow::Node cfn) { cfn = p.getCallable().getEntryPoint().getASuccessor() and - p instanceof PreSsa::SimpleLocalScopeVariable + p instanceof BaseSsa::SimpleLocalScopeVariable or exists(ControlFlow::Node mid | parameterReaches(p, mid) | not mid = diff --git a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql index 7952f3adef5..f212e48f1c4 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql @@ -1,9 +1,9 @@ import csharp -private import semmle.code.csharp.controlflow.internal.PreSsa +private import semmle.code.csharp.dataflow.internal.BaseSSA /** "Naive" use-use implementation. */ predicate useReaches( - LocalScopeVariableRead read, PreSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn + LocalScopeVariableRead read, BaseSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn ) { read.getTarget() = v and cfn = read.getAControlFlowNode().getASuccessor() or diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected index ff9e6ab405e..4e469e11887 100644 --- a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected @@ -332,18 +332,18 @@ edges | B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem1] : Elem | B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem1] : Elem | provenance | | | B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem2] : Elem | B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem2] : Elem | provenance | | | B.cs:41:25:41:26 | access to parameter b1 : Box1 [field elem2] : Elem | B.cs:41:13:41:16 | [post] this access : Box2 [field box1, field elem2] : Elem | provenance | | -| C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | provenance | | -| C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | provenance | | +| C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | C.cs:16:13:16:13 | [post] this access : C [field s1] : Elem | provenance | | +| C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | C.cs:16:13:16:13 | [post] this access : C [field s1] : Elem | provenance | | | C.cs:3:23:3:37 | call to method Source : Elem | C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | provenance | | | C.cs:3:23:3:37 | call to method Source : Elem | C.cs:3:18:3:19 | [post] this access : C [field s1] : Elem | provenance | | -| C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s2] : Elem | provenance | | -| C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s2] : Elem | provenance | | +| C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | C.cs:16:13:16:13 | [post] this access : C [field s2] : Elem | provenance | | +| C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | C.cs:16:13:16:13 | [post] this access : C [field s2] : Elem | provenance | | | C.cs:4:32:4:46 | call to method Source : Elem | C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | provenance | | | C.cs:4:32:4:46 | call to method Source : Elem | C.cs:4:27:4:28 | [post] this access : C [field s2] : Elem | provenance | | | C.cs:6:30:6:44 | call to method Source : Elem | C.cs:26:14:26:15 | access to field s4 | provenance | | | C.cs:6:30:6:44 | call to method Source : Elem | C.cs:26:14:26:15 | access to field s4 | provenance | | -| C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | C.cs:16:13:16:13 | this [Return] : C [property s5] : Elem | provenance | | -| C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | C.cs:16:13:16:13 | this [Return] : C [property s5] : Elem | provenance | | +| C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | C.cs:16:13:16:13 | [post] this access : C [property s5] : Elem | provenance | | +| C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | C.cs:16:13:16:13 | [post] this access : C [property s5] : Elem | provenance | | | C.cs:7:37:7:51 | call to method Source : Elem | C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | provenance | | | C.cs:7:37:7:51 | call to method Source : Elem | C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | provenance | | | C.cs:8:30:8:44 | call to method Source : Elem | C.cs:28:14:28:15 | access to property s6 | provenance | | @@ -372,6 +372,12 @@ edges | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | C.cs:21:17:21:18 | this : C [field s3] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | C.cs:21:17:21:18 | this : C [property s5] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | C.cs:21:17:21:18 | this : C [property s5] : Elem | provenance | | +| C.cs:16:13:16:13 | [post] this access : C [field s1] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | provenance | | +| C.cs:16:13:16:13 | [post] this access : C [field s1] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | provenance | | +| C.cs:16:13:16:13 | [post] this access : C [field s2] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s2] : Elem | provenance | | +| C.cs:16:13:16:13 | [post] this access : C [field s2] : Elem | C.cs:16:13:16:13 | this [Return] : C [field s2] : Elem | provenance | | +| C.cs:16:13:16:13 | [post] this access : C [property s5] : Elem | C.cs:16:13:16:13 | this [Return] : C [property s5] : Elem | provenance | | +| C.cs:16:13:16:13 | [post] this access : C [property s5] : Elem | C.cs:16:13:16:13 | this [Return] : C [property s5] : Elem | provenance | | | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | provenance | | | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | provenance | | | C.cs:16:13:16:13 | this [Return] : C [field s2] : Elem | C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | provenance | | @@ -1627,6 +1633,12 @@ nodes | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | semmle.label | access to local variable c : C [field s3] : Elem | | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | semmle.label | access to local variable c : C [property s5] : Elem | | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | semmle.label | access to local variable c : C [property s5] : Elem | +| C.cs:16:13:16:13 | [post] this access : C [field s1] : Elem | semmle.label | [post] this access : C [field s1] : Elem | +| C.cs:16:13:16:13 | [post] this access : C [field s1] : Elem | semmle.label | [post] this access : C [field s1] : Elem | +| C.cs:16:13:16:13 | [post] this access : C [field s2] : Elem | semmle.label | [post] this access : C [field s2] : Elem | +| C.cs:16:13:16:13 | [post] this access : C [field s2] : Elem | semmle.label | [post] this access : C [field s2] : Elem | +| C.cs:16:13:16:13 | [post] this access : C [property s5] : Elem | semmle.label | [post] this access : C [property s5] : Elem | +| C.cs:16:13:16:13 | [post] this access : C [property s5] : Elem | semmle.label | [post] this access : C [property s5] : Elem | | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | semmle.label | this [Return] : C [field s1] : Elem | | C.cs:16:13:16:13 | this [Return] : C [field s1] : Elem | semmle.label | this [Return] : C [field s1] : Elem | | C.cs:16:13:16:13 | this [Return] : C [field s2] : Elem | semmle.label | this [Return] : C [field s2] : Elem | diff --git a/csharp/ql/test/library-tests/dataflow/implicittostring/PrintAst.expected b/csharp/ql/test/library-tests/dataflow/implicittostring/PrintAst.expected index cd7658f6f5e..3500820e250 100644 --- a/csharp/ql/test/library-tests/dataflow/implicittostring/PrintAst.expected +++ b/csharp/ql/test/library-tests/dataflow/implicittostring/PrintAst.expected @@ -1,19 +1,19 @@ implicitToString.cs: # 3| [Class] TestClass -# 5| 5: [Class] MyClass -# 5| 4: [InstanceConstructor,PrimaryConstructor] MyClass -# 7| 5: [Method] ToString +# 5| 6: [Class] MyClass +# 5| 5: [InstanceConstructor,PrimaryConstructor] MyClass +# 7| 6: [Method] ToString # 7| -1: [TypeMention] string # 8| 4: [BlockStmt] {...} # 9| 0: [ReturnStmt] return ...; # 9| 0: [StringLiteralUtf16] "tainted" -# 13| 6: [Method] Sink +# 13| 7: [Method] Sink # 13| -1: [TypeMention] Void #-----| 2: (Parameters) # 13| 0: [Parameter] o # 13| -1: [TypeMention] object # 13| 4: [BlockStmt] {...} -# 15| 7: [Method] M1 +# 15| 8: [Method] M1 # 15| -1: [TypeMention] Void # 16| 4: [BlockStmt] {...} # 17| 0: [LocalVariableDeclStmt] ... ...; @@ -33,7 +33,7 @@ implicitToString.cs: # 19| 2: [ExprStmt] ...; # 19| 0: [MethodCall] call to method Sink # 19| 0: [LocalVariableAccess] access to local variable x2 -# 22| 8: [Method] M2 +# 22| 9: [Method] M2 # 22| -1: [TypeMention] Void # 23| 4: [BlockStmt] {...} # 24| 0: [LocalVariableDeclStmt] ... ...; @@ -53,7 +53,7 @@ implicitToString.cs: # 26| 2: [ExprStmt] ...; # 26| 0: [MethodCall] call to method Sink # 26| 0: [LocalVariableAccess] access to local variable x2 -# 29| 9: [Method] M3 +# 29| 10: [Method] M3 # 29| -1: [TypeMention] Void # 30| 4: [BlockStmt] {...} # 31| 0: [LocalVariableDeclStmt] ... ...; @@ -74,7 +74,7 @@ implicitToString.cs: # 33| 2: [ExprStmt] ...; # 33| 0: [MethodCall] call to method Sink # 33| 0: [LocalVariableAccess] access to local variable x2 -# 36| 10: [Method] M4 +# 36| 11: [Method] M4 # 36| -1: [TypeMention] Void # 37| 4: [BlockStmt] {...} # 38| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 6bf236135a2..861e4c519a8 100644 --- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,3 +1,4 @@ +| Capture.cs:3:14:3:20 | this | Capture.cs:3:14:3:20 | this access | | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | | Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | @@ -10,6 +11,11 @@ | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | | Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | | Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | +| LocalDataFlow.cs:13:25:13:35 | this | LocalDataFlow.cs:13:25:13:35 | this access | +| LocalDataFlow.cs:29:18:29:24 | this | LocalDataFlow.cs:29:18:29:24 | this access | +| LocalDataFlow.cs:37:25:37:45 | this | LocalDataFlow.cs:37:25:37:45 | this access | +| LocalDataFlow.cs:38:25:38:43 | this | LocalDataFlow.cs:38:25:38:43 | this access | +| LocalDataFlow.cs:46:14:46:26 | this | LocalDataFlow.cs:46:14:46:26 | this access | | LocalDataFlow.cs:48:24:48:24 | SSA param(b) | LocalDataFlow.cs:84:21:84:21 | access to parameter b | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:48:24:48:24 | SSA param(b) | | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | @@ -482,6 +488,7 @@ | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | +| LocalDataFlow.cs:328:18:328:29 | this | LocalDataFlow.cs:328:18:328:29 | this access | | LocalDataFlow.cs:334:28:334:30 | SSA entry def(this.anInt) | LocalDataFlow.cs:334:41:334:45 | access to field anInt | | LocalDataFlow.cs:334:28:334:30 | this | LocalDataFlow.cs:334:41:334:45 | this access | | LocalDataFlow.cs:334:50:334:52 | SSA param(value) | LocalDataFlow.cs:334:64:334:68 | access to parameter value | @@ -500,11 +507,11 @@ | LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:21 | ... = ... | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:29 | access to local variable os2 | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:34 | ... = ... | -| LocalDataFlow.cs:361:41:361:44 | SSA param(args) | LocalDataFlow.cs:363:29:363:32 | access to parameter args | +| LocalDataFlow.cs:361:41:361:44 | SSA param(args) | LocalDataFlow.cs:364:27:364:30 | access to parameter args | | LocalDataFlow.cs:361:41:361:44 | args | LocalDataFlow.cs:361:41:361:44 | SSA param(args) | -| LocalDataFlow.cs:363:29:363:32 | [post] access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | -| LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | -| LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | LocalDataFlow.cs:363:22:363:25 | access to local variable span | +| LocalDataFlow.cs:361:56:361:57 | SSA param(dt) | LocalDataFlow.cs:363:30:363:31 | access to parameter dt | +| LocalDataFlow.cs:361:56:361:57 | dt | LocalDataFlow.cs:361:56:361:57 | SSA param(dt) | +| LocalDataFlow.cs:363:30:363:31 | call to operator implicit conversion | LocalDataFlow.cs:363:24:363:26 | access to local variable dto | | LocalDataFlow.cs:364:27:364:30 | call to operator implicit conversion | LocalDataFlow.cs:364:23:364:23 | access to local variable x | | LocalDataFlow.cs:367:23:367:24 | SSA param(b1) | LocalDataFlow.cs:371:13:371:14 | access to parameter b1 | | LocalDataFlow.cs:367:23:367:24 | b1 | LocalDataFlow.cs:367:23:367:24 | SSA param(b1) | @@ -519,6 +526,7 @@ | LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x | | LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x | +| SSA.cs:3:14:3:16 | this | SSA.cs:3:14:3:16 | this access | | SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S | | SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access | | SSA.cs:5:26:5:32 | SSA param(tainted) | SSA.cs:8:24:8:30 | access to parameter tainted | @@ -917,6 +925,7 @@ | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | | SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | +| Splitting.cs:1:7:1:15 | this | Splitting.cs:1:7:1:15 | this access | | Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:6:13:6:13 | access to parameter b | | Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) | | Splitting.cs:3:28:3:34 | SSA param(tainted) | Splitting.cs:5:17:5:23 | access to parameter tainted | @@ -1001,6 +1010,7 @@ | Splitting.cs:57:17:57:17 | access to local variable y | Splitting.cs:58:27:58:27 | access to local variable y | | Splitting.cs:58:22:58:22 | SSA def(s) | Splitting.cs:59:19:59:19 | access to local variable s | | Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | SSA def(s) | +| UseUseExplosion.cs:1:7:1:7 | this | UseUseExplosion.cs:1:7:1:7 | this access | | UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop | | UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access | | UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | diff --git a/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs b/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs index 900a2161715..53b6165dd75 100644 --- a/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs +++ b/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs @@ -358,9 +358,9 @@ public class LocalDataFlow public static implicit operator LocalDataFlow(string[] args) => null; - public void ConversionFlow(string[] args) + public void ConversionFlow(string[] args, DateTime dt) { - Span span = args; // flow (library operator) + DateTimeOffset dto = dt; // flow (library operator) LocalDataFlow x = args; // no flow (source code operator) } diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected index 1e9e48f5456..b2d395d4b83 100644 --- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected @@ -1,3 +1,4 @@ +| Capture.cs:3:14:3:20 | this | Capture.cs:3:14:3:20 | this access | | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | | Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | @@ -10,6 +11,11 @@ | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | | Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | | Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | +| LocalDataFlow.cs:13:25:13:35 | this | LocalDataFlow.cs:13:25:13:35 | this access | +| LocalDataFlow.cs:29:18:29:24 | this | LocalDataFlow.cs:29:18:29:24 | this access | +| LocalDataFlow.cs:37:25:37:45 | this | LocalDataFlow.cs:37:25:37:45 | this access | +| LocalDataFlow.cs:38:25:38:43 | this | LocalDataFlow.cs:38:25:38:43 | this access | +| LocalDataFlow.cs:46:14:46:26 | this | LocalDataFlow.cs:46:14:46:26 | this access | | LocalDataFlow.cs:48:24:48:24 | SSA param(b) | LocalDataFlow.cs:84:21:84:21 | access to parameter b | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:48:24:48:24 | SSA param(b) | | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | @@ -593,6 +599,7 @@ | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | +| LocalDataFlow.cs:328:18:328:29 | this | LocalDataFlow.cs:328:18:328:29 | this access | | LocalDataFlow.cs:334:28:334:30 | SSA entry def(this.anInt) | LocalDataFlow.cs:334:41:334:45 | access to field anInt | | LocalDataFlow.cs:334:28:334:30 | this | LocalDataFlow.cs:334:41:334:45 | this access | | LocalDataFlow.cs:334:50:334:52 | SSA param(value) | LocalDataFlow.cs:334:64:334:68 | access to parameter value | @@ -611,12 +618,12 @@ | LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:21 | ... = ... | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:29 | access to local variable os2 | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:34 | ... = ... | -| LocalDataFlow.cs:361:41:361:44 | SSA param(args) | LocalDataFlow.cs:363:29:363:32 | access to parameter args | +| LocalDataFlow.cs:361:41:361:44 | SSA param(args) | LocalDataFlow.cs:364:27:364:30 | access to parameter args | | LocalDataFlow.cs:361:41:361:44 | args | LocalDataFlow.cs:361:41:361:44 | SSA param(args) | -| LocalDataFlow.cs:363:29:363:32 | [post] access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | -| LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | -| LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | -| LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | LocalDataFlow.cs:363:22:363:25 | access to local variable span | +| LocalDataFlow.cs:361:56:361:57 | SSA param(dt) | LocalDataFlow.cs:363:30:363:31 | access to parameter dt | +| LocalDataFlow.cs:361:56:361:57 | dt | LocalDataFlow.cs:361:56:361:57 | SSA param(dt) | +| LocalDataFlow.cs:363:30:363:31 | access to parameter dt | LocalDataFlow.cs:363:30:363:31 | call to operator implicit conversion | +| LocalDataFlow.cs:363:30:363:31 | call to operator implicit conversion | LocalDataFlow.cs:363:24:363:26 | access to local variable dto | | LocalDataFlow.cs:364:27:364:30 | call to operator implicit conversion | LocalDataFlow.cs:364:23:364:23 | access to local variable x | | LocalDataFlow.cs:367:23:367:24 | SSA param(b1) | LocalDataFlow.cs:371:13:371:14 | access to parameter b1 | | LocalDataFlow.cs:367:23:367:24 | b1 | LocalDataFlow.cs:367:23:367:24 | SSA param(b1) | @@ -631,6 +638,7 @@ | LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x | | LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x | +| SSA.cs:3:14:3:16 | this | SSA.cs:3:14:3:16 | this access | | SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S | | SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access | | SSA.cs:5:26:5:32 | SSA param(tainted) | SSA.cs:8:24:8:30 | access to parameter tainted | @@ -1047,6 +1055,7 @@ | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | | SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | +| Splitting.cs:1:7:1:15 | this | Splitting.cs:1:7:1:15 | this access | | Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:6:13:6:13 | access to parameter b | | Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) | | Splitting.cs:3:28:3:34 | SSA param(tainted) | Splitting.cs:5:17:5:23 | access to parameter tainted | @@ -1143,6 +1152,7 @@ | Splitting.cs:58:22:58:22 | SSA def(s) | Splitting.cs:59:19:59:19 | access to local variable s | | Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | SSA def(s) | | Splitting.cs:58:27:58:27 | access to local variable y | Splitting.cs:58:22:58:22 | SSA def(s) | +| UseUseExplosion.cs:1:7:1:7 | this | UseUseExplosion.cs:1:7:1:7 | this access | | UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop | | UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access | | UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/PreSsaConsistency.expected b/csharp/ql/test/library-tests/dataflow/ssa/PreSsaConsistency.expected deleted file mode 100644 index 4fa64b47674..00000000000 --- a/csharp/ql/test/library-tests/dataflow/ssa/PreSsaConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -defReadInconsistency -readReadInconsistency -phiInconsistency diff --git a/csharp/ql/test/library-tests/dataflow/ssa/PreSsaConsistency.ql b/csharp/ql/test/library-tests/dataflow/ssa/PreSsaConsistency.ql deleted file mode 100644 index de7357d14b6..00000000000 --- a/csharp/ql/test/library-tests/dataflow/ssa/PreSsaConsistency.ql +++ /dev/null @@ -1,99 +0,0 @@ -import csharp -import semmle.code.csharp.controlflow.internal.PreSsa -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl -import semmle.code.csharp.dataflow.internal.SsaImpl as SsaImpl - -class CallableWithSplitting extends Callable { - CallableWithSplitting() { this = any(SplitAstNode n).getEnclosingCallable() } -} - -query predicate defReadInconsistency( - AssignableRead ar, Expr e, PreSsa::SsaInput::SourceVariable v, boolean b -) { - // Exclude definitions in callables with CFG splitting, as SSA definitions may be - // very different from pre-SSA definitions - not ar.getEnclosingCallable() instanceof CallableWithSplitting and - exists(AssignableDefinition def | e = def.getExpr() | - b = true and - exists(PreSsa::Definition ssaDef | ssaDef.getSourceVariable() = v | - ar = ssaDef.getAFirstRead() and - ssaDef.getDefinition() = def and - not exists(Ssa::ExplicitDefinition edef | - edef.getADefinition() = def and - edef.getAFirstRead() = ar - ) - ) - or - b = false and - exists(Ssa::ExplicitDefinition edef | - edef.getADefinition() = def and - edef.getAFirstRead() = ar and - def.getTarget() = v and - not exists(PreSsa::Definition ssaDef | - ar = ssaDef.getAFirstRead() and - ssaDef.getDefinition() = def - ) - ) - ) -} - -query predicate readReadInconsistency( - LocalScopeVariableRead read1, LocalScopeVariableRead read2, PreSsa::SsaInput::SourceVariable v, - boolean b -) { - // Exclude definitions in callables with CFG splitting, as SSA definitions may be - // very different from pre-SSA definitions - not read1.getEnclosingCallable() instanceof CallableWithSplitting and - ( - b = true and - v = read1.getTarget() and - PreSsa::adjacentReadPairSameVar(read1, read2) and - not SsaImpl::adjacentReadPairSameVar(_, read1.getAControlFlowNode(), read2.getAControlFlowNode()) - or - b = false and - v = read1.getTarget() and - SsaImpl::adjacentReadPairSameVar(_, read1.getAControlFlowNode(), read2.getAControlFlowNode()) and - read1.getTarget() instanceof PreSsa::SsaInput::SourceVariable and - not PreSsa::adjacentReadPairSameVar(read1, read2) and - // Exclude split CFG elements because SSA may be more precise than pre-SSA - // in those cases - not read1 instanceof SplitAstNode and - not read2 instanceof SplitAstNode - ) -} - -query predicate phiInconsistency( - ControlFlowElement cfe, Expr e, PreSsa::SsaInput::SourceVariable v, boolean b -) { - // Exclude definitions in callables with CFG splitting, as SSA definitions may be - // very different from pre-SSA definitions - not cfe.getEnclosingCallable() instanceof CallableWithSplitting and - exists(AssignableDefinition adef | e = adef.getExpr() | - b = true and - exists(PreSsa::PhiNode prePhi | v = prePhi.getSourceVariable() | - adef = prePhi.getAnInput+().getDefinition() and - cfe = prePhi.getBasicBlock().getFirstElement() and - not exists(Ssa::PhiNode phi, ControlFlow::BasicBlock bb, Ssa::ExplicitDefinition edef | - edef = phi.getAnUltimateDefinition() - | - edef.getADefinition() = adef and - phi.definesAt(_, bb, _) and - cfe = bb.getFirstNode().getAstNode() - ) - ) - or - b = false and - exists(Ssa::PhiNode phi, ControlFlow::BasicBlock bb, Ssa::ExplicitDefinition edef | - v = phi.getSourceVariable().getAssignable() - | - edef = phi.getAnUltimateDefinition() and - edef.getADefinition() = adef and - phi.definesAt(_, bb, _) and - cfe = bb.getFirstNode().getAstNode() and - not exists(PreSsa::PhiNode prePhi | - adef = prePhi.getAnInput+().getDefinition() and - cfe = prePhi.getBasicBlock().getFirstElement() - ) - ) - ) -} diff --git a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected index 73b0a757b5a..583bae92d93 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected @@ -1,3 +1,4 @@ +| Tuples.cs:3:7:3:12 | this | Tuples.cs:3:7:3:12 | this access | | Tuples.cs:7:13:7:14 | access to local variable o1 | Tuples.cs:7:13:7:34 | SSA def(o1) | | Tuples.cs:7:13:7:34 | SSA def(o1) | Tuples.cs:10:21:10:22 | access to local variable o1 | | Tuples.cs:7:18:7:34 | call to method Source | Tuples.cs:7:13:7:14 | access to local variable o1 | @@ -168,9 +169,12 @@ | Tuples.cs:87:30:87:30 | SSA def(r) | Tuples.cs:90:18:90:18 | access to local variable r | | Tuples.cs:87:30:87:30 | String r | Tuples.cs:87:30:87:30 | SSA def(r) | | Tuples.cs:91:18:91:18 | access to local variable q | Tuples.cs:91:18:91:18 | (...) ... | +| Tuples.cs:95:12:95:13 | this | Tuples.cs:95:12:95:13 | this access | | Tuples.cs:95:12:95:13 | this | Tuples.cs:95:22:95:22 | this | | Tuples.cs:95:22:95:22 | [post] this | Tuples.cs:95:29:95:29 | this | | Tuples.cs:95:22:95:22 | this | Tuples.cs:95:29:95:29 | this | +| Tuples.cs:95:29:95:29 | [post] this | Tuples.cs:95:12:95:13 | this access | +| Tuples.cs:95:29:95:29 | this | Tuples.cs:95:12:95:13 | this access | | Tuples.cs:99:13:99:13 | access to local variable o | Tuples.cs:99:13:99:33 | SSA def(o) | | Tuples.cs:99:13:99:33 | SSA def(o) | Tuples.cs:100:24:100:24 | access to local variable o | | Tuples.cs:99:17:99:33 | call to method Source | Tuples.cs:99:13:99:13 | access to local variable o | @@ -225,3 +229,4 @@ | Tuples.cs:133:24:133:29 | (..., ...) | Tuples.cs:133:9:133:20 | (..., ...) | | Tuples.cs:133:25:133:25 | 1 | Tuples.cs:133:9:133:29 | ... = ... | | Tuples.cs:133:28:133:28 | access to local variable o | Tuples.cs:133:18:133:19 | access to local variable y4 | +| Tuples.cs:144:18:144:31 | this | Tuples.cs:144:18:144:31 | this access | diff --git a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected index 7cbddb9d3d5..11e14eeb6c5 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected @@ -1,6 +1,6 @@ Tuples.cs: # 3| [Class] Tuples -# 5| 5: [Method] M1 +# 5| 6: [Method] M1 # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; @@ -99,7 +99,7 @@ Tuples.cs: # 29| 0: [FieldAccess] access to field Item2 # 29| -1: [FieldAccess] access to field Item2 # 29| -1: [LocalVariableAccess] access to local variable x -# 32| 6: [Method] M2 +# 32| 7: [Method] M2 # 32| -1: [TypeMention] Void # 33| 4: [BlockStmt] {...} # 34| 0: [LocalVariableDeclStmt] ... ...; @@ -144,7 +144,7 @@ Tuples.cs: # 40| 0: [MethodCall] call to method Sink # 40| 0: [FieldAccess] access to field Item10 # 40| -1: [LocalVariableAccess] access to local variable x -# 43| 7: [Method] M3 +# 43| 8: [Method] M3 # 43| -1: [TypeMention] Void # 44| 4: [BlockStmt] {...} # 45| 0: [LocalVariableDeclStmt] ... ...; @@ -201,7 +201,7 @@ Tuples.cs: # 52| 0: [CastExpr] (...) ... # 52| 1: [FieldAccess] access to field Item2 # 52| -1: [LocalVariableAccess] access to local variable y -# 55| 8: [Method] M4 +# 55| 9: [Method] M4 # 55| -1: [TypeMention] Void #-----| 2: (Parameters) # 55| 0: [Parameter] s @@ -352,34 +352,34 @@ Tuples.cs: # 91| 0: [MethodCall] call to method Sink # 91| 0: [CastExpr] (...) ... # 91| 1: [LocalVariableAccess] access to local variable q -# 95| 9: [RecordClass] R1 -# 95| 12: [NEOperator] != +# 95| 10: [RecordClass] R1 +# 95| 13: [NEOperator] != #-----| 2: (Parameters) # 95| 0: [Parameter] left # 95| 1: [Parameter] right -# 95| 13: [EQOperator] == +# 95| 14: [EQOperator] == #-----| 2: (Parameters) # 95| 0: [Parameter] left # 95| 1: [Parameter] right -# 95| 14: [Property] EqualityContract +# 95| 15: [Property] EqualityContract # 95| 3: [Getter] get_EqualityContract -# 95| 15: [InstanceConstructor,PrimaryConstructor] R1 +# 95| 16: [InstanceConstructor,PrimaryConstructor] R1 #-----| 2: (Parameters) # 95| 0: [Parameter] i # 95| -1: [TypeMention] string # 95| 1: [Parameter] j # 95| -1: [TypeMention] int -# 95| 16: [Property] i +# 95| 17: [Property] i # 95| 3: [Getter] get_i # 95| 4: [Setter] set_i #-----| 2: (Parameters) # 95| 0: [Parameter] value -# 95| 17: [Property] j +# 95| 18: [Property] j # 95| 3: [Getter] get_j # 95| 4: [Setter] set_j #-----| 2: (Parameters) # 95| 0: [Parameter] value -# 97| 10: [Method] M5 +# 97| 11: [Method] M5 # 97| -1: [TypeMention] Void # 98| 4: [BlockStmt] {...} # 99| 0: [LocalVariableDeclStmt] ... ...; @@ -428,7 +428,7 @@ Tuples.cs: # 111| 0: [CastExpr] (...) ... # 111| 1: [LocalVariableAccess] access to local variable y # 112| 3: [BreakStmt] break; -# 116| 11: [Method] M6 +# 116| 12: [Method] M6 # 116| -1: [TypeMention] Void # 117| 4: [BlockStmt] {...} # 118| 0: [LocalVariableDeclStmt] ... ...; @@ -504,13 +504,13 @@ Tuples.cs: # 134| 12: [ExprStmt] ...; # 134| 0: [MethodCall] call to method Sink # 134| 0: [LocalVariableAccess] access to local variable y4 -# 137| 12: [Method] Sink +# 137| 13: [Method] Sink # 137| -1: [TypeMention] Void #-----| 2: (Parameters) # 137| 0: [Parameter] o # 137| -1: [TypeMention] object # 137| 4: [BlockStmt] {...} -# 139| 15: [Method] Source`1 +# 139| 16: [Method] Source`1 # 139| -1: [TypeMention] T #-----| 1: (Type parameters) # 139| 0: [TypeParameter] T diff --git a/csharp/ql/test/library-tests/definitions/PrintAst.expected b/csharp/ql/test/library-tests/definitions/PrintAst.expected index 9b5606d30f5..28196c75a85 100644 --- a/csharp/ql/test/library-tests/definitions/PrintAst.expected +++ b/csharp/ql/test/library-tests/definitions/PrintAst.expected @@ -17,15 +17,15 @@ definitions.cs: # 15| 1: [IntLiteral] 2 # 15| 7: [Field] e3 # 18| 3: [Class] C1 -# 20| 4: [InstanceConstructor] C1 +# 20| 5: [InstanceConstructor] C1 #-----| 2: (Parameters) # 20| 0: [Parameter] args # 20| -1: [TypeMention] Int32[] # 20| 1: [TypeMention] int # 20| 4: [BlockStmt] {...} -# 22| 5: [Field] field1 +# 22| 6: [Field] field1 # 22| -1: [TypeMention] int -# 24| 6: [Property] property1 +# 24| 7: [Property] property1 # 24| -1: [TypeMention] int # 26| 3: [Getter] get_property1 # 26| 4: [BlockStmt] {...} @@ -39,7 +39,7 @@ definitions.cs: # 27| 0: [AssignExpr] ... = ... # 27| 0: [FieldAccess] access to field field1 # 27| 1: [ParameterAccess] access to parameter value -# 30| 7: [Method] f1 +# 30| 8: [Method] f1 # 30| -1: [TypeMention] Void #-----| 2: (Parameters) # 30| 0: [Parameter] args @@ -157,7 +157,7 @@ definitions.cs: # 67| 0: [LocalVariableAccess] access to local variable m1 # 67| 1: [ImplicitDelegateCreation] delegate creation of type Action # 67| 0: [MethodAccess] access to method GenericFn -# 70| 8: [Method] VariableTypeUse +# 70| 9: [Method] VariableTypeUse # 70| -1: [TypeMention] Void #-----| 2: (Parameters) # 70| 0: [Parameter] c1 @@ -168,7 +168,7 @@ definitions.cs: # 72| -1: [TypeMention] C1 # 72| 0: [LocalVariableAccess] access to local variable c2 # 72| 1: [NullLiteral] null -# 75| 10: [Method] GenericFn`1 +# 75| 11: [Method] GenericFn`1 # 75| -1: [TypeMention] Void #-----| 1: (Type parameters) # 75| 0: [TypeParameter] T @@ -177,7 +177,7 @@ definitions.cs: # 75| -1: [TypeMention] T # 75| 4: [BlockStmt] {...} # 78| 4: [Struct] S1 -# 80| 5: [Method] M +# 80| 6: [Method] M # 80| -1: [TypeMention] S1 #-----| 2: (Parameters) # 80| 0: [Parameter] ss @@ -216,8 +216,8 @@ definitions.cs: # 93| 0: [ObjectCreation] object creation of type S1 # 93| 0: [TypeMention] S1 # 97| 5: [Class] A -# 99| 5: [DelegateType] EventHandler -# 101| 6: [Event] Click +# 99| 6: [DelegateType] EventHandler +# 101| 7: [Event] Click # 101| -1: [TypeMention] EventHandler # 101| 3: [AddEventAccessor] add_Click #-----| 2: (Parameters) @@ -225,7 +225,7 @@ definitions.cs: # 101| 4: [RemoveEventAccessor] remove_Click #-----| 2: (Parameters) # 101| 0: [Parameter] value -# 103| 7: [Method] M +# 103| 8: [Method] M # 103| -1: [TypeMention] Void # 104| 4: [BlockStmt] {...} # 105| 0: [ExprStmt] ...; @@ -265,24 +265,24 @@ definitions.cs: # 121| 1: [TypeMention] I1 # 121| 2: [TypeMention] I2 # 121| 1: [TypeMention] A -# 123| 5: [Method] M +# 123| 6: [Method] M # 123| -1: [TypeMention] Void # 124| 4: [BlockStmt] {...} # 125| 0: [ExprStmt] ...; # 125| 0: [MethodCall] call to method M # 125| -1: [BaseAccess] base access -# 128| 6: [Method] M2`1 +# 128| 7: [Method] M2`1 # 128| -1: [TypeMention] I1 # 128| -1: [TypeMention] Void #-----| 1: (Type parameters) # 128| 0: [TypeParameter] T # 128| 4: [BlockStmt] {...} -# 130| 7: [Struct] S`1 +# 130| 8: [Struct] S`1 #-----| 1: (Type parameters) # 130| 0: [TypeParameter] T2 #-----| 3: (Base types) # 130| 1: [TypeMention] I3 -# 132| 8: [Method] Tuple +# 132| 9: [Method] Tuple # 132| -1: [TypeMention] (I1, B) # 132| 1: [TypeMention] I1 # 132| 2: [TypeMention] B @@ -290,7 +290,7 @@ definitions.cs: # 132| 4: [ThrowExpr] throw ... # 132| 0: [ObjectCreation] object creation of type Exception # 132| 0: [TypeMention] Exception -# 134| 9: [Indexer] Item +# 134| 10: [Indexer] Item # 134| -1: [TypeMention] B # 134| 1: [TypeMention] A #-----| 1: (Parameters) @@ -306,8 +306,8 @@ definitions.cs: # 134| 0: [TypeMention] B # 134| 1: [TypeMention] A # 137| 10: [Class] C -# 139| 5: [Enum] E -# 140| 6: [Method] Pointer +# 139| 6: [Enum] E +# 140| 7: [Method] Pointer # 140| -1: [TypeMention] E* # 140| 1: [TypeMention] E # 140| 4: [ThrowExpr] throw ... @@ -345,7 +345,7 @@ definitions.cs: # 151| 12: [Class] C4 #-----| 3: (Base types) # 151| 1: [TypeMention] I4 -# 153| 5: [Event] EH +# 153| 6: [Event] EH # 153| -1: [TypeMention] I4 # 153| 3: [AddEventAccessor] add_EH #-----| 2: (Parameters) @@ -355,20 +355,20 @@ definitions.cs: #-----| 2: (Parameters) # 153| 0: [Parameter] value # 153| 4: [BlockStmt] {...} -# 154| 6: [Method] M +# 154| 7: [Method] M # 154| -1: [TypeMention] I4 # 154| -1: [TypeMention] A # 154| 4: [ThrowExpr] throw ... # 154| 0: [ObjectCreation] object creation of type Exception # 154| 0: [TypeMention] Exception -# 155| 7: [Property] P +# 155| 8: [Property] P # 155| -1: [TypeMention] I4 # 155| -1: [TypeMention] I3 # 155| 3: [Getter] get_P # 155| 4: [ThrowExpr] throw ... # 155| 0: [ObjectCreation] object creation of type Exception # 155| 0: [TypeMention] Exception -# 156| 8: [Indexer] Item +# 156| 9: [Indexer] Item # 156| -1: [TypeMention] I4 # 156| -1: [TypeMention] S1 #-----| 1: (Parameters) @@ -385,10 +385,10 @@ definitions.cs: # 156| 0: [TypeMention] S1 # 156| 1: [ObjectCreation] object creation of type S1 # 156| 0: [TypeMention] S1 -# 158| 10: [Class] Nested`1 +# 158| 11: [Class] Nested`1 #-----| 1: (Type parameters) # 158| 0: [TypeParameter] T -# 160| 5: [Method] Create +# 160| 6: [Method] Create # 160| -1: [TypeMention] Nested # 160| 1: [TypeMention] T # 160| 4: [BlockStmt] {...} @@ -397,7 +397,7 @@ definitions.cs: # 160| 0: [TypeMention] Nested # 160| 1: [TypeMention] T # 164| 13: [Class] C5 -# 166| 5: [Field] f +# 166| 6: [Field] f # 166| -1: [TypeMention] Nested # 166| 1: [TypeMention] C4 # 166| 2: [TypeMention] I4 @@ -407,9 +407,9 @@ definitions.cs: # 166| 1: [TypeMention] I4 # 166| -1: [TypeAccess] access to type C4 # 166| 0: [TypeMention] C4 -# 167| 6: [Field] c1 +# 167| 7: [Field] c1 # 167| -1: [TypeMention] C1 -# 169| 7: [Method] M +# 169| 8: [Method] M # 169| -1: [TypeMention] Void # 170| 4: [BlockStmt] {...} # 171| 0: [LocalVariableDeclStmt] ... ...; @@ -450,7 +450,7 @@ definitions.cs: # 175| 1: [TypeMention] C4 # 175| 2: [TypeMention] I4 # 179| 14: [Class] C6 -# 181| 5: [ExplicitConversionOperator] explicit conversion +# 181| 6: [ExplicitConversionOperator] explicit conversion # 181| -1: [TypeMention] C5 #-----| 2: (Parameters) # 181| 0: [Parameter] c @@ -461,14 +461,14 @@ definitions.cs: # 182| 4: [BlockStmt] {...} # 183| 0: [ReturnStmt] return ...; # 183| 0: [NullLiteral] null -# 186| 6: [Method] M +# 186| 7: [Method] M # 186| -1: [TypeMention] C5 # 187| 4: [BlockStmt] {...} # 188| 0: [ReturnStmt] return ...; # 188| 0: [OperatorCall] call to operator explicit conversion # 188| -1: [TypeMention] C5 # 188| 0: [ThisAccess] this access -# 191| 7: [AddOperator] + +# 191| 8: [AddOperator] + # 191| -1: [TypeMention] C6 #-----| 2: (Parameters) # 191| 0: [Parameter] x @@ -480,10 +480,10 @@ definitions.cs: #-----| 3: (Base types) # 194| 0: [TypeMention] Attribute # 196| 16: [Class] C7 -# 198| 5: [Method] M +# 198| 6: [Method] M # 198| -1: [TypeMention] Void # 198| 4: [BlockStmt] {...} -# 200| 6: [Method] M2 +# 200| 7: [Method] M2 # 200| -1: [TypeMention] Void # 201| 4: [BlockStmt] {...} # 202| 0: [ExprStmt] ...; @@ -491,7 +491,7 @@ definitions.cs: # 202| -1: [TypeAccess] access to type C7 # 202| 0: [TypeMention] C7 # 206| 17: [Class] C8 -# 208| 5: [Method] F +# 208| 6: [Method] F # 208| -1: [TypeMention] Void # 209| 4: [BlockStmt] {...} # 210| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/delegates/PrintAst.expected b/csharp/ql/test/library-tests/delegates/PrintAst.expected index fee97ca9daf..86a5f9c241e 100644 --- a/csharp/ql/test/library-tests/delegates/PrintAst.expected +++ b/csharp/ql/test/library-tests/delegates/PrintAst.expected @@ -16,7 +16,7 @@ delegates.cs: # 9| 1: [Parameter] d # 9| -1: [TypeMention] double # 11| 3: [Class] A -# 14| 5: [Method] M1 +# 14| 6: [Method] M1 # 14| -1: [TypeMention] int #-----| 2: (Parameters) # 14| 0: [Parameter] a @@ -33,13 +33,13 @@ delegates.cs: # 14| 1: [ParameterAccess] access to parameter a # 14| 1: [ParameterAccess] access to parameter b # 18| 4: [Class] B -# 21| 5: [DelegateType] D2 +# 21| 6: [DelegateType] D2 #-----| 2: (Parameters) # 21| 0: [Parameter] c # 21| -1: [TypeMention] int # 21| 1: [Parameter] d # 21| -1: [TypeMention] double -# 23| 6: [Method] M1 +# 23| 7: [Method] M1 # 23| -1: [TypeMention] int #-----| 2: (Parameters) # 23| 0: [Parameter] f @@ -54,7 +54,7 @@ delegates.cs: # 23| 0: [TypeAccess] access to type Int32 # 23| 0: [TypeMention] int # 23| 1: [ParameterAccess] access to parameter g -# 25| 7: [Method] M2 +# 25| 8: [Method] M2 # 25| -1: [TypeMention] Void #-----| 2: (Parameters) # 25| 0: [Parameter] k @@ -62,7 +62,7 @@ delegates.cs: # 25| 1: [Parameter] l # 25| -1: [TypeMention] double # 25| 4: [BlockStmt] {...} -# 27| 8: [Method] M3 +# 27| 9: [Method] M3 # 27| -1: [TypeMention] int #-----| 2: (Parameters) # 27| 0: [Parameter] g @@ -74,7 +74,7 @@ delegates.cs: # 27| 0: [ParameterAccess] access to parameter g # 27| 1: [UnaryPlusExpr] +... # 27| 0: [ParameterAccess] access to parameter g -# 29| 9: [Method] M4 +# 29| 10: [Method] M4 # 29| -1: [TypeMention] Void #-----| 2: (Parameters) # 29| 0: [Parameter] g @@ -87,7 +87,7 @@ delegates.cs: # 33| 0: [Parameter] value # 33| -1: [TypeMention] T # 35| 6: [Class] X -# 38| 5: [Method] F +# 38| 6: [Method] F # 38| -1: [TypeMention] bool #-----| 2: (Parameters) # 38| 0: [Parameter] i @@ -97,7 +97,7 @@ delegates.cs: # 38| 0: [LTExpr] ... < ... # 38| 0: [ParameterAccess] access to parameter i # 38| 1: [IntLiteral] 2 -# 40| 6: [Method] G +# 40| 7: [Method] G # 40| -1: [TypeMention] bool #-----| 2: (Parameters) # 40| 0: [Parameter] s @@ -110,26 +110,26 @@ delegates.cs: # 44| 0: [Parameter] x # 44| -1: [TypeMention] int # 46| 8: [Class] C -# 49| 5: [Method] M1 +# 49| 6: [Method] M1 # 49| -1: [TypeMention] Void #-----| 2: (Parameters) # 49| 0: [Parameter] i # 49| -1: [TypeMention] int # 49| 4: [BlockStmt] {...} -# 50| 6: [Method] M2 +# 50| 7: [Method] M2 # 50| -1: [TypeMention] Void #-----| 2: (Parameters) # 50| 0: [Parameter] i # 50| -1: [TypeMention] int # 50| 4: [BlockStmt] {...} -# 51| 7: [Method] M3 +# 51| 8: [Method] M3 # 51| -1: [TypeMention] Void #-----| 2: (Parameters) # 51| 0: [Parameter] i # 51| -1: [TypeMention] int # 51| 4: [BlockStmt] {...} # 55| 9: [Class] Test -# 58| 5: [Method] Main +# 58| 6: [Method] Main # 58| -1: [TypeMention] Void # 59| 4: [BlockStmt] {...} # 60| 0: [LocalVariableDeclStmt] ... ...; @@ -250,25 +250,25 @@ delegates.cs: # 81| 0: [LocalVariableDeclExpr] ContextCallback d # 81| 0: [TypeMention] ContextCallback # 86| 10: [Class] E -# 88| 5: [Field] Field +# 88| 6: [Field] Field # 88| -1: [TypeMention] Action # 88| 1: [TypeMention] int -# 89| 6: [Property] Property +# 89| 7: [Property] Property # 89| -1: [TypeMention] Action # 89| 1: [TypeMention] int # 89| 3: [Getter] get_Property # 89| 4: [Setter] set_Property #-----| 2: (Parameters) # 89| 0: [Parameter] value -# 90| 7: [Field] FieldPtr +# 90| 8: [Field] FieldPtr # 90| -1: [TypeMention] delegate* default -# 91| 8: [Property] PropertyPtr +# 91| 9: [Property] PropertyPtr # 91| -1: [TypeMention] delegate* default # 91| 3: [Getter] get_PropertyPtr # 91| 4: [Setter] set_PropertyPtr #-----| 2: (Parameters) # 91| 0: [Parameter] value -# 93| 9: [Method] M +# 93| 10: [Method] M # 93| -1: [TypeMention] Void # 94| 4: [BlockStmt] {...} # 95| 0: [ExprStmt] ...; diff --git a/csharp/ql/test/library-tests/dynamic/PrintAst.expected b/csharp/ql/test/library-tests/dynamic/PrintAst.expected index 160242e47f7..3bde4d42d86 100644 --- a/csharp/ql/test/library-tests/dynamic/PrintAst.expected +++ b/csharp/ql/test/library-tests/dynamic/PrintAst.expected @@ -1,11 +1,11 @@ dynamic.cs: # 4| [Class] DynamicTest -# 6| 4: [InstanceConstructor] DynamicTest +# 6| 5: [InstanceConstructor] DynamicTest #-----| 2: (Parameters) # 6| 0: [Parameter] x # 6| -1: [TypeMention] int # 6| 4: [BlockStmt] {...} -# 8| 5: [Method] Main +# 8| 6: [Method] Main # 8| -1: [TypeMention] Void #-----| 2: (Parameters) # 8| 0: [Parameter] args @@ -235,25 +235,25 @@ dynamic.cs: # 75| 0: [DelegateCall] delegate call # 75| -1: [LocalVariableAccess] access to local variable d # 75| 0: [IntLiteral] 42 -# 78| 6: [Method] Foo +# 78| 7: [Method] Foo # 78| -1: [TypeMention] Void #-----| 2: (Parameters) # 78| 0: [Parameter] x # 78| -1: [TypeMention] int # 78| 4: [BlockStmt] {...} -# 79| 7: [Method] Foo +# 79| 8: [Method] Foo # 79| -1: [TypeMention] Void #-----| 2: (Parameters) # 79| 0: [Parameter] x # 79| -1: [TypeMention] string # 79| 4: [BlockStmt] {...} -# 81| 8: [Method] Bar +# 81| 9: [Method] Bar # 81| -1: [TypeMention] Void #-----| 2: (Parameters) # 81| 0: [Parameter] x # 81| -1: [TypeMention] string # 81| 4: [BlockStmt] {...} -# 83| 9: [IncrementOperator] ++ +# 83| 10: [IncrementOperator] ++ # 83| -1: [TypeMention] DynamicTest #-----| 2: (Parameters) # 83| 0: [Parameter] dt @@ -261,15 +261,15 @@ dynamic.cs: # 84| 4: [BlockStmt] {...} # 85| 0: [ReturnStmt] return ...; # 85| 0: [ParameterAccess] access to parameter dt -# 88| 10: [Field] Field +# 88| 11: [Field] Field # 88| -1: [TypeMention] int -# 90| 11: [Property] Prop +# 90| 12: [Property] Prop # 90| -1: [TypeMention] int # 90| 3: [Getter] get_Prop # 90| 4: [Setter] set_Prop #-----| 2: (Parameters) # 90| 0: [Parameter] value -# 92| 12: [Indexer] Item +# 92| 13: [Indexer] Item # 92| -1: [TypeMention] int #-----| 1: (Parameters) # 92| 0: [Parameter] x diff --git a/csharp/ql/test/library-tests/enums/PrintAst.expected b/csharp/ql/test/library-tests/enums/PrintAst.expected index bb9e5a3a9c9..3495c43a493 100644 --- a/csharp/ql/test/library-tests/enums/PrintAst.expected +++ b/csharp/ql/test/library-tests/enums/PrintAst.expected @@ -31,7 +31,7 @@ enums.cs: # 40| 1: [CastExpr] (...) ... # 40| 1: [MemberConstantAccess] access to constant Red # 44| 6: [Class] Test -# 47| 5: [Method] Main +# 47| 6: [Method] Main # 47| -1: [TypeMention] Void # 48| 4: [BlockStmt] {...} # 49| 0: [ExprStmt] ...; @@ -58,7 +58,7 @@ enums.cs: # 51| 0: [MemberConstantAccess] access to constant Blue # 51| -1: [TypeAccess] access to type SparseColor # 51| 0: [TypeMention] SparseColor -# 54| 6: [Method] StringFromColor +# 54| 7: [Method] StringFromColor # 54| -1: [TypeMention] string #-----| 2: (Parameters) # 54| 0: [Parameter] c diff --git a/csharp/ql/test/library-tests/events/PrintAst.expected b/csharp/ql/test/library-tests/events/PrintAst.expected index 84825067e42..4767ea99084 100644 --- a/csharp/ql/test/library-tests/events/PrintAst.expected +++ b/csharp/ql/test/library-tests/events/PrintAst.expected @@ -7,7 +7,7 @@ events.cs: # 7| 1: [Parameter] e # 7| -1: [TypeMention] object # 9| 2: [Class] Button -# 12| 5: [Event] Click +# 12| 6: [Event] Click # 12| -1: [TypeMention] EventHandler # 12| 3: [AddEventAccessor] add_Click #-----| 2: (Parameters) @@ -15,7 +15,7 @@ events.cs: # 12| 4: [RemoveEventAccessor] remove_Click #-----| 2: (Parameters) # 12| 0: [Parameter] value -# 14| 6: [Method] OnClick +# 14| 7: [Method] OnClick # 14| -1: [TypeMention] Void #-----| 2: (Parameters) # 14| 0: [Parameter] e @@ -30,7 +30,7 @@ events.cs: # 17| -1: [EventAccess,EventCall] access to event Click # 17| 0: [ThisAccess] this access # 17| 1: [ParameterAccess] access to parameter e -# 20| 7: [Method] Reset +# 20| 8: [Method] Reset # 20| -1: [TypeMention] Void # 21| 4: [BlockStmt] {...} # 22| 0: [ExprStmt] ...; @@ -38,11 +38,11 @@ events.cs: # 22| 0: [EventAccess,EventCall] access to event Click # 22| 1: [NullLiteral] null # 26| 3: [Class] LoginDialog -# 29| 4: [Field] OkButton +# 29| 5: [Field] OkButton # 29| -1: [TypeMention] Button -# 30| 5: [Field] CancelButton +# 30| 6: [Field] CancelButton # 30| -1: [TypeMention] Button -# 32| 6: [InstanceConstructor] LoginDialog +# 32| 7: [InstanceConstructor] LoginDialog # 33| 4: [BlockStmt] {...} # 34| 0: [ExprStmt] ...; # 34| 0: [AssignExpr] ... = ... @@ -68,7 +68,7 @@ events.cs: # 37| 1: [ExplicitDelegateCreation] delegate creation of type EventHandler # 37| -1: [TypeMention] EventHandler # 37| 0: [MethodAccess] access to method CancelButtonClick -# 40| 7: [Method] OkButtonClick +# 40| 8: [Method] OkButtonClick # 40| -1: [TypeMention] Void #-----| 2: (Parameters) # 40| 0: [Parameter] sender @@ -76,7 +76,7 @@ events.cs: # 40| 1: [Parameter] e # 40| -1: [TypeMention] object # 41| 4: [BlockStmt] {...} -# 44| 8: [Method] CancelButtonClick +# 44| 9: [Method] CancelButtonClick # 44| -1: [TypeMention] Void #-----| 2: (Parameters) # 44| 0: [Parameter] sender @@ -85,15 +85,15 @@ events.cs: # 44| -1: [TypeMention] object # 45| 4: [BlockStmt] {...} # 50| 4: [Class] Control -# 53| 6: [Field] mouseDownEventKey +# 53| 7: [Field] mouseDownEventKey # 53| -1: [TypeMention] object # 53| 1: [ObjectCreation] object creation of type Object # 53| 0: [TypeMention] object -# 54| 7: [Field] mouseUpEventKey +# 54| 8: [Field] mouseUpEventKey # 54| -1: [TypeMention] object # 54| 1: [ObjectCreation] object creation of type Object # 54| 0: [TypeMention] object -# 57| 8: [Method] GetEventHandler +# 57| 9: [Method] GetEventHandler # 57| -1: [TypeMention] Delegate #-----| 2: (Parameters) # 57| 0: [Parameter] key @@ -101,7 +101,7 @@ events.cs: # 57| 4: [BlockStmt] {...} # 57| 0: [ReturnStmt] return ...; # 57| 0: [NullLiteral] null -# 60| 9: [Method] AddEventHandler +# 60| 10: [Method] AddEventHandler # 60| -1: [TypeMention] Void #-----| 2: (Parameters) # 60| 0: [Parameter] key @@ -109,7 +109,7 @@ events.cs: # 60| 1: [Parameter] handler # 60| -1: [TypeMention] Delegate # 60| 4: [BlockStmt] {...} -# 63| 10: [Method] RemoveEventHandler +# 63| 11: [Method] RemoveEventHandler # 63| -1: [TypeMention] Void #-----| 2: (Parameters) # 63| 0: [Parameter] key @@ -117,7 +117,7 @@ events.cs: # 63| 1: [Parameter] handler # 63| -1: [TypeMention] Delegate # 63| 4: [BlockStmt] {...} -# 66| 11: [Event] MouseDown +# 66| 12: [Event] MouseDown # 68| 3: [AddEventAccessor] add_MouseDown #-----| 2: (Parameters) # 68| 0: [Parameter] value @@ -134,7 +134,7 @@ events.cs: # 69| 0: [MethodCall] call to method RemoveEventHandler # 69| 0: [FieldAccess] access to field mouseDownEventKey # 69| 1: [ParameterAccess] access to parameter value -# 73| 12: [Event] MouseUp +# 73| 13: [Event] MouseUp # 75| 3: [AddEventAccessor] add_MouseUp #-----| 2: (Parameters) # 75| 0: [Parameter] value @@ -151,7 +151,7 @@ events.cs: # 76| 0: [MethodCall] call to method RemoveEventHandler # 76| 0: [FieldAccess] access to field mouseUpEventKey # 76| 1: [ParameterAccess] access to parameter value -# 80| 13: [Method] OnMouseUp +# 80| 14: [Method] OnMouseUp # 80| -1: [TypeMention] Void #-----| 2: (Parameters) # 80| 0: [Parameter] args diff --git a/csharp/ql/test/library-tests/exceptions/PrintAst.expected b/csharp/ql/test/library-tests/exceptions/PrintAst.expected index bbe09076bc6..bdc7ecb3688 100644 --- a/csharp/ql/test/library-tests/exceptions/PrintAst.expected +++ b/csharp/ql/test/library-tests/exceptions/PrintAst.expected @@ -1,11 +1,11 @@ exceptions.cs: # 3| [Class] Class1 -# 5| 5: [Method] G +# 5| 6: [Method] G # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} -# 9| 6: [Field] p +# 9| 7: [Field] p # 9| -1: [TypeMention] int -# 11| 7: [Method] TestNoThrow +# 11| 8: [Method] TestNoThrow # 11| -1: [TypeMention] Void # 12| 4: [BlockStmt] {...} # 13| 0: [TryStmt] try {...} ... @@ -38,7 +38,7 @@ exceptions.cs: # 33| 0: [TypeMention] Exception # 34| 1: [BlockStmt] {...} # 35| 0: [EmptyStmt] ; -# 43| 8: [Method] TestCall +# 43| 9: [Method] TestCall # 43| -1: [TypeMention] Void # 44| 4: [BlockStmt] {...} # 45| 0: [TryStmt] try {...} ... @@ -69,7 +69,7 @@ exceptions.cs: # 66| 5: [GeneralCatchClause] catch {...} # 67| 1: [BlockStmt] {...} # 68| 0: [EmptyStmt] ; -# 72| 9: [Method] TestCreation +# 72| 10: [Method] TestCreation # 72| -1: [TypeMention] Void # 73| 4: [BlockStmt] {...} # 74| 0: [TryStmt] try {...} ... @@ -106,7 +106,7 @@ exceptions.cs: # 95| 0: [TypeMention] Exception # 96| 1: [BlockStmt] {...} # 97| 0: [EmptyStmt] ; -# 101| 10: [Method] TestIntAdd +# 101| 11: [Method] TestIntAdd # 101| -1: [TypeMention] Void # 102| 4: [BlockStmt] {...} # 103| 0: [TryStmt] try {...} ... @@ -144,7 +144,7 @@ exceptions.cs: # 124| 0: [TypeMention] Exception # 125| 1: [BlockStmt] {...} # 126| 0: [EmptyStmt] ; -# 130| 11: [Method] TestIntSub +# 130| 12: [Method] TestIntSub # 130| -1: [TypeMention] Void # 131| 4: [BlockStmt] {...} # 132| 0: [TryStmt] try {...} ... @@ -182,7 +182,7 @@ exceptions.cs: # 153| 0: [TypeMention] Exception # 154| 1: [BlockStmt] {...} # 155| 0: [EmptyStmt] ; -# 159| 12: [Method] TestIntMul +# 159| 13: [Method] TestIntMul # 159| -1: [TypeMention] Void # 160| 4: [BlockStmt] {...} # 161| 0: [TryStmt] try {...} ... @@ -220,7 +220,7 @@ exceptions.cs: # 182| 0: [TypeMention] Exception # 183| 1: [BlockStmt] {...} # 184| 0: [EmptyStmt] ; -# 188| 13: [Method] TestStringLiteral +# 188| 14: [Method] TestStringLiteral # 188| -1: [TypeMention] Void # 189| 4: [BlockStmt] {...} # 190| 0: [TryStmt] try {...} ... @@ -256,7 +256,7 @@ exceptions.cs: # 211| 0: [TypeMention] Exception # 212| 1: [BlockStmt] {...} # 213| 0: [EmptyStmt] ; -# 217| 14: [Method] TestStringAdd +# 217| 15: [Method] TestStringAdd # 217| -1: [TypeMention] Void # 218| 4: [BlockStmt] {...} # 219| 0: [TryStmt] try {...} ... @@ -299,7 +299,7 @@ exceptions.cs: # 241| 0: [TypeMention] Exception # 242| 1: [BlockStmt] {...} # 243| 0: [EmptyStmt] ; -# 247| 15: [Method] TestDivide +# 247| 16: [Method] TestDivide # 247| -1: [TypeMention] Void # 248| 4: [BlockStmt] {...} # 249| 0: [TryStmt] try {...} ... @@ -337,7 +337,7 @@ exceptions.cs: # 270| 0: [TypeMention] Exception # 271| 1: [BlockStmt] {...} # 272| 0: [EmptyStmt] ; -# 276| 16: [Method] TestRemainder +# 276| 17: [Method] TestRemainder # 276| -1: [TypeMention] Void # 277| 4: [BlockStmt] {...} # 278| 0: [TryStmt] try {...} ... @@ -375,7 +375,7 @@ exceptions.cs: # 299| 0: [TypeMention] Exception # 300| 1: [BlockStmt] {...} # 301| 0: [EmptyStmt] ; -# 305| 17: [Method] TestMemberAccess +# 305| 18: [Method] TestMemberAccess # 305| -1: [TypeMention] Void # 306| 4: [BlockStmt] {...} # 307| 0: [TryStmt] try {...} ... @@ -412,7 +412,7 @@ exceptions.cs: # 328| 0: [TypeMention] Exception # 329| 1: [BlockStmt] {...} # 330| 0: [EmptyStmt] ; -# 334| 18: [Method] TestCast +# 334| 19: [Method] TestCast # 334| -1: [TypeMention] Void # 335| 4: [BlockStmt] {...} # 336| 0: [TryStmt] try {...} ... @@ -451,7 +451,7 @@ exceptions.cs: # 357| 0: [TypeMention] Exception # 358| 1: [BlockStmt] {...} # 359| 0: [EmptyStmt] ; -# 363| 19: [Method] TestThrow +# 363| 20: [Method] TestThrow # 363| -1: [TypeMention] Void # 364| 4: [BlockStmt] {...} # 365| 0: [TryStmt] try {...} ... @@ -490,7 +490,7 @@ exceptions.cs: # 387| 0: [TypeMention] Exception # 388| 1: [BlockStmt] {...} # 389| 0: [EmptyStmt] ; -# 393| 20: [Method] TestUnaryOperation +# 393| 21: [Method] TestUnaryOperation # 393| -1: [TypeMention] Void # 394| 4: [BlockStmt] {...} # 395| 0: [TryStmt] try {...} ... @@ -529,7 +529,7 @@ exceptions.cs: # 417| 0: [TypeMention] Exception # 418| 1: [BlockStmt] {...} # 419| 0: [EmptyStmt] ; -# 423| 21: [Method] TestRethrow +# 423| 22: [Method] TestRethrow # 423| -1: [TypeMention] Void # 424| 4: [BlockStmt] {...} # 425| 0: [TryStmt] try {...} ... @@ -548,7 +548,7 @@ exceptions.cs: # 440| 2: [GeneralCatchClause] catch {...} # 441| 1: [BlockStmt] {...} # 442| 0: [EmptyStmt] ; -# 446| 22: [Method] TestSubtypeCast +# 446| 23: [Method] TestSubtypeCast # 446| -1: [TypeMention] Void # 447| 4: [BlockStmt] {...} # 448| 0: [TryStmt] try {...} ... @@ -577,7 +577,7 @@ exceptions.cs: # 458| 0: [TypeMention] Exception # 459| 1: [BlockStmt] {...} # 460| 0: [EmptyStmt] ; -# 464| 23: [Method] TestDivideMaybeZero +# 464| 24: [Method] TestDivideMaybeZero # 464| -1: [TypeMention] Void #-----| 2: (Parameters) # 464| 0: [Parameter] i diff --git a/csharp/ql/test/library-tests/expressions/PrintAst.expected b/csharp/ql/test/library-tests/expressions/PrintAst.expected index bee0a1e429c..208ea388114 100644 --- a/csharp/ql/test/library-tests/expressions/PrintAst.expected +++ b/csharp/ql/test/library-tests/expressions/PrintAst.expected @@ -1,6 +1,6 @@ FoldedLiterals.cs: # 1| [Class] FoldedLiterals -# 3| 5: [Method] Test +# 3| 6: [Method] Test # 3| -1: [TypeMention] Void # 4| 4: [BlockStmt] {...} # 6| 0: [LocalVariableDeclStmt] ... ...; @@ -338,7 +338,7 @@ FoldedLiterals.cs: # 77| 0: [DecimalLiteral] 11 MethodAccess.cs: # 3| [Class] MethodAccess -# 5| 5: [Method] M +# 5| 6: [Method] M # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalFunctionStmt] M1(...) @@ -374,29 +374,29 @@ MethodAccess.cs: # 12| 0: [MethodAccess] access to method M3 # 12| -1: [TypeAccess] access to type MethodAccess # 12| 0: [TypeMention] MethodAccess -# 15| 6: [Method] M2 +# 15| 7: [Method] M2 # 15| -1: [TypeMention] Void # 15| 4: [BlockStmt] {...} -# 17| 7: [Method] M3 +# 17| 8: [Method] M3 # 17| -1: [TypeMention] Void # 17| 4: [BlockStmt] {...} Qualifiers.cs: # 3| [Class] Qualifiers -# 5| 5: [Property] S +# 5| 6: [Property] S # 5| -1: [TypeMention] short # 5| 3: [Getter] get_S # 5| 4: [MethodCall] call to method Static # 5| 0: [NullLiteral] null -# 7| 6: [Property] I +# 7| 7: [Property] I # 7| -1: [TypeMention] int # 7| 3: [Getter] get_I # 7| 4: [MethodCall] call to method Instance -# 9| 7: [Property] B +# 9| 8: [Property] B # 9| -1: [TypeMention] bool # 9| 3: [Getter] get_B # 9| 4: [MethodCall] call to method Instance # 9| -1: [ThisAccess] this access -# 11| 9: [Method] Static`1 +# 11| 10: [Method] Static`1 # 11| -1: [TypeMention] T #-----| 1: (Type parameters) # 11| 0: [TypeParameter] T @@ -406,7 +406,7 @@ Qualifiers.cs: # 11| 4: [DefaultValueExpr] default(...) # 11| 0: [TypeAccess] access to type T # 11| 0: [TypeMention] T -# 13| 12: [Method] Instance`1 +# 13| 13: [Method] Instance`1 # 13| -1: [TypeMention] T #-----| 1: (Type parameters) # 13| 0: [TypeParameter] T @@ -415,7 +415,7 @@ Qualifiers.cs: # 13| 0: [TypeMention] T ReducedExpression.cs: # 2| [Class] ReducedClass -# 5| 5: [Field] ReducedExpression +# 5| 6: [Field] ReducedExpression # 5| -1: [TypeMention] int # 5| 1: [ConditionalExpr] ... ? ... : ... # 5| 0: [BoolLiteral] true @@ -424,7 +424,7 @@ ReducedExpression.cs: expressions.cs: # 5| [NamespaceDeclaration] namespace ... { ... } # 7| 1: [Class] Class -# 10| 4: [Method] MainLiterals +# 10| 5: [Method] MainLiterals # 10| -1: [TypeMention] Void # 11| 4: [BlockStmt] {...} # 12| 0: [LocalVariableDeclStmt] ... ...; @@ -514,7 +514,7 @@ expressions.cs: # 34| 0: [AssignExpr] ... = ... # 34| 0: [LocalVariableAccess] access to local variable o # 34| 1: [NullLiteral] null -# 37| 5: [Method] LogicalOperators +# 37| 6: [Method] LogicalOperators # 37| -1: [TypeMention] bool #-----| 2: (Parameters) # 37| 0: [Parameter] a @@ -546,15 +546,15 @@ expressions.cs: # 41| 1: [ParameterAccess] access to parameter b # 41| 1: [LogicalNotExpr] !... # 41| 0: [LocalVariableAccess] access to local variable c -# 44| 6: [Field] constant +# 44| 7: [Field] constant # 44| -1: [TypeMention] string # 44| 1: [StringLiteralUtf16] "constant" -# 45| 7: [Field] f +# 45| 8: [Field] f # 45| -1: [TypeMention] int # 45| 1: [IntLiteral] 0 -# 46| 8: [Field] name +# 46| 9: [Field] name # 46| -1: [TypeMention] string -# 48| 9: [StaticConstructor] Class +# 48| 10: [StaticConstructor] Class # 49| 4: [BlockStmt] {...} # 51| 0: [ExprStmt] ...; # 51| 0: [AssignExpr] ... = ... @@ -568,19 +568,19 @@ expressions.cs: # 52| 0: [TypeMention] Class # 53| 2: [ExprStmt] ...; # 53| 0: [MethodCall] call to method Foo -# 56| 10: [InstanceConstructor] Class +# 56| 11: [InstanceConstructor] Class # 56| 3: [ConstructorInitializer] call to constructor Class # 56| 0: [IntLiteral] 0 # 56| 4: [BlockStmt] {...} -# 58| 11: [InstanceConstructor] Class +# 58| 12: [InstanceConstructor] Class #-----| 2: (Parameters) # 58| 0: [Parameter] i # 58| -1: [TypeMention] int # 58| 4: [BlockStmt] {...} -# 60| 12: [Method] Foo +# 60| 13: [Method] Foo # 60| -1: [TypeMention] Void # 60| 4: [BlockStmt] {...} -# 62| 13: [Method] Bar +# 62| 14: [Method] Bar # 62| -1: [TypeMention] int #-----| 2: (Parameters) # 62| 0: [Parameter] x @@ -593,7 +593,7 @@ expressions.cs: # 64| 0: [PropertyCall] access to property Length # 64| -1: [ParameterAccess] access to parameter s # 64| 1: [ParameterAccess] access to parameter x -# 67| 14: [Property] Name +# 67| 15: [Property] Name # 67| -1: [TypeMention] string # 69| 3: [Getter] get_Name # 69| 4: [BlockStmt] {...} @@ -607,7 +607,7 @@ expressions.cs: # 70| 0: [AssignExpr] ... = ... # 70| 0: [FieldAccess] access to field name # 70| 1: [ParameterAccess] access to parameter value -# 73| 15: [Indexer] Item +# 73| 16: [Indexer] Item # 73| -1: [TypeMention] bool #-----| 1: (Parameters) # 73| 0: [Parameter] i @@ -638,7 +638,7 @@ expressions.cs: # 76| 1: [ExprStmt] ...; # 76| 0: [PostIncrExpr] ...++ # 76| 0: [FieldAccess] access to field f -# 79| 16: [Method] MainAccesses +# 79| 17: [Method] MainAccesses # 79| -1: [TypeMention] Void #-----| 2: (Parameters) # 79| 0: [Parameter] other @@ -718,7 +718,7 @@ expressions.cs: # 89| -1: [LocalVariableAccess] access to local variable inlinearray # 89| 0: [IntLiteral] 2 # 89| 1: [IntLiteral] 7 -# 92| 17: [Method] MainIsAsCast +# 92| 18: [Method] MainIsAsCast # 92| -1: [TypeMention] Void #-----| 2: (Parameters) # 92| 0: [Parameter] s @@ -780,14 +780,14 @@ expressions.cs: # 101| 1: [StringLiteralUtf16] " " # 101| 1: [CastExpr] (...) ... # 101| 1: [LocalVariableAccess] access to local variable i -# 104| 18: [Class] Y`2 +# 104| 19: [Class] Y`2 #-----| 1: (Type parameters) # 104| 0: [TypeParameter] T # 104| 1: [TypeParameter] U -# 108| 20: [Class] X`1 +# 108| 21: [Class] X`1 #-----| 1: (Type parameters) # 108| 0: [TypeParameter] T -# 111| 5: [Method] PrintTypes +# 111| 6: [Method] PrintTypes # 111| -1: [TypeMention] Void # 112| 4: [BlockStmt] {...} # 113| 0: [LocalVariableDeclStmt] ... ...; @@ -840,17 +840,17 @@ expressions.cs: # 125| 1: [DefaultValueExpr] default(...) # 125| 0: [TypeAccess] access to type T # 125| 0: [TypeMention] T -# 130| 21: [Class] Nested +# 130| 22: [Class] Nested #-----| 3: (Base types) # 130| 0: [TypeMention] Class -# 132| 4: [StaticConstructor] Nested +# 132| 5: [StaticConstructor] Nested # 132| 4: [BlockStmt] {...} -# 133| 5: [InstanceConstructor] Nested +# 133| 6: [InstanceConstructor] Nested #-----| 2: (Parameters) # 133| 0: [Parameter] b # 133| -1: [TypeMention] bool # 133| 4: [BlockStmt] {...} -# 134| 6: [InstanceConstructor] Nested +# 134| 7: [InstanceConstructor] Nested #-----| 2: (Parameters) # 134| 0: [Parameter] i # 134| -1: [TypeMention] int @@ -859,7 +859,7 @@ expressions.cs: # 134| 0: [ParameterAccess] access to parameter i # 134| 1: [IntLiteral] 1 # 134| 4: [BlockStmt] {...} -# 136| 7: [Method] OtherAccesses +# 136| 8: [Method] OtherAccesses # 136| -1: [TypeMention] Void # 137| 4: [BlockStmt] {...} # 138| 0: [ExprStmt] ...; @@ -880,7 +880,7 @@ expressions.cs: # 139| 4: [CastExpr] (...) ... # 139| 1: [IntLiteral] 4 # 139| 5: [StringLiteralUtf16] "" -# 144| 22: [Method] MainLocalVarDecl +# 144| 23: [Method] MainLocalVarDecl # 144| -1: [TypeMention] Void # 145| 4: [BlockStmt] {...} # 146| 0: [LocalVariableDeclStmt] ... ...; @@ -918,7 +918,7 @@ expressions.cs: # 151| -1: [TypeMention] string # 151| 0: [LocalVariableAccess] access to local variable y # 151| 1: [StringLiteralUtf16] "test" -# 154| 23: [Method] MainLocalConstDecl +# 154| 24: [Method] MainLocalConstDecl # 154| -1: [TypeMention] Void # 155| 4: [BlockStmt] {...} # 156| 0: [LocalConstantDeclStmt] const ... ...; @@ -944,7 +944,7 @@ expressions.cs: # 158| 1: [LocalVariableAccess] access to local variable r # 158| 1: [CastExpr] (...) ... # 158| 1: [LocalVariableAccess] access to local variable r -# 161| 24: [Method] MainChecked +# 161| 25: [Method] MainChecked # 161| -1: [TypeMention] Void # 162| 4: [BlockStmt] {...} # 163| 0: [LocalVariableDeclStmt] ... ...; @@ -961,7 +961,7 @@ expressions.cs: # 164| 0: [AddExpr] ... + ... # 164| 0: [FieldAccess] access to field f # 164| 1: [IntLiteral] 20 -# 167| 25: [Method] MainElementAccess +# 167| 26: [Method] MainElementAccess # 167| -1: [TypeMention] Void #-----| 2: (Parameters) # 167| 0: [Parameter] i @@ -978,7 +978,7 @@ expressions.cs: # 169| -1: [ArrayInitializer] { ..., ... } # 169| 0: [CastExpr] (...) ... # 169| 1: [ParameterAccess] access to parameter i -# 172| 26: [Method] MainDelegateAndMethodAccesses +# 172| 27: [Method] MainDelegateAndMethodAccesses # 172| -1: [TypeMention] Void # 173| 4: [BlockStmt] {...} # 174| 0: [LocalVariableDeclStmt] ... ...; @@ -1127,26 +1127,26 @@ expressions.cs: # 205| 0: [Parameter] x # 205| -1: [TypeMention] int # 207| 4: [Class] C -# 210| 5: [Method] M1 +# 210| 6: [Method] M1 # 210| -1: [TypeMention] Void #-----| 2: (Parameters) # 210| 0: [Parameter] i # 210| -1: [TypeMention] int # 210| 4: [BlockStmt] {...} -# 211| 6: [Method] M2 +# 211| 7: [Method] M2 # 211| -1: [TypeMention] Void #-----| 2: (Parameters) # 211| 0: [Parameter] i # 211| -1: [TypeMention] int # 211| 4: [BlockStmt] {...} -# 212| 7: [Method] M3 +# 212| 8: [Method] M3 # 212| -1: [TypeMention] Void #-----| 2: (Parameters) # 212| 0: [Parameter] i # 212| -1: [TypeMention] int # 212| 4: [BlockStmt] {...} # 216| 5: [Class] X -# 219| 5: [Method] F +# 219| 6: [Method] F # 219| -1: [TypeMention] bool #-----| 2: (Parameters) # 219| 0: [Parameter] i @@ -1156,7 +1156,7 @@ expressions.cs: # 219| 0: [LTExpr] ... < ... # 219| 0: [ParameterAccess] access to parameter i # 219| 1: [IntLiteral] 2 -# 221| 6: [Method] G +# 221| 7: [Method] G # 221| -1: [TypeMention] bool #-----| 2: (Parameters) # 221| 0: [Parameter] s @@ -1171,7 +1171,7 @@ expressions.cs: # 225| 1: [Parameter] e # 225| -1: [TypeMention] object # 227| 7: [Class] Button -# 230| 5: [Event] Click +# 230| 6: [Event] Click # 230| -1: [TypeMention] EventHandler # 230| 3: [AddEventAccessor] add_Click #-----| 2: (Parameters) @@ -1179,7 +1179,7 @@ expressions.cs: # 230| 4: [RemoveEventAccessor] remove_Click #-----| 2: (Parameters) # 230| 0: [Parameter] value -# 232| 6: [Method] OnClick +# 232| 7: [Method] OnClick # 232| -1: [TypeMention] Void #-----| 2: (Parameters) # 232| 0: [Parameter] e @@ -1194,7 +1194,7 @@ expressions.cs: # 235| -1: [EventAccess,EventCall] access to event Click # 235| 0: [ThisAccess] this access # 235| 1: [ParameterAccess] access to parameter e -# 238| 7: [Method] Reset +# 238| 8: [Method] Reset # 238| -1: [TypeMention] Void # 239| 4: [BlockStmt] {...} # 240| 0: [ExprStmt] ...; @@ -1202,11 +1202,11 @@ expressions.cs: # 240| 0: [EventAccess,EventCall] access to event Click # 240| 1: [NullLiteral] null # 244| 8: [Class] LoginDialog -# 247| 4: [Field] OkButton +# 247| 5: [Field] OkButton # 247| -1: [TypeMention] Button -# 248| 5: [Field] CancelButton +# 248| 6: [Field] CancelButton # 248| -1: [TypeMention] Button -# 250| 6: [InstanceConstructor] LoginDialog +# 250| 7: [InstanceConstructor] LoginDialog # 251| 4: [BlockStmt] {...} # 252| 0: [ExprStmt] ...; # 252| 0: [AssignExpr] ... = ... @@ -1232,7 +1232,7 @@ expressions.cs: # 255| 1: [ExplicitDelegateCreation] delegate creation of type EventHandler # 255| -1: [TypeMention] EventHandler # 255| 0: [MethodAccess] access to method CancelButtonClick -# 258| 7: [Method] OkButtonClick +# 258| 8: [Method] OkButtonClick # 258| -1: [TypeMention] Void #-----| 2: (Parameters) # 258| 0: [Parameter] sender @@ -1240,7 +1240,7 @@ expressions.cs: # 258| 1: [Parameter] e # 258| -1: [TypeMention] object # 259| 4: [BlockStmt] {...} -# 262| 8: [Method] CancelButtonClick +# 262| 9: [Method] CancelButtonClick # 262| -1: [TypeMention] Void #-----| 2: (Parameters) # 262| 0: [Parameter] sender @@ -1249,18 +1249,18 @@ expressions.cs: # 262| -1: [TypeMention] object # 263| 4: [BlockStmt] {...} # 268| 9: [Class] IntVector -# 271| 4: [InstanceConstructor] IntVector +# 271| 5: [InstanceConstructor] IntVector #-----| 2: (Parameters) # 271| 0: [Parameter] length # 271| -1: [TypeMention] int # 271| 4: [BlockStmt] {...} -# 273| 5: [Property] Length +# 273| 6: [Property] Length # 273| -1: [TypeMention] int # 273| 3: [Getter] get_Length # 273| 4: [BlockStmt] {...} # 273| 0: [ReturnStmt] return ...; # 273| 0: [IntLiteral] 4 -# 275| 6: [Indexer] Item +# 275| 7: [Indexer] Item # 275| -1: [TypeMention] int #-----| 1: (Parameters) # 275| 0: [Parameter] index @@ -1276,7 +1276,7 @@ expressions.cs: # 275| 0: [Parameter] index # 275| 1: [Parameter] value # 275| 4: [BlockStmt] {...} -# 277| 7: [IncrementOperator] ++ +# 277| 8: [IncrementOperator] ++ # 277| -1: [TypeMention] IntVector #-----| 2: (Parameters) # 277| 0: [Parameter] iv @@ -1313,7 +1313,7 @@ expressions.cs: # 281| 1: [IntLiteral] 1 # 282| 2: [ReturnStmt] return ...; # 282| 0: [LocalVariableAccess] access to local variable temp -# 285| 8: [AddOperator] + +# 285| 9: [AddOperator] + # 285| -1: [TypeMention] IntVector #-----| 2: (Parameters) # 285| 0: [Parameter] iv1 @@ -1324,7 +1324,7 @@ expressions.cs: # 287| 0: [ReturnStmt] return ...; # 287| 0: [ParameterAccess] access to parameter iv1 # 292| 10: [Class] TestUnaryOperator -# 295| 5: [Method] MainUnaryOperator +# 295| 6: [Method] MainUnaryOperator # 295| -1: [TypeMention] Void # 296| 4: [BlockStmt] {...} # 297| 0: [LocalVariableDeclStmt] ... ...; @@ -1355,9 +1355,9 @@ expressions.cs: # 301| 0: [LocalVariableAccess] access to local variable iv1 # 301| 1: [LocalVariableAccess] access to local variable iv2 # 306| 11: [Struct] Digit -# 309| 5: [Field] value +# 309| 6: [Field] value # 309| -1: [TypeMention] byte -# 311| 6: [InstanceConstructor] Digit +# 311| 7: [InstanceConstructor] Digit #-----| 2: (Parameters) # 311| 0: [Parameter] value # 311| -1: [TypeMention] byte @@ -1380,7 +1380,7 @@ expressions.cs: # 315| 0: [FieldAccess] access to field value # 315| -1: [ThisAccess] this access # 315| 1: [ParameterAccess] access to parameter value -# 318| 7: [ImplicitConversionOperator] implicit conversion +# 318| 8: [ImplicitConversionOperator] implicit conversion # 318| -1: [TypeMention] byte #-----| 2: (Parameters) # 318| 0: [Parameter] d @@ -1389,7 +1389,7 @@ expressions.cs: # 320| 0: [ReturnStmt] return ...; # 320| 0: [FieldAccess] access to field value # 320| -1: [ParameterAccess] access to parameter d -# 323| 8: [ExplicitConversionOperator] explicit conversion +# 323| 9: [ExplicitConversionOperator] explicit conversion # 323| -1: [TypeMention] Digit #-----| 2: (Parameters) # 323| 0: [Parameter] b @@ -1400,7 +1400,7 @@ expressions.cs: # 325| -1: [TypeMention] Digit # 325| 0: [ParameterAccess] access to parameter b # 330| 12: [Class] TestConversionOperator -# 333| 5: [Method] MainConversionOperator +# 333| 6: [Method] MainConversionOperator # 333| -1: [TypeMention] Void # 334| 4: [BlockStmt] {...} # 335| 0: [LocalVariableDeclStmt] ... ...; @@ -1418,11 +1418,11 @@ expressions.cs: # 336| 1: [OperatorCall] call to operator implicit conversion # 336| 0: [LocalVariableAccess] access to local variable d # 341| 13: [Class] Point -# 344| 5: [Field] x +# 344| 6: [Field] x # 344| -1: [TypeMention] int -# 344| 6: [Field] y +# 344| 7: [Field] y # 344| -1: [TypeMention] int -# 346| 7: [Property] X +# 346| 8: [Property] X # 346| -1: [TypeMention] int # 346| 3: [Getter] get_X # 346| 4: [BlockStmt] {...} @@ -1436,7 +1436,7 @@ expressions.cs: # 346| 0: [AssignExpr] ... = ... # 346| 0: [FieldAccess] access to field x # 346| 1: [ParameterAccess] access to parameter value -# 347| 8: [Property] Y +# 347| 9: [Property] Y # 347| -1: [TypeMention] int # 347| 3: [Getter] get_Y # 347| 4: [BlockStmt] {...} @@ -1451,11 +1451,11 @@ expressions.cs: # 347| 0: [FieldAccess] access to field y # 347| 1: [ParameterAccess] access to parameter value # 351| 14: [Class] Rectangle -# 354| 5: [Field] p1 +# 354| 6: [Field] p1 # 354| -1: [TypeMention] Point -# 354| 6: [Field] p2 +# 354| 7: [Field] p2 # 354| -1: [TypeMention] Point -# 356| 7: [Property] P1 +# 356| 8: [Property] P1 # 356| -1: [TypeMention] Point # 356| 3: [Getter] get_P1 # 356| 4: [BlockStmt] {...} @@ -1469,7 +1469,7 @@ expressions.cs: # 356| 0: [AssignExpr] ... = ... # 356| 0: [FieldAccess] access to field p1 # 356| 1: [ParameterAccess] access to parameter value -# 357| 8: [Property] P2 +# 357| 9: [Property] P2 # 357| -1: [TypeMention] Point # 357| 3: [Getter] get_P2 # 357| 4: [BlockStmt] {...} @@ -1484,36 +1484,36 @@ expressions.cs: # 357| 0: [FieldAccess] access to field p2 # 357| 1: [ParameterAccess] access to parameter value # 361| 15: [Class] Rectangle2 -# 364| 5: [Field] p1 +# 364| 6: [Field] p1 # 364| -1: [TypeMention] Point # 364| 1: [ObjectCreation] object creation of type Point # 364| 0: [TypeMention] Point -# 365| 6: [Field] p2 +# 365| 7: [Field] p2 # 365| -1: [TypeMention] Point # 365| 1: [ObjectCreation] object creation of type Point # 365| 0: [TypeMention] Point -# 367| 7: [Property] P1 +# 367| 8: [Property] P1 # 367| -1: [TypeMention] Point # 367| 3: [Getter] get_P1 # 367| 4: [BlockStmt] {...} # 367| 0: [ReturnStmt] return ...; # 367| 0: [FieldAccess] access to field p1 -# 368| 8: [Property] P2 +# 368| 9: [Property] P2 # 368| -1: [TypeMention] Point # 368| 3: [Getter] get_P2 # 368| 4: [BlockStmt] {...} # 368| 0: [ReturnStmt] return ...; # 368| 0: [FieldAccess] access to field p2 # 372| 16: [Class] Contact -# 375| 5: [Field] name +# 375| 6: [Field] name # 375| -1: [TypeMention] string -# 376| 6: [Field] phoneNumbers +# 376| 7: [Field] phoneNumbers # 376| -1: [TypeMention] List # 376| 1: [TypeMention] string # 376| 1: [ObjectCreation] object creation of type List # 376| 0: [TypeMention] List # 376| 1: [TypeMention] string -# 378| 7: [Property] Name +# 378| 8: [Property] Name # 378| -1: [TypeMention] string # 378| 3: [Getter] get_Name # 378| 4: [BlockStmt] {...} @@ -1527,7 +1527,7 @@ expressions.cs: # 378| 0: [AssignExpr] ... = ... # 378| 0: [FieldAccess] access to field name # 378| 1: [ParameterAccess] access to parameter value -# 379| 8: [Property] PhoneNumbers +# 379| 9: [Property] PhoneNumbers # 379| -1: [TypeMention] List # 379| 1: [TypeMention] string # 379| 3: [Getter] get_PhoneNumbers @@ -1535,7 +1535,7 @@ expressions.cs: # 379| 0: [ReturnStmt] return ...; # 379| 0: [FieldAccess] access to field phoneNumbers # 383| 17: [Class] TestCreations -# 386| 5: [Method] MainCreations +# 386| 6: [Method] MainCreations # 386| -1: [TypeMention] Void # 387| 4: [BlockStmt] {...} # 388| 0: [LocalVariableDeclStmt] ... ...; @@ -1827,14 +1827,14 @@ expressions.cs: # 430| 0: [EQExpr] ... == ... # 430| 0: [LocalVariableAccess] access to local variable i # 430| 1: [IntLiteral] 2 -# 433| 6: [DelegateType] S +# 433| 7: [DelegateType] S #-----| 2: (Parameters) # 433| 0: [Parameter] x # 433| -1: [TypeMention] int # 433| 1: [Parameter] y # 433| -1: [TypeMention] int -# 434| 7: [DelegateType] Unit -# 436| 8: [Method] MultiDimensionalArrayCreations +# 434| 8: [DelegateType] Unit +# 436| 9: [Method] MultiDimensionalArrayCreations # 436| -1: [TypeMention] Void # 437| 4: [BlockStmt] {...} # 438| 0: [LocalVariableDeclStmt] ... ...; @@ -1994,7 +1994,7 @@ expressions.cs: # 445| 0: [IntLiteral] 1 # 445| 1: [IntLiteral] 2 # 445| 2: [IntLiteral] 3 -# 448| 9: [Method] MainAnonymousFunctions +# 448| 10: [Method] MainAnonymousFunctions # 448| -1: [TypeMention] Void # 449| 4: [BlockStmt] {...} # 450| 0: [LocalVariableDeclStmt] ... ...; @@ -2108,7 +2108,7 @@ expressions.cs: # 458| 0: [LocalVariableAccess] access to local variable j # 458| 1: [IntLiteral] 1 # 463| 18: [Class] OperatorCalls -# 465| 5: [Method] delegateCombine +# 465| 6: [Method] delegateCombine # 465| -1: [TypeMention] Void #-----| 2: (Parameters) # 465| 0: [Parameter] fun @@ -2123,7 +2123,7 @@ expressions.cs: # 468| 0: [AssignAddExpr] ... += ... # 468| 0: [LocalVariableAccess] access to local variable PropertyChanged # 468| 1: [ParameterAccess] access to parameter fun -# 471| 6: [Method] addition +# 471| 7: [Method] addition # 471| -1: [TypeMention] Num #-----| 2: (Parameters) # 471| 0: [Parameter] a @@ -2146,10 +2146,10 @@ expressions.cs: # 474| 1: [ParameterAccess] access to parameter c # 475| 2: [ReturnStmt] return ...; # 475| 0: [LocalVariableAccess] access to local variable result -# 477| 7: [Class] Num -# 479| 4: [Field] value +# 477| 8: [Class] Num +# 479| 5: [Field] value # 479| -1: [TypeMention] int -# 481| 5: [InstanceConstructor] Num +# 481| 6: [InstanceConstructor] Num #-----| 2: (Parameters) # 481| 0: [Parameter] value # 481| -1: [TypeMention] int @@ -2159,7 +2159,7 @@ expressions.cs: # 483| 0: [FieldAccess] access to field value # 483| -1: [ThisAccess] this access # 483| 1: [ParameterAccess] access to parameter value -# 486| 6: [AddOperator] + +# 486| 7: [AddOperator] + # 486| -1: [TypeMention] Num #-----| 2: (Parameters) # 486| 0: [Parameter] c1 @@ -2175,12 +2175,12 @@ expressions.cs: # 488| -1: [ParameterAccess] access to parameter c1 # 488| 1: [FieldAccess] access to field value # 488| -1: [ParameterAccess] access to parameter c2 -# 492| 8: [DelegateType] MyDelegate +# 492| 9: [DelegateType] MyDelegate #-----| 2: (Parameters) # 492| 0: [Parameter] e # 492| -1: [TypeMention] string # 495| 19: [Class] ExpressionDepth -# 497| 5: [Field] d +# 497| 6: [Field] d # 497| -1: [TypeMention] int # 497| 1: [AddExpr] ... + ... # 497| 0: [AddExpr] ... + ... @@ -2342,7 +2342,7 @@ expressions.cs: # 498| 1: [IntLiteral] 1 # 498| 1: [IntLiteral] 1 # 501| 20: [Class] TupleExprs -# 503| 5: [Method] Test +# 503| 6: [Method] Test # 503| -1: [TypeMention] Void # 504| 4: [BlockStmt] {...} # 505| 0: [LocalVariableDeclStmt] ... ...; @@ -2390,28 +2390,28 @@ expressions.cs: # 512| 1: [DefaultAttribute] [InlineArray(...)] # 512| -1: [TypeMention] InlineArrayAttribute # 512| 0: [IntLiteral] 10 -# 515| 5: [Field] myInlineArrayElements +# 515| 6: [Field] myInlineArrayElements # 515| -1: [TypeMention] int # 518| 22: [Class] ClassC1 -# 518| 4: [InstanceConstructor,PrimaryConstructor] ClassC1 +# 518| 5: [InstanceConstructor,PrimaryConstructor] ClassC1 #-----| 2: (Parameters) # 518| 0: [Parameter] oc1 # 518| -1: [TypeMention] object # 520| 23: [Class] ClassC2 #-----| 3: (Base types) # 520| 0: [TypeMention] ClassC1 -# 520| 4: [InstanceConstructor,PrimaryConstructor] ClassC2 +# 520| 5: [InstanceConstructor,PrimaryConstructor] ClassC2 #-----| 2: (Parameters) # 520| 0: [Parameter] oc2 # 520| -1: [TypeMention] object # 520| 3: [ConstructorInitializer] call to constructor ClassC1 # 520| 0: [ParameterAccess] access to parameter oc2 # 522| 24: [Class] SuppressNullableWarning -# 525| 5: [Method] Api +# 525| 6: [Method] Api # 525| -1: [TypeMention] object # 525| 4: [ObjectCreation] object creation of type Object # 525| 0: [TypeMention] object -# 527| 6: [Method] Test +# 527| 7: [Method] Test # 527| -1: [TypeMention] Void #-----| 2: (Parameters) # 527| 0: [Parameter] arg0 diff --git a/csharp/ql/test/library-tests/expressions/QualifiableExpr.expected b/csharp/ql/test/library-tests/expressions/QualifiableExpr.expected index c85d73bd7f7..8030da8c4fa 100644 --- a/csharp/ql/test/library-tests/expressions/QualifiableExpr.expected +++ b/csharp/ql/test/library-tests/expressions/QualifiableExpr.expected @@ -1,12 +1,17 @@ +| FoldedLiterals.cs:1:7:1:20 | call to method | FoldedLiterals.cs:1:7:1:20 | this access | +| MethodAccess.cs:3:7:3:18 | call to method | MethodAccess.cs:3:7:3:18 | this access | | MethodAccess.cs:8:20:8:21 | access to local function M1 | MethodAccess.cs:8:20:8:21 | this access | | MethodAccess.cs:9:13:9:14 | access to method M2 | MethodAccess.cs:9:13:9:14 | this access | | MethodAccess.cs:10:13:10:19 | access to method M2 | MethodAccess.cs:10:13:10:16 | this access | | MethodAccess.cs:12:13:12:27 | access to method M3 | MethodAccess.cs:12:13:12:24 | access to type MethodAccess | +| Qualifiers.cs:3:7:3:16 | call to method | Qualifiers.cs:3:7:3:16 | this access | | Qualifiers.cs:7:21:7:35 | call to method Instance | Qualifiers.cs:7:21:7:35 | this access | | Qualifiers.cs:9:22:9:42 | call to method Instance | Qualifiers.cs:9:22:9:25 | this access | +| ReducedExpression.cs:2:7:2:18 | call to method | ReducedExpression.cs:2:7:2:18 | this access | | expressions.cs:45:20:45:20 | access to field f | expressions.cs:45:20:45:20 | this access | | expressions.cs:51:13:51:34 | access to field name | expressions.cs:51:13:51:29 | access to type Class | | expressions.cs:52:13:52:23 | call to method Foo | expressions.cs:52:13:52:17 | access to type Class | +| expressions.cs:58:19:58:23 | call to method | expressions.cs:58:19:58:23 | this access | | expressions.cs:64:20:64:27 | access to property Length | expressions.cs:64:20:64:20 | access to parameter s | | expressions.cs:75:35:75:46 | call to method Equals | expressions.cs:75:35:75:35 | access to parameter s | | expressions.cs:76:30:76:30 | access to field f | expressions.cs:76:30:76:30 | this access | @@ -20,6 +25,10 @@ | expressions.cs:85:41:85:51 | access to indexer | expressions.cs:85:41:85:44 | this access | | expressions.cs:87:13:87:20 | access to array element | expressions.cs:87:13:87:17 | access to local variable array | | expressions.cs:89:13:89:26 | access to array element | expressions.cs:89:13:89:23 | access to local variable inlinearray | +| expressions.cs:104:15:104:15 | call to method | expressions.cs:104:15:104:15 | this access | +| expressions.cs:108:15:108:15 | call to method | expressions.cs:108:15:108:15 | this access | +| expressions.cs:133:13:133:18 | call to method | expressions.cs:133:13:133:18 | this access | +| expressions.cs:134:13:134:18 | call to method | expressions.cs:134:13:134:18 | this access | | expressions.cs:138:17:138:22 | access to field f | expressions.cs:138:17:138:20 | this access | | expressions.cs:139:17:139:55 | call to method MainAccesses | expressions.cs:139:17:139:20 | base access | | expressions.cs:149:13:149:40 | call to method WriteLine | expressions.cs:149:13:149:19 | access to type Console | @@ -33,9 +42,13 @@ | expressions.cs:191:36:191:38 | access to method G | expressions.cs:191:36:191:36 | access to type X | | expressions.cs:198:25:198:37 | access to local function LocalFunction | expressions.cs:198:25:198:37 | this access | | expressions.cs:199:19:199:31 | access to local function LocalFunction | expressions.cs:199:19:199:31 | this access | +| expressions.cs:207:11:207:11 | call to method | expressions.cs:207:11:207:11 | this access | +| expressions.cs:216:18:216:18 | call to method | expressions.cs:216:18:216:18 | this access | +| expressions.cs:227:18:227:23 | call to method | expressions.cs:227:18:227:23 | this access | | expressions.cs:234:17:234:21 | access to event Click | expressions.cs:234:17:234:21 | this access | | expressions.cs:235:17:235:21 | access to event Click | expressions.cs:235:17:235:21 | this access | | expressions.cs:240:13:240:17 | access to event Click | expressions.cs:240:13:240:17 | this access | +| expressions.cs:250:16:250:26 | call to method | expressions.cs:250:16:250:26 | this access | | expressions.cs:252:13:252:20 | access to field OkButton | expressions.cs:252:13:252:20 | this access | | expressions.cs:253:13:253:20 | access to field OkButton | expressions.cs:253:13:253:20 | this access | | expressions.cs:253:13:253:26 | access to event Click | expressions.cs:253:13:253:20 | access to field OkButton | @@ -44,30 +57,48 @@ | expressions.cs:255:13:255:24 | access to field CancelButton | expressions.cs:255:13:255:24 | this access | | expressions.cs:255:13:255:30 | access to event Click | expressions.cs:255:13:255:24 | access to field CancelButton | | expressions.cs:255:52:255:68 | access to method CancelButtonClick | expressions.cs:255:52:255:68 | this access | +| expressions.cs:271:16:271:24 | call to method | expressions.cs:271:16:271:24 | this access | | expressions.cs:279:44:279:52 | access to property Length | expressions.cs:279:44:279:45 | access to parameter iv | | expressions.cs:280:33:280:41 | access to property Length | expressions.cs:280:33:280:34 | access to parameter iv | | expressions.cs:281:17:281:23 | access to indexer | expressions.cs:281:17:281:20 | access to local variable temp | | expressions.cs:281:27:281:31 | access to indexer | expressions.cs:281:27:281:28 | access to parameter iv | +| expressions.cs:292:11:292:27 | call to method | expressions.cs:292:11:292:27 | this access | +| expressions.cs:306:19:306:23 | call to method | expressions.cs:306:19:306:23 | this access | +| expressions.cs:311:16:311:20 | call to method | expressions.cs:311:16:311:20 | this access | | expressions.cs:315:13:315:22 | access to field value | expressions.cs:315:13:315:16 | this access | | expressions.cs:320:20:320:26 | access to field value | expressions.cs:320:20:320:20 | access to parameter d | +| expressions.cs:330:11:330:32 | call to method | expressions.cs:330:11:330:32 | this access | +| expressions.cs:341:18:341:22 | call to method | expressions.cs:341:18:341:22 | this access | | expressions.cs:346:37:346:37 | access to field x | expressions.cs:346:37:346:37 | this access | | expressions.cs:346:48:346:48 | access to field x | expressions.cs:346:48:346:48 | this access | | expressions.cs:347:37:347:37 | access to field y | expressions.cs:347:37:347:37 | this access | | expressions.cs:347:48:347:48 | access to field y | expressions.cs:347:48:347:48 | this access | +| expressions.cs:351:18:351:26 | call to method | expressions.cs:351:18:351:26 | this access | | expressions.cs:356:40:356:41 | access to field p1 | expressions.cs:356:40:356:41 | this access | | expressions.cs:356:52:356:53 | access to field p1 | expressions.cs:356:52:356:53 | this access | | expressions.cs:357:40:357:41 | access to field p2 | expressions.cs:357:40:357:41 | this access | | expressions.cs:357:52:357:53 | access to field p2 | expressions.cs:357:52:357:53 | this access | +| expressions.cs:361:18:361:27 | call to method | expressions.cs:361:18:361:27 | this access | | expressions.cs:364:15:364:16 | access to field p1 | expressions.cs:364:15:364:16 | this access | | expressions.cs:365:15:365:16 | access to field p2 | expressions.cs:365:15:365:16 | this access | | expressions.cs:367:40:367:41 | access to field p1 | expressions.cs:367:40:367:41 | this access | | expressions.cs:368:40:368:41 | access to field p2 | expressions.cs:368:40:368:41 | this access | +| expressions.cs:372:18:372:24 | call to method | expressions.cs:372:18:372:24 | this access | | expressions.cs:376:22:376:33 | access to field phoneNumbers | expressions.cs:376:22:376:33 | this access | | expressions.cs:378:43:378:46 | access to field name | expressions.cs:378:43:378:46 | this access | | expressions.cs:378:57:378:60 | access to field name | expressions.cs:378:57:378:60 | this access | | expressions.cs:379:57:379:68 | access to field phoneNumbers | expressions.cs:379:57:379:68 | this access | +| expressions.cs:383:18:383:30 | call to method | expressions.cs:383:18:383:30 | this access | | expressions.cs:455:29:455:47 | call to method WriteLine | expressions.cs:455:29:455:35 | access to type Console | +| expressions.cs:463:11:463:23 | call to method | expressions.cs:463:11:463:23 | this access | +| expressions.cs:481:20:481:22 | call to method | expressions.cs:481:20:481:22 | this access | | expressions.cs:483:17:483:26 | access to field value | expressions.cs:483:17:483:20 | this access | | expressions.cs:488:32:488:39 | access to field value | expressions.cs:488:32:488:33 | access to parameter c1 | | expressions.cs:488:43:488:50 | access to field value | expressions.cs:488:43:488:44 | access to parameter c2 | +| expressions.cs:495:11:495:25 | call to method | expressions.cs:495:11:495:25 | this access | +| expressions.cs:501:11:501:20 | call to method | expressions.cs:501:11:501:20 | this access | +| expressions.cs:513:12:513:24 | call to method | expressions.cs:513:12:513:24 | this access | +| expressions.cs:518:11:518:17 | call to method | expressions.cs:518:11:518:17 | this access | +| expressions.cs:520:11:520:17 | call to method | expressions.cs:520:11:520:17 | this access | +| expressions.cs:522:11:522:33 | call to method | expressions.cs:522:11:522:33 | this access | | expressions.cs:530:21:530:25 | call to method Api | expressions.cs:530:21:530:25 | this access | diff --git a/csharp/ql/test/library-tests/extension-method-call/ExtensionMethodCalls.expected b/csharp/ql/test/library-tests/extension-method-call/ExtensionMethodCalls.expected index ae15431d964..0407c9b3e39 100644 --- a/csharp/ql/test/library-tests/extension-method-call/ExtensionMethodCalls.expected +++ b/csharp/ql/test/library-tests/extension-method-call/ExtensionMethodCalls.expected @@ -1,6 +1,7 @@ methodCallTargets | methods.cs:14:60:14:73 | call to method Ext3`1 | methods.cs:14:28:14:34 | Ext3`1 | Ext3(T, int) | | methods.cs:16:60:16:74 | call to method Ext4`1 | methods.cs:16:28:16:34 | Ext4`1 | Ext4(T, int) | +| methods.cs:19:18:19:24 | call to method | methods.cs:19:18:19:24 | | () | | methods.cs:23:13:23:22 | call to method Ext0 | methods.cs:8:28:8:34 | Ext0 | Ext0(string, int) | | methods.cs:24:13:24:27 | call to method Ext0 | methods.cs:8:28:8:34 | Ext0 | Ext0(string, int) | | methods.cs:25:13:25:30 | call to method Ext0 | methods.cs:8:28:8:34 | Ext0 | Ext0(string, double) | diff --git a/csharp/ql/test/library-tests/fields/PrintAst.expected b/csharp/ql/test/library-tests/fields/PrintAst.expected index 4f33d662a06..e9e6ad49a2b 100644 --- a/csharp/ql/test/library-tests/fields/PrintAst.expected +++ b/csharp/ql/test/library-tests/fields/PrintAst.expected @@ -1,56 +1,56 @@ fields.cs: # 5| [NamespaceDeclaration] namespace ... { ... } # 7| 1: [Class] A -# 10| 6: [Field] X +# 10| 7: [Field] X # 10| -1: [TypeMention] int # 10| 1: [IntLiteral] 1 -# 10| 7: [Field] Y +# 10| 8: [Field] Y # 10| -1: [TypeMention] int -# 10| 8: [Field] Z +# 10| 9: [Field] Z # 10| -1: [TypeMention] int # 10| 1: [IntLiteral] 100 # 13| 2: [Class] B -# 15| 6: [Field] X +# 15| 7: [Field] X # 15| -1: [TypeMention] int # 15| 1: [IntLiteral] 1 -# 16| 7: [Field] Y +# 16| 8: [Field] Y # 16| -1: [TypeMention] int -# 17| 8: [Field] Z +# 17| 9: [Field] Z # 17| -1: [TypeMention] int # 17| 1: [IntLiteral] 100 # 20| 3: [Class] C`1 #-----| 1: (Type parameters) # 20| 0: [TypeParameter] V -# 23| 5: [Field] count +# 23| 6: [Field] count # 23| -1: [TypeMention] int # 23| 1: [IntLiteral] 0 -# 25| 6: [InstanceConstructor] C +# 25| 7: [InstanceConstructor] C # 25| 4: [BlockStmt] {...} # 25| 0: [ExprStmt] ...; # 25| 0: [PostIncrExpr] ...++ # 25| 0: [FieldAccess] access to field count -# 27| 7: [Property] Count +# 27| 8: [Property] Count # 27| -1: [TypeMention] int # 27| 3: [Getter] get_Count # 27| 4: [BlockStmt] {...} # 27| 0: [ReturnStmt] return ...; # 27| 0: [FieldAccess] access to field count # 31| 4: [Class] Application -# 34| 6: [Field] finished +# 34| 7: [Field] finished # 34| -1: [TypeMention] bool -# 35| 7: [Field] x +# 35| 8: [Field] x # 35| -1: [TypeMention] double # 35| 1: [MethodCall] call to method Sqrt # 35| -1: [TypeAccess] access to type Math # 35| 0: [TypeMention] Math # 35| 0: [DoubleLiteral] 2 -# 36| 8: [Field] i +# 36| 9: [Field] i # 36| -1: [TypeMention] int # 36| 1: [IntLiteral] 100 -# 37| 9: [Field] s +# 37| 10: [Field] s # 37| -1: [TypeMention] string # 37| 1: [StringLiteralUtf16] "Hello" -# 39| 10: [Method] Main +# 39| 11: [Method] Main # 39| -1: [TypeMention] Void # 40| 4: [BlockStmt] {...} # 41| 0: [LocalVariableDeclStmt] ... ...; @@ -93,7 +93,7 @@ fields.cs: # 45| 0: [TypeMention] C # 45| 1: [TypeMention] int # 50| 5: [Class] Color -# 53| 5: [Field] Black +# 53| 6: [Field] Black # 53| -1: [TypeMention] Color # 53| 1: [ObjectCreation] object creation of type Color # 53| -1: [TypeMention] Color @@ -103,7 +103,7 @@ fields.cs: # 53| 1: [IntLiteral] 0 # 53| 2: [CastExpr] (...) ... # 53| 1: [IntLiteral] 0 -# 54| 6: [Field] White +# 54| 7: [Field] White # 54| -1: [TypeMention] Color # 54| 1: [ObjectCreation] object creation of type Color # 54| -1: [TypeMention] Color @@ -113,7 +113,7 @@ fields.cs: # 54| 1: [IntLiteral] 255 # 54| 2: [CastExpr] (...) ... # 54| 1: [IntLiteral] 255 -# 56| 7: [InstanceConstructor] Color +# 56| 8: [InstanceConstructor] Color #-----| 2: (Parameters) # 56| 0: [Parameter] r # 56| -1: [TypeMention] byte @@ -123,30 +123,30 @@ fields.cs: # 56| -1: [TypeMention] byte # 56| 4: [BlockStmt] {...} # 60| 6: [Class] TestBindings -# 63| 6: [Field] a +# 63| 7: [Field] a # 63| -1: [TypeMention] int # 63| 1: [AddExpr] ... + ... # 63| 0: [FieldAccess] access to field b # 63| 1: [IntLiteral] 1 -# 64| 7: [Field] b +# 64| 8: [Field] b # 64| -1: [TypeMention] int # 64| 1: [AddExpr] ... + ... # 64| 0: [FieldAccess] access to field a # 64| 1: [IntLiteral] 1 # 70| [NamespaceDeclaration] namespace ... { ... } # 72| 1: [Class] A -# 74| 5: [Field] X +# 74| 6: [Field] X # 74| -1: [TypeMention] int # 74| 1: [AddExpr] ... + ... # 74| 0: [MemberConstantAccess] access to constant Z # 74| -1: [TypeAccess] access to type B # 74| 0: [TypeMention] B # 74| 1: [IntLiteral] 1 -# 75| 6: [Field] Y +# 75| 7: [Field] Y # 75| -1: [TypeMention] int # 75| 1: [IntLiteral] 10 # 78| 2: [Class] B -# 80| 5: [Field] Z +# 80| 6: [Field] Z # 80| -1: [TypeMention] int # 80| 1: [AddExpr] ... + ... # 80| 0: [MemberConstantAccess] access to constant Y @@ -154,13 +154,13 @@ fields.cs: # 80| 0: [TypeMention] A # 80| 1: [IntLiteral] 1 # 83| 3: [Class] C -# 85| 4: [Field] Foo +# 85| 5: [Field] Foo # 85| -1: [TypeMention] int # 85| 1: [IntLiteral] 1 -# 86| 5: [Field] x +# 86| 6: [Field] x # 86| -1: [TypeMention] long? # 86| 1: [TypeMention] long -# 87| 6: [InstanceConstructor] C +# 87| 7: [InstanceConstructor] C # 88| 4: [BlockStmt] {...} # 89| 0: [ExprStmt] ...; # 89| 0: [AssignExpr] ... = ... @@ -191,12 +191,12 @@ fields.cs: # 92| 1: [CastExpr] (...) ... # 92| 1: [MemberConstantAccess] access to constant Foo # 96| 4: [Class] D -# 98| 4: [InstanceConstructor] D +# 98| 5: [InstanceConstructor] D #-----| 2: (Parameters) # 98| 0: [Parameter] d # 98| -1: [TypeMention] int # 99| 4: [BlockStmt] {...} -# 101| 5: [ImplicitConversionOperator] implicit conversion +# 101| 6: [ImplicitConversionOperator] implicit conversion # 101| -1: [TypeMention] D #-----| 2: (Parameters) # 101| 0: [Parameter] d diff --git a/csharp/ql/test/library-tests/generics/Generics.expected b/csharp/ql/test/library-tests/generics/Generics.expected index d390859b4df..8e82103a19e 100644 --- a/csharp/ql/test/library-tests/generics/Generics.expected +++ b/csharp/ql/test/library-tests/generics/Generics.expected @@ -31,6 +31,7 @@ test14 test15 | generics.cs:7:23:7:40 | GenericDelegate | test16 +| generics.cs:135:11:135:16 | Subtle | generics.cs:135:11:135:16 | | | generics.cs:135:11:135:16 | Subtle | generics.cs:138:21:138:25 | fs`1 | | generics.cs:135:11:135:16 | Subtle | generics.cs:140:21:140:25 | fs`1 | | generics.cs:135:11:135:16 | Subtle | generics.cs:142:21:142:22 | fs | diff --git a/csharp/ql/test/library-tests/generics/Generics.ql b/csharp/ql/test/library-tests/generics/Generics.ql index ab1f0af982a..95ae84ebd9a 100644 --- a/csharp/ql/test/library-tests/generics/Generics.ql +++ b/csharp/ql/test/library-tests/generics/Generics.ql @@ -118,7 +118,7 @@ query predicate test15(ConstructedDelegateType d) { query predicate test16(Class c, Method m) { c.hasName("Subtle") and - count(c.getAMethod()) = 3 and + count(c.getAMethod()) = 4 and m = c.getAMethod() } diff --git a/csharp/ql/test/library-tests/generics/PrintAst.expected b/csharp/ql/test/library-tests/generics/PrintAst.expected index 3653b3b7a2d..0d50888edd3 100644 --- a/csharp/ql/test/library-tests/generics/PrintAst.expected +++ b/csharp/ql/test/library-tests/generics/PrintAst.expected @@ -2,13 +2,13 @@ Nesting.cs: # 1| [Class] A`1 #-----| 1: (Type parameters) # 1| 0: [TypeParameter] T1 -# 3| 5: [Method] MA1 +# 3| 6: [Method] MA1 # 3| -1: [TypeMention] Void #-----| 2: (Parameters) # 3| 0: [Parameter] x # 3| -1: [TypeMention] T1 # 3| 4: [BlockStmt] {...} -# 4| 6: [Method] MA2`1 +# 4| 7: [Method] MA2`1 # 4| -1: [TypeMention] Void #-----| 1: (Type parameters) # 4| 0: [TypeParameter] T2 @@ -18,10 +18,10 @@ Nesting.cs: # 4| 1: [Parameter] y # 4| -1: [TypeMention] T2 # 4| 4: [BlockStmt] {...} -# 6| 7: [Class] B`1 +# 6| 8: [Class] B`1 #-----| 1: (Type parameters) # 6| 0: [TypeParameter] T3 -# 8| 5: [Method] MB1 +# 8| 6: [Method] MB1 # 8| -1: [TypeMention] Void #-----| 2: (Parameters) # 8| 0: [Parameter] x @@ -29,7 +29,7 @@ Nesting.cs: # 8| 1: [Parameter] y # 8| -1: [TypeMention] T3 # 8| 4: [BlockStmt] {...} -# 9| 6: [Method] MB2`1 +# 9| 7: [Method] MB2`1 # 9| -1: [TypeMention] Void #-----| 1: (Type parameters) # 9| 0: [TypeParameter] T4 @@ -41,14 +41,14 @@ Nesting.cs: # 9| 2: [Parameter] z # 9| -1: [TypeMention] T4 # 9| 4: [BlockStmt] {...} -# 12| 8: [Class] C -# 14| 5: [Method] MC1 +# 12| 9: [Class] C +# 14| 6: [Method] MC1 # 14| -1: [TypeMention] Void #-----| 2: (Parameters) # 14| 0: [Parameter] x # 14| -1: [TypeMention] T1 # 14| 4: [BlockStmt] {...} -# 15| 6: [Method] MC2`1 +# 15| 7: [Method] MC2`1 # 15| -1: [TypeMention] Void #-----| 1: (Type parameters) # 15| 0: [TypeParameter] T5 @@ -58,10 +58,10 @@ Nesting.cs: # 15| 1: [Parameter] y # 15| -1: [TypeMention] T5 # 15| 4: [BlockStmt] {...} -# 17| 7: [Class] D`1 +# 17| 8: [Class] D`1 #-----| 1: (Type parameters) # 17| 0: [TypeParameter] T6 -# 19| 5: [Method] MD1 +# 19| 6: [Method] MD1 # 19| -1: [TypeMention] Void #-----| 2: (Parameters) # 19| 0: [Parameter] x @@ -69,7 +69,7 @@ Nesting.cs: # 19| 1: [Parameter] y # 19| -1: [TypeMention] T6 # 19| 4: [BlockStmt] {...} -# 20| 6: [Method] MD2`1 +# 20| 7: [Method] MD2`1 # 20| -1: [TypeMention] Void #-----| 1: (Type parameters) # 20| 0: [TypeParameter] T7 @@ -81,7 +81,7 @@ Nesting.cs: # 20| 2: [Parameter] z # 20| -1: [TypeMention] T7 # 20| 4: [BlockStmt] {...} -# 24| 9: [Method] Construct +# 24| 10: [Method] Construct # 24| -1: [TypeMention] Void # 25| 4: [BlockStmt] {...} # 26| 0: [LocalVariableDeclStmt] ... ...; @@ -244,7 +244,7 @@ generics.cs: # 13| 3: [Class] A`1 #-----| 1: (Type parameters) # 13| 0: [TypeParameter] T -# 16| 5: [DelegateType] GenericDelegateInGenericClass`1 +# 16| 6: [DelegateType] GenericDelegateInGenericClass`1 #-----| 1: (Type parameters) # 16| 0: [TypeParameter] U #-----| 2: (Parameters) @@ -252,7 +252,7 @@ generics.cs: # 16| -1: [TypeMention] T # 16| 1: [Parameter] u # 16| -1: [TypeMention] U -# 18| 6: [Method] bar`1 +# 18| 7: [Method] bar`1 # 18| -1: [TypeMention] T #-----| 1: (Type parameters) # 18| 0: [TypeParameter] X @@ -271,25 +271,25 @@ generics.cs: # 22| 4: [Class] B`1 #-----| 1: (Type parameters) # 22| 0: [TypeParameter] T -# 25| 5: [Field] at +# 25| 6: [Field] at # 25| -1: [TypeMention] A # 25| 1: [TypeMention] T -# 27| 6: [Field] name +# 27| 7: [Field] name # 27| -1: [TypeMention] string -# 29| 7: [Method] foo +# 29| 8: [Method] foo # 29| -1: [TypeMention] Void # 29| 4: [BlockStmt] {...} -# 31| 8: [Method] fooParams +# 31| 9: [Method] fooParams # 31| -1: [TypeMention] Void #-----| 2: (Parameters) # 31| 0: [Parameter] ts # 31| -1: [TypeMention] T[] # 31| 1: [TypeMention] T # 31| 4: [BlockStmt] {...} -# 33| 9: [Method] staticFoo +# 33| 10: [Method] staticFoo # 33| -1: [TypeMention] Void # 33| 4: [BlockStmt] {...} -# 35| 10: [Property] Name +# 35| 11: [Property] Name # 35| -1: [TypeMention] string # 35| 3: [Getter] get_Name # 35| 4: [BlockStmt] {...} @@ -303,7 +303,7 @@ generics.cs: # 35| 0: [AssignExpr] ... = ... # 35| 0: [FieldAccess] access to field name # 35| 1: [ParameterAccess] access to parameter value -# 37| 11: [Event] myEvent +# 37| 12: [Event] myEvent # 37| -1: [TypeMention] GenericDelegate # 37| 1: [TypeMention] T # 37| 3: [AddEventAccessor] add_myEvent @@ -312,7 +312,7 @@ generics.cs: # 37| 4: [RemoveEventAccessor] remove_myEvent #-----| 2: (Parameters) # 37| 0: [Parameter] value -# 39| 12: [IncrementOperator] ++ +# 39| 13: [IncrementOperator] ++ # 39| -1: [TypeMention] B # 39| 1: [TypeMention] T #-----| 2: (Parameters) @@ -324,9 +324,9 @@ generics.cs: # 41| 0: [ObjectCreation] object creation of type B`1 # 41| 0: [TypeMention] B # 41| 1: [TypeMention] T -# 44| 13: [Destructor] ~B +# 44| 14: [Destructor] ~B # 44| 4: [BlockStmt] {...} -# 45| 14: [Method] f`1 +# 45| 15: [Method] f`1 # 45| -1: [TypeMention] Void #-----| 1: (Type parameters) # 45| 0: [TypeParameter] X @@ -339,17 +339,17 @@ generics.cs: #-----| 1: (Type parameters) # 48| 0: [TypeParameter] T1 # 48| 1: [TypeParameter] T2 -# 51| 5: [Class] Inner`2 +# 51| 6: [Class] Inner`2 #-----| 1: (Type parameters) # 51| 0: [TypeParameter] U1 # 51| 1: [TypeParameter] U2 -# 54| 5: [Field] t +# 54| 6: [Field] t # 54| -1: [TypeMention] T1 -# 55| 6: [Field] myFunc +# 55| 7: [Field] myFunc # 55| -1: [TypeMention] Func # 55| 1: [TypeMention] U1 # 55| 2: [TypeMention] T1 -# 56| 7: [Method] MyMethod`2 +# 56| 8: [Method] MyMethod`2 # 56| -1: [TypeMention] Void #-----| 1: (Type parameters) # 56| 0: [TypeParameter] W1 @@ -368,13 +368,13 @@ generics.cs: # 60| 6: [Class] Grid`1 #-----| 1: (Type parameters) # 60| 0: [TypeParameter] T -# 63| 5: [Field] NumRows +# 63| 6: [Field] NumRows # 63| -1: [TypeMention] int # 63| 1: [IntLiteral] 26 -# 64| 6: [Field] NumCols +# 64| 7: [Field] NumCols # 64| -1: [TypeMention] int # 64| 1: [IntLiteral] 10 -# 66| 7: [Field] cells +# 66| 8: [Field] cells # 66| -1: [TypeMention] T[,] # 66| 1: [TypeMention] T # 66| 1: [ArrayCreation] array creation of type T[,] @@ -382,7 +382,7 @@ generics.cs: # 66| 1: [TypeMention] T # 66| 0: [MemberConstantAccess] access to constant NumRows # 66| 1: [MemberConstantAccess] access to constant NumCols -# 68| 8: [Indexer] Item +# 68| 9: [Indexer] Item # 68| -1: [TypeMention] int #-----| 1: (Parameters) # 68| 0: [Parameter] i @@ -393,7 +393,7 @@ generics.cs: # 70| 4: [BlockStmt] {...} # 70| 0: [ReturnStmt] return ...; # 70| 0: [ParameterAccess] access to parameter i -# 73| 9: [Indexer] Item +# 73| 10: [Indexer] Item # 73| -1: [TypeMention] T #-----| 1: (Parameters) # 73| 0: [Parameter] c @@ -502,7 +502,7 @@ generics.cs: # 99| 1: [ParameterAccess] access to parameter col # 99| 1: [ParameterAccess] access to parameter value # 105| 7: [Class] Test -# 108| 5: [Method] Main +# 108| 6: [Method] Main # 108| -1: [TypeMention] Void # 109| 4: [BlockStmt] {...} # 110| 0: [LocalVariableDeclStmt] ... ...; @@ -605,7 +605,7 @@ generics.cs: # 128| 0: [ObjectCreation] object creation of type Test # 128| 0: [TypeMention] Test # 128| 1: [IntLiteral] 2 -# 131| 6: [Method] f +# 131| 7: [Method] f # 131| -1: [TypeMention] string #-----| 2: (Parameters) # 131| 0: [Parameter] s @@ -614,7 +614,7 @@ generics.cs: # 131| 0: [ReturnStmt] return ...; # 131| 0: [ParameterAccess] access to parameter s # 135| 8: [Class] Subtle -# 138| 5: [Method] fs`1 +# 138| 6: [Method] fs`1 # 138| -1: [TypeMention] Void #-----| 1: (Type parameters) # 138| 0: [TypeParameter] X @@ -622,7 +622,7 @@ generics.cs: # 138| 0: [Parameter] i # 138| -1: [TypeMention] int # 138| 4: [BlockStmt] {...} -# 140| 6: [Method] fs`1 +# 140| 7: [Method] fs`1 # 140| -1: [TypeMention] Void #-----| 1: (Type parameters) # 140| 0: [TypeParameter] X @@ -632,7 +632,7 @@ generics.cs: # 140| 1: [Parameter] j # 140| -1: [TypeMention] int # 140| 4: [BlockStmt] {...} -# 142| 7: [Method] fs +# 142| 8: [Method] fs # 142| -1: [TypeMention] Void #-----| 2: (Parameters) # 142| 0: [Parameter] i @@ -641,15 +641,15 @@ generics.cs: # 146| 9: [Class] Param`1 #-----| 1: (Type parameters) # 146| 0: [TypeParameter] T -# 148| 5: [Enum] E +# 148| 6: [Enum] E # 148| 5: [Field] x # 151| 10: [Class] ConstructedMethods -# 153| 7: [Method] CM1`1 +# 153| 8: [Method] CM1`1 # 153| -1: [TypeMention] Void #-----| 1: (Type parameters) # 153| 0: [TypeParameter] T # 153| 4: [BlockStmt] {...} -# 154| 10: [Method] CM2`1 +# 154| 11: [Method] CM2`1 # 154| -1: [TypeMention] T #-----| 1: (Type parameters) # 154| 0: [TypeParameter] T @@ -659,10 +659,10 @@ generics.cs: # 154| 4: [BlockStmt] {...} # 154| 0: [ReturnStmt] return ...; # 154| 0: [ParameterAccess] access to parameter t -# 156| 13: [Class] Class`1 +# 156| 14: [Class] Class`1 #-----| 1: (Type parameters) # 156| 0: [TypeParameter] T1 -# 158| 5: [Method] CM3`1 +# 158| 6: [Method] CM3`1 # 158| -1: [TypeMention] T2 #-----| 1: (Type parameters) # 158| 0: [TypeParameter] T2 @@ -674,10 +674,10 @@ generics.cs: # 158| 4: [BlockStmt] {...} # 158| 0: [ReturnStmt] return ...; # 158| 0: [ParameterAccess] access to parameter t -# 161| 14: [Method] NonCM +# 161| 15: [Method] NonCM # 161| -1: [TypeMention] Void # 161| 4: [BlockStmt] {...} -# 163| 15: [Method] CM +# 163| 16: [Method] CM # 163| -1: [TypeMention] Void # 164| 4: [BlockStmt] {...} # 165| 0: [ExprStmt] ...; @@ -718,14 +718,14 @@ generics.cs: #-----| 3: (Base types) # 179| 1: [TypeMention] Interface # 179| 1: [TypeMention] T -# 181| 5: [Method] set +# 181| 6: [Method] set # 181| -1: [TypeMention] Void #-----| 2: (Parameters) # 181| 0: [Parameter] t # 181| -1: [TypeMention] T # 181| 4: [BlockStmt] {...} # 184| 13: [Class] InheritanceTest -# 186| 5: [Field] member +# 186| 6: [Field] member # 186| -1: [TypeMention] Inheritance # 186| 1: [TypeMention] int # 189| 14: [Interface] Interface2`2 diff --git a/csharp/ql/test/library-tests/goto/Goto1.expected b/csharp/ql/test/library-tests/goto/Goto1.expected index 0baaf5ef723..137c1b7241c 100644 --- a/csharp/ql/test/library-tests/goto/Goto1.expected +++ b/csharp/ql/test/library-tests/goto/Goto1.expected @@ -1,6 +1,8 @@ | goto.cs:2:7:2:10 | call to constructor Object | goto.cs:2:7:2:10 | {...} | semmle.label | successor | -| goto.cs:2:7:2:10 | enter Goto | goto.cs:2:7:2:10 | call to constructor Object | semmle.label | successor | +| goto.cs:2:7:2:10 | call to method | goto.cs:2:7:2:10 | call to constructor Object | semmle.label | successor | +| goto.cs:2:7:2:10 | enter Goto | goto.cs:2:7:2:10 | this access | semmle.label | successor | | goto.cs:2:7:2:10 | exit Goto (normal) | goto.cs:2:7:2:10 | exit Goto | semmle.label | successor | +| goto.cs:2:7:2:10 | this access | goto.cs:2:7:2:10 | call to method | semmle.label | successor | | goto.cs:2:7:2:10 | {...} | goto.cs:2:7:2:10 | exit Goto (normal) | semmle.label | successor | | goto.cs:4:17:4:20 | enter Main | goto.cs:5:5:20:5 | {...} | semmle.label | successor | | goto.cs:4:17:4:20 | exit Main (normal) | goto.cs:4:17:4:20 | exit Main | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/goto/PrintAst.expected b/csharp/ql/test/library-tests/goto/PrintAst.expected index a6ecfb8c301..e90947ed979 100644 --- a/csharp/ql/test/library-tests/goto/PrintAst.expected +++ b/csharp/ql/test/library-tests/goto/PrintAst.expected @@ -1,6 +1,6 @@ goto.cs: # 2| [Class] Goto -# 4| 5: [Method] Main +# 4| 6: [Method] Main # 4| -1: [TypeMention] Void # 5| 4: [BlockStmt] {...} # 6| 0: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/implicittostring/implicitToString.expected b/csharp/ql/test/library-tests/implicittostring/implicitToString.expected index 14efebf2320..e42817cc306 100644 --- a/csharp/ql/test/library-tests/implicittostring/implicitToString.expected +++ b/csharp/ql/test/library-tests/implicittostring/implicitToString.expected @@ -1,3 +1,8 @@ +| implicitToString.cs:3:14:3:33 | call to method | TestImplicitToString | +| implicitToString.cs:5:18:5:26 | call to method | Container | +| implicitToString.cs:13:18:13:27 | call to method | Container2 | +| implicitToString.cs:15:18:15:27 | call to method | Container3 | +| implicitToString.cs:17:18:17:37 | call to method | FormattableContainer | | implicitToString.cs:35:27:35:35 | call to method ToString | Container | | implicitToString.cs:37:22:37:30 | call to method ToString | Container | | implicitToString.cs:39:22:39:30 | call to method ToString | Container | diff --git a/csharp/ql/test/library-tests/indexers/PrintAst.expected b/csharp/ql/test/library-tests/indexers/PrintAst.expected index 6f9fde00e24..93160309c79 100644 --- a/csharp/ql/test/library-tests/indexers/PrintAst.expected +++ b/csharp/ql/test/library-tests/indexers/PrintAst.expected @@ -1,12 +1,12 @@ indexers.cs: # 5| [NamespaceDeclaration] namespace ... { ... } # 8| 1: [Class] BitArray -# 11| 4: [Field] bits +# 11| 5: [Field] bits # 11| -1: [TypeMention] Int32[] # 11| 1: [TypeMention] int -# 12| 5: [Field] length +# 12| 6: [Field] length # 12| -1: [TypeMention] int -# 14| 6: [InstanceConstructor] BitArray +# 14| 7: [InstanceConstructor] BitArray #-----| 2: (Parameters) # 14| 0: [Parameter] length # 14| -1: [TypeMention] int @@ -36,13 +36,13 @@ indexers.cs: # 19| 0: [FieldAccess] access to field length # 19| -1: [ThisAccess] this access # 19| 1: [ParameterAccess] access to parameter length -# 22| 7: [Property] Length +# 22| 8: [Property] Length # 22| -1: [TypeMention] int # 22| 3: [Getter] get_Length # 22| 4: [BlockStmt] {...} # 22| 0: [ReturnStmt] return ...; # 22| 0: [FieldAccess] access to field length -# 24| 8: [Indexer] Item +# 24| 9: [Indexer] Item # 24| -1: [TypeMention] bool #-----| 1: (Parameters) # 24| 0: [Parameter] index @@ -118,7 +118,7 @@ indexers.cs: # 46| 0: [IntLiteral] 1 # 46| 1: [ParameterAccess] access to parameter index # 53| 2: [Class] CountPrimes -# 56| 5: [Method] Count +# 56| 6: [Method] Count # 56| -1: [TypeMention] int #-----| 2: (Parameters) # 56| 0: [Parameter] max @@ -179,7 +179,7 @@ indexers.cs: # 66| 0: [LocalVariableAccess] access to local variable count # 69| 3: [ReturnStmt] return ...; # 69| 0: [LocalVariableAccess] access to local variable count -# 72| 6: [Method] Main +# 72| 7: [Method] Main # 72| -1: [TypeMention] Void #-----| 2: (Parameters) # 72| 0: [Parameter] args @@ -212,13 +212,13 @@ indexers.cs: # 76| 2: [CastExpr] (...) ... # 76| 1: [LocalVariableAccess] access to local variable max # 81| 3: [Class] Grid -# 84| 5: [Field] NumRows +# 84| 6: [Field] NumRows # 84| -1: [TypeMention] int # 84| 1: [IntLiteral] 26 -# 85| 6: [Field] NumCols +# 85| 7: [Field] NumCols # 85| -1: [TypeMention] int # 85| 1: [IntLiteral] 10 -# 87| 7: [Field] cells +# 87| 8: [Field] cells # 87| -1: [TypeMention] Int32[,] # 87| 1: [TypeMention] int # 87| 1: [ArrayCreation] array creation of type Int32[,] @@ -226,7 +226,7 @@ indexers.cs: # 87| 1: [TypeMention] int # 87| 0: [MemberConstantAccess] access to constant NumRows # 87| 1: [MemberConstantAccess] access to constant NumCols -# 89| 8: [Indexer] Item +# 89| 9: [Indexer] Item # 89| -1: [TypeMention] int #-----| 1: (Parameters) # 89| 0: [Parameter] c @@ -335,7 +335,7 @@ indexers.cs: # 115| 1: [ParameterAccess] access to parameter col # 115| 1: [ParameterAccess] access to parameter value # 121| 4: [Class] DuplicateIndexerSignatures -# 123| 5: [Indexer] Item +# 123| 6: [Indexer] Item # 123| -1: [TypeMention] bool #-----| 1: (Parameters) # 123| 0: [Parameter] index @@ -346,7 +346,7 @@ indexers.cs: # 125| 4: [BlockStmt] {...} # 125| 0: [ReturnStmt] return ...; # 125| 0: [BoolLiteral] false -# 128| 6: [Indexer] Item +# 128| 7: [Indexer] Item # 128| -1: [TypeMention] int #-----| 1: (Parameters) # 128| 0: [Parameter] c diff --git a/csharp/ql/test/library-tests/initializers/PrintAst.expected b/csharp/ql/test/library-tests/initializers/PrintAst.expected index 29b7ca47003..f59bb2f135f 100644 --- a/csharp/ql/test/library-tests/initializers/PrintAst.expected +++ b/csharp/ql/test/library-tests/initializers/PrintAst.expected @@ -1,14 +1,14 @@ initializers.cs: # 3| [Class] S1 -# 5| 5: [Field] P1 +# 5| 6: [Field] P1 # 5| -1: [TypeMention] int -# 6| 6: [Property] P2 +# 6| 7: [Property] P2 # 6| -1: [TypeMention] int # 6| 3: [Getter] get_P2 # 6| 4: [Setter] set_P2 #-----| 2: (Parameters) # 6| 0: [Parameter] value -# 7| 7: [Property] P3 +# 7| 8: [Property] P3 # 7| -1: [TypeMention] int # 7| 3: [Setter] set_P3 #-----| 2: (Parameters) @@ -17,13 +17,13 @@ initializers.cs: # 10| [Class] S2 #-----| 3: (Base types) # 10| 1: [TypeMention] IEnumerable -# 12| 5: [Method] Add +# 12| 6: [Method] Add # 12| -1: [TypeMention] Void #-----| 2: (Parameters) # 12| 0: [Parameter] x # 12| -1: [TypeMention] int # 12| 4: [BlockStmt] {...} -# 13| 6: [Method] Add +# 13| 7: [Method] Add # 13| -1: [TypeMention] Void #-----| 2: (Parameters) # 13| 0: [Parameter] x @@ -31,13 +31,13 @@ initializers.cs: # 13| 1: [Parameter] y # 13| -1: [TypeMention] int # 13| 4: [BlockStmt] {...} -# 14| 7: [Method] GetEnumerator +# 14| 8: [Method] GetEnumerator # 14| -1: [TypeMention] IEnumerator # 14| 4: [BlockStmt] {...} # 14| 0: [ReturnStmt] return ...; # 14| 0: [NullLiteral] null # 17| [Class] Test -# 19| 5: [Method] Main +# 19| 6: [Method] Main # 19| -1: [TypeMention] Void #-----| 2: (Parameters) # 19| 0: [Parameter] args diff --git a/csharp/ql/test/library-tests/linq/PrintAst.expected b/csharp/ql/test/library-tests/linq/PrintAst.expected index fee8ab80ee2..c16babcf270 100644 --- a/csharp/ql/test/library-tests/linq/PrintAst.expected +++ b/csharp/ql/test/library-tests/linq/PrintAst.expected @@ -1,6 +1,6 @@ queries.cs: # 5| [Class] Queries -# 7| 5: [Method] Queries1 +# 7| 6: [Method] Queries1 # 7| -1: [TypeMention] Void # 8| 4: [BlockStmt] {...} # 9| 0: [LocalVariableDeclStmt] ... ...; @@ -204,19 +204,19 @@ queries.cs: # 56| 1: [TupleExpr] (..., ...) # 56| 0: [LocalVariableAccess] access to local variable a # 56| 1: [LocalVariableAccess] access to local variable d -# 59| 6: [Class] A +# 59| 7: [Class] A #-----| 3: (Base types) # 59| 1: [TypeMention] IEnumerable -# 61| 5: [Method] GetEnumerator +# 61| 6: [Method] GetEnumerator # 61| -1: [TypeMention] IEnumerator # 62| 4: [BlockStmt] {...} # 63| 0: [ThrowStmt] throw ...; # 63| 0: [ObjectCreation] object creation of type NotImplementedException # 63| 0: [TypeMention] NotImplementedException -# 67| 7: [Class] B +# 67| 8: [Class] B #-----| 3: (Base types) # 67| 0: [TypeMention] A -# 69| 8: [Class] C +# 69| 9: [Class] C #-----| 3: (Base types) # 69| 0: [TypeMention] List # 69| 1: [TypeMention] int diff --git a/csharp/ql/test/library-tests/locations/locations.expected b/csharp/ql/test/library-tests/locations/locations.expected index d41369ddcd4..1d19fc3f0c5 100644 --- a/csharp/ql/test/library-tests/locations/locations.expected +++ b/csharp/ql/test/library-tests/locations/locations.expected @@ -19,6 +19,7 @@ member_locations | A.cs:3:23:3:26 | A | A.cs:12:12:12:12 | A | A.cs:12:12:12:12 | A.cs:12:12:12:12 | | A.cs:3:23:3:26 | A | A.cs:13:6:13:6 | ~A | A.cs:13:6:13:6 | A.cs:13:6:13:6 | | A.cs:3:23:3:26 | A | A.cs:14:33:14:33 | + | A.cs:14:33:14:33 | A.cs:14:33:14:33 | +| A.cs:3:23:3:26 | A`1 | A.cs:3:23:3:26 | | A.cs:3:23:3:26 | A.cs:3:23:3:26 | | A.cs:3:23:3:26 | A`1 | A.cs:5:23:5:26 | Prop | A.cs:5:23:5:26 | A.cs:5:23:5:26 | | A.cs:3:23:3:26 | A`1 | A.cs:6:23:6:26 | Item | A.cs:6:23:6:26 | A.cs:6:23:6:26 | | A.cs:3:23:3:26 | A`1 | A.cs:7:40:7:44 | Event | A.cs:7:40:7:44 | A.cs:7:40:7:44 | @@ -29,12 +30,14 @@ member_locations | A.cs:3:23:3:26 | A`1 | A.cs:12:12:12:12 | A | A.cs:12:12:12:12 | A.cs:12:12:12:12 | | A.cs:3:23:3:26 | A`1 | A.cs:13:6:13:6 | ~A | A.cs:13:6:13:6 | A.cs:13:6:13:6 | | A.cs:3:23:3:26 | A`1 | A.cs:14:33:14:33 | + | A.cs:14:33:14:33 | A.cs:14:33:14:33 | +| A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | | A.cs:17:14:17:15 | A.cs:17:14:17:15 | | A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | A2 | A.cs:17:14:17:15 | A.cs:17:14:17:15 | | A.cs:17:14:17:15 | A2 | A.cs:19:28:19:31 | Prop | A.cs:19:28:19:31 | A.cs:19:28:19:31 | | A.cs:17:14:17:15 | A2 | A.cs:21:28:21:31 | Item | A.cs:21:28:21:31 | A.cs:21:28:21:31 | | A.cs:17:14:17:15 | A2 | A.cs:27:40:27:44 | Event | A.cs:27:40:27:44 | A.cs:27:40:27:44 | | A.cs:17:14:17:15 | A2 | A.cs:33:28:33:35 | ToObject | A.cs:33:28:33:35 | A.cs:33:28:33:35 | | A.cs:17:14:17:15 | A2 | A.cs:35:17:35:17 | M | A.cs:35:17:35:17 | A.cs:35:17:35:17 | +| B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | | B.cs:3:14:3:14 | B.cs:3:14:3:14 | | B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B | B.cs:3:14:3:14 | B.cs:3:14:3:14 | | B.cs:3:14:3:14 | B | B.cs:5:25:5:28 | Prop | B.cs:5:25:5:28 | B.cs:5:25:5:28 | | B.cs:3:14:3:14 | B | B.cs:7:25:7:28 | Item | B.cs:7:25:7:28 | B.cs:7:25:7:28 | @@ -44,21 +47,32 @@ member_locations | Base.cs:1:23:1:29 | Base | Base.cs:3:17:3:17 | M | Base.cs:3:17:3:17 | Base.cs:3:17:3:17 | | Base.cs:1:23:1:29 | Base | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | | Base.cs:1:23:1:29 | Base`1 | Base.cs:1:23:1:26 | Base | Base.cs:1:23:1:26 | Base.cs:1:23:1:26 | +| Base.cs:1:23:1:29 | Base`1 | Base.cs:1:23:1:29 | | Base.cs:1:23:1:29 | Base.cs:1:23:1:29 | | Base.cs:1:23:1:29 | Base`1 | Base.cs:3:17:3:17 | M | Base.cs:3:17:3:17 | Base.cs:3:17:3:17 | | Base.cs:1:23:1:29 | Base`1 | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | +| Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | InnerBase | Base.cs:5:18:5:26 | Base.cs:5:18:5:26 | | Base.cs:8:23:8:30 | Base2`1 | Base.cs:8:23:8:27 | Base2 | Base.cs:8:23:8:27 | Base.cs:8:23:8:27 | +| Base.cs:8:23:8:30 | Base2`1 | Base.cs:8:23:8:30 | | Base.cs:8:23:8:30 | Base.cs:8:23:8:30 | +| C.cs:3:7:3:7 | C | C.cs:3:7:3:7 | | C.cs:3:7:3:7 | C.cs:3:7:3:7 | | C.cs:3:7:3:7 | C | C.cs:3:7:3:7 | C | C.cs:3:7:3:7 | C.cs:3:7:3:7 | | C.cs:3:7:3:7 | C | C.cs:5:17:5:17 | M | C.cs:5:17:5:17 | C.cs:5:17:5:17 | +| Multiple1.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | | Multiple1.cs:1:22:1:29 | Multiple1.cs:1:22:1:29 | | Multiple1.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple1.cs:1:22:1:29 | | Multiple1.cs:3:22:3:39 | MultipleGeneric`1 | Multiple1.cs:3:22:3:36 | MultipleGeneric | Multiple1.cs:3:22:3:36 | Multiple1.cs:3:22:3:36 | +| Multiple1.cs:3:22:3:39 | MultipleGeneric`1 | Multiple1.cs:3:22:3:39 | | Multiple1.cs:3:22:3:39 | Multiple1.cs:3:22:3:39 | +| Multiple1.cs:5:14:5:30 | Multiple1Specific | Multiple1.cs:5:14:5:30 | | Multiple1.cs:5:14:5:30 | Multiple1.cs:5:14:5:30 | | Multiple1.cs:5:14:5:30 | Multiple1Specific | Multiple1.cs:5:14:5:30 | Multiple1Specific | Multiple1.cs:5:14:5:30 | Multiple1.cs:5:14:5:30 | | Multiple1.cs:5:14:5:30 | Multiple1Specific | Multiple1.cs:7:33:7:33 | M | Multiple1.cs:7:33:7:33 | Multiple1.cs:7:33:7:33 | +| Multiple2.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | | Multiple1.cs:1:22:1:29 | Multiple1.cs:1:22:1:29 | | Multiple2.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple | Multiple1.cs:1:22:1:29 | Multiple1.cs:1:22:1:29 | | Multiple2.cs:3:22:3:39 | MultipleGeneric`1 | Multiple1.cs:3:22:3:36 | MultipleGeneric | Multiple1.cs:3:22:3:36 | Multiple1.cs:3:22:3:36 | +| Multiple2.cs:3:22:3:39 | MultipleGeneric`1 | Multiple1.cs:3:22:3:39 | | Multiple1.cs:3:22:3:39 | Multiple1.cs:3:22:3:39 | +| Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:5:14:5:30 | | Multiple2.cs:5:14:5:30 | Multiple2.cs:5:14:5:30 | | Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:5:14:5:30 | Multiple2.cs:5:14:5:30 | | Multiple2.cs:5:14:5:30 | Multiple2Specific | Multiple2.cs:7:17:7:17 | M | Multiple2.cs:7:17:7:17 | Multiple2.cs:7:17:7:17 | +| Sub.cs:1:14:1:16 | Sub | Sub.cs:1:14:1:16 | | Sub.cs:1:14:1:16 | Sub.cs:1:14:1:16 | | Sub.cs:1:14:1:16 | Sub | Sub.cs:1:14:1:16 | Sub | Sub.cs:1:14:1:16 | Sub.cs:1:14:1:16 | | Sub.cs:1:14:1:16 | Sub | Sub.cs:3:17:3:20 | SubM | Sub.cs:3:17:3:20 | Sub.cs:3:17:3:20 | accessor_location diff --git a/csharp/ql/test/library-tests/members/PrintAst.expected b/csharp/ql/test/library-tests/members/PrintAst.expected index c8fe6fbf5d9..3d1f4a344a4 100644 --- a/csharp/ql/test/library-tests/members/PrintAst.expected +++ b/csharp/ql/test/library-tests/members/PrintAst.expected @@ -7,8 +7,8 @@ Members.cs: # 3| 1: [Parameter] e # 3| -1: [TypeMention] object # 6| 2: [Class] Class -# 9| 5: [Class] NestedClass -# 12| 5: [Method] Method`1 +# 9| 6: [Class] NestedClass +# 12| 6: [Method] Method`1 # 12| -1: [TypeMention] string #-----| 1: (Type parameters) # 12| 0: [TypeParameter] T @@ -17,7 +17,7 @@ Members.cs: # 12| -1: [TypeMention] T # 12| 4: [MethodCall] call to method ToString # 12| -1: [ParameterAccess] access to parameter t -# 14| 6: [Indexer] Item +# 14| 7: [Indexer] Item # 14| -1: [TypeMention] string #-----| 1: (Parameters) # 14| 0: [Parameter] i @@ -32,15 +32,15 @@ Members.cs: # 14| 0: [Parameter] i # 14| 1: [Parameter] value # 14| 4: [BlockStmt] {...} -# 16| 7: [Field] Field +# 16| 8: [Field] Field # 16| -1: [TypeMention] string -# 18| 8: [Property] Prop +# 18| 9: [Property] Prop # 18| -1: [TypeMention] string # 18| 3: [Getter] get_Prop # 18| 4: [Setter] set_Prop #-----| 2: (Parameters) # 18| 0: [Parameter] value -# 20| 9: [Event] Event +# 20| 10: [Event] Event # 20| -1: [TypeMention] EventHandler # 20| 3: [AddEventAccessor] add_Event #-----| 2: (Parameters) @@ -48,10 +48,10 @@ Members.cs: # 20| 4: [RemoveEventAccessor] remove_Event #-----| 2: (Parameters) # 20| 0: [Parameter] value -# 24| 6: [Method] Method +# 24| 7: [Method] Method # 24| -1: [TypeMention] Void # 24| 4: [BlockStmt] {...} -# 26| 7: [Indexer] Item +# 26| 8: [Indexer] Item # 26| -1: [TypeMention] string #-----| 1: (Parameters) # 26| 0: [Parameter] i @@ -66,15 +66,15 @@ Members.cs: # 26| 0: [Parameter] i # 26| 1: [Parameter] value # 26| 4: [BlockStmt] {...} -# 28| 8: [Field] Field +# 28| 9: [Field] Field # 28| -1: [TypeMention] string -# 30| 9: [Property] Prop +# 30| 10: [Property] Prop # 30| -1: [TypeMention] string # 30| 3: [Getter] get_Prop # 30| 4: [Setter] set_Prop #-----| 2: (Parameters) # 30| 0: [Parameter] value -# 32| 10: [Event] Event +# 32| 11: [Event] Event # 32| -1: [TypeMention] EventHandler # 32| 3: [AddEventAccessor] add_Event #-----| 2: (Parameters) @@ -83,8 +83,8 @@ Members.cs: #-----| 2: (Parameters) # 32| 0: [Parameter] value # 35| 3: [Class] Class2 -# 37| 5: [Class] NestedClass2 -# 39| 5: [Method] Method`1 +# 37| 6: [Class] NestedClass2 +# 39| 6: [Method] Method`1 # 39| -1: [TypeMention] string #-----| 1: (Type parameters) # 39| 0: [TypeParameter] T @@ -93,7 +93,7 @@ Members.cs: # 39| -1: [TypeMention] T # 39| 4: [MethodCall] call to method ToString # 39| -1: [ParameterAccess] access to parameter t -# 40| 6: [Indexer] Item +# 40| 7: [Indexer] Item # 40| -1: [TypeMention] string #-----| 1: (Parameters) # 40| 0: [Parameter] i @@ -108,15 +108,15 @@ Members.cs: # 40| 0: [Parameter] i # 40| 1: [Parameter] value # 40| 4: [BlockStmt] {...} -# 41| 7: [Field] Field +# 41| 8: [Field] Field # 41| -1: [TypeMention] string -# 42| 8: [Property] Prop +# 42| 9: [Property] Prop # 42| -1: [TypeMention] string # 42| 3: [Getter] get_Prop # 42| 4: [Setter] set_Prop #-----| 2: (Parameters) # 42| 0: [Parameter] value -# 43| 9: [Event] Event +# 43| 10: [Event] Event # 43| -1: [TypeMention] EventHandler # 43| 3: [AddEventAccessor] add_Event #-----| 2: (Parameters) @@ -124,10 +124,10 @@ Members.cs: # 43| 4: [RemoveEventAccessor] remove_Event #-----| 2: (Parameters) # 43| 0: [Parameter] value -# 46| 6: [Method] Method +# 46| 7: [Method] Method # 46| -1: [TypeMention] Void # 46| 4: [BlockStmt] {...} -# 47| 7: [Indexer] Item +# 47| 8: [Indexer] Item # 47| -1: [TypeMention] string #-----| 1: (Parameters) # 47| 0: [Parameter] i @@ -142,15 +142,15 @@ Members.cs: # 47| 0: [Parameter] i # 47| 1: [Parameter] value # 47| 4: [BlockStmt] {...} -# 48| 8: [Field] Field +# 48| 9: [Field] Field # 48| -1: [TypeMention] string -# 49| 9: [Property] Prop +# 49| 10: [Property] Prop # 49| -1: [TypeMention] string # 49| 3: [Getter] get_Prop # 49| 4: [Setter] set_Prop #-----| 2: (Parameters) # 49| 0: [Parameter] value -# 50| 10: [Event] Event +# 50| 11: [Event] Event # 50| -1: [TypeMention] EventHandler # 50| 3: [AddEventAccessor] add_Event #-----| 2: (Parameters) diff --git a/csharp/ql/test/library-tests/methods/Methods5.ql b/csharp/ql/test/library-tests/methods/Methods5.ql index b7c74d24d13..eb2980a17da 100644 --- a/csharp/ql/test/library-tests/methods/Methods5.ql +++ b/csharp/ql/test/library-tests/methods/Methods5.ql @@ -1,5 +1,5 @@ /** - * @name Tests call graph. + * @name Tests call graph */ import csharp diff --git a/csharp/ql/test/library-tests/methods/PrintAst.expected b/csharp/ql/test/library-tests/methods/PrintAst.expected index 42268fdc89d..4810c6c0b5b 100644 --- a/csharp/ql/test/library-tests/methods/PrintAst.expected +++ b/csharp/ql/test/library-tests/methods/PrintAst.expected @@ -1,7 +1,7 @@ methods.cs: # 4| [NamespaceDeclaration] namespace ... { ... } # 7| 1: [Class] TestRef -# 10| 5: [Method] Swap +# 10| 6: [Method] Swap # 10| -1: [TypeMention] Void #-----| 2: (Parameters) # 10| 0: [Parameter] x @@ -22,7 +22,7 @@ methods.cs: # 14| 0: [AssignExpr] ... = ... # 14| 0: [ParameterAccess] access to parameter y # 14| 1: [LocalVariableAccess] access to local variable temp -# 17| 6: [Method] Main +# 17| 7: [Method] Main # 17| -1: [TypeMention] Void # 18| 4: [BlockStmt] {...} # 19| 0: [LocalVariableDeclStmt] ... ...; @@ -57,7 +57,7 @@ methods.cs: # 22| 2: [CastExpr] (...) ... # 22| 1: [LocalVariableAccess] access to local variable j # 26| 2: [Class] TestOut -# 29| 5: [Method] Divide +# 29| 6: [Method] Divide # 29| -1: [TypeMention] Void #-----| 2: (Parameters) # 29| 0: [Parameter] x @@ -81,7 +81,7 @@ methods.cs: # 32| 1: [RemExpr] ... % ... # 32| 0: [ParameterAccess] access to parameter x # 32| 1: [ParameterAccess] access to parameter y -# 35| 6: [Method] Main +# 35| 7: [Method] Main # 35| -1: [TypeMention] Void # 36| 4: [BlockStmt] {...} # 37| 0: [LocalVariableDeclStmt] ... ...; @@ -105,7 +105,7 @@ methods.cs: # 39| 2: [CastExpr] (...) ... # 39| 1: [LocalVariableAccess] access to local variable rem # 43| 3: [Class] Console -# 46| 5: [Method] Write +# 46| 6: [Method] Write # 46| -1: [TypeMention] Void #-----| 2: (Parameters) # 46| 0: [Parameter] fmt @@ -114,7 +114,7 @@ methods.cs: # 46| -1: [TypeMention] Object[] # 46| 1: [TypeMention] object # 46| 4: [BlockStmt] {...} -# 47| 6: [Method] WriteLine +# 47| 7: [Method] WriteLine # 47| -1: [TypeMention] Void #-----| 2: (Parameters) # 47| 0: [Parameter] fmt @@ -124,7 +124,7 @@ methods.cs: # 47| 1: [TypeMention] object # 47| 4: [BlockStmt] {...} # 50| 4: [Class] TestOverloading -# 53| 5: [Method] F +# 53| 6: [Method] F # 53| -1: [TypeMention] Void # 54| 4: [BlockStmt] {...} # 55| 0: [ExprStmt] ...; @@ -132,7 +132,7 @@ methods.cs: # 55| -1: [TypeAccess] access to type Console # 55| 0: [TypeMention] Console # 55| 0: [StringLiteralUtf16] "F()" -# 58| 6: [Method] F +# 58| 7: [Method] F # 58| -1: [TypeMention] Void #-----| 2: (Parameters) # 58| 0: [Parameter] x @@ -143,7 +143,7 @@ methods.cs: # 60| -1: [TypeAccess] access to type Console # 60| 0: [TypeMention] Console # 60| 0: [StringLiteralUtf16] "F(object)" -# 63| 7: [Method] F +# 63| 8: [Method] F # 63| -1: [TypeMention] Void #-----| 2: (Parameters) # 63| 0: [Parameter] x @@ -154,7 +154,7 @@ methods.cs: # 65| -1: [TypeAccess] access to type Console # 65| 0: [TypeMention] Console # 65| 0: [StringLiteralUtf16] "F(int)" -# 68| 8: [Method] F +# 68| 9: [Method] F # 68| -1: [TypeMention] Void #-----| 2: (Parameters) # 68| 0: [Parameter] x @@ -165,7 +165,7 @@ methods.cs: # 70| -1: [TypeAccess] access to type Console # 70| 0: [TypeMention] Console # 70| 0: [StringLiteralUtf16] "F(double)" -# 73| 11: [Method] F`1 +# 73| 12: [Method] F`1 # 73| -1: [TypeMention] Void #-----| 1: (Type parameters) # 73| 0: [TypeParameter] T @@ -178,7 +178,7 @@ methods.cs: # 75| -1: [TypeAccess] access to type Console # 75| 0: [TypeMention] Console # 75| 0: [StringLiteralUtf16] "F(T)" -# 78| 12: [Method] F +# 78| 13: [Method] F # 78| -1: [TypeMention] Void #-----| 2: (Parameters) # 78| 0: [Parameter] x @@ -191,7 +191,7 @@ methods.cs: # 80| -1: [TypeAccess] access to type Console # 80| 0: [TypeMention] Console # 80| 0: [StringLiteralUtf16] "F(double, double)" -# 83| 13: [Method] Main +# 83| 14: [Method] Main # 83| -1: [TypeMention] Void # 84| 4: [BlockStmt] {...} # 85| 0: [ExprStmt] ...; @@ -352,7 +352,7 @@ methods.cs: # 135| -1: [TypeAccess] access to type Boolean # 135| 0: [TypeMention] bool # 140| 7: [Class] TestDefaultParameters -# 142| 4: [Method] Method1 +# 142| 5: [Method] Method1 # 142| -1: [TypeMention] Void #-----| 2: (Parameters) # 142| 0: [Parameter] x @@ -360,7 +360,7 @@ methods.cs: # 142| 1: [Parameter] y # 142| -1: [TypeMention] int # 143| 4: [BlockStmt] {...} -# 146| 5: [Method] Method2 +# 146| 6: [Method] Method2 # 146| -1: [TypeMention] Void #-----| 2: (Parameters) # 146| 0: [Parameter] a @@ -379,12 +379,12 @@ methods.cs: # 146| 0: [StringLiteralUtf16] "a" # 146| 1: [StringLiteralUtf16] "b" # 147| 4: [BlockStmt] {...} -# 150| 6: [InstanceConstructor] TestDefaultParameters +# 150| 7: [InstanceConstructor] TestDefaultParameters #-----| 2: (Parameters) # 150| 0: [Parameter] x # 150| -1: [TypeMention] int # 151| 4: [BlockStmt] {...} -# 154| 7: [InstanceConstructor] TestDefaultParameters +# 154| 8: [InstanceConstructor] TestDefaultParameters #-----| 2: (Parameters) # 154| 0: [Parameter] x # 154| -1: [TypeMention] string @@ -394,7 +394,7 @@ methods.cs: # 154| 1: [ObjectCreation] object creation of type Double # 154| 0: [TypeMention] double # 155| 4: [BlockStmt] {...} -# 158| 8: [DelegateType] Del +# 158| 9: [DelegateType] Del #-----| 2: (Parameters) # 158| 0: [Parameter] a # 158| -1: [TypeMention] string @@ -405,7 +405,7 @@ methods.cs: # 158| -1: [TypeMention] double # 158| 1: [ObjectCreation] object creation of type Double # 158| 0: [TypeMention] double -# 160| 9: [Indexer] Item +# 160| 10: [Indexer] Item # 160| -1: [TypeMention] int #-----| 1: (Parameters) # 160| 0: [Parameter] x @@ -477,7 +477,7 @@ methods.cs: # 185| 9: [Class] TestCollidingMethods`1 #-----| 1: (Type parameters) # 185| 0: [TypeParameter] T -# 187| 5: [Method] M +# 187| 6: [Method] M # 187| -1: [TypeMention] Void #-----| 2: (Parameters) # 187| 0: [Parameter] p1 @@ -485,7 +485,7 @@ methods.cs: # 187| 1: [Parameter] p2 # 187| -1: [TypeMention] int # 187| 4: [BlockStmt] {...} -# 188| 6: [Method] M +# 188| 7: [Method] M # 188| -1: [TypeMention] Void #-----| 2: (Parameters) # 188| 0: [Parameter] p1 @@ -493,7 +493,7 @@ methods.cs: # 188| 1: [Parameter] p2 # 188| -1: [TypeMention] int # 188| 4: [BlockStmt] {...} -# 190| 7: [Method] Calls +# 190| 8: [Method] Calls # 190| -1: [TypeMention] Void # 191| 4: [BlockStmt] {...} # 192| 0: [LocalVariableDeclStmt] ... ...; @@ -525,13 +525,13 @@ methods.cs: # 197| -1: [LocalVariableAccess] access to local variable y # 197| 0: [IntLiteral] 1 # 197| 1: [IntLiteral] 1 -# 200| 8: [Class] Nested -# 202| 4: [InstanceConstructor] Nested +# 200| 9: [Class] Nested +# 202| 5: [InstanceConstructor] Nested #-----| 2: (Parameters) # 202| 0: [Parameter] p1 # 202| -1: [TypeMention] int # 202| 4: [BlockStmt] {...} -# 203| 5: [InstanceConstructor] Nested +# 203| 6: [InstanceConstructor] Nested #-----| 2: (Parameters) # 203| 0: [Parameter] p1 # 203| -1: [TypeMention] T diff --git a/csharp/ql/test/library-tests/namespaces/PrintAst.expected b/csharp/ql/test/library-tests/namespaces/PrintAst.expected index 2b0e505ec27..88d8dbe02a7 100644 --- a/csharp/ql/test/library-tests/namespaces/PrintAst.expected +++ b/csharp/ql/test/library-tests/namespaces/PrintAst.expected @@ -26,7 +26,7 @@ namespaces.cs: # 72| 1: [Class] A`1 #-----| 1: (Type parameters) # 72| 0: [TypeParameter] T -# 75| 5: [Class] B +# 75| 6: [Class] B # 79| 2: [Class] A # 83| [NamespaceDeclaration] namespace ... { ... } # 90| [NamespaceDeclaration] namespace ... { ... } diff --git a/csharp/ql/test/library-tests/nestedtypes/PrintAst.expected b/csharp/ql/test/library-tests/nestedtypes/PrintAst.expected index 8a2f4343556..9a0c4a7f029 100644 --- a/csharp/ql/test/library-tests/nestedtypes/PrintAst.expected +++ b/csharp/ql/test/library-tests/nestedtypes/PrintAst.expected @@ -1,13 +1,13 @@ nestedtypes.cs: # 5| [NamespaceDeclaration] namespace ... { ... } # 8| 1: [Class] Base -# 11| 5: [Struct] S -# 13| 6: [Interface] I -# 15| 7: [DelegateType] MyDelegate +# 11| 6: [Struct] S +# 13| 7: [Interface] I +# 15| 8: [DelegateType] MyDelegate #-----| 2: (Parameters) # 15| 0: [Parameter] s # 15| -1: [TypeMention] S -# 17| 8: [Method] F +# 17| 9: [Method] F # 17| -1: [TypeMention] Void # 18| 4: [BlockStmt] {...} # 19| 0: [ExprStmt] ...; @@ -15,12 +15,12 @@ nestedtypes.cs: # 19| -1: [TypeAccess] access to type Console # 19| 0: [TypeMention] Console # 19| 0: [StringLiteralUtf16] "Base.F" -# 22| 9: [Class] C +# 22| 10: [Class] C # 26| 2: [Class] Derived #-----| 3: (Base types) # 26| 0: [TypeMention] Base -# 29| 5: [Class] Nested -# 32| 5: [Method] G +# 29| 6: [Class] Nested +# 32| 6: [Method] G # 32| -1: [TypeMention] Void # 33| 4: [BlockStmt] {...} # 34| 0: [LocalVariableDeclStmt] ... ...; @@ -33,7 +33,7 @@ nestedtypes.cs: # 35| 0: [MethodCall] call to method F # 35| -1: [LocalVariableAccess] access to local variable d # 42| 3: [Class] Test -# 45| 5: [Method] Main +# 45| 6: [Method] Main # 45| -1: [TypeMention] Void # 46| 4: [BlockStmt] {...} # 47| 0: [LocalVariableDeclStmt] ... ...; @@ -50,10 +50,10 @@ nestedtypes.cs: # 53| 4: [Class] Outer`1 #-----| 1: (Type parameters) # 53| 0: [TypeParameter] T -# 56| 6: [Class] Inner`1 +# 56| 7: [Class] Inner`1 #-----| 1: (Type parameters) # 56| 0: [TypeParameter] U -# 59| 5: [Method] F +# 59| 6: [Method] F # 59| -1: [TypeMention] Void #-----| 2: (Parameters) # 59| 0: [Parameter] t @@ -61,7 +61,7 @@ nestedtypes.cs: # 59| 1: [Parameter] u # 59| -1: [TypeMention] U # 59| 4: [BlockStmt] {...} -# 63| 7: [Method] F +# 63| 8: [Method] F # 63| -1: [TypeMention] Void #-----| 2: (Parameters) # 63| 0: [Parameter] t @@ -100,8 +100,8 @@ nestedtypes.cs: # 74| 5: [Class] Outer2`1 #-----| 1: (Type parameters) # 74| 0: [TypeParameter] T -# 77| 5: [Class] Inner2`1 +# 77| 6: [Class] Inner2`1 #-----| 1: (Type parameters) # 77| 0: [TypeParameter] T -# 80| 5: [Field] t +# 80| 6: [Field] t # 80| -1: [TypeMention] T diff --git a/csharp/ql/test/library-tests/nullable/NullableExpressions.expected b/csharp/ql/test/library-tests/nullable/NullableExpressions.expected index 675450ab2ee..7d66522f0b9 100644 --- a/csharp/ql/test/library-tests/nullable/NullableExpressions.expected +++ b/csharp/ql/test/library-tests/nullable/NullableExpressions.expected @@ -1,4 +1,6 @@ | 1 | 14 | nullable.cs:1:14:1:21 | Nullable | nullable.cs:1:14:1:21 | call to constructor Object | Object | +| 1 | 14 | nullable.cs:1:14:1:21 | Nullable | nullable.cs:1:14:1:21 | call to method | Void | +| 1 | 14 | nullable.cs:1:14:1:21 | call to method | nullable.cs:1:14:1:21 | this access | Nullable | | 5 | 13 | nullable.cs:5:9:6:24 | if (...) ... | nullable.cs:5:13:5:21 | ... == ... | Boolean | | 5 | 13 | nullable.cs:5:13:5:21 | ... == ... | nullable.cs:5:13:5:13 | access to parameter x | Nullable | | 5 | 18 | nullable.cs:5:13:5:21 | ... == ... | nullable.cs:5:18:5:21 | null | null | diff --git a/csharp/ql/test/library-tests/obinit/Flow.expected b/csharp/ql/test/library-tests/obinit/Flow.expected new file mode 100644 index 00000000000..a9306a762ff --- /dev/null +++ b/csharp/ql/test/library-tests/obinit/Flow.expected @@ -0,0 +1,20 @@ +edges +| obinit.cs:5:23:5:23 | [post] this access : A [field s] : String | obinit.cs:7:16:7:16 | [post] this access : A [field s] : String | provenance | | +| obinit.cs:5:27:5:34 | "source" : String | obinit.cs:5:23:5:23 | [post] this access : A [field s] : String | provenance | | +| obinit.cs:7:16:7:16 | [post] this access : A [field s] : String | obinit.cs:7:16:7:16 | this [Return] : A [field s] : String | provenance | | +| obinit.cs:7:16:7:16 | this [Return] : A [field s] : String | obinit.cs:20:19:20:25 | object creation of type A : A [field s] : String | provenance | | +| obinit.cs:20:15:20:15 | access to local variable a : A [field s] : String | obinit.cs:21:18:21:18 | access to local variable a : A [field s] : String | provenance | | +| obinit.cs:20:19:20:25 | object creation of type A : A [field s] : String | obinit.cs:20:15:20:15 | access to local variable a : A [field s] : String | provenance | | +| obinit.cs:21:18:21:18 | access to local variable a : A [field s] : String | obinit.cs:21:18:21:20 | access to field s | provenance | | +flow +| obinit.cs:21:18:21:20 | access to field s | +nodes +| obinit.cs:5:23:5:23 | [post] this access : A [field s] : String | semmle.label | [post] this access : A [field s] : String | +| obinit.cs:5:27:5:34 | "source" : String | semmle.label | "source" : String | +| obinit.cs:7:16:7:16 | [post] this access : A [field s] : String | semmle.label | [post] this access : A [field s] : String | +| obinit.cs:7:16:7:16 | this [Return] : A [field s] : String | semmle.label | this [Return] : A [field s] : String | +| obinit.cs:20:15:20:15 | access to local variable a : A [field s] : String | semmle.label | access to local variable a : A [field s] : String | +| obinit.cs:20:19:20:25 | object creation of type A : A [field s] : String | semmle.label | object creation of type A : A [field s] : String | +| obinit.cs:21:18:21:18 | access to local variable a : A [field s] : String | semmle.label | access to local variable a : A [field s] : String | +| obinit.cs:21:18:21:20 | access to field s | semmle.label | access to field s | +subpaths diff --git a/csharp/ql/test/library-tests/obinit/Flow.ql b/csharp/ql/test/library-tests/obinit/Flow.ql new file mode 100644 index 00000000000..54f0300546c --- /dev/null +++ b/csharp/ql/test/library-tests/obinit/Flow.ql @@ -0,0 +1,20 @@ +import csharp + +module FlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.asExpr().(StringLiteral).getValue() = "source" + } + + predicate isSink(DataFlow::Node sink) { + exists(MethodCall mc | + mc.getTarget().getUndecoratedName() = "Sink" and + mc.getAnArgument() = sink.asExpr() + ) + } +} + +module Flow = DataFlow::Global; + +import Flow::PathGraph + +query predicate flow(DataFlow::Node sink) { Flow::flowTo(sink) } diff --git a/csharp/ql/test/library-tests/obinit/Flow.qlref b/csharp/ql/test/library-tests/obinit/Flow.qlref new file mode 100644 index 00000000000..f48796a83f7 --- /dev/null +++ b/csharp/ql/test/library-tests/obinit/Flow.qlref @@ -0,0 +1,2 @@ +query: Flow.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/library-tests/obinit/ObInit.expected b/csharp/ql/test/library-tests/obinit/ObInit.expected new file mode 100644 index 00000000000..38dd8268680 --- /dev/null +++ b/csharp/ql/test/library-tests/obinit/ObInit.expected @@ -0,0 +1,25 @@ +method +| obinit.cs:2:18:2:18 | | obinit.cs:2:18:2:18 | A | +| obinit.cs:14:18:14:18 | | obinit.cs:14:18:14:18 | B | +call +| obinit.cs:7:16:7:16 | call to method | obinit.cs:2:18:2:18 | | obinit.cs:7:16:7:16 | A | +| obinit.cs:9:16:9:16 | call to method | obinit.cs:2:18:2:18 | | obinit.cs:9:16:9:16 | A | +| obinit.cs:15:16:15:16 | call to method | obinit.cs:14:18:14:18 | | obinit.cs:15:16:15:16 | B | +cfg +| obinit.cs:2:18:2:18 | | obinit.cs:3:13:3:13 | this access | obinit.cs:3:17:3:17 | 1 | normal | 0 | +| obinit.cs:2:18:2:18 | | obinit.cs:3:13:3:17 | ... = ... | obinit.cs:5:23:5:23 | this access | normal | 2 | +| obinit.cs:2:18:2:18 | | obinit.cs:3:17:3:17 | 1 | obinit.cs:3:13:3:17 | ... = ... | normal | 1 | +| obinit.cs:2:18:2:18 | | obinit.cs:5:23:5:23 | this access | obinit.cs:5:27:5:34 | "source" | normal | 3 | +| obinit.cs:2:18:2:18 | | obinit.cs:5:27:5:34 | "source" | obinit.cs:5:23:5:34 | ... = ... | normal | 4 | +| obinit.cs:7:16:7:16 | A | obinit.cs:7:16:7:16 | call to constructor Object | obinit.cs:7:20:7:22 | {...} | normal | 2 | +| obinit.cs:7:16:7:16 | A | obinit.cs:7:16:7:16 | call to method | obinit.cs:7:16:7:16 | call to constructor Object | normal | 1 | +| obinit.cs:7:16:7:16 | A | obinit.cs:7:16:7:16 | this access | obinit.cs:7:16:7:16 | call to method | normal | 0 | +| obinit.cs:9:16:9:16 | A | obinit.cs:9:16:9:16 | call to constructor Object | obinit.cs:9:25:9:27 | {...} | normal | 2 | +| obinit.cs:9:16:9:16 | A | obinit.cs:9:16:9:16 | call to method | obinit.cs:9:16:9:16 | call to constructor Object | normal | 1 | +| obinit.cs:9:16:9:16 | A | obinit.cs:9:16:9:16 | this access | obinit.cs:9:16:9:16 | call to method | normal | 0 | +| obinit.cs:11:16:11:16 | A | obinit.cs:11:34:11:37 | call to constructor A | obinit.cs:11:42:11:44 | {...} | normal | 1 | +| obinit.cs:11:16:11:16 | A | obinit.cs:11:39:11:39 | access to parameter y | obinit.cs:11:34:11:37 | call to constructor A | normal | 0 | +| obinit.cs:15:16:15:16 | B | obinit.cs:15:16:15:16 | call to method | obinit.cs:15:27:15:28 | 10 | normal | 1 | +| obinit.cs:15:16:15:16 | B | obinit.cs:15:16:15:16 | this access | obinit.cs:15:16:15:16 | call to method | normal | 0 | +| obinit.cs:15:16:15:16 | B | obinit.cs:15:22:15:25 | call to constructor A | obinit.cs:15:31:15:33 | {...} | normal | 3 | +| obinit.cs:15:16:15:16 | B | obinit.cs:15:27:15:28 | 10 | obinit.cs:15:22:15:25 | call to constructor A | normal | 2 | diff --git a/csharp/ql/test/library-tests/obinit/ObInit.ql b/csharp/ql/test/library-tests/obinit/ObInit.ql new file mode 100644 index 00000000000..cfd21d14b5e --- /dev/null +++ b/csharp/ql/test/library-tests/obinit/ObInit.ql @@ -0,0 +1,28 @@ +import csharp +import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl +import semmle.code.csharp.controlflow.internal.Completion +import semmle.code.csharp.dataflow.internal.DataFlowPrivate +import semmle.code.csharp.dataflow.internal.DataFlowDispatch + +query predicate method(ObjectInitMethod m, RefType t) { m.getDeclaringType() = t } + +query predicate call(Call c, ObjectInitMethod m, Callable src) { + c.getTarget() = m and c.getEnclosingCallable() = src +} + +predicate scope(Callable callable, AstNode n, int i) { + (callable instanceof ObjectInitMethod or callable instanceof Constructor) and + scopeFirst(callable, n) and + i = 0 + or + exists(AstNode prev | + scope(callable, prev, i - 1) and + succ(prev, n, _) and + i < 30 + ) +} + +query predicate cfg(Callable callable, AstNode pred, AstNode succ, Completion c, int i) { + scope(callable, pred, i) and + succ(pred, succ, c) +} diff --git a/csharp/ql/test/library-tests/obinit/obinit.cs b/csharp/ql/test/library-tests/obinit/obinit.cs new file mode 100644 index 00000000000..9a9c628e71f --- /dev/null +++ b/csharp/ql/test/library-tests/obinit/obinit.cs @@ -0,0 +1,30 @@ +namespace ObInit { + public class A { + int x = 1; + + public string s = "source"; + + public A() { } + + public A(int y) { } + + public A(int y, int z) : this(y) { } + } + + public class B : A { + public B() : base(10) { } + + static void Sink(string s) { } + + static void Foo() { + A a = new A(); + Sink(a.s); // $ flow + + A a2 = new A(0, 0); + Sink(a2.s); // $ MISSING: flow + + B b = new B(); + Sink(b.s); // $ MISSING: flow + } + } +} diff --git a/csharp/ql/test/library-tests/operators/PrintAst.expected b/csharp/ql/test/library-tests/operators/PrintAst.expected index 0b490c13d2c..d3b41fe05fb 100644 --- a/csharp/ql/test/library-tests/operators/PrintAst.expected +++ b/csharp/ql/test/library-tests/operators/PrintAst.expected @@ -1,18 +1,18 @@ operators.cs: # 5| [NamespaceDeclaration] namespace ... { ... } # 7| 1: [Class] IntVector -# 10| 4: [InstanceConstructor] IntVector +# 10| 5: [InstanceConstructor] IntVector #-----| 2: (Parameters) # 10| 0: [Parameter] length # 10| -1: [TypeMention] int # 10| 4: [BlockStmt] {...} -# 12| 5: [Property] Length +# 12| 6: [Property] Length # 12| -1: [TypeMention] int # 12| 3: [Getter] get_Length # 12| 4: [BlockStmt] {...} # 12| 0: [ReturnStmt] return ...; # 12| 0: [IntLiteral] 4 -# 14| 6: [Indexer] Item +# 14| 7: [Indexer] Item # 14| -1: [TypeMention] int #-----| 1: (Parameters) # 14| 0: [Parameter] index @@ -28,7 +28,7 @@ operators.cs: # 14| 0: [Parameter] index # 14| 1: [Parameter] value # 14| 4: [BlockStmt] {...} -# 16| 7: [IncrementOperator] ++ +# 16| 8: [IncrementOperator] ++ # 16| -1: [TypeMention] IntVector #-----| 2: (Parameters) # 16| 0: [Parameter] iv @@ -66,7 +66,7 @@ operators.cs: # 21| 2: [ReturnStmt] return ...; # 21| 0: [LocalVariableAccess] access to local variable temp # 26| 2: [Class] TestUnaryOperator -# 29| 5: [Method] Main +# 29| 6: [Method] Main # 29| -1: [TypeMention] Void # 30| 4: [BlockStmt] {...} # 31| 0: [LocalVariableDeclStmt] ... ...; @@ -90,9 +90,9 @@ operators.cs: # 34| 1: [OperatorCall] call to operator ++ # 34| 0: [LocalVariableAccess] access to local variable iv1 # 39| 3: [Struct] Digit -# 42| 5: [Field] value +# 42| 6: [Field] value # 42| -1: [TypeMention] byte -# 44| 6: [InstanceConstructor] Digit +# 44| 7: [InstanceConstructor] Digit #-----| 2: (Parameters) # 44| 0: [Parameter] value # 44| -1: [TypeMention] byte @@ -115,7 +115,7 @@ operators.cs: # 48| 0: [FieldAccess] access to field value # 48| -1: [ThisAccess] this access # 48| 1: [ParameterAccess] access to parameter value -# 51| 7: [ImplicitConversionOperator] implicit conversion +# 51| 8: [ImplicitConversionOperator] implicit conversion # 51| -1: [TypeMention] byte #-----| 2: (Parameters) # 51| 0: [Parameter] d @@ -124,7 +124,7 @@ operators.cs: # 53| 0: [ReturnStmt] return ...; # 53| 0: [FieldAccess] access to field value # 53| -1: [ParameterAccess] access to parameter d -# 56| 8: [ExplicitConversionOperator] explicit conversion +# 56| 9: [ExplicitConversionOperator] explicit conversion # 56| -1: [TypeMention] Digit #-----| 2: (Parameters) # 56| 0: [Parameter] b @@ -135,7 +135,7 @@ operators.cs: # 58| -1: [TypeMention] Digit # 58| 0: [ParameterAccess] access to parameter b # 63| 4: [Class] TestConversionOperator -# 66| 5: [Method] Main +# 66| 6: [Method] Main # 66| -1: [TypeMention] Void # 67| 4: [BlockStmt] {...} # 68| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/overlay/base/test.expected b/csharp/ql/test/library-tests/overlay/base/test.expected index 0c2b5750f2c..67a440b87db 100644 --- a/csharp/ql/test/library-tests/overlay/base/test.expected +++ b/csharp/ql/test/library-tests/overlay/base/test.expected @@ -1,5 +1,7 @@ expressions | A.cs:8:16:8:16 | call to constructor Object | +| A.cs:8:16:8:16 | call to method | +| A.cs:8:16:8:16 | this access | | A.cs:10:13:10:16 | access to field name | | A.cs:10:13:10:16 | this access | | A.cs:10:13:10:20 | ... = ... | @@ -34,7 +36,11 @@ expressions | A.cs:58:27:58:30 | this access | | A.cs:59:20:59:20 | access to local variable x | | A.cs:63:18:63:36 | call to constructor Attribute | +| A.cs:63:18:63:36 | call to method | +| A.cs:63:18:63:36 | this access | | A.cs:65:18:65:18 | call to constructor Object | +| A.cs:65:18:65:18 | call to method | +| A.cs:65:18:65:18 | this access | | Program.cs:9:17:9:20 | access to parameter args | | Program.cs:9:17:9:27 | access to property Length | | Program.cs:9:17:9:32 | ... == ... | @@ -56,6 +62,8 @@ expressions | Program.cs:16:31:16:31 | access to local variable a | | Program.cs:16:31:16:42 | call to method ToString | | Program.cs:21:16:21:22 | call to constructor Object | +| Program.cs:21:16:21:22 | call to method | +| Program.cs:21:16:21:22 | this access | | Program.cs:23:13:23:23 | access to field programName | | Program.cs:23:13:23:23 | this access | | Program.cs:23:13:23:27 | ... = ... | @@ -77,6 +85,8 @@ expressions | Program.cs:51:35:51:59 | "Program handler removed" | | Program.cs:57:20:57:20 | access to parameter b | | Program.cs:64:18:64:33 | call to constructor Attribute | +| Program.cs:64:18:64:33 | call to method | +| Program.cs:64:18:64:33 | this access | statements | A.cs:9:9:11:9 | {...} | | A.cs:10:13:10:21 | ...; | diff --git a/csharp/ql/test/library-tests/overlay/overlay/test.expected b/csharp/ql/test/library-tests/overlay/overlay/test.expected index d9d4d0ec6fe..bb9a82b3a23 100644 --- a/csharp/ql/test/library-tests/overlay/overlay/test.expected +++ b/csharp/ql/test/library-tests/overlay/overlay/test.expected @@ -1,6 +1,10 @@ expressions | A.cs:5:18:5:18 | call to constructor Object | +| A.cs:5:18:5:18 | call to method | +| A.cs:5:18:5:18 | this access | | A.cs:10:16:10:16 | call to constructor Object | +| A.cs:10:16:10:16 | call to method | +| A.cs:10:16:10:16 | this access | | A.cs:12:13:12:16 | access to field name | | A.cs:12:13:12:16 | this access | | A.cs:12:13:12:20 | ... = ... | @@ -40,6 +44,8 @@ expressions | A.cs:64:24:64:27 | this access | | A.cs:64:24:64:37 | call to method ToUpper | | A.cs:69:18:69:36 | call to constructor Attribute | +| A.cs:69:18:69:36 | call to method | +| A.cs:69:18:69:36 | this access | | Program.cs:9:17:9:20 | access to parameter args | | Program.cs:9:17:9:27 | access to property Length | | Program.cs:9:17:9:32 | ... == ... | @@ -61,6 +67,8 @@ expressions | Program.cs:16:31:16:31 | access to local variable a | | Program.cs:16:31:16:42 | call to method ToString | | Program.cs:21:16:21:22 | call to constructor Object | +| Program.cs:21:16:21:22 | call to method | +| Program.cs:21:16:21:22 | this access | | Program.cs:23:13:23:23 | access to field programName | | Program.cs:23:13:23:23 | this access | | Program.cs:23:13:23:27 | ... = ... | @@ -82,6 +90,8 @@ expressions | Program.cs:51:35:51:59 | "Program handler removed" | | Program.cs:57:20:57:20 | access to parameter b | | Program.cs:64:18:64:33 | call to constructor Attribute | +| Program.cs:64:18:64:33 | call to method | +| Program.cs:64:18:64:33 | this access | statements | A.cs:5:18:5:18 | {...} | | A.cs:11:9:13:9 | {...} | diff --git a/csharp/ql/test/library-tests/partial/Partial2.expected b/csharp/ql/test/library-tests/partial/Partial2.expected index 9dc3a24a4ce..87194dd3f9e 100644 --- a/csharp/ql/test/library-tests/partial/Partial2.expected +++ b/csharp/ql/test/library-tests/partial/Partial2.expected @@ -1,10 +1,15 @@ +| Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:1:15:1:26 | | | Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:4:18:4:42 | PartialMethodWithoutBody1 | | Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:5:17:5:23 | Method2 | | Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:14:18:14:39 | PartialMethodWithBody1 | | Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:15:17:15:23 | Method3 | +| Partial.cs:12:15:12:26 | TwoPartClass | Partial.cs:1:15:1:26 | | | Partial.cs:12:15:12:26 | TwoPartClass | Partial.cs:4:18:4:42 | PartialMethodWithoutBody1 | | Partial.cs:12:15:12:26 | TwoPartClass | Partial.cs:5:17:5:23 | Method2 | | Partial.cs:12:15:12:26 | TwoPartClass | Partial.cs:14:18:14:39 | PartialMethodWithBody1 | | Partial.cs:12:15:12:26 | TwoPartClass | Partial.cs:15:17:15:23 | Method3 | +| Partial.cs:32:15:32:33 | OnePartPartialClass | Partial.cs:32:15:32:33 | | | Partial.cs:32:15:32:33 | OnePartPartialClass | Partial.cs:34:18:34:42 | PartialMethodWithoutBody2 | | Partial.cs:32:15:32:33 | OnePartPartialClass | Partial.cs:35:17:35:23 | Method4 | +| PartialMultipleFiles1.cs:1:22:1:41 | PartialMultipleFiles | PartialMultipleFiles1.cs:1:22:1:41 | | +| PartialMultipleFiles2.cs:1:22:1:41 | PartialMultipleFiles | PartialMultipleFiles1.cs:1:22:1:41 | | diff --git a/csharp/ql/test/library-tests/partial/PrintAst.expected b/csharp/ql/test/library-tests/partial/PrintAst.expected index d97f6fc01f0..0729946b18b 100644 --- a/csharp/ql/test/library-tests/partial/PrintAst.expected +++ b/csharp/ql/test/library-tests/partial/PrintAst.expected @@ -1,19 +1,19 @@ Partial.cs: # 1| [Class] TwoPartClass -# 4| 5: [Method] PartialMethodWithoutBody1 +# 4| 6: [Method] PartialMethodWithoutBody1 # 4| -1: [TypeMention] Void -# 5| 6: [Method] Method2 +# 5| 7: [Method] Method2 # 5| -1: [TypeMention] Void # 5| 4: [BlockStmt] {...} -# 14| 7: [Method] PartialMethodWithBody1 +# 14| 8: [Method] PartialMethodWithBody1 # 3| -1: [TypeMention] Void # 14| 4: [BlockStmt] {...} -# 15| 8: [Method] Method3 +# 15| 9: [Method] Method3 # 15| -1: [TypeMention] Void # 15| 4: [BlockStmt] {...} -# 16| 9: [Field] _backingField +# 16| 10: [Field] _backingField # 16| -1: [TypeMention] object -# 18| 10: [Property] PartialProperty1 +# 18| 11: [Property] PartialProperty1 # 7| -1: [TypeMention] object # 18| -1: [TypeMention] object # 20| 3: [Getter] get_PartialProperty1 @@ -28,10 +28,10 @@ Partial.cs: # 21| 0: [AssignExpr] ... = ... # 21| 0: [FieldAccess] access to field _backingField # 21| 1: [ParameterAccess] access to parameter value -# 23| 11: [Field] _backingArray +# 23| 12: [Field] _backingArray # 23| -1: [TypeMention] Object[] # 23| 1: [TypeMention] object -# 25| 12: [Indexer] Item +# 25| 13: [Indexer] Item # 9| -1: [TypeMention] object # 25| -1: [TypeMention] object #-----| 1: (Parameters) @@ -58,22 +58,22 @@ Partial.cs: # 28| 0: [ParameterAccess] access to parameter index # 28| 1: [ParameterAccess] access to parameter value # 32| [Class] OnePartPartialClass -# 34| 5: [Method] PartialMethodWithoutBody2 +# 34| 6: [Method] PartialMethodWithoutBody2 # 34| -1: [TypeMention] Void -# 35| 6: [Method] Method4 +# 35| 7: [Method] Method4 # 35| -1: [TypeMention] Void # 35| 4: [BlockStmt] {...} # 38| [Class] NonPartialClass -# 40| 5: [Method] Method5 +# 40| 6: [Method] Method5 # 40| -1: [TypeMention] Void # 40| 4: [BlockStmt] {...} -# 41| 6: [Property] Property +# 41| 7: [Property] Property # 41| -1: [TypeMention] object # 41| 3: [Getter] get_Property # 41| 4: [Setter] set_Property #-----| 2: (Parameters) # 41| 0: [Parameter] value -# 42| 7: [Indexer] Item +# 42| 8: [Indexer] Item # 42| -1: [TypeMention] object #-----| 1: (Parameters) # 42| 0: [Parameter] index diff --git a/csharp/ql/test/library-tests/properties/PrintAst.expected b/csharp/ql/test/library-tests/properties/PrintAst.expected index 370d180a08e..2df3ee3f5e8 100644 --- a/csharp/ql/test/library-tests/properties/PrintAst.expected +++ b/csharp/ql/test/library-tests/properties/PrintAst.expected @@ -1,9 +1,9 @@ properties.cs: # 5| [NamespaceDeclaration] namespace ... { ... } # 7| 1: [Class] Button -# 10| 5: [Field] caption +# 10| 6: [Field] caption # 10| -1: [TypeMention] string -# 12| 6: [Property] Caption +# 12| 7: [Property] Caption # 12| -1: [TypeMention] string # 15| 3: [Getter] get_Caption # 15| 4: [BlockStmt] {...} @@ -22,7 +22,7 @@ properties.cs: # 21| 0: [AssignExpr] ... = ... # 21| 0: [FieldAccess] access to field caption # 21| 1: [ParameterAccess] access to parameter value -# 26| 7: [Method] Paint +# 26| 8: [Method] Paint # 26| -1: [TypeMention] Void # 27| 4: [BlockStmt] {...} # 28| 0: [LocalVariableDeclStmt] ... ...; @@ -43,9 +43,9 @@ properties.cs: # 30| 1: [PropertyCall] access to property Caption # 30| -1: [LocalVariableAccess] access to local variable okButton # 34| 2: [Class] Counter -# 37| 5: [Field] next +# 37| 6: [Field] next # 37| -1: [TypeMention] int -# 39| 6: [Property] Next +# 39| 7: [Property] Next # 39| -1: [TypeMention] int # 41| 3: [Getter] get_Next # 41| 4: [BlockStmt] {...} @@ -53,32 +53,32 @@ properties.cs: # 41| 0: [PostIncrExpr] ...++ # 41| 0: [FieldAccess] access to field next # 46| 3: [Class] Point -# 49| 5: [Property] X +# 49| 6: [Property] X # 49| -1: [TypeMention] int # 49| 3: [Getter] get_X # 49| 4: [Setter] set_X #-----| 2: (Parameters) # 49| 0: [Parameter] value -# 50| 6: [Property] Y +# 50| 7: [Property] Y # 50| -1: [TypeMention] int # 50| 3: [Getter] get_Y # 50| 4: [Setter] set_Y #-----| 2: (Parameters) # 50| 0: [Parameter] value # 54| 4: [Class] ReadOnlyPoint -# 57| 4: [Property] X +# 57| 5: [Property] X # 57| -1: [TypeMention] int # 57| 3: [Getter] get_X # 57| 4: [Setter] set_X #-----| 2: (Parameters) # 57| 0: [Parameter] value -# 58| 5: [Property] Y +# 58| 6: [Property] Y # 58| -1: [TypeMention] int # 58| 3: [Getter] get_Y # 58| 4: [Setter] set_Y #-----| 2: (Parameters) # 58| 0: [Parameter] value -# 59| 6: [InstanceConstructor] ReadOnlyPoint +# 59| 7: [InstanceConstructor] ReadOnlyPoint #-----| 2: (Parameters) # 59| 0: [Parameter] x # 59| -1: [TypeMention] int @@ -94,15 +94,15 @@ properties.cs: # 62| 0: [PropertyCall] access to property Y # 62| 1: [ParameterAccess] access to parameter y # 67| 5: [Class] A -# 69| 5: [Field] y +# 69| 6: [Field] y # 69| -1: [TypeMention] int -# 70| 6: [Property] X +# 70| 7: [Property] X # 70| -1: [TypeMention] int # 70| 3: [Getter] get_X # 70| 4: [BlockStmt] {...} # 70| 0: [ReturnStmt] return ...; # 70| 0: [IntLiteral] 0 -# 71| 7: [Property] Y +# 71| 8: [Property] Y # 71| -1: [TypeMention] int # 73| 3: [Getter] get_Y # 73| 4: [BlockStmt] {...} @@ -116,7 +116,7 @@ properties.cs: # 74| 0: [AssignExpr] ... = ... # 74| 0: [FieldAccess] access to field y # 74| 1: [ParameterAccess] access to parameter value -# 76| 8: [Property] Z +# 76| 9: [Property] Z # 76| -1: [TypeMention] int # 76| 3: [Getter] get_Z # 76| 4: [Setter] set_Z @@ -125,9 +125,9 @@ properties.cs: # 79| 6: [Class] B #-----| 3: (Base types) # 79| 0: [TypeMention] A -# 81| 5: [Field] z +# 81| 6: [Field] z # 81| -1: [TypeMention] int -# 82| 6: [Property] X +# 82| 7: [Property] X # 82| -1: [TypeMention] int # 82| 3: [Getter] get_X # 82| 4: [BlockStmt] {...} @@ -136,7 +136,7 @@ properties.cs: # 82| 0: [PropertyCall] access to property X # 82| -1: [BaseAccess] base access # 82| 1: [IntLiteral] 1 -# 83| 7: [Property] Y +# 83| 8: [Property] Y # 83| -1: [TypeMention] int # 83| 3: [Setter] set_Y #-----| 2: (Parameters) @@ -152,7 +152,7 @@ properties.cs: # 83| 1: [IntLiteral] 0 # 83| 1: [IntLiteral] 0 # 83| 2: [ParameterAccess] access to parameter value -# 84| 8: [Property] Z +# 84| 9: [Property] Z # 84| -1: [TypeMention] int # 86| 3: [Getter] get_Z # 86| 4: [BlockStmt] {...} @@ -167,13 +167,13 @@ properties.cs: # 87| 0: [FieldAccess] access to field z # 87| 1: [ParameterAccess] access to parameter value # 91| 7: [Class] Test -# 93| 5: [Property] Init +# 93| 6: [Property] Init # 93| -1: [TypeMention] int # 93| 3: [Setter] set_Init #-----| 2: (Parameters) # 93| 0: [Parameter] value # 93| 4: [BlockStmt] {...} -# 94| 6: [Method] Main +# 94| 7: [Method] Main # 94| -1: [TypeMention] Void # 95| 4: [BlockStmt] {...} # 96| 0: [LocalVariableDeclStmt] ... ...; @@ -211,19 +211,19 @@ properties.cs: # 110| 9: [Class] ImplementsProperties #-----| 3: (Base types) # 110| 1: [TypeMention] InterfaceWithProperties -# 112| 5: [Property] Prop1 +# 112| 6: [Property] Prop1 # 112| -1: [TypeMention] int # 114| 3: [Getter] get_Prop1 # 114| 4: [BlockStmt] {...} # 114| 0: [ReturnStmt] return ...; # 114| 0: [IntLiteral] 0 -# 117| 6: [Property] Prop2 +# 117| 7: [Property] Prop2 # 117| -1: [TypeMention] int # 119| 3: [Setter] set_Prop2 #-----| 2: (Parameters) # 119| 0: [Parameter] value # 119| 4: [BlockStmt] {...} -# 122| 7: [Property] Prop2 +# 122| 8: [Property] Prop2 # 122| -1: [TypeMention] InterfaceWithProperties # 122| -1: [TypeMention] int # 124| 3: [Setter] set_Prop2 diff --git a/csharp/ql/test/library-tests/standalone/brokentypes/brokenTypes.expected b/csharp/ql/test/library-tests/standalone/brokentypes/brokenTypes.expected index bb3acba4f64..524249492d3 100644 --- a/csharp/ql/test/library-tests/standalone/brokentypes/brokenTypes.expected +++ b/csharp/ql/test/library-tests/standalone/brokentypes/brokenTypes.expected @@ -1,7 +1,15 @@ | BrokenTypes.cs:2:14:2:13 | call to constructor Object | object | ObjectType | +| BrokenTypes.cs:2:14:2:13 | call to method | Void | VoidType | +| BrokenTypes.cs:2:14:2:13 | this access | | UnknownType | | BrokenTypes.cs:5:14:5:16 | call to constructor Object | object | ObjectType | +| BrokenTypes.cs:5:14:5:16 | call to method | Void | VoidType | +| BrokenTypes.cs:5:14:5:16 | this access | var | UnknownType | | BrokenTypes.cs:7:14:7:14 | call to constructor Object | object | ObjectType | +| BrokenTypes.cs:7:14:7:14 | call to method | Void | VoidType | +| BrokenTypes.cs:7:14:7:14 | this access | C | Class | | BrokenTypes.cs:13:14:13:20 | call to constructor Object | object | ObjectType | +| BrokenTypes.cs:13:14:13:20 | call to method | Void | VoidType | +| BrokenTypes.cs:13:14:13:20 | this access | Program | Class | | BrokenTypes.cs:17:11:17:12 | access to local variable x1 | C | Class | | BrokenTypes.cs:17:11:17:22 | C x1 = ... | C | Class | | BrokenTypes.cs:17:16:17:22 | object creation of type C | C | Class | diff --git a/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected b/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected index fab1dec1100..a42a3c662d4 100644 --- a/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected +++ b/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected @@ -1,6 +1,8 @@ | ControlFlow.cs:3:7:3:9 | call to constructor Object | ControlFlow.cs:3:7:3:9 | {...} | -| ControlFlow.cs:3:7:3:9 | enter Cfg | ControlFlow.cs:3:7:3:9 | call to constructor Object | +| ControlFlow.cs:3:7:3:9 | call to method | ControlFlow.cs:3:7:3:9 | call to constructor Object | +| ControlFlow.cs:3:7:3:9 | enter Cfg | ControlFlow.cs:3:7:3:9 | this access | | ControlFlow.cs:3:7:3:9 | exit Cfg (normal) | ControlFlow.cs:3:7:3:9 | exit Cfg | +| ControlFlow.cs:3:7:3:9 | this access | ControlFlow.cs:3:7:3:9 | call to method | | ControlFlow.cs:3:7:3:9 | {...} | ControlFlow.cs:3:7:3:9 | exit Cfg (normal) | | ControlFlow.cs:5:10:5:10 | enter F | ControlFlow.cs:6:5:11:5 | {...} | | ControlFlow.cs:5:10:5:10 | exit F (normal) | ControlFlow.cs:5:10:5:10 | exit F | diff --git a/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected b/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected index a4a2aa6e7a8..791cd3450e8 100644 --- a/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected +++ b/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected @@ -1,10 +1,15 @@ | errors.cs:13:11:13:12 | errors.cs:13:11:13:12 | call to constructor Object | Object | +| errors.cs:13:11:13:12 | errors.cs:13:11:13:12 | call to method | | | errors.cs:22:31:22:40 | errors.cs:22:31:22:40 | call to method | none | | errors.cs:41:21:41:28 | errors.cs:41:21:41:28 | object creation of type C1 | C1 | | errors.cs:42:13:42:19 | errors.cs:42:13:42:19 | call to method m1 | m1 | | errors.cs:43:13:43:19 | errors.cs:43:13:43:19 | call to method m2 | m2 | | errors.cs:44:13:44:38 | errors.cs:44:13:44:38 | call to method WriteLine | WriteLine | | errors.cs:48:11:48:12 | errors.cs:48:11:48:12 | call to constructor Object | Object | +| errors.cs:48:11:48:12 | errors.cs:48:11:48:12 | call to method | | | errors.cs:51:17:51:25 | errors.cs:51:17:51:25 | object creation of type C2 | none | | errors.cs:65:11:65:12 | errors.cs:65:11:65:12 | call to constructor Object | Object | +| errors.cs:65:11:65:12 | errors.cs:65:11:65:12 | call to method | | | errors.cs:70:11:70:12 | errors.cs:70:11:70:12 | call to constructor Object | Object | +| errors.cs:70:11:70:12 | errors.cs:70:11:70:12 | call to method | | +| errors.cs:79:11:79:12 | errors.cs:79:11:79:12 | call to method | | diff --git a/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.expected b/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.expected index 8c4346f7832..3f724bc4902 100644 --- a/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.expected +++ b/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.expected @@ -4,5 +4,6 @@ compilationErrors | standalone.cs:16:12:16:18 | CS0104: 'ILogger' is an ambiguous reference between 'A.ILogger' and 'B.ILogger' | methodCalls +| standalone.cs:14:14:14:14 | call to method | | standalone.cs:20:9:20:21 | call to method | | standalone.cs:25:9:25:33 | call to method | diff --git a/csharp/ql/test/library-tests/statements/PrintAst.expected b/csharp/ql/test/library-tests/statements/PrintAst.expected index 6aea0fa286e..59af8ce4a2e 100644 --- a/csharp/ql/test/library-tests/statements/PrintAst.expected +++ b/csharp/ql/test/library-tests/statements/PrintAst.expected @@ -1,6 +1,6 @@ fixed.cs: # 3| [Class] Fixed -# 5| 5: [Method] fixed1 +# 5| 6: [Method] fixed1 # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; @@ -52,7 +52,7 @@ fixed.cs: statements.cs: # 6| [NamespaceDeclaration] namespace ... { ... } # 8| 1: [Class] Class -# 11| 5: [Method] Main +# 11| 6: [Method] Main # 11| -1: [TypeMention] Void # 12| 4: [BlockStmt] {...} # 13| 0: [LabelStmt] block: @@ -60,7 +60,7 @@ statements.cs: # 15| 0: [BlockStmt] {...} # 17| 1: [BlockStmt] {...} # 18| 0: [BlockStmt] {...} -# 24| 6: [Method] MainEmpty +# 24| 7: [Method] MainEmpty # 24| -1: [TypeMention] Void # 25| 4: [BlockStmt] {...} # 26| 0: [LocalVariableDeclStmt] ... ...; @@ -75,7 +75,7 @@ statements.cs: # 28| 4: [IfStmt] if (...) ... # 28| 0: [BoolLiteral] true # 28| 1: [EmptyStmt] ; -# 31| 7: [Method] MainLocalVarDecl +# 31| 8: [Method] MainLocalVarDecl # 31| -1: [TypeMention] Void # 32| 4: [BlockStmt] {...} # 33| 0: [LocalVariableDeclStmt] ... ...; @@ -113,7 +113,7 @@ statements.cs: # 38| -1: [TypeMention] string # 38| 0: [LocalVariableAccess] access to local variable y # 38| 1: [StringLiteralUtf16] "test" -# 41| 8: [Method] MainLocalConstDecl +# 41| 9: [Method] MainLocalConstDecl # 41| -1: [TypeMention] Void # 42| 4: [BlockStmt] {...} # 43| 0: [LocalConstantDeclStmt] const ... ...; @@ -139,7 +139,7 @@ statements.cs: # 45| 1: [LocalVariableAccess] access to local variable r # 45| 1: [CastExpr] (...) ... # 45| 1: [LocalVariableAccess] access to local variable r -# 48| 9: [Method] MainExpr +# 48| 10: [Method] MainExpr # 48| -1: [TypeMention] Void # 49| 4: [BlockStmt] {...} # 50| 0: [LocalVariableDeclStmt] ... ...; @@ -162,7 +162,7 @@ statements.cs: # 54| -1: [TypeAccess] access to type Console # 54| 0: [TypeMention] Console # 54| 0: [LocalVariableAccess] access to local variable i -# 57| 10: [Method] MainIf +# 57| 11: [Method] MainIf # 57| -1: [TypeMention] Void #-----| 2: (Parameters) # 57| 0: [Parameter] args @@ -186,7 +186,7 @@ statements.cs: # 65| -1: [TypeAccess] access to type Console # 65| 0: [TypeMention] Console # 65| 0: [StringLiteralUtf16] "One or more arguments" -# 69| 11: [Method] MainSwitch +# 69| 12: [Method] MainSwitch # 69| -1: [TypeMention] Void #-----| 2: (Parameters) # 69| 0: [Parameter] args @@ -226,7 +226,7 @@ statements.cs: # 81| 1: [CastExpr] (...) ... # 81| 1: [LocalVariableAccess] access to local variable n # 82| 8: [BreakStmt] break; -# 86| 12: [Method] StringSwitch +# 86| 13: [Method] StringSwitch # 86| -1: [TypeMention] int #-----| 2: (Parameters) # 86| 0: [Parameter] foo @@ -270,7 +270,7 @@ statements.cs: # 106| 0: [IntLiteral] 7 # 108| 1: [ReturnStmt] return ...; # 108| 0: [IntLiteral] 7 -# 111| 13: [Method] MainWhile +# 111| 14: [Method] MainWhile # 111| -1: [TypeMention] Void #-----| 2: (Parameters) # 111| 0: [Parameter] args @@ -298,7 +298,7 @@ statements.cs: # 117| 1: [ExprStmt] ...; # 117| 0: [PostIncrExpr] ...++ # 117| 0: [LocalVariableAccess] access to local variable i -# 121| 14: [Method] MainDo +# 121| 15: [Method] MainDo # 121| -1: [TypeMention] Void # 122| 4: [BlockStmt] {...} # 123| 0: [LocalVariableDeclStmt] ... ...; @@ -324,7 +324,7 @@ statements.cs: # 127| -1: [TypeAccess] access to type Console # 127| 0: [TypeMention] Console # 127| 0: [LocalVariableAccess] access to local variable s -# 131| 15: [Method] MainFor +# 131| 16: [Method] MainFor # 131| -1: [TypeMention] Void #-----| 2: (Parameters) # 131| 0: [Parameter] args @@ -350,7 +350,7 @@ statements.cs: # 135| 0: [ArrayAccess] access to array element # 135| -1: [ParameterAccess] access to parameter args # 135| 0: [LocalVariableAccess] access to local variable i -# 139| 16: [Method] MainForeach +# 139| 17: [Method] MainForeach # 139| -1: [TypeMention] Void #-----| 2: (Parameters) # 139| 0: [Parameter] args @@ -367,7 +367,7 @@ statements.cs: # 143| -1: [TypeAccess] access to type Console # 143| 0: [TypeMention] Console # 143| 0: [LocalVariableAccess] access to local variable s -# 147| 17: [Method] MainBreak +# 147| 18: [Method] MainBreak # 147| -1: [TypeMention] Void # 148| 4: [BlockStmt] {...} # 149| 0: [WhileStmt] while (...) ... @@ -390,7 +390,7 @@ statements.cs: # 153| -1: [TypeAccess] access to type Console # 153| 0: [TypeMention] Console # 153| 0: [LocalVariableAccess] access to local variable s -# 157| 18: [Method] MainContinue +# 157| 19: [Method] MainContinue # 157| -1: [TypeMention] Void #-----| 2: (Parameters) # 157| 0: [Parameter] args @@ -423,7 +423,7 @@ statements.cs: # 162| 0: [ArrayAccess] access to array element # 162| -1: [ParameterAccess] access to parameter args # 162| 0: [LocalVariableAccess] access to local variable i -# 166| 19: [Method] MainGoto +# 166| 20: [Method] MainGoto # 166| -1: [TypeMention] Void #-----| 2: (Parameters) # 166| 0: [Parameter] args @@ -452,7 +452,7 @@ statements.cs: # 171| 1: [PropertyCall] access to property Length # 171| -1: [ParameterAccess] access to parameter args # 171| 1: [GotoLabelStmt] goto ...; -# 174| 20: [Method] Add +# 174| 21: [Method] Add # 174| -1: [TypeMention] int #-----| 2: (Parameters) # 174| 0: [Parameter] a @@ -464,7 +464,7 @@ statements.cs: # 176| 0: [AddExpr] ... + ... # 176| 0: [ParameterAccess] access to parameter a # 176| 1: [ParameterAccess] access to parameter b -# 178| 21: [Method] MainReturn +# 178| 22: [Method] MainReturn # 178| -1: [TypeMention] Void # 179| 4: [BlockStmt] {...} # 180| 0: [ExprStmt] ...; @@ -475,7 +475,7 @@ statements.cs: # 180| 0: [IntLiteral] 1 # 180| 1: [IntLiteral] 2 # 181| 1: [ReturnStmt] return ...; -# 184| 22: [Method] Range +# 184| 23: [Method] Range # 184| -1: [TypeMention] IEnumerable # 184| 1: [TypeMention] int #-----| 2: (Parameters) @@ -498,7 +498,7 @@ statements.cs: # 188| 0: [YieldReturnStmt] yield return ...; # 188| 0: [LocalVariableAccess] access to local variable i # 190| 1: [YieldBreakStmt] yield break; -# 192| 23: [Method] MainYield +# 192| 24: [Method] MainYield # 192| -1: [TypeMention] Void # 193| 4: [BlockStmt] {...} # 194| 0: [ForeachStmt] foreach (... ... in ...) ... @@ -514,7 +514,7 @@ statements.cs: # 196| -1: [TypeAccess] access to type Console # 196| 0: [TypeMention] Console # 196| 0: [LocalVariableAccess] access to local variable x -# 200| 24: [Method] Divide +# 200| 25: [Method] Divide # 200| -1: [TypeMention] double #-----| 2: (Parameters) # 200| 0: [Parameter] x @@ -534,7 +534,7 @@ statements.cs: # 203| 0: [DivExpr] ... / ... # 203| 0: [ParameterAccess] access to parameter x # 203| 1: [ParameterAccess] access to parameter y -# 205| 25: [Method] MainTryThrow +# 205| 26: [Method] MainTryThrow # 205| -1: [TypeMention] Void #-----| 2: (Parameters) # 205| 0: [Parameter] args @@ -603,7 +603,7 @@ statements.cs: # 223| -1: [TypeAccess] access to type Console # 223| 0: [TypeMention] Console # 223| 0: [StringLiteralUtf16] "Exception" -# 231| 26: [Method] MainCheckedUnchecked +# 231| 27: [Method] MainCheckedUnchecked # 231| -1: [TypeMention] Void # 232| 4: [BlockStmt] {...} # 233| 0: [LocalVariableDeclStmt] ... ...; @@ -631,10 +631,10 @@ statements.cs: # 240| 0: [AddExpr] ... + ... # 240| 0: [LocalVariableAccess] access to local variable i # 240| 1: [IntLiteral] 1 -# 244| 27: [Class] AccountLock -# 246| 5: [Field] balance +# 244| 28: [Class] AccountLock +# 246| 6: [Field] balance # 246| -1: [TypeMention] decimal -# 247| 6: [Method] Withdraw +# 247| 7: [Method] Withdraw # 247| -1: [TypeMention] Void #-----| 2: (Parameters) # 247| 0: [Parameter] amount @@ -656,7 +656,7 @@ statements.cs: # 255| 0: [AssignSubExpr] ... -= ... # 255| 0: [FieldAccess] access to field balance # 255| 1: [ParameterAccess] access to parameter amount -# 260| 28: [Method] MainUsing +# 260| 29: [Method] MainUsing # 260| -1: [TypeMention] Void # 261| 4: [BlockStmt] {...} # 262| 0: [UsingBlockStmt] using (...) {...} @@ -686,7 +686,7 @@ statements.cs: # 268| 0: [TypeMention] File # 268| 0: [StringLiteralUtf16] "test.txt" # 269| 1: [BlockStmt] {...} -# 273| 29: [Method] MainLabeled +# 273| 30: [Method] MainLabeled # 273| -1: [TypeMention] Void # 274| 4: [BlockStmt] {...} # 275| 0: [GotoLabelStmt] goto ...; @@ -700,11 +700,11 @@ statements.cs: # 278| 0: [AssignExpr] ... = ... # 278| 0: [LocalVariableAccess] access to local variable x # 278| 1: [IntLiteral] 9 -# 281| 30: [Field] lockObject +# 281| 31: [Field] lockObject # 281| -1: [TypeMention] Lock # 281| 1: [ObjectCreation] object creation of type Lock # 281| 0: [TypeMention] Lock -# 283| 31: [Method] LockMethod +# 283| 32: [Method] LockMethod # 283| -1: [TypeMention] Void # 284| 4: [BlockStmt] {...} # 285| 0: [LockStmt] lock (...) {...} diff --git a/csharp/ql/test/library-tests/statements/Switch4.ql b/csharp/ql/test/library-tests/statements/Switch4.ql index 742190ad4d5..af44a5f92cf 100644 --- a/csharp/ql/test/library-tests/statements/Switch4.ql +++ b/csharp/ql/test/library-tests/statements/Switch4.ql @@ -1,5 +1,5 @@ /** - * @name Test the implicit switch field isn't populated. + * @name Test the implicit switch field isn't populated */ import csharp diff --git a/csharp/ql/test/library-tests/stringinterpolation/PrintAst.expected b/csharp/ql/test/library-tests/stringinterpolation/PrintAst.expected index 6529f9feed5..4e975eedd4c 100644 --- a/csharp/ql/test/library-tests/stringinterpolation/PrintAst.expected +++ b/csharp/ql/test/library-tests/stringinterpolation/PrintAst.expected @@ -1,6 +1,6 @@ StringInterpolation.cs: # 3| [Class] MyStringInterpolationClass -# 6| 5: [Method] M +# 6| 6: [Method] M # 6| -1: [TypeMention] Void # 7| 4: [BlockStmt] {...} # 8| 0: [LocalVariableDeclStmt] ... ...; diff --git a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected index 9d3c935266a..0f131d8c25c 100644 --- a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected +++ b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected @@ -52,6 +52,8 @@ same | StructuralComparison.cs:50:18:50:21 | access to property Prop | StructuralComparison.cs:51:18:51:26 | access to property Prop | gvn | StructuralComparison.cs:3:14:3:18 | call to constructor Object | (kind:Expr(79)) | +| StructuralComparison.cs:3:14:3:18 | call to method | ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,)) | +| StructuralComparison.cs:3:14:3:18 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:3:14:3:18 | {...} | (kind:Stmt(1)) | | StructuralComparison.cs:5:26:5:26 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:5:26:5:26 | this access | (kind:Expr(12)) | @@ -148,8 +150,12 @@ gvn | StructuralComparison.cs:28:15:28:15 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:28:15:28:15 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:32:14:32:22 | call to constructor Object | (kind:Expr(79)) | +| StructuralComparison.cs:32:14:32:22 | call to method | ((kind:Expr(12),false,BaseClass) :: (kind:Expr(24),false,)) | +| StructuralComparison.cs:32:14:32:22 | this access | (kind:Expr(12),false,BaseClass) | | StructuralComparison.cs:32:14:32:22 | {...} | (kind:Stmt(1)) | | StructuralComparison.cs:38:14:38:25 | call to constructor BaseClass | (kind:Expr(79)) | +| StructuralComparison.cs:38:14:38:25 | call to method | ((kind:Expr(12),false,DerivedClass) :: (kind:Expr(24),false,)) | +| StructuralComparison.cs:38:14:38:25 | this access | (kind:Expr(12),false,DerivedClass) | | StructuralComparison.cs:38:14:38:25 | {...} | (kind:Stmt(1)) | | StructuralComparison.cs:41:5:45:5 | {...} | ((((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | | StructuralComparison.cs:42:9:42:28 | ... ...; | (((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | diff --git a/csharp/ql/test/library-tests/types/PrintAst.expected b/csharp/ql/test/library-tests/types/PrintAst.expected index 47c3c11261b..c6dc07ab1a5 100644 --- a/csharp/ql/test/library-tests/types/PrintAst.expected +++ b/csharp/ql/test/library-tests/types/PrintAst.expected @@ -1,91 +1,91 @@ types.cs: # 1| [NamespaceDeclaration] namespace ... { ... } # 3| 1: [Class] Class -# 5| 5: [Method] BoolType +# 5| 6: [Method] BoolType # 5| -1: [TypeMention] bool -# 6| 6: [Method] CharType +# 6| 7: [Method] CharType # 6| -1: [TypeMention] char -# 7| 7: [Method] DecimalType +# 7| 8: [Method] DecimalType # 7| -1: [TypeMention] decimal -# 8| 8: [Method] SByteType +# 8| 9: [Method] SByteType # 8| -1: [TypeMention] sbyte -# 9| 9: [Method] ShortType +# 9| 10: [Method] ShortType # 9| -1: [TypeMention] short -# 10| 10: [Method] IntType +# 10| 11: [Method] IntType # 10| -1: [TypeMention] int -# 11| 11: [Method] LongType +# 11| 12: [Method] LongType # 11| -1: [TypeMention] long -# 12| 12: [Method] ByteType +# 12| 13: [Method] ByteType # 12| -1: [TypeMention] byte -# 13| 13: [Method] UShortType +# 13| 14: [Method] UShortType # 13| -1: [TypeMention] ushort -# 14| 14: [Method] UIntType +# 14| 15: [Method] UIntType # 14| -1: [TypeMention] uint -# 15| 15: [Method] ULongType +# 15| 16: [Method] ULongType # 15| -1: [TypeMention] ulong -# 16| 16: [Method] FloatType +# 16| 17: [Method] FloatType # 16| -1: [TypeMention] float -# 17| 17: [Method] DoubleType +# 17| 18: [Method] DoubleType # 17| -1: [TypeMention] double -# 18| 18: [Method] NullableType +# 18| 19: [Method] NullableType # 18| -1: [TypeMention] Struct? # 18| 1: [TypeMention] Struct -# 19| 19: [Method] VoidType +# 19| 20: [Method] VoidType # 19| -1: [TypeMention] Void -# 20| 20: [Method] ArrayType +# 20| 21: [Method] ArrayType # 20| -1: [TypeMention] Class[] # 20| 1: [TypeMention] Class -# 21| 21: [Method] ArrayArrayType +# 21| 22: [Method] ArrayArrayType # 21| -1: [TypeMention] Class[][] # 21| 1: [TypeMention] Class -# 22| 22: [Method] ConstructedClassType +# 22| 23: [Method] ConstructedClassType # 22| -1: [TypeMention] GenericClass # 22| 1: [TypeMention] Class -# 23| 23: [Method] ConstructedInterfaceType +# 23| 24: [Method] ConstructedInterfaceType # 23| -1: [TypeMention] GenericInterface # 23| 1: [TypeMention] Class -# 24| 24: [Method] ConstructedStructType +# 24| 25: [Method] ConstructedStructType # 24| -1: [TypeMention] GenericStruct # 24| 1: [TypeMention] Class -# 25| 25: [Method] DelegateType +# 25| 26: [Method] DelegateType # 25| -1: [TypeMention] Delegate -# 26| 26: [Method] PointerType +# 26| 27: [Method] PointerType # 26| -1: [TypeMention] byte* # 26| 1: [TypeMention] byte -# 27| 27: [Method] PointerPointerType +# 27| 28: [Method] PointerPointerType # 27| -1: [TypeMention] byte** # 27| 1: [TypeMention] byte -# 28| 28: [Method] PointerArrayArrayType +# 28| 29: [Method] PointerArrayArrayType # 28| -1: [TypeMention] Byte*[][] # 28| 1: [TypeMention] byte -# 29| 29: [Method] NullableArrayType +# 29| 30: [Method] NullableArrayType # 29| -1: [TypeMention] Nullable[] # 29| 1: [TypeMention] byte? # 29| 1: [TypeMention] byte -# 30| 30: [Method] NullableArrayArrayType +# 30| 31: [Method] NullableArrayArrayType # 30| -1: [TypeMention] Nullable[][] # 30| 1: [TypeMention] byte? # 30| 1: [TypeMention] byte -# 32| 31: [Method] ArrayNullArrayType1 +# 32| 32: [Method] ArrayNullArrayType1 # 32| -1: [TypeMention] Byte[][] # 32| 1: [TypeMention] byte -# 33| 32: [Method] ArrayNullArrayType2 +# 33| 33: [Method] ArrayNullArrayType2 # 33| -1: [TypeMention] Object[][] # 33| 1: [TypeMention] object -# 34| 33: [Method] ArrayNullableRefType +# 34| 34: [Method] ArrayNullableRefType # 34| -1: [TypeMention] Object[] # 34| 1: [TypeMention] object -# 35| 34: [Method] NullableRefType +# 35| 35: [Method] NullableRefType # 35| -1: [TypeMention] object -# 37| 35: [Method] NullableArrayArrayType2 +# 37| 36: [Method] NullableArrayArrayType2 # 37| -1: [TypeMention] Nullable[][] # 37| 1: [TypeMention] byte? # 37| 1: [TypeMention] byte -# 38| 36: [Method] Map +# 38| 37: [Method] Map # 38| -1: [TypeMention] Map # 38| 1: [TypeMention] string # 38| 2: [TypeMention] Class -# 39| 37: [Method] Null +# 39| 38: [Method] Null # 39| -1: [TypeMention] Class # 40| 4: [BlockStmt] {...} # 41| 0: [ReturnStmt] return ...; @@ -112,21 +112,21 @@ types.cs: # 59| 1: [DefaultAttribute] [InlineArray(...)] # 59| -1: [TypeMention] InlineArrayAttribute # 59| 0: [IntLiteral] 10 -# 62| 5: [Field] myInlineArrayElements +# 62| 6: [Field] myInlineArrayElements # 62| -1: [TypeMention] int # 66| 11: [InlineArrayType] MyMultiDimensionalInlineArray #-----| 0: (Attributes) # 65| 1: [DefaultAttribute] [InlineArray(...)] # 65| -1: [TypeMention] InlineArrayAttribute # 65| 0: [IntLiteral] 5 -# 68| 5: [Field] myMultiDimentionalInlineArrayElements +# 68| 6: [Field] myMultiDimentionalInlineArrayElements # 68| -1: [TypeMention] MyInlineArray # 72| 12: [InlineArrayType] MyMultiDimensionalInlineArray2 #-----| 0: (Attributes) # 71| 1: [DefaultAttribute] [InlineArray(...)] # 71| -1: [TypeMention] InlineArrayAttribute # 71| 0: [IntLiteral] 7 -# 74| 5: [Field] myMultiDimentionalInlineArrayElements +# 74| 6: [Field] myMultiDimentionalInlineArrayElements # 74| -1: [TypeMention] String[] # 74| 1: [TypeMention] string # 78| 13: [InlineArrayType] MyMultiDimensionalInlineArray3 @@ -134,7 +134,7 @@ types.cs: # 77| 1: [DefaultAttribute] [InlineArray(...)] # 77| -1: [TypeMention] InlineArrayAttribute # 77| 0: [IntLiteral] 4 -# 80| 5: [Field] myMultiDimentionalInlineArrayElements +# 80| 6: [Field] myMultiDimentionalInlineArrayElements # 80| -1: [TypeMention] Object[,] # 80| 1: [TypeMention] object # 84| 14: [InlineArrayType] MyMultiDimensionalInlineArray4 @@ -142,6 +142,6 @@ types.cs: # 83| 1: [DefaultAttribute] [InlineArray(...)] # 83| -1: [TypeMention] InlineArrayAttribute # 83| 0: [IntLiteral] 11 -# 86| 5: [Field] myMultiDimentionalInlineArrayElements +# 86| 6: [Field] myMultiDimentionalInlineArrayElements # 86| -1: [TypeMention] Object[][] # 86| 1: [TypeMention] object diff --git a/csharp/ql/test/library-tests/unsafe/PrintAst.expected b/csharp/ql/test/library-tests/unsafe/PrintAst.expected index d18e3b33072..76e1387cb76 100644 --- a/csharp/ql/test/library-tests/unsafe/PrintAst.expected +++ b/csharp/ql/test/library-tests/unsafe/PrintAst.expected @@ -1,7 +1,7 @@ unsafe.cs: # 1| [NamespaceDeclaration] namespace ... { ... } # 3| 1: [Class] Test -# 5| 5: [Method] Main +# 5| 6: [Method] Main # 5| -1: [TypeMention] Void #-----| 2: (Parameters) # 5| 0: [Parameter] args @@ -93,7 +93,7 @@ unsafe.cs: # 19| 1: [SubExpr] ... - ... # 19| 0: [LocalVariableAccess] access to local variable ip # 19| 1: [LocalVariableAccess] access to local variable ip42 -# 22| 6: [Method] f +# 22| 7: [Method] f # 22| -1: [TypeMention] Void #-----| 2: (Parameters) # 22| 0: [Parameter] p @@ -114,10 +114,10 @@ unsafe.cs: # 26| 0: [AddExpr] ... + ... # 26| 0: [ParameterAccess] access to parameter p # 26| 1: [IntLiteral] 0 -# 30| 7: [Method] g +# 30| 8: [Method] g # 30| -1: [TypeMention] Void # 30| 4: [BlockStmt] {...} -# 32| 8: [Method] h +# 32| 9: [Method] h # 32| -1: [TypeMention] Void # 33| 4: [BlockStmt] {...} # 34| 0: [UnsafeStmt] unsafe {...} diff --git a/csharp/ql/test/query-tests/Bad Practices/Path Combine/PathCombine.expected b/csharp/ql/test/query-tests/Bad Practices/Path Combine/PathCombine.expected index c0f9e405516..cf1fa3e2c8f 100644 --- a/csharp/ql/test/query-tests/Bad Practices/Path Combine/PathCombine.expected +++ b/csharp/ql/test/query-tests/Bad Practices/Path Combine/PathCombine.expected @@ -1 +1 @@ -| PathCombine.cs:7:9:7:54 | call to method Combine | Call to 'System.IO.Path.Combine'. | +| PathCombine.cs:7:9:7:54 | call to method Combine | Call to 'System.IO.Path.Combine' may silently drop its earlier arguments. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected index 238cbd0bc3b..9d54fb1cdd7 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected @@ -17,6 +17,9 @@ | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | This query depends on $@. | SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | this TextBox text | | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | This query depends on $@. | SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | this TextBox text | | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | This query depends on $@. | SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | this TextBox text | +| SqlInjectionNHibernate.cs:17:36:17:53 | access to property Text | SqlInjectionNHibernate.cs:17:36:17:48 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:17:36:17:53 | access to property Text | This query depends on $@. | SqlInjectionNHibernate.cs:17:36:17:48 | access to field untrustedData : TextBox | this ASP.NET user input | +| SqlInjectionNHibernate.cs:19:45:19:62 | access to property Text | SqlInjectionNHibernate.cs:19:45:19:57 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:19:45:19:62 | access to property Text | This query depends on $@. | SqlInjectionNHibernate.cs:19:45:19:57 | access to field untrustedData : TextBox | this ASP.NET user input | +| SqlInjectionNHibernate.cs:21:33:21:50 | access to property Text | SqlInjectionNHibernate.cs:21:33:21:45 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:21:33:21:50 | access to property Text | This query depends on $@. | SqlInjectionNHibernate.cs:21:33:21:45 | access to field untrustedData : TextBox | this ASP.NET user input | | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | This query depends on $@. | SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | this ASP.NET user input | | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | This query depends on $@. | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | this ASP.NET user input | | SqlInjectionSqlite.cs:33:49:33:66 | access to property Text | SqlInjectionSqlite.cs:33:49:33:61 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:33:49:33:66 | access to property Text | This query depends on $@. | SqlInjectionSqlite.cs:33:49:33:61 | access to field untrustedData : TextBox | this ASP.NET user input | @@ -27,43 +30,43 @@ edges | SecondOrderSqlInjection.cs:20:31:20:44 | access to local variable customerReader : SqlDataReader | SecondOrderSqlInjection.cs:25:119:25:132 | access to local variable customerReader : SqlDataReader | provenance | | | SecondOrderSqlInjection.cs:20:48:20:78 | call to method ExecuteReader : SqlDataReader | SecondOrderSqlInjection.cs:20:31:20:44 | access to local variable customerReader : SqlDataReader | provenance | | -| SecondOrderSqlInjection.cs:25:119:25:132 | access to local variable customerReader : SqlDataReader | SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | provenance | MaD:23 | -| SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | provenance | Sink:MaD:15 | +| SecondOrderSqlInjection.cs:25:119:25:132 | access to local variable customerReader : SqlDataReader | SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | provenance | MaD:26 | +| SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | provenance | Sink:MaD:18 | | SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | provenance | | -| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | provenance | Src:MaD:19 | -| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | provenance | Src:MaD:18 | +| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | provenance | Src:MaD:22 | +| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | provenance | Src:MaD:21 | | SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | provenance | | | SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | provenance | | -| SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | provenance | MaD:25 | +| SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | provenance | MaD:28 | | SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | provenance | | -| SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | provenance | MaD:26 | +| SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | provenance | MaD:29 | | SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | provenance | | -| SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | provenance | Sink:MaD:10 | -| SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | provenance | MaD:28 | +| SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | provenance | Sink:MaD:13 | +| SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | provenance | MaD:31 | | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | provenance | | -| SqlInjection.cs:37:21:37:26 | access to local variable query1 : String | SqlInjection.cs:39:50:39:55 | access to local variable query1 | provenance | Sink:MaD:17 | -| SqlInjection.cs:38:21:38:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:38:21:38:40 | access to property Text : String | provenance | MaD:27 | +| SqlInjection.cs:37:21:37:26 | access to local variable query1 : String | SqlInjection.cs:39:50:39:55 | access to local variable query1 | provenance | Sink:MaD:20 | +| SqlInjection.cs:38:21:38:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:38:21:38:40 | access to property Text : String | provenance | MaD:30 | | SqlInjection.cs:38:21:38:40 | access to property Text : String | SqlInjection.cs:37:21:37:26 | access to local variable query1 : String | provenance | | -| SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | SqlInjection.cs:74:56:74:61 | access to local variable query1 | provenance | Sink:MaD:7 | -| SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | SqlInjection.cs:75:55:75:60 | access to local variable query1 | provenance | Sink:MaD:8 | -| SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:73:33:73:52 | access to property Text : String | provenance | MaD:27 | +| SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | SqlInjection.cs:74:56:74:61 | access to local variable query1 | provenance | Sink:MaD:10 | +| SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | SqlInjection.cs:75:55:75:60 | access to local variable query1 | provenance | Sink:MaD:11 | +| SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:73:33:73:52 | access to property Text : String | provenance | MaD:30 | | SqlInjection.cs:73:33:73:52 | access to property Text : String | SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | provenance | | -| SqlInjection.cs:86:21:86:26 | access to local variable query1 : String | SqlInjection.cs:88:50:88:55 | access to local variable query1 | provenance | Sink:MaD:17 | +| SqlInjection.cs:86:21:86:26 | access to local variable query1 : String | SqlInjection.cs:88:50:88:55 | access to local variable query1 | provenance | Sink:MaD:20 | | SqlInjection.cs:87:21:87:29 | access to property Text : String | SqlInjection.cs:86:21:86:26 | access to local variable query1 : String | provenance | | -| SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | SqlInjection.cs:98:42:98:52 | access to local variable queryString | provenance | Sink:MaD:14 | +| SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | SqlInjection.cs:98:42:98:52 | access to local variable queryString | provenance | Sink:MaD:17 | | SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | SqlInjection.cs:98:42:98:52 | access to local variable queryString : String | provenance | | | SqlInjection.cs:97:21:97:29 | access to property Text : String | SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | provenance | | -| SqlInjection.cs:98:21:98:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:99:50:99:52 | access to local variable cmd | provenance | Sink:MaD:16 | +| SqlInjection.cs:98:21:98:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:99:50:99:52 | access to local variable cmd | provenance | Sink:MaD:19 | | SqlInjection.cs:98:27:98:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:98:21:98:23 | access to local variable cmd : SqlCommand | provenance | | -| SqlInjection.cs:98:42:98:52 | access to local variable queryString : String | SqlInjection.cs:98:27:98:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:22 | -| SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | SqlInjection.cs:109:42:109:52 | access to local variable queryString | provenance | Sink:MaD:14 | +| SqlInjection.cs:98:42:98:52 | access to local variable queryString : String | SqlInjection.cs:98:27:98:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:25 | +| SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | SqlInjection.cs:109:42:109:52 | access to local variable queryString | provenance | Sink:MaD:17 | | SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | SqlInjection.cs:109:42:109:52 | access to local variable queryString : String | provenance | | -| SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | provenance | Src:MaD:20 | -| SqlInjection.cs:109:21:109:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:110:50:110:52 | access to local variable cmd | provenance | Sink:MaD:16 | +| SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | provenance | Src:MaD:23 | +| SqlInjection.cs:109:21:109:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:110:50:110:52 | access to local variable cmd | provenance | Sink:MaD:19 | | SqlInjection.cs:109:27:109:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:109:21:109:23 | access to local variable cmd : SqlCommand | provenance | | -| SqlInjection.cs:109:42:109:52 | access to local variable queryString : String | SqlInjection.cs:109:27:109:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:22 | +| SqlInjection.cs:109:42:109:52 | access to local variable queryString : String | SqlInjection.cs:109:27:109:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:25 | | SqlInjection.cs:122:73:122:78 | userId : String | SqlInjection.cs:125:20:125:24 | access to local variable query : String | provenance | | -| SqlInjection.cs:125:20:125:24 | access to local variable query : String | SqlInjection.cs:129:53:129:57 | access to local variable query | provenance | Sink:MaD:15 | +| SqlInjection.cs:125:20:125:24 | access to local variable query : String | SqlInjection.cs:129:53:129:57 | access to local variable query | provenance | Sink:MaD:18 | | SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | provenance | Sink:MaD:4 | | SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | provenance | | | SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | provenance | Sink:MaD:5 | @@ -78,27 +81,36 @@ edges | SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | SqlInjectionDapper.cs:66:21:66:25 | access to local variable query : String | provenance | | | SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | provenance | | | SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | provenance | | -| SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | provenance | MaD:27 Sink:MaD:9 | -| SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | provenance | Sink:MaD:11 | +| SqlInjectionNHibernate.cs:17:36:17:48 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:17:36:17:53 | access to property Text | provenance | MaD:30 Sink:MaD:8 | +| SqlInjectionNHibernate.cs:17:36:17:48 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:17:36:17:53 | access to property Text | provenance | MaD:30 Sink:MaD:9 | +| SqlInjectionNHibernate.cs:17:36:17:48 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:17:36:17:53 | access to property Text | provenance | MaD:30 Sink:MaD:7 | +| SqlInjectionNHibernate.cs:19:45:19:57 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:19:45:19:62 | access to property Text | provenance | MaD:30 Sink:MaD:8 | +| SqlInjectionNHibernate.cs:19:45:19:57 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:19:45:19:62 | access to property Text | provenance | MaD:30 Sink:MaD:9 | +| SqlInjectionNHibernate.cs:19:45:19:57 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:19:45:19:62 | access to property Text | provenance | MaD:30 Sink:MaD:7 | +| SqlInjectionNHibernate.cs:21:33:21:45 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:21:33:21:50 | access to property Text | provenance | MaD:30 Sink:MaD:8 | +| SqlInjectionNHibernate.cs:21:33:21:45 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:21:33:21:50 | access to property Text | provenance | MaD:30 Sink:MaD:9 | +| SqlInjectionNHibernate.cs:21:33:21:45 | access to field untrustedData : TextBox | SqlInjectionNHibernate.cs:21:33:21:50 | access to property Text | provenance | MaD:30 Sink:MaD:7 | +| SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | provenance | MaD:30 Sink:MaD:12 | +| SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | provenance | Sink:MaD:14 | | SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | provenance | | -| SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | provenance | MaD:27 Sink:MaD:10 | -| SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | provenance | MaD:27 | -| SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | provenance | MaD:21 | -| SqlInjectionSqlite.cs:33:49:33:61 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:33:49:33:66 | access to property Text | provenance | MaD:27 Sink:MaD:12 | -| SqlInjectionSqlite.cs:39:45:39:57 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:39:45:39:62 | access to property Text | provenance | MaD:27 Sink:MaD:13 | +| SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | provenance | MaD:30 Sink:MaD:13 | +| SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | provenance | MaD:30 | +| SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | provenance | MaD:24 | +| SqlInjectionSqlite.cs:33:49:33:61 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:33:49:33:66 | access to property Text | provenance | MaD:30 Sink:MaD:15 | +| SqlInjectionSqlite.cs:39:45:39:57 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:39:45:39:62 | access to property Text | provenance | MaD:30 Sink:MaD:16 | | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | -| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | Src:MaD:19 | -| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | Src:MaD:18 | -| SqlInjectionSqlite.cs:49:51:49:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | provenance | MaD:27 | -| SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | provenance | MaD:24 | +| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | Src:MaD:22 | +| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | Src:MaD:21 | +| SqlInjectionSqlite.cs:49:51:49:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | provenance | MaD:30 | +| SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | provenance | MaD:27 | | SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | provenance | | -| SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | provenance | MaD:25 | +| SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | provenance | MaD:28 | | SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | -| SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | provenance | MaD:26 | +| SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | provenance | MaD:29 | | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | provenance | | -| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | Sink:MaD:10 | -| SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | provenance | MaD:28 | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | Sink:MaD:13 | +| SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | provenance | MaD:31 | | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | provenance | | models | 1 | Sink: Dapper; SqlMapper; false; ExecuteAsync; (System.Data.IDbConnection,System.String,System.Object,System.Data.IDbTransaction,System.Nullable,System.Nullable); ; Argument[1]; sql-injection; manual | @@ -107,28 +119,31 @@ models | 4 | Sink: Dapper; SqlMapper; false; Query; (System.Data.IDbConnection,System.String,System.Object,System.Data.IDbTransaction,System.Boolean,System.Nullable,System.Nullable); ; Argument[1]; sql-injection; manual | | 5 | Sink: Dapper; SqlMapper; false; QueryAsync; (System.Data.IDbConnection,System.String,System.Object,System.Data.IDbTransaction,System.Nullable,System.Nullable); ; Argument[1]; sql-injection; manual | | 6 | Sink: Dapper; SqlMapper; false; QueryFirstAsync; (System.Data.IDbConnection,System.String,System.Object,System.Data.IDbTransaction,System.Nullable,System.Nullable); ; Argument[1]; sql-injection; manual | -| 7 | Sink: System.Data.Entity; Database; false; ExecuteSqlCommand; (System.String,System.Object[]); ; Argument[0]; sql-injection; manual | -| 8 | Sink: System.Data.Entity; Database; false; SqlQuery; (System.String,System.Object[]); ; Argument[0]; sql-injection; manual | -| 9 | Sink: System.Data.SQLite; SQLiteCommand; false; SQLiteCommand; (System.String); ; Argument[0]; sql-injection; manual | -| 10 | Sink: System.Data.SQLite; SQLiteCommand; false; SQLiteCommand; (System.String,System.Data.SQLite.SQLiteConnection); ; Argument[0]; sql-injection; manual | -| 11 | Sink: System.Data.SQLite; SQLiteDataAdapter; false; SQLiteDataAdapter; (System.Data.SQLite.SQLiteCommand); ; Argument[0]; sql-injection; manual | -| 12 | Sink: System.Data.SQLite; SQLiteDataAdapter; false; SQLiteDataAdapter; (System.String,System.Data.SQLite.SQLiteConnection); ; Argument[0]; sql-injection; manual | -| 13 | Sink: System.Data.SQLite; SQLiteDataAdapter; false; SQLiteDataAdapter; (System.String,System.String); ; Argument[0]; sql-injection; manual | -| 14 | Sink: System.Data.SqlClient; SqlCommand; false; SqlCommand; (System.String); ; Argument[0]; sql-injection; manual | -| 15 | Sink: System.Data.SqlClient; SqlCommand; false; SqlCommand; (System.String,System.Data.SqlClient.SqlConnection); ; Argument[0]; sql-injection; manual | -| 16 | Sink: System.Data.SqlClient; SqlDataAdapter; false; SqlDataAdapter; (System.Data.SqlClient.SqlCommand); ; Argument[0]; sql-injection; manual | -| 17 | Sink: System.Data.SqlClient; SqlDataAdapter; false; SqlDataAdapter; (System.String,System.Data.SqlClient.SqlConnection); ; Argument[0]; sql-injection; manual | -| 18 | Source: System.IO; FileStream; false; FileStream; ; ; Argument[this]; file-write; manual | -| 19 | Source: System.IO; FileStream; false; FileStream; ; ; Argument[this]; file; manual | -| 20 | Source: System; Console; false; ReadLine; ; ; ReturnValue; stdin; manual | -| 21 | Summary: System.Data.SQLite; SQLiteCommand; false; SQLiteCommand; (System.String,System.Data.SQLite.SQLiteConnection); ; Argument[0]; Argument[this]; taint; manual | -| 22 | Summary: System.Data.SqlClient; SqlCommand; false; SqlCommand; (System.String); ; Argument[0]; Argument[this]; taint; manual | -| 23 | Summary: System.Data; IDataRecord; true; GetString; (System.Int32); ; Argument[this]; ReturnValue; taint; manual | -| 24 | Summary: System.IO; FileStream; false; FileStream; (System.String,System.IO.FileMode); ; Argument[0]; Argument[this]; taint; manual | -| 25 | Summary: System.IO; StreamReader; false; StreamReader; (System.IO.Stream,System.Text.Encoding); ; Argument[0]; Argument[this]; taint; manual | -| 26 | Summary: System.IO; TextReader; true; ReadLine; (); ; Argument[this]; ReturnValue; taint; manual | -| 27 | Summary: System.Web.UI.WebControls; TextBox; false; get_Text; (); ; Argument[this]; ReturnValue; taint; manual | -| 28 | Summary: System; String; false; Trim; (); ; Argument[this]; ReturnValue; taint; manual | +| 7 | Sink: NHibernate.Impl; AbstractSessionImpl; true; CreateSQLQuery; (System.String); ; Argument[0]; sql-injection; manual | +| 8 | Sink: NHibernate; ISession; true; CreateSQLQuery; (System.String); ; Argument[0]; sql-injection; manual | +| 9 | Sink: NHibernate; IStatelessSession; true; CreateSQLQuery; (System.String); ; Argument[0]; sql-injection; manual | +| 10 | Sink: System.Data.Entity; Database; false; ExecuteSqlCommand; (System.String,System.Object[]); ; Argument[0]; sql-injection; manual | +| 11 | Sink: System.Data.Entity; Database; false; SqlQuery; (System.String,System.Object[]); ; Argument[0]; sql-injection; manual | +| 12 | Sink: System.Data.SQLite; SQLiteCommand; false; SQLiteCommand; (System.String); ; Argument[0]; sql-injection; manual | +| 13 | Sink: System.Data.SQLite; SQLiteCommand; false; SQLiteCommand; (System.String,System.Data.SQLite.SQLiteConnection); ; Argument[0]; sql-injection; manual | +| 14 | Sink: System.Data.SQLite; SQLiteDataAdapter; false; SQLiteDataAdapter; (System.Data.SQLite.SQLiteCommand); ; Argument[0]; sql-injection; manual | +| 15 | Sink: System.Data.SQLite; SQLiteDataAdapter; false; SQLiteDataAdapter; (System.String,System.Data.SQLite.SQLiteConnection); ; Argument[0]; sql-injection; manual | +| 16 | Sink: System.Data.SQLite; SQLiteDataAdapter; false; SQLiteDataAdapter; (System.String,System.String); ; Argument[0]; sql-injection; manual | +| 17 | Sink: System.Data.SqlClient; SqlCommand; false; SqlCommand; (System.String); ; Argument[0]; sql-injection; manual | +| 18 | Sink: System.Data.SqlClient; SqlCommand; false; SqlCommand; (System.String,System.Data.SqlClient.SqlConnection); ; Argument[0]; sql-injection; manual | +| 19 | Sink: System.Data.SqlClient; SqlDataAdapter; false; SqlDataAdapter; (System.Data.SqlClient.SqlCommand); ; Argument[0]; sql-injection; manual | +| 20 | Sink: System.Data.SqlClient; SqlDataAdapter; false; SqlDataAdapter; (System.String,System.Data.SqlClient.SqlConnection); ; Argument[0]; sql-injection; manual | +| 21 | Source: System.IO; FileStream; false; FileStream; ; ; Argument[this]; file-write; manual | +| 22 | Source: System.IO; FileStream; false; FileStream; ; ; Argument[this]; file; manual | +| 23 | Source: System; Console; false; ReadLine; ; ; ReturnValue; stdin; manual | +| 24 | Summary: System.Data.SQLite; SQLiteCommand; false; SQLiteCommand; (System.String,System.Data.SQLite.SQLiteConnection); ; Argument[0]; Argument[this]; taint; manual | +| 25 | Summary: System.Data.SqlClient; SqlCommand; false; SqlCommand; (System.String); ; Argument[0]; Argument[this]; taint; manual | +| 26 | Summary: System.Data; IDataRecord; true; GetString; (System.Int32); ; Argument[this]; ReturnValue; taint; manual | +| 27 | Summary: System.IO; FileStream; false; FileStream; (System.String,System.IO.FileMode); ; Argument[0]; Argument[this]; taint; manual | +| 28 | Summary: System.IO; StreamReader; false; StreamReader; (System.IO.Stream,System.Text.Encoding); ; Argument[0]; Argument[this]; taint; manual | +| 29 | Summary: System.IO; TextReader; true; ReadLine; (); ; Argument[this]; ReturnValue; taint; manual | +| 30 | Summary: System.Web.UI.WebControls; TextBox; false; get_Text; (); ; Argument[this]; ReturnValue; taint; manual | +| 31 | Summary: System; String; false; Trim; (); ; Argument[this]; ReturnValue; taint; manual | nodes | SecondOrderSqlInjection.cs:20:31:20:44 | access to local variable customerReader : SqlDataReader | semmle.label | access to local variable customerReader : SqlDataReader | | SecondOrderSqlInjection.cs:20:48:20:78 | call to method ExecuteReader : SqlDataReader | semmle.label | call to method ExecuteReader : SqlDataReader | @@ -197,6 +212,12 @@ nodes | SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionNHibernate.cs:17:36:17:48 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | +| SqlInjectionNHibernate.cs:17:36:17:53 | access to property Text | semmle.label | access to property Text | +| SqlInjectionNHibernate.cs:19:45:19:57 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | +| SqlInjectionNHibernate.cs:19:45:19:62 | access to property Text | semmle.label | access to property Text | +| SqlInjectionNHibernate.cs:21:33:21:45 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | +| SqlInjectionNHibernate.cs:21:33:21:50 | access to property Text | semmle.label | access to property Text | | SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | semmle.label | access to property Text | | SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | semmle.label | access to local variable cmd : SQLiteCommand | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjectionNHibernate.cs b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjectionNHibernate.cs new file mode 100644 index 00000000000..3493891abb2 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjectionNHibernate.cs @@ -0,0 +1,24 @@ +using System; + +namespace TestNHibernate +{ + using System.Data; + using System.IO; + using System.Text; + using System.Web.UI.WebControls; + + class SqlInjection + { + private string connectionString; + public TextBox untrustedData; + + public void InjectUntrustedData(NHibernate.ISession session, NHibernate.IStatelessSession statelessSession, NHibernate.Impl.AbstractSessionImpl impl) + { + session.CreateSQLQuery(untrustedData.Text); // $ Alert[cs/sql-injection] + + statelessSession.CreateSQLQuery(untrustedData.Text); // $ Alert[cs/sql-injection] + + impl.CreateSQLQuery(untrustedData.Text); // $ Alert[cs/sql-injection] + } + } +} diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/options b/csharp/ql/test/query-tests/Security Features/CWE-089/options index 77da3f8c8fb..7cdc544e958 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/options +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/options @@ -4,3 +4,4 @@ semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resour semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/System.Data.SQLite/1.0.119/System.Data.SQLite.csproj semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Windows.cs semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/NHibernate/5.5.2/NHibernate.csproj diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.cs b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.cs new file mode 100644 index 00000000000..84d904f900d --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Mvc; + +public class HomeController : Controller +{ + // BAD: Anti forgery token has been forgotten + [HttpPost] + public ActionResult Login() + { + return View(); + } + + // GOOD: Anti forgery token is validated + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult UpdateDetails() + { + return View(); + } + + // No validation required, as this is a GET method. + public ActionResult ShowHelp() + { + return View(); + } + + // Should be ignored, because it is not an action method + [NonAction] + public void UtilityMethod() + { + } +} diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.expected new file mode 100644 index 00000000000..859fd4be920 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.expected @@ -0,0 +1 @@ +| MissingAntiForgeryTokenValidation.cs:7:25:7:29 | Login | Method 'Login' handles a POST request without performing CSRF token validation. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.qlref b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.qlref new file mode 100644 index 00000000000..5e1ab2426c6 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.qlref @@ -0,0 +1 @@ +query: Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/options b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/options new file mode 100644 index 00000000000..698ad488b6d --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj diff --git a/csharp/ql/test/resources/stubs/Amazon.Lambda.APIGatewayEvents/2.7.1/Amazon.Lambda.APIGatewayEvents.csproj b/csharp/ql/test/resources/stubs/Amazon.Lambda.APIGatewayEvents/2.7.1/Amazon.Lambda.APIGatewayEvents.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Amazon.Lambda.APIGatewayEvents/2.7.1/Amazon.Lambda.APIGatewayEvents.csproj +++ b/csharp/ql/test/resources/stubs/Amazon.Lambda.APIGatewayEvents/2.7.1/Amazon.Lambda.APIGatewayEvents.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Amazon.Lambda.Core/2.5.0/Amazon.Lambda.Core.csproj b/csharp/ql/test/resources/stubs/Amazon.Lambda.Core/2.5.0/Amazon.Lambda.Core.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Amazon.Lambda.Core/2.5.0/Amazon.Lambda.Core.csproj +++ b/csharp/ql/test/resources/stubs/Amazon.Lambda.Core/2.5.0/Amazon.Lambda.Core.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Antlr3.Runtime/3.5.1/Antlr3.Runtime.csproj b/csharp/ql/test/resources/stubs/Antlr3.Runtime/3.5.1/Antlr3.Runtime.csproj index 38998301525..b1003793c72 100644 --- a/csharp/ql/test/resources/stubs/Antlr3.Runtime/3.5.1/Antlr3.Runtime.csproj +++ b/csharp/ql/test/resources/stubs/Antlr3.Runtime/3.5.1/Antlr3.Runtime.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Azure.Core/1.38.0/Azure.Core.csproj b/csharp/ql/test/resources/stubs/Azure.Core/1.38.0/Azure.Core.csproj index a440919775d..4be1ba89cb8 100644 --- a/csharp/ql/test/resources/stubs/Azure.Core/1.38.0/Azure.Core.csproj +++ b/csharp/ql/test/resources/stubs/Azure.Core/1.38.0/Azure.Core.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Azure.Identity/1.11.4/Azure.Identity.csproj b/csharp/ql/test/resources/stubs/Azure.Identity/1.11.4/Azure.Identity.csproj index e16e446b3a1..3ff33c8434f 100644 --- a/csharp/ql/test/resources/stubs/Azure.Identity/1.11.4/Azure.Identity.csproj +++ b/csharp/ql/test/resources/stubs/Azure.Identity/1.11.4/Azure.Identity.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Dapper/2.1.35/Dapper.csproj b/csharp/ql/test/resources/stubs/Dapper/2.1.35/Dapper.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Dapper/2.1.35/Dapper.csproj +++ b/csharp/ql/test/resources/stubs/Dapper/2.1.35/Dapper.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/EntityFramework/6.5.1/EntityFramework.csproj b/csharp/ql/test/resources/stubs/EntityFramework/6.5.1/EntityFramework.csproj index edca0c61e77..2485c5768e3 100644 --- a/csharp/ql/test/resources/stubs/EntityFramework/6.5.1/EntityFramework.csproj +++ b/csharp/ql/test/resources/stubs/EntityFramework/6.5.1/EntityFramework.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Iesi.Collections/4.0.4/Iesi.Collections.csproj b/csharp/ql/test/resources/stubs/Iesi.Collections/4.0.4/Iesi.Collections.csproj index eedd49158a1..032e2630cd1 100644 --- a/csharp/ql/test/resources/stubs/Iesi.Collections/4.0.4/Iesi.Collections.csproj +++ b/csharp/ql/test/resources/stubs/Iesi.Collections/4.0.4/Iesi.Collections.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Bcl.AsyncInterfaces/1.1.1/Microsoft.Bcl.AsyncInterfaces.csproj b/csharp/ql/test/resources/stubs/Microsoft.Bcl.AsyncInterfaces/1.1.1/Microsoft.Bcl.AsyncInterfaces.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Bcl.AsyncInterfaces/1.1.1/Microsoft.Bcl.AsyncInterfaces.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Bcl.AsyncInterfaces/1.1.1/Microsoft.Bcl.AsyncInterfaces.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Bcl.Cryptography/9.0.4/Microsoft.Bcl.Cryptography.csproj b/csharp/ql/test/resources/stubs/Microsoft.Bcl.Cryptography/9.0.4/Microsoft.Bcl.Cryptography.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Bcl.Cryptography/9.0.4/Microsoft.Bcl.Cryptography.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Bcl.Cryptography/9.0.4/Microsoft.Bcl.Cryptography.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.CSharp/4.7.0/Microsoft.CSharp.csproj b/csharp/ql/test/resources/stubs/Microsoft.CSharp/4.7.0/Microsoft.CSharp.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.CSharp/4.7.0/Microsoft.CSharp.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.CSharp/4.7.0/Microsoft.CSharp.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient.SNI.runtime/6.0.2/Microsoft.Data.SqlClient.SNI.runtime.csproj b/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient.SNI.runtime/6.0.2/Microsoft.Data.SqlClient.SNI.runtime.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient.SNI.runtime/6.0.2/Microsoft.Data.SqlClient.SNI.runtime.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient.SNI.runtime/6.0.2/Microsoft.Data.SqlClient.SNI.runtime.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient/6.0.2/Microsoft.Data.SqlClient.csproj b/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient/6.0.2/Microsoft.Data.SqlClient.csproj index 457f65b723b..b01103f8746 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient/6.0.2/Microsoft.Data.SqlClient.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Data.SqlClient/6.0.2/Microsoft.Data.SqlClient.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Abstractions/9.0.4/Microsoft.Extensions.Caching.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Abstractions/9.0.4/Microsoft.Extensions.Caching.Abstractions.csproj index ba6857adb2b..144dee9836f 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Abstractions/9.0.4/Microsoft.Extensions.Caching.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Abstractions/9.0.4/Microsoft.Extensions.Caching.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Memory/9.0.4/Microsoft.Extensions.Caching.Memory.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Memory/9.0.4/Microsoft.Extensions.Caching.Memory.csproj index 611dcc85a91..b3ef41ed560 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Memory/9.0.4/Microsoft.Extensions.Caching.Memory.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Caching.Memory/9.0.4/Microsoft.Extensions.Caching.Memory.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Abstractions/8.0.0/Microsoft.Extensions.Configuration.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Abstractions/8.0.0/Microsoft.Extensions.Configuration.Abstractions.csproj index bc1dd1b3547..675855d6169 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Abstractions/8.0.0/Microsoft.Extensions.Configuration.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Abstractions/8.0.0/Microsoft.Extensions.Configuration.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Binder/8.0.0/Microsoft.Extensions.Configuration.Binder.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Binder/8.0.0/Microsoft.Extensions.Configuration.Binder.csproj index 27f68066b0c..b45625dcaf9 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Binder/8.0.0/Microsoft.Extensions.Configuration.Binder.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration.Binder/8.0.0/Microsoft.Extensions.Configuration.Binder.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration/8.0.0/Microsoft.Extensions.Configuration.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration/8.0.0/Microsoft.Extensions.Configuration.csproj index 3a3d95c8025..e491cc391cf 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration/8.0.0/Microsoft.Extensions.Configuration.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Configuration/8.0.0/Microsoft.Extensions.Configuration.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0/Microsoft.Extensions.DependencyInjection.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0/Microsoft.Extensions.DependencyInjection.Abstractions.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0/Microsoft.Extensions.DependencyInjection.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0/Microsoft.Extensions.DependencyInjection.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/9.0.4/Microsoft.Extensions.DependencyInjection.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/9.0.4/Microsoft.Extensions.DependencyInjection.Abstractions.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/9.0.4/Microsoft.Extensions.DependencyInjection.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection.Abstractions/9.0.4/Microsoft.Extensions.DependencyInjection.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection/8.0.0/Microsoft.Extensions.DependencyInjection.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection/8.0.0/Microsoft.Extensions.DependencyInjection.csproj index d40ad81bae2..9c117ab0052 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection/8.0.0/Microsoft.Extensions.DependencyInjection.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.DependencyInjection/8.0.0/Microsoft.Extensions.DependencyInjection.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics.Abstractions/8.0.0/Microsoft.Extensions.Diagnostics.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics.Abstractions/8.0.0/Microsoft.Extensions.Diagnostics.Abstractions.csproj index 5e2dafdbf45..c6cb5c63e8f 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics.Abstractions/8.0.0/Microsoft.Extensions.Diagnostics.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics.Abstractions/8.0.0/Microsoft.Extensions.Diagnostics.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics/8.0.0/Microsoft.Extensions.Diagnostics.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics/8.0.0/Microsoft.Extensions.Diagnostics.csproj index 9d6ce5a7870..15a14363eda 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics/8.0.0/Microsoft.Extensions.Diagnostics.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Diagnostics/8.0.0/Microsoft.Extensions.Diagnostics.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Http/8.0.0/Microsoft.Extensions.Http.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Http/8.0.0/Microsoft.Extensions.Http.csproj index ad6270c7d19..361c7c439cb 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Http/8.0.0/Microsoft.Extensions.Http.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Http/8.0.0/Microsoft.Extensions.Http.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/8.0.0/Microsoft.Extensions.Logging.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/8.0.0/Microsoft.Extensions.Logging.Abstractions.csproj index d40ad81bae2..9c117ab0052 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/8.0.0/Microsoft.Extensions.Logging.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/8.0.0/Microsoft.Extensions.Logging.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/9.0.4/Microsoft.Extensions.Logging.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/9.0.4/Microsoft.Extensions.Logging.Abstractions.csproj index 24dcab514cf..26c5c626f38 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/9.0.4/Microsoft.Extensions.Logging.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging.Abstractions/9.0.4/Microsoft.Extensions.Logging.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging/8.0.0/Microsoft.Extensions.Logging.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging/8.0.0/Microsoft.Extensions.Logging.csproj index 52843546756..6f6268b46f1 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging/8.0.0/Microsoft.Extensions.Logging.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Logging/8.0.0/Microsoft.Extensions.Logging.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0/Microsoft.Extensions.Options.ConfigurationExtensions.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0/Microsoft.Extensions.Options.ConfigurationExtensions.csproj index 8f14f384fd6..da4c02d67bc 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0/Microsoft.Extensions.Options.ConfigurationExtensions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0/Microsoft.Extensions.Options.ConfigurationExtensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/8.0.0/Microsoft.Extensions.Options.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/8.0.0/Microsoft.Extensions.Options.csproj index 477139a9ca3..ab32cef0094 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/8.0.0/Microsoft.Extensions.Options.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/8.0.0/Microsoft.Extensions.Options.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/9.0.4/Microsoft.Extensions.Options.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/9.0.4/Microsoft.Extensions.Options.csproj index be3f78d87fc..3232e838163 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/9.0.4/Microsoft.Extensions.Options.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Options/9.0.4/Microsoft.Extensions.Options.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/8.0.0/Microsoft.Extensions.Primitives.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/8.0.0/Microsoft.Extensions.Primitives.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/8.0.0/Microsoft.Extensions.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/8.0.0/Microsoft.Extensions.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/9.0.4/Microsoft.Extensions.Primitives.csproj b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/9.0.4/Microsoft.Extensions.Primitives.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/9.0.4/Microsoft.Extensions.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Extensions.Primitives/9.0.4/Microsoft.Extensions.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Identity.Client.Extensions.Msal/4.61.3/Microsoft.Identity.Client.Extensions.Msal.csproj b/csharp/ql/test/resources/stubs/Microsoft.Identity.Client.Extensions.Msal/4.61.3/Microsoft.Identity.Client.Extensions.Msal.csproj index a085743bd52..8b04793470c 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Identity.Client.Extensions.Msal/4.61.3/Microsoft.Identity.Client.Extensions.Msal.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Identity.Client.Extensions.Msal/4.61.3/Microsoft.Identity.Client.Extensions.Msal.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Identity.Client/4.61.3/Microsoft.Identity.Client.csproj b/csharp/ql/test/resources/stubs/Microsoft.Identity.Client/4.61.3/Microsoft.Identity.Client.csproj index 3951c0cd04f..15c39f9afd8 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Identity.Client/4.61.3/Microsoft.Identity.Client.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Identity.Client/4.61.3/Microsoft.Identity.Client.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Abstractions/7.5.0/Microsoft.IdentityModel.Abstractions.csproj b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Abstractions/7.5.0/Microsoft.IdentityModel.Abstractions.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Abstractions/7.5.0/Microsoft.IdentityModel.Abstractions.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Abstractions/7.5.0/Microsoft.IdentityModel.Abstractions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.JsonWebTokens/7.5.0/Microsoft.IdentityModel.JsonWebTokens.csproj b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.JsonWebTokens/7.5.0/Microsoft.IdentityModel.JsonWebTokens.csproj index 3f7a9eeb43f..2f8d8081f4f 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.JsonWebTokens/7.5.0/Microsoft.IdentityModel.JsonWebTokens.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.JsonWebTokens/7.5.0/Microsoft.IdentityModel.JsonWebTokens.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Logging/7.5.0/Microsoft.IdentityModel.Logging.csproj b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Logging/7.5.0/Microsoft.IdentityModel.Logging.csproj index ccae125b498..a3ab1ba0587 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Logging/7.5.0/Microsoft.IdentityModel.Logging.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Logging/7.5.0/Microsoft.IdentityModel.Logging.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols.OpenIdConnect/7.5.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.csproj b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols.OpenIdConnect/7.5.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.csproj index 4fcb6a92ab7..e1b68d55db9 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols.OpenIdConnect/7.5.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols.OpenIdConnect/7.5.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols/7.5.0/Microsoft.IdentityModel.Protocols.csproj b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols/7.5.0/Microsoft.IdentityModel.Protocols.csproj index 3f7a9eeb43f..2f8d8081f4f 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols/7.5.0/Microsoft.IdentityModel.Protocols.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Protocols/7.5.0/Microsoft.IdentityModel.Protocols.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Tokens/7.5.0/Microsoft.IdentityModel.Tokens.csproj b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Tokens/7.5.0/Microsoft.IdentityModel.Tokens.csproj index 524740979fa..5355c82a2a2 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Tokens/7.5.0/Microsoft.IdentityModel.Tokens.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.IdentityModel.Tokens/7.5.0/Microsoft.IdentityModel.Tokens.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.NETCore.Platforms/3.1.0/Microsoft.NETCore.Platforms.csproj b/csharp/ql/test/resources/stubs/Microsoft.NETCore.Platforms/3.1.0/Microsoft.NETCore.Platforms.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.NETCore.Platforms/3.1.0/Microsoft.NETCore.Platforms.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.NETCore.Platforms/3.1.0/Microsoft.NETCore.Platforms.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.NETCore.Targets/1.1.0/Microsoft.NETCore.Targets.csproj b/csharp/ql/test/resources/stubs/Microsoft.NETCore.Targets/1.1.0/Microsoft.NETCore.Targets.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.NETCore.Targets/1.1.0/Microsoft.NETCore.Targets.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.NETCore.Targets/1.1.0/Microsoft.NETCore.Targets.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.SqlServer.Server/1.0.0/Microsoft.SqlServer.Server.csproj b/csharp/ql/test/resources/stubs/Microsoft.SqlServer.Server/1.0.0/Microsoft.SqlServer.Server.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.SqlServer.Server/1.0.0/Microsoft.SqlServer.Server.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.SqlServer.Server/1.0.0/Microsoft.SqlServer.Server.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Win32.Primitives/4.3.0/Microsoft.Win32.Primitives.csproj b/csharp/ql/test/resources/stubs/Microsoft.Win32.Primitives/4.3.0/Microsoft.Win32.Primitives.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Win32.Primitives/4.3.0/Microsoft.Win32.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Win32.Primitives/4.3.0/Microsoft.Win32.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Microsoft.Win32.SystemEvents/9.0.1/Microsoft.Win32.SystemEvents.csproj b/csharp/ql/test/resources/stubs/Microsoft.Win32.SystemEvents/9.0.1/Microsoft.Win32.SystemEvents.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.Win32.SystemEvents/9.0.1/Microsoft.Win32.SystemEvents.csproj +++ b/csharp/ql/test/resources/stubs/Microsoft.Win32.SystemEvents/9.0.1/Microsoft.Win32.SystemEvents.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/NETStandard.Library/1.6.1/NETStandard.Library.csproj b/csharp/ql/test/resources/stubs/NETStandard.Library/1.6.1/NETStandard.Library.csproj index 273e29bbe55..456dbed0286 100644 --- a/csharp/ql/test/resources/stubs/NETStandard.Library/1.6.1/NETStandard.Library.csproj +++ b/csharp/ql/test/resources/stubs/NETStandard.Library/1.6.1/NETStandard.Library.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/NHibernate/5.5.2/NHibernate.csproj b/csharp/ql/test/resources/stubs/NHibernate/5.5.2/NHibernate.csproj index c327bef839a..d7190e71fe2 100644 --- a/csharp/ql/test/resources/stubs/NHibernate/5.5.2/NHibernate.csproj +++ b/csharp/ql/test/resources/stubs/NHibernate/5.5.2/NHibernate.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Newtonsoft.Json/13.0.3/Newtonsoft.Json.csproj b/csharp/ql/test/resources/stubs/Newtonsoft.Json/13.0.3/Newtonsoft.Json.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Newtonsoft.Json/13.0.3/Newtonsoft.Json.csproj +++ b/csharp/ql/test/resources/stubs/Newtonsoft.Json/13.0.3/Newtonsoft.Json.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Remotion.Linq.EagerFetching/2.2.0/Remotion.Linq.EagerFetching.csproj b/csharp/ql/test/resources/stubs/Remotion.Linq.EagerFetching/2.2.0/Remotion.Linq.EagerFetching.csproj index c1ed1379cbd..decc44b4c3c 100644 --- a/csharp/ql/test/resources/stubs/Remotion.Linq.EagerFetching/2.2.0/Remotion.Linq.EagerFetching.csproj +++ b/csharp/ql/test/resources/stubs/Remotion.Linq.EagerFetching/2.2.0/Remotion.Linq.EagerFetching.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Remotion.Linq/2.2.0/Remotion.Linq.csproj b/csharp/ql/test/resources/stubs/Remotion.Linq/2.2.0/Remotion.Linq.csproj index d6c4929252c..bcce1168ac5 100644 --- a/csharp/ql/test/resources/stubs/Remotion.Linq/2.2.0/Remotion.Linq.csproj +++ b/csharp/ql/test/resources/stubs/Remotion.Linq/2.2.0/Remotion.Linq.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/ServiceStack.Client/8.5.2/ServiceStack.Client.csproj b/csharp/ql/test/resources/stubs/ServiceStack.Client/8.5.2/ServiceStack.Client.csproj index 086203dafdc..f85faa8f7c9 100644 --- a/csharp/ql/test/resources/stubs/ServiceStack.Client/8.5.2/ServiceStack.Client.csproj +++ b/csharp/ql/test/resources/stubs/ServiceStack.Client/8.5.2/ServiceStack.Client.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/ServiceStack.Common/8.5.2/ServiceStack.Common.csproj b/csharp/ql/test/resources/stubs/ServiceStack.Common/8.5.2/ServiceStack.Common.csproj index 738ed3be534..2b25400ea6a 100644 --- a/csharp/ql/test/resources/stubs/ServiceStack.Common/8.5.2/ServiceStack.Common.csproj +++ b/csharp/ql/test/resources/stubs/ServiceStack.Common/8.5.2/ServiceStack.Common.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/ServiceStack.Interfaces/8.5.2/ServiceStack.Interfaces.csproj b/csharp/ql/test/resources/stubs/ServiceStack.Interfaces/8.5.2/ServiceStack.Interfaces.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/ServiceStack.Interfaces/8.5.2/ServiceStack.Interfaces.csproj +++ b/csharp/ql/test/resources/stubs/ServiceStack.Interfaces/8.5.2/ServiceStack.Interfaces.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/ServiceStack.OrmLite.SqlServer/8.5.2/ServiceStack.OrmLite.SqlServer.csproj b/csharp/ql/test/resources/stubs/ServiceStack.OrmLite.SqlServer/8.5.2/ServiceStack.OrmLite.SqlServer.csproj index c091c7d032f..597c06cbe84 100644 --- a/csharp/ql/test/resources/stubs/ServiceStack.OrmLite.SqlServer/8.5.2/ServiceStack.OrmLite.SqlServer.csproj +++ b/csharp/ql/test/resources/stubs/ServiceStack.OrmLite.SqlServer/8.5.2/ServiceStack.OrmLite.SqlServer.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/ServiceStack.OrmLite/8.5.2/ServiceStack.OrmLite.csproj b/csharp/ql/test/resources/stubs/ServiceStack.OrmLite/8.5.2/ServiceStack.OrmLite.csproj index 7138015c599..dc9c0b1497b 100644 --- a/csharp/ql/test/resources/stubs/ServiceStack.OrmLite/8.5.2/ServiceStack.OrmLite.csproj +++ b/csharp/ql/test/resources/stubs/ServiceStack.OrmLite/8.5.2/ServiceStack.OrmLite.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/ServiceStack.Text/8.5.2/ServiceStack.Text.csproj b/csharp/ql/test/resources/stubs/ServiceStack.Text/8.5.2/ServiceStack.Text.csproj index f52b7af1326..72a6682fc4d 100644 --- a/csharp/ql/test/resources/stubs/ServiceStack.Text/8.5.2/ServiceStack.Text.csproj +++ b/csharp/ql/test/resources/stubs/ServiceStack.Text/8.5.2/ServiceStack.Text.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/ServiceStack/8.5.2/ServiceStack.csproj b/csharp/ql/test/resources/stubs/ServiceStack/8.5.2/ServiceStack.csproj index 5fc24d19b67..4dbb285aaa5 100644 --- a/csharp/ql/test/resources/stubs/ServiceStack/8.5.2/ServiceStack.csproj +++ b/csharp/ql/test/resources/stubs/ServiceStack/8.5.2/ServiceStack.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/Stub.System.Data.SQLite.Core.NetStandard/1.0.119/Stub.System.Data.SQLite.Core.NetStandard.csproj b/csharp/ql/test/resources/stubs/Stub.System.Data.SQLite.Core.NetStandard/1.0.119/Stub.System.Data.SQLite.Core.NetStandard.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/Stub.System.Data.SQLite.Core.NetStandard/1.0.119/Stub.System.Data.SQLite.Core.NetStandard.csproj +++ b/csharp/ql/test/resources/stubs/Stub.System.Data.SQLite.Core.NetStandard/1.0.119/Stub.System.Data.SQLite.Core.NetStandard.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.AppContext/4.3.0/System.AppContext.csproj b/csharp/ql/test/resources/stubs/System.AppContext/4.3.0/System.AppContext.csproj index 05ae99d36ae..45b1e4e8f0e 100644 --- a/csharp/ql/test/resources/stubs/System.AppContext/4.3.0/System.AppContext.csproj +++ b/csharp/ql/test/resources/stubs/System.AppContext/4.3.0/System.AppContext.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Buffers/4.3.0/System.Buffers.csproj b/csharp/ql/test/resources/stubs/System.Buffers/4.3.0/System.Buffers.csproj index 461a9c76cd8..d6f8f78264e 100644 --- a/csharp/ql/test/resources/stubs/System.Buffers/4.3.0/System.Buffers.csproj +++ b/csharp/ql/test/resources/stubs/System.Buffers/4.3.0/System.Buffers.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.ClientModel/1.0.0/System.ClientModel.csproj b/csharp/ql/test/resources/stubs/System.ClientModel/1.0.0/System.ClientModel.csproj index af9830f6d13..758bf53c79a 100644 --- a/csharp/ql/test/resources/stubs/System.ClientModel/1.0.0/System.ClientModel.csproj +++ b/csharp/ql/test/resources/stubs/System.ClientModel/1.0.0/System.ClientModel.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.CodeDom/6.0.0/System.CodeDom.csproj b/csharp/ql/test/resources/stubs/System.CodeDom/6.0.0/System.CodeDom.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.CodeDom/6.0.0/System.CodeDom.csproj +++ b/csharp/ql/test/resources/stubs/System.CodeDom/6.0.0/System.CodeDom.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Collections.Concurrent/4.3.0/System.Collections.Concurrent.csproj b/csharp/ql/test/resources/stubs/System.Collections.Concurrent/4.3.0/System.Collections.Concurrent.csproj index e14050e856c..bc793c64812 100644 --- a/csharp/ql/test/resources/stubs/System.Collections.Concurrent/4.3.0/System.Collections.Concurrent.csproj +++ b/csharp/ql/test/resources/stubs/System.Collections.Concurrent/4.3.0/System.Collections.Concurrent.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Collections.NonGeneric/4.3.0/System.Collections.NonGeneric.csproj b/csharp/ql/test/resources/stubs/System.Collections.NonGeneric/4.3.0/System.Collections.NonGeneric.csproj index c90f517b0d7..2349fd41cce 100644 --- a/csharp/ql/test/resources/stubs/System.Collections.NonGeneric/4.3.0/System.Collections.NonGeneric.csproj +++ b/csharp/ql/test/resources/stubs/System.Collections.NonGeneric/4.3.0/System.Collections.NonGeneric.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Collections/4.3.0/System.Collections.csproj b/csharp/ql/test/resources/stubs/System.Collections/4.3.0/System.Collections.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Collections/4.3.0/System.Collections.csproj +++ b/csharp/ql/test/resources/stubs/System.Collections/4.3.0/System.Collections.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.ComponentModel.Annotations/5.0.0/System.ComponentModel.Annotations.csproj b/csharp/ql/test/resources/stubs/System.ComponentModel.Annotations/5.0.0/System.ComponentModel.Annotations.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.ComponentModel.Annotations/5.0.0/System.ComponentModel.Annotations.csproj +++ b/csharp/ql/test/resources/stubs/System.ComponentModel.Annotations/5.0.0/System.ComponentModel.Annotations.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.ComponentModel.Primitives/4.3.0/System.ComponentModel.Primitives.csproj b/csharp/ql/test/resources/stubs/System.ComponentModel.Primitives/4.3.0/System.ComponentModel.Primitives.csproj index a3f8fc48b0c..d9054dba10f 100644 --- a/csharp/ql/test/resources/stubs/System.ComponentModel.Primitives/4.3.0/System.ComponentModel.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/System.ComponentModel.Primitives/4.3.0/System.ComponentModel.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.ComponentModel/4.3.0/System.ComponentModel.csproj b/csharp/ql/test/resources/stubs/System.ComponentModel/4.3.0/System.ComponentModel.csproj index 05ae99d36ae..45b1e4e8f0e 100644 --- a/csharp/ql/test/resources/stubs/System.ComponentModel/4.3.0/System.ComponentModel.csproj +++ b/csharp/ql/test/resources/stubs/System.ComponentModel/4.3.0/System.ComponentModel.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.1/System.Configuration.ConfigurationManager.csproj b/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.1/System.Configuration.ConfigurationManager.csproj index 8017e89ccf2..992d2312bd5 100644 --- a/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.1/System.Configuration.ConfigurationManager.csproj +++ b/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.1/System.Configuration.ConfigurationManager.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.4/System.Configuration.ConfigurationManager.csproj b/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.4/System.Configuration.ConfigurationManager.csproj index 8017e89ccf2..992d2312bd5 100644 --- a/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.4/System.Configuration.ConfigurationManager.csproj +++ b/csharp/ql/test/resources/stubs/System.Configuration.ConfigurationManager/9.0.4/System.Configuration.ConfigurationManager.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Console/4.3.0/System.Console.csproj b/csharp/ql/test/resources/stubs/System.Console/4.3.0/System.Console.csproj index 9b785dfa937..28e7058a12e 100644 --- a/csharp/ql/test/resources/stubs/System.Console/4.3.0/System.Console.csproj +++ b/csharp/ql/test/resources/stubs/System.Console/4.3.0/System.Console.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Data.OleDb/9.0.1/System.Data.OleDb.csproj b/csharp/ql/test/resources/stubs/System.Data.OleDb/9.0.1/System.Data.OleDb.csproj index ded2d0d5626..0e4bf5f125b 100644 --- a/csharp/ql/test/resources/stubs/System.Data.OleDb/9.0.1/System.Data.OleDb.csproj +++ b/csharp/ql/test/resources/stubs/System.Data.OleDb/9.0.1/System.Data.OleDb.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Data.SQLite.Core/1.0.119/System.Data.SQLite.Core.csproj b/csharp/ql/test/resources/stubs/System.Data.SQLite.Core/1.0.119/System.Data.SQLite.Core.csproj index f28b2ba64e4..5b0ee2f2696 100644 --- a/csharp/ql/test/resources/stubs/System.Data.SQLite.Core/1.0.119/System.Data.SQLite.Core.csproj +++ b/csharp/ql/test/resources/stubs/System.Data.SQLite.Core/1.0.119/System.Data.SQLite.Core.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Data.SQLite.EF6/1.0.119/System.Data.SQLite.EF6.csproj b/csharp/ql/test/resources/stubs/System.Data.SQLite.EF6/1.0.119/System.Data.SQLite.EF6.csproj index 73e466e0806..5497fba3f3b 100644 --- a/csharp/ql/test/resources/stubs/System.Data.SQLite.EF6/1.0.119/System.Data.SQLite.EF6.csproj +++ b/csharp/ql/test/resources/stubs/System.Data.SQLite.EF6/1.0.119/System.Data.SQLite.EF6.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Data.SQLite/1.0.119/System.Data.SQLite.csproj b/csharp/ql/test/resources/stubs/System.Data.SQLite/1.0.119/System.Data.SQLite.csproj index a9338476133..d425aed68d5 100644 --- a/csharp/ql/test/resources/stubs/System.Data.SQLite/1.0.119/System.Data.SQLite.csproj +++ b/csharp/ql/test/resources/stubs/System.Data.SQLite/1.0.119/System.Data.SQLite.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Data.SqlClient/4.9.0/System.Data.SqlClient.csproj b/csharp/ql/test/resources/stubs/System.Data.SqlClient/4.9.0/System.Data.SqlClient.csproj index df3e3803d8d..85741278775 100644 --- a/csharp/ql/test/resources/stubs/System.Data.SqlClient/4.9.0/System.Data.SqlClient.csproj +++ b/csharp/ql/test/resources/stubs/System.Data.SqlClient/4.9.0/System.Data.SqlClient.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.Debug/4.3.0/System.Diagnostics.Debug.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.Debug/4.3.0/System.Diagnostics.Debug.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.Debug/4.3.0/System.Diagnostics.Debug.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.Debug/4.3.0/System.Diagnostics.Debug.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/6.0.1/System.Diagnostics.DiagnosticSource.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/6.0.1/System.Diagnostics.DiagnosticSource.csproj index 44f3b6c98d1..3c0ecb9c83e 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/6.0.1/System.Diagnostics.DiagnosticSource.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/6.0.1/System.Diagnostics.DiagnosticSource.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/8.0.0/System.Diagnostics.DiagnosticSource.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/8.0.0/System.Diagnostics.DiagnosticSource.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/8.0.0/System.Diagnostics.DiagnosticSource.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.DiagnosticSource/8.0.0/System.Diagnostics.DiagnosticSource.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.1/System.Diagnostics.EventLog.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.1/System.Diagnostics.EventLog.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.1/System.Diagnostics.EventLog.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.1/System.Diagnostics.EventLog.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.4/System.Diagnostics.EventLog.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.4/System.Diagnostics.EventLog.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.4/System.Diagnostics.EventLog.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.EventLog/9.0.4/System.Diagnostics.EventLog.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.PerformanceCounter/9.0.1/System.Diagnostics.PerformanceCounter.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.PerformanceCounter/9.0.1/System.Diagnostics.PerformanceCounter.csproj index bb528bfa826..8daf53f8044 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.PerformanceCounter/9.0.1/System.Diagnostics.PerformanceCounter.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.PerformanceCounter/9.0.1/System.Diagnostics.PerformanceCounter.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.Tools/4.3.0/System.Diagnostics.Tools.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.Tools/4.3.0/System.Diagnostics.Tools.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.Tools/4.3.0/System.Diagnostics.Tools.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.Tools/4.3.0/System.Diagnostics.Tools.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Diagnostics.Tracing/4.3.0/System.Diagnostics.Tracing.csproj b/csharp/ql/test/resources/stubs/System.Diagnostics.Tracing/4.3.0/System.Diagnostics.Tracing.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Diagnostics.Tracing/4.3.0/System.Diagnostics.Tracing.csproj +++ b/csharp/ql/test/resources/stubs/System.Diagnostics.Tracing/4.3.0/System.Diagnostics.Tracing.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Drawing.Common/9.0.1/System.Drawing.Common.csproj b/csharp/ql/test/resources/stubs/System.Drawing.Common/9.0.1/System.Drawing.Common.csproj index 342c6102919..2a731d89815 100644 --- a/csharp/ql/test/resources/stubs/System.Drawing.Common/9.0.1/System.Drawing.Common.csproj +++ b/csharp/ql/test/resources/stubs/System.Drawing.Common/9.0.1/System.Drawing.Common.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Dynamic.Runtime/4.3.0/System.Dynamic.Runtime.csproj b/csharp/ql/test/resources/stubs/System.Dynamic.Runtime/4.3.0/System.Dynamic.Runtime.csproj index d22ce2d8ece..c295597573c 100644 --- a/csharp/ql/test/resources/stubs/System.Dynamic.Runtime/4.3.0/System.Dynamic.Runtime.csproj +++ b/csharp/ql/test/resources/stubs/System.Dynamic.Runtime/4.3.0/System.Dynamic.Runtime.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Globalization.Calendars/4.3.0/System.Globalization.Calendars.csproj b/csharp/ql/test/resources/stubs/System.Globalization.Calendars/4.3.0/System.Globalization.Calendars.csproj index 0dfbf223dba..4a713846d3b 100644 --- a/csharp/ql/test/resources/stubs/System.Globalization.Calendars/4.3.0/System.Globalization.Calendars.csproj +++ b/csharp/ql/test/resources/stubs/System.Globalization.Calendars/4.3.0/System.Globalization.Calendars.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Globalization.Extensions/4.3.0/System.Globalization.Extensions.csproj b/csharp/ql/test/resources/stubs/System.Globalization.Extensions/4.3.0/System.Globalization.Extensions.csproj index 5e5d3cd90e9..d0fc9d064fe 100644 --- a/csharp/ql/test/resources/stubs/System.Globalization.Extensions/4.3.0/System.Globalization.Extensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Globalization.Extensions/4.3.0/System.Globalization.Extensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Globalization/4.3.0/System.Globalization.csproj b/csharp/ql/test/resources/stubs/System.Globalization/4.3.0/System.Globalization.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Globalization/4.3.0/System.Globalization.csproj +++ b/csharp/ql/test/resources/stubs/System.Globalization/4.3.0/System.Globalization.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.IO.Compression.ZipFile/4.3.0/System.IO.Compression.ZipFile.csproj b/csharp/ql/test/resources/stubs/System.IO.Compression.ZipFile/4.3.0/System.IO.Compression.ZipFile.csproj index aa49337117c..84d7216ee2d 100644 --- a/csharp/ql/test/resources/stubs/System.IO.Compression.ZipFile/4.3.0/System.IO.Compression.ZipFile.csproj +++ b/csharp/ql/test/resources/stubs/System.IO.Compression.ZipFile/4.3.0/System.IO.Compression.ZipFile.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.IO.Compression/4.3.0/System.IO.Compression.csproj b/csharp/ql/test/resources/stubs/System.IO.Compression/4.3.0/System.IO.Compression.csproj index f3323292dcd..5af530f71b3 100644 --- a/csharp/ql/test/resources/stubs/System.IO.Compression/4.3.0/System.IO.Compression.csproj +++ b/csharp/ql/test/resources/stubs/System.IO.Compression/4.3.0/System.IO.Compression.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.IO.FileSystem.Primitives/4.3.0/System.IO.FileSystem.Primitives.csproj b/csharp/ql/test/resources/stubs/System.IO.FileSystem.Primitives/4.3.0/System.IO.FileSystem.Primitives.csproj index 05ae99d36ae..45b1e4e8f0e 100644 --- a/csharp/ql/test/resources/stubs/System.IO.FileSystem.Primitives/4.3.0/System.IO.FileSystem.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/System.IO.FileSystem.Primitives/4.3.0/System.IO.FileSystem.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.IO.FileSystem/4.3.0/System.IO.FileSystem.csproj b/csharp/ql/test/resources/stubs/System.IO.FileSystem/4.3.0/System.IO.FileSystem.csproj index c5d1e07015a..2d8600a5a32 100644 --- a/csharp/ql/test/resources/stubs/System.IO.FileSystem/4.3.0/System.IO.FileSystem.csproj +++ b/csharp/ql/test/resources/stubs/System.IO.FileSystem/4.3.0/System.IO.FileSystem.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.IO/4.3.0/System.IO.csproj b/csharp/ql/test/resources/stubs/System.IO/4.3.0/System.IO.csproj index 531a3f6347c..cf4711e4471 100644 --- a/csharp/ql/test/resources/stubs/System.IO/4.3.0/System.IO.csproj +++ b/csharp/ql/test/resources/stubs/System.IO/4.3.0/System.IO.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.IdentityModel.Tokens.Jwt/7.5.0/System.IdentityModel.Tokens.Jwt.csproj b/csharp/ql/test/resources/stubs/System.IdentityModel.Tokens.Jwt/7.5.0/System.IdentityModel.Tokens.Jwt.csproj index 2f5d2330dc9..ad74be7ad08 100644 --- a/csharp/ql/test/resources/stubs/System.IdentityModel.Tokens.Jwt/7.5.0/System.IdentityModel.Tokens.Jwt.csproj +++ b/csharp/ql/test/resources/stubs/System.IdentityModel.Tokens.Jwt/7.5.0/System.IdentityModel.Tokens.Jwt.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Linq.Expressions/4.3.0/System.Linq.Expressions.csproj b/csharp/ql/test/resources/stubs/System.Linq.Expressions/4.3.0/System.Linq.Expressions.csproj index 2942048df30..a44d7b8937e 100644 --- a/csharp/ql/test/resources/stubs/System.Linq.Expressions/4.3.0/System.Linq.Expressions.csproj +++ b/csharp/ql/test/resources/stubs/System.Linq.Expressions/4.3.0/System.Linq.Expressions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Linq.Queryable/4.0.1/System.Linq.Queryable.csproj b/csharp/ql/test/resources/stubs/System.Linq.Queryable/4.0.1/System.Linq.Queryable.csproj index 1b9179010ea..d80dbdd4d7c 100644 --- a/csharp/ql/test/resources/stubs/System.Linq.Queryable/4.0.1/System.Linq.Queryable.csproj +++ b/csharp/ql/test/resources/stubs/System.Linq.Queryable/4.0.1/System.Linq.Queryable.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Linq/4.3.0/System.Linq.csproj b/csharp/ql/test/resources/stubs/System.Linq/4.3.0/System.Linq.csproj index df71d560e13..5e81708b4cc 100644 --- a/csharp/ql/test/resources/stubs/System.Linq/4.3.0/System.Linq.csproj +++ b/csharp/ql/test/resources/stubs/System.Linq/4.3.0/System.Linq.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Memory.Data/1.0.2/System.Memory.Data.csproj b/csharp/ql/test/resources/stubs/System.Memory.Data/1.0.2/System.Memory.Data.csproj index c444f79ac6f..c9b6459dcb3 100644 --- a/csharp/ql/test/resources/stubs/System.Memory.Data/1.0.2/System.Memory.Data.csproj +++ b/csharp/ql/test/resources/stubs/System.Memory.Data/1.0.2/System.Memory.Data.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Memory/4.5.4/System.Memory.csproj b/csharp/ql/test/resources/stubs/System.Memory/4.5.4/System.Memory.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Memory/4.5.4/System.Memory.csproj +++ b/csharp/ql/test/resources/stubs/System.Memory/4.5.4/System.Memory.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Memory/4.6.0/System.Memory.csproj b/csharp/ql/test/resources/stubs/System.Memory/4.6.0/System.Memory.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Memory/4.6.0/System.Memory.csproj +++ b/csharp/ql/test/resources/stubs/System.Memory/4.6.0/System.Memory.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Net.Http/4.3.0/System.Net.Http.csproj b/csharp/ql/test/resources/stubs/System.Net.Http/4.3.0/System.Net.Http.csproj index 8b07cde32bf..36246904dc0 100644 --- a/csharp/ql/test/resources/stubs/System.Net.Http/4.3.0/System.Net.Http.csproj +++ b/csharp/ql/test/resources/stubs/System.Net.Http/4.3.0/System.Net.Http.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Net.Primitives/4.3.0/System.Net.Primitives.csproj b/csharp/ql/test/resources/stubs/System.Net.Primitives/4.3.0/System.Net.Primitives.csproj index 1f3b6fd84a8..13849284ebd 100644 --- a/csharp/ql/test/resources/stubs/System.Net.Primitives/4.3.0/System.Net.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/System.Net.Primitives/4.3.0/System.Net.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Net.Sockets/4.3.0/System.Net.Sockets.csproj b/csharp/ql/test/resources/stubs/System.Net.Sockets/4.3.0/System.Net.Sockets.csproj index cf920ee7e92..0644b1a5fc3 100644 --- a/csharp/ql/test/resources/stubs/System.Net.Sockets/4.3.0/System.Net.Sockets.csproj +++ b/csharp/ql/test/resources/stubs/System.Net.Sockets/4.3.0/System.Net.Sockets.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Numerics.Vectors/4.5.0/System.Numerics.Vectors.csproj b/csharp/ql/test/resources/stubs/System.Numerics.Vectors/4.5.0/System.Numerics.Vectors.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Numerics.Vectors/4.5.0/System.Numerics.Vectors.csproj +++ b/csharp/ql/test/resources/stubs/System.Numerics.Vectors/4.5.0/System.Numerics.Vectors.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.ObjectModel/4.3.0/System.ObjectModel.csproj b/csharp/ql/test/resources/stubs/System.ObjectModel/4.3.0/System.ObjectModel.csproj index 6aa1406d634..48f65b0b017 100644 --- a/csharp/ql/test/resources/stubs/System.ObjectModel/4.3.0/System.ObjectModel.csproj +++ b/csharp/ql/test/resources/stubs/System.ObjectModel/4.3.0/System.ObjectModel.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Reflection.Emit.ILGeneration/4.3.0/System.Reflection.Emit.ILGeneration.csproj b/csharp/ql/test/resources/stubs/System.Reflection.Emit.ILGeneration/4.3.0/System.Reflection.Emit.ILGeneration.csproj index 80dffb6c91a..b5752b6f67d 100644 --- a/csharp/ql/test/resources/stubs/System.Reflection.Emit.ILGeneration/4.3.0/System.Reflection.Emit.ILGeneration.csproj +++ b/csharp/ql/test/resources/stubs/System.Reflection.Emit.ILGeneration/4.3.0/System.Reflection.Emit.ILGeneration.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Reflection.Emit.Lightweight/4.7.0/System.Reflection.Emit.Lightweight.csproj b/csharp/ql/test/resources/stubs/System.Reflection.Emit.Lightweight/4.7.0/System.Reflection.Emit.Lightweight.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Reflection.Emit.Lightweight/4.7.0/System.Reflection.Emit.Lightweight.csproj +++ b/csharp/ql/test/resources/stubs/System.Reflection.Emit.Lightweight/4.7.0/System.Reflection.Emit.Lightweight.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Reflection.Emit/4.7.0/System.Reflection.Emit.csproj b/csharp/ql/test/resources/stubs/System.Reflection.Emit/4.7.0/System.Reflection.Emit.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Reflection.Emit/4.7.0/System.Reflection.Emit.csproj +++ b/csharp/ql/test/resources/stubs/System.Reflection.Emit/4.7.0/System.Reflection.Emit.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Reflection.Extensions/4.3.0/System.Reflection.Extensions.csproj b/csharp/ql/test/resources/stubs/System.Reflection.Extensions/4.3.0/System.Reflection.Extensions.csproj index 3418538bc44..84fe0ba3fd9 100644 --- a/csharp/ql/test/resources/stubs/System.Reflection.Extensions/4.3.0/System.Reflection.Extensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Reflection.Extensions/4.3.0/System.Reflection.Extensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Reflection.Primitives/4.3.0/System.Reflection.Primitives.csproj b/csharp/ql/test/resources/stubs/System.Reflection.Primitives/4.3.0/System.Reflection.Primitives.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Reflection.Primitives/4.3.0/System.Reflection.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/System.Reflection.Primitives/4.3.0/System.Reflection.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Reflection.TypeExtensions/4.7.0/System.Reflection.TypeExtensions.csproj b/csharp/ql/test/resources/stubs/System.Reflection.TypeExtensions/4.7.0/System.Reflection.TypeExtensions.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Reflection.TypeExtensions/4.7.0/System.Reflection.TypeExtensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Reflection.TypeExtensions/4.7.0/System.Reflection.TypeExtensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Reflection/4.3.0/System.Reflection.csproj b/csharp/ql/test/resources/stubs/System.Reflection/4.3.0/System.Reflection.csproj index 0869c160e2d..3c5a8575fb7 100644 --- a/csharp/ql/test/resources/stubs/System.Reflection/4.3.0/System.Reflection.csproj +++ b/csharp/ql/test/resources/stubs/System.Reflection/4.3.0/System.Reflection.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Resources.ResourceManager/4.3.0/System.Resources.ResourceManager.csproj b/csharp/ql/test/resources/stubs/System.Resources.ResourceManager/4.3.0/System.Resources.ResourceManager.csproj index 195c1b3ba7c..7059a756745 100644 --- a/csharp/ql/test/resources/stubs/System.Resources.ResourceManager/4.3.0/System.Resources.ResourceManager.csproj +++ b/csharp/ql/test/resources/stubs/System.Resources.ResourceManager/4.3.0/System.Resources.ResourceManager.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.CompilerServices.Unsafe/6.0.0/System.Runtime.CompilerServices.Unsafe.csproj b/csharp/ql/test/resources/stubs/System.Runtime.CompilerServices.Unsafe/6.0.0/System.Runtime.CompilerServices.Unsafe.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.CompilerServices.Unsafe/6.0.0/System.Runtime.CompilerServices.Unsafe.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.CompilerServices.Unsafe/6.0.0/System.Runtime.CompilerServices.Unsafe.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.Extensions/4.3.0/System.Runtime.Extensions.csproj b/csharp/ql/test/resources/stubs/System.Runtime.Extensions/4.3.0/System.Runtime.Extensions.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.Extensions/4.3.0/System.Runtime.Extensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.Extensions/4.3.0/System.Runtime.Extensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.Handles/4.3.0/System.Runtime.Handles.csproj b/csharp/ql/test/resources/stubs/System.Runtime.Handles/4.3.0/System.Runtime.Handles.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.Handles/4.3.0/System.Runtime.Handles.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.Handles/4.3.0/System.Runtime.Handles.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.InteropServices.RuntimeInformation/4.3.0/System.Runtime.InteropServices.RuntimeInformation.csproj b/csharp/ql/test/resources/stubs/System.Runtime.InteropServices.RuntimeInformation/4.3.0/System.Runtime.InteropServices.RuntimeInformation.csproj index 6f9c25eb744..3bcf3a63a77 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.InteropServices.RuntimeInformation/4.3.0/System.Runtime.InteropServices.RuntimeInformation.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.InteropServices.RuntimeInformation/4.3.0/System.Runtime.InteropServices.RuntimeInformation.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.InteropServices/4.3.0/System.Runtime.InteropServices.csproj b/csharp/ql/test/resources/stubs/System.Runtime.InteropServices/4.3.0/System.Runtime.InteropServices.csproj index 2e413fd28d5..29b2e27579f 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.InteropServices/4.3.0/System.Runtime.InteropServices.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.InteropServices/4.3.0/System.Runtime.InteropServices.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.Numerics/4.3.0/System.Runtime.Numerics.csproj b/csharp/ql/test/resources/stubs/System.Runtime.Numerics/4.3.0/System.Runtime.Numerics.csproj index 57754ba8a4e..7391fce40cd 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.Numerics/4.3.0/System.Runtime.Numerics.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.Numerics/4.3.0/System.Runtime.Numerics.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Formatters/4.3.0/System.Runtime.Serialization.Formatters.csproj b/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Formatters/4.3.0/System.Runtime.Serialization.Formatters.csproj index 969789e7005..11b6e7e27e0 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Formatters/4.3.0/System.Runtime.Serialization.Formatters.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Formatters/4.3.0/System.Runtime.Serialization.Formatters.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Primitives/4.3.0/System.Runtime.Serialization.Primitives.csproj b/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Primitives/4.3.0/System.Runtime.Serialization.Primitives.csproj index 296b55a60a8..a7640c74aa7 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Primitives/4.3.0/System.Runtime.Serialization.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime.Serialization.Primitives/4.3.0/System.Runtime.Serialization.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Runtime/4.3.0/System.Runtime.csproj b/csharp/ql/test/resources/stubs/System.Runtime/4.3.0/System.Runtime.csproj index 32b25ba435e..c1bb4d18f73 100644 --- a/csharp/ql/test/resources/stubs/System.Runtime/4.3.0/System.Runtime.csproj +++ b/csharp/ql/test/resources/stubs/System.Runtime/4.3.0/System.Runtime.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Algorithms/4.3.0/System.Security.Cryptography.Algorithms.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Algorithms/4.3.0/System.Security.Cryptography.Algorithms.csproj index 4c2a4eaf588..9f73adccf5d 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Algorithms/4.3.0/System.Security.Cryptography.Algorithms.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Algorithms/4.3.0/System.Security.Cryptography.Algorithms.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Cng/4.3.0/System.Security.Cryptography.Cng.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Cng/4.3.0/System.Security.Cryptography.Cng.csproj index cadc9113fab..ed73cd974f7 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Cng/4.3.0/System.Security.Cryptography.Cng.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Cng/4.3.0/System.Security.Cryptography.Cng.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Csp/4.3.0/System.Security.Cryptography.Csp.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Csp/4.3.0/System.Security.Cryptography.Csp.csproj index 8aa9b969d65..894b05f5b5d 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Csp/4.3.0/System.Security.Cryptography.Csp.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Csp/4.3.0/System.Security.Cryptography.Csp.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Encoding/4.3.0/System.Security.Cryptography.Encoding.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Encoding/4.3.0/System.Security.Cryptography.Encoding.csproj index 4ee4e2b8093..27721f827a7 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Encoding/4.3.0/System.Security.Cryptography.Encoding.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Encoding/4.3.0/System.Security.Cryptography.Encoding.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.OpenSsl/4.3.0/System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.OpenSsl/4.3.0/System.Security.Cryptography.OpenSsl.csproj index 8ba6c5da32d..b8300780e8d 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.OpenSsl/4.3.0/System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.OpenSsl/4.3.0/System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Pkcs/9.0.4/System.Security.Cryptography.Pkcs.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Pkcs/9.0.4/System.Security.Cryptography.Pkcs.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Pkcs/9.0.4/System.Security.Cryptography.Pkcs.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Pkcs/9.0.4/System.Security.Cryptography.Pkcs.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Primitives/4.3.0/System.Security.Cryptography.Primitives.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Primitives/4.3.0/System.Security.Cryptography.Primitives.csproj index 4ea09d97c5c..9d13c0aca7e 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.Primitives/4.3.0/System.Security.Cryptography.Primitives.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.Primitives/4.3.0/System.Security.Cryptography.Primitives.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.1/System.Security.Cryptography.ProtectedData.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.1/System.Security.Cryptography.ProtectedData.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.1/System.Security.Cryptography.ProtectedData.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.1/System.Security.Cryptography.ProtectedData.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.4/System.Security.Cryptography.ProtectedData.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.4/System.Security.Cryptography.ProtectedData.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.4/System.Security.Cryptography.ProtectedData.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.ProtectedData/9.0.4/System.Security.Cryptography.ProtectedData.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Cryptography.X509Certificates/4.3.0/System.Security.Cryptography.X509Certificates.csproj b/csharp/ql/test/resources/stubs/System.Security.Cryptography.X509Certificates/4.3.0/System.Security.Cryptography.X509Certificates.csproj index 13e32293916..5b4bcef20f9 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Cryptography.X509Certificates/4.3.0/System.Security.Cryptography.X509Certificates.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Cryptography.X509Certificates/4.3.0/System.Security.Cryptography.X509Certificates.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Security.Permissions/9.0.1/System.Security.Permissions.csproj b/csharp/ql/test/resources/stubs/System.Security.Permissions/9.0.1/System.Security.Permissions.csproj index e25e81c4c5f..da1d0207343 100644 --- a/csharp/ql/test/resources/stubs/System.Security.Permissions/9.0.1/System.Security.Permissions.csproj +++ b/csharp/ql/test/resources/stubs/System.Security.Permissions/9.0.1/System.Security.Permissions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Text.Encoding.Extensions/4.3.0/System.Text.Encoding.Extensions.csproj b/csharp/ql/test/resources/stubs/System.Text.Encoding.Extensions/4.3.0/System.Text.Encoding.Extensions.csproj index 8cc5decfb55..944efc80f30 100644 --- a/csharp/ql/test/resources/stubs/System.Text.Encoding.Extensions/4.3.0/System.Text.Encoding.Extensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Text.Encoding.Extensions/4.3.0/System.Text.Encoding.Extensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Text.Encoding/4.3.0/System.Text.Encoding.csproj b/csharp/ql/test/resources/stubs/System.Text.Encoding/4.3.0/System.Text.Encoding.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Text.Encoding/4.3.0/System.Text.Encoding.csproj +++ b/csharp/ql/test/resources/stubs/System.Text.Encoding/4.3.0/System.Text.Encoding.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Text.Encodings.Web/4.7.2/System.Text.Encodings.Web.csproj b/csharp/ql/test/resources/stubs/System.Text.Encodings.Web/4.7.2/System.Text.Encodings.Web.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Text.Encodings.Web/4.7.2/System.Text.Encodings.Web.csproj +++ b/csharp/ql/test/resources/stubs/System.Text.Encodings.Web/4.7.2/System.Text.Encodings.Web.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Text.Json/4.7.2/System.Text.Json.csproj b/csharp/ql/test/resources/stubs/System.Text.Json/4.7.2/System.Text.Json.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Text.Json/4.7.2/System.Text.Json.csproj +++ b/csharp/ql/test/resources/stubs/System.Text.Json/4.7.2/System.Text.Json.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Text.RegularExpressions/4.3.0/System.Text.RegularExpressions.csproj b/csharp/ql/test/resources/stubs/System.Text.RegularExpressions/4.3.0/System.Text.RegularExpressions.csproj index 05ae99d36ae..45b1e4e8f0e 100644 --- a/csharp/ql/test/resources/stubs/System.Text.RegularExpressions/4.3.0/System.Text.RegularExpressions.csproj +++ b/csharp/ql/test/resources/stubs/System.Text.RegularExpressions/4.3.0/System.Text.RegularExpressions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.3.0/System.Threading.Tasks.Extensions.csproj b/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.3.0/System.Threading.Tasks.Extensions.csproj index 9719080f314..5fadc1ee521 100644 --- a/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.3.0/System.Threading.Tasks.Extensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.3.0/System.Threading.Tasks.Extensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.5.4/System.Threading.Tasks.Extensions.csproj b/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.5.4/System.Threading.Tasks.Extensions.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.5.4/System.Threading.Tasks.Extensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Threading.Tasks.Extensions/4.5.4/System.Threading.Tasks.Extensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Threading.Tasks/4.3.0/System.Threading.Tasks.csproj b/csharp/ql/test/resources/stubs/System.Threading.Tasks/4.3.0/System.Threading.Tasks.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Threading.Tasks/4.3.0/System.Threading.Tasks.csproj +++ b/csharp/ql/test/resources/stubs/System.Threading.Tasks/4.3.0/System.Threading.Tasks.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Threading.Timer/4.3.0/System.Threading.Timer.csproj b/csharp/ql/test/resources/stubs/System.Threading.Timer/4.3.0/System.Threading.Timer.csproj index 4ed1849a7e3..e03091cbb83 100644 --- a/csharp/ql/test/resources/stubs/System.Threading.Timer/4.3.0/System.Threading.Timer.csproj +++ b/csharp/ql/test/resources/stubs/System.Threading.Timer/4.3.0/System.Threading.Timer.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Threading/4.3.0/System.Threading.csproj b/csharp/ql/test/resources/stubs/System.Threading/4.3.0/System.Threading.csproj index a52b105bcb7..72f1cb505bb 100644 --- a/csharp/ql/test/resources/stubs/System.Threading/4.3.0/System.Threading.csproj +++ b/csharp/ql/test/resources/stubs/System.Threading/4.3.0/System.Threading.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Windows.Extensions/9.0.1/System.Windows.Extensions.csproj b/csharp/ql/test/resources/stubs/System.Windows.Extensions/9.0.1/System.Windows.Extensions.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/System.Windows.Extensions/9.0.1/System.Windows.Extensions.csproj +++ b/csharp/ql/test/resources/stubs/System.Windows.Extensions/9.0.1/System.Windows.Extensions.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Xml.ReaderWriter/4.3.0/System.Xml.ReaderWriter.csproj b/csharp/ql/test/resources/stubs/System.Xml.ReaderWriter/4.3.0/System.Xml.ReaderWriter.csproj index 57b27b200a4..0b9b8f7afcc 100644 --- a/csharp/ql/test/resources/stubs/System.Xml.ReaderWriter/4.3.0/System.Xml.ReaderWriter.csproj +++ b/csharp/ql/test/resources/stubs/System.Xml.ReaderWriter/4.3.0/System.Xml.ReaderWriter.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/System.Xml.XDocument/4.3.0/System.Xml.XDocument.csproj b/csharp/ql/test/resources/stubs/System.Xml.XDocument/4.3.0/System.Xml.XDocument.csproj index d594a8ea0f4..ccd05437277 100644 --- a/csharp/ql/test/resources/stubs/System.Xml.XDocument/4.3.0/System.Xml.XDocument.csproj +++ b/csharp/ql/test/resources/stubs/System.Xml.XDocument/4.3.0/System.Xml.XDocument.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj b/csharp/ql/test/resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj index adf087e7314..6d21fd55022 100644 --- a/csharp/ql/test/resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj +++ b/csharp/ql/test/resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj b/csharp/ql/test/resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj index 396498c8261..dc08e6a07f7 100644 --- a/csharp/ql/test/resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj +++ b/csharp/ql/test/resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.native.System.Data.SqlClient.sni.csproj b/csharp/ql/test/resources/stubs/runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.native.System.Data.SqlClient.sni.csproj index db0fe00833e..651bfd2c549 100644 --- a/csharp/ql/test/resources/stubs/runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.native.System.Data.SqlClient.sni.csproj +++ b/csharp/ql/test/resources/stubs/runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.native.System.Data.SqlClient.sni.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.native.System.IO.Compression/4.3.0/runtime.native.System.IO.Compression.csproj b/csharp/ql/test/resources/stubs/runtime.native.System.IO.Compression/4.3.0/runtime.native.System.IO.Compression.csproj index 32b25ba435e..c1bb4d18f73 100644 --- a/csharp/ql/test/resources/stubs/runtime.native.System.IO.Compression/4.3.0/runtime.native.System.IO.Compression.csproj +++ b/csharp/ql/test/resources/stubs/runtime.native.System.IO.Compression/4.3.0/runtime.native.System.IO.Compression.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.native.System.Net.Http/4.3.0/runtime.native.System.Net.Http.csproj b/csharp/ql/test/resources/stubs/runtime.native.System.Net.Http/4.3.0/runtime.native.System.Net.Http.csproj index 32b25ba435e..c1bb4d18f73 100644 --- a/csharp/ql/test/resources/stubs/runtime.native.System.Net.Http/4.3.0/runtime.native.System.Net.Http.csproj +++ b/csharp/ql/test/resources/stubs/runtime.native.System.Net.Http/4.3.0/runtime.native.System.Net.Http.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.native.System.Security.Cryptography.Apple.csproj b/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.native.System.Security.Cryptography.Apple.csproj index 27e7adb1b75..f2560c2ad2f 100644 --- a/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.native.System.Security.Cryptography.Apple.csproj +++ b/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.native.System.Security.Cryptography.Apple.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.native.System.Security.Cryptography.OpenSsl.csproj index a864639497f..bb4a0f554a8 100644 --- a/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.native.System/4.3.0/runtime.native.System.csproj b/csharp/ql/test/resources/stubs/runtime.native.System/4.3.0/runtime.native.System.csproj index 32b25ba435e..c1bb4d18f73 100644 --- a/csharp/ql/test/resources/stubs/runtime.native.System/4.3.0/runtime.native.System.csproj +++ b/csharp/ql/test/resources/stubs/runtime.native.System/4.3.0/runtime.native.System.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple.csproj b/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple.csproj +++ b/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj b/csharp/ql/test/resources/stubs/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj +++ b/csharp/ql/test/resources/stubs/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0/runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni.csproj b/csharp/ql/test/resources/stubs/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni.csproj +++ b/csharp/ql/test/resources/stubs/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-arm64.runtime.native.System.Data.SqlClient.sni.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x64.runtime.native.System.Data.SqlClient.sni.csproj b/csharp/ql/test/resources/stubs/runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x64.runtime.native.System.Data.SqlClient.sni.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x64.runtime.native.System.Data.SqlClient.sni.csproj +++ b/csharp/ql/test/resources/stubs/runtime.win-x64.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x64.runtime.native.System.Data.SqlClient.sni.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/resources/stubs/runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x86.runtime.native.System.Data.SqlClient.sni.csproj b/csharp/ql/test/resources/stubs/runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x86.runtime.native.System.Data.SqlClient.sni.csproj index c7646fbae20..2be6995cd16 100644 --- a/csharp/ql/test/resources/stubs/runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x86.runtime.native.System.Data.SqlClient.sni.csproj +++ b/csharp/ql/test/resources/stubs/runtime.win-x86.runtime.native.System.Data.SqlClient.sni/4.4.0/runtime.win-x86.runtime.native.System.Data.SqlClient.sni.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true bin\ false diff --git a/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected b/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected index 7dcf3b4f877..b73eb6717e5 100644 --- a/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected +++ b/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected @@ -1,12 +1,12 @@ -| NonPublicClass.cs:9:9:9:31 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicClass.cs:19:9:19:51 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 9.0.0.0 | neutral | source | -| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 9.0.0.0 | source | source | -| PublicClass.cs:24:9:24:46 | call to method Write | System | Console | Write | (System.Object) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicClass.cs:30:9:30:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicGenericClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicGenericClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicGenericInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | -| PublicInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | +| NonPublicClass.cs:9:9:9:31 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicClass.cs:19:9:19:51 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 10.0.0.0 | neutral | source | +| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 10.0.0.0 | source | source | +| PublicClass.cs:24:9:24:46 | call to method Write | System | Console | Write | (System.Object) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicClass.cs:30:9:30:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicGenericClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicGenericClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicGenericInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 10.0.0.0 | neutral | source | +| PublicInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 10.0.0.0 | neutral | source | diff --git a/csharp/scripts/create-extractor-pack.sh b/csharp/scripts/create-extractor-pack.sh index a1b5a044ebc..3003dd81172 100755 --- a/csharp/scripts/create-extractor-pack.sh +++ b/csharp/scripts/create-extractor-pack.sh @@ -21,7 +21,7 @@ mkdir -p extractor-pack mkdir -p extractor-pack/tools/${platform} function dotnet_publish { - dotnet publish --self-contained --configuration Release --runtime ${dotnet_platform} -p:RuntimeFrameworkVersion=9.0.5 $1 --output extractor-pack/tools/${platform} + dotnet publish --self-contained --configuration Release --runtime ${dotnet_platform} -p:RuntimeFrameworkVersion=10.0.0 $1 --output extractor-pack/tools/${platform} } dotnet tool restore diff --git a/csharp/scripts/gen-assembly-info.py b/csharp/scripts/gen-assembly-info.py index ca88f5e1683..9937477f70d 100644 --- a/csharp/scripts/gen-assembly-info.py +++ b/csharp/scripts/gen-assembly-info.py @@ -28,7 +28,7 @@ using System.Reflection; [assembly: AssemblyCompany("GitHub")] [assembly: AssemblyCopyright("Copyright © 2024 GitHub")] -[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] +[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] """ output_file.write_text(output_file_contents) diff --git a/csharp/scripts/stubs/helpers.py b/csharp/scripts/stubs/helpers.py index f3810e4f8cc..28b73258c20 100644 --- a/csharp/scripts/stubs/helpers.py +++ b/csharp/scripts/stubs/helpers.py @@ -56,7 +56,7 @@ def remove_files(path, ext): def write_csproj_prefix(ioWrapper): ioWrapper.write('\n') ioWrapper.write(' \n') - ioWrapper.write(' net9.0\n') + ioWrapper.write(' net10.0\n') ioWrapper.write(' true\n') ioWrapper.write(' bin\\n') ioWrapper.write( @@ -73,7 +73,7 @@ class Generator: self.projectDirIn = os.path.join(self.workDir, self.projectNameIn) self.template = template print("\n* Creating new input project") - self.run_cmd(['dotnet', 'new', self.template, "-f", "net9.0", "--language", "C#", '--name', + self.run_cmd(['dotnet', 'new', self.template, "-f", "net10.0", "--language", "C#", '--name', self.projectNameIn, '--output', self.projectDirIn]) remove_files(self.projectDirIn, '.cs') @@ -118,7 +118,7 @@ class Generator: bqrsFile = os.path.join(rawOutputDir, outputName + '.bqrs') jsonFile = os.path.join(rawOutputDir, outputName + '.json') - sdk_version = '9.0.300' + sdk_version = '10.0.100' print("\n* Creating new global.json file and setting SDK to " + sdk_version) self.run_cmd(['dotnet', 'new', 'globaljson', '--force', '--sdk-version', sdk_version, '--output', self.workDir]) diff --git a/csharp/tools/tracing-config.lua b/csharp/tools/tracing-config.lua index 13ede12a237..94cc4fabc16 100644 --- a/csharp/tools/tracing-config.lua +++ b/csharp/tools/tracing-config.lua @@ -183,7 +183,7 @@ function RegisterExtractorPack(id) MsBuildMatcher, CreatePatternMatcher({ '^csc.*%.exe$' }, MatchCompilerName, extractor, { prepend = { '--compiler', '"${compiler}"' }, - order = ORDER_BEFORE + order = ORDER_AFTER }), CreatePatternMatcher({ '^fakes.*%.exe$', 'moles.*%.exe' }, MatchCompilerName, nil, { trace = false }), @@ -224,7 +224,7 @@ function RegisterExtractorPack(id) CreatePatternMatcher({ '^mcs%.exe$', '^csc%.exe$', '^csc$' }, MatchCompilerName, extractor, { prepend = { '--compiler', '${compiler}' }, - order = ORDER_BEFORE + order = ORDER_AFTER }), MsBuildMatcher, function(compilerName, compilerPath, compilerArguments, _languageId) diff --git a/docs/codeql/codeql-language-guides/abstract-syntax-tree-classes-for-working-with-java-programs.rst b/docs/codeql/codeql-language-guides/abstract-syntax-tree-classes-for-working-with-java-programs.rst index 9921ba9734b..c94b9d1891e 100644 --- a/docs/codeql/codeql-language-guides/abstract-syntax-tree-classes-for-working-with-java-programs.rst +++ b/docs/codeql/codeql-language-guides/abstract-syntax-tree-classes-for-working-with-java-programs.rst @@ -231,7 +231,7 @@ Accesses +--------------------------------+---------------------+ | ``a[i]`` | ArrayAccess_ | +--------------------------------+---------------------+ -| ``f(...)`` | MethodAccess_ | +| ``f(...)`` | MethodCall_ | +--------------------------------+ | | ``e.m(...)`` | | +--------------------------------+---------------------+ @@ -374,7 +374,7 @@ Further reading .. _ThisAccess: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$ThisAccess.html .. _SuperAccess: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$SuperAccess.html .. _ArrayAccess: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$ArrayAccess.html -.. _MethodAccess: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$MethodAccess.html +.. _MethodCall: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$MethodCall.html .. _WildcardTypeAccess: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$WildcardTypeAccess.html .. _FieldAccess: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$FieldAccess.html .. _CastExpr: https://codeql.github.com/codeql-standard-libraries/java/semmle/code/java/Expr.qll/type.Expr$CastExpr.html diff --git a/docs/codeql/codeql-language-guides/basic-query-for-java-code.rst b/docs/codeql/codeql-language-guides/basic-query-for-java-code.rst index 63944d25d43..b61e0f01ee7 100644 --- a/docs/codeql/codeql-language-guides/basic-query-for-java-code.rst +++ b/docs/codeql/codeql-language-guides/basic-query-for-java-code.rst @@ -42,11 +42,11 @@ Running a quick query .. code-block:: ql - from MethodAccess ma + from MethodCall mc where - ma.getMethod().hasName("equals") and - ma.getArgument(0).(StringLiteral).getValue() = "" - select ma, "This comparison to empty string is inefficient, use isEmpty() instead." + mc.getMethod().hasName("equals") and + mc.getArgument(0).(StringLiteral).getValue() = "" + select mc, "This comparison to empty string is inefficient, use isEmpty() instead." Note that CodeQL treats Java and Kotlin as part of the same language, so even though this query starts with ``import java``, it will work for both Java and Kotlin code. @@ -55,7 +55,7 @@ Running a quick query .. image:: ../images/codeql-for-visual-studio-code/basic-java-query-results-1.png :align: center -If any matching code is found, click a link in the ``ma`` column to view the ``.equals`` expression in the code viewer. +If any matching code is found, click a link in the ``mc`` column to view the ``.equals`` expression in the code viewer. .. image:: ../images/codeql-for-visual-studio-code/basic-java-query-results-2.png :align: center @@ -72,15 +72,15 @@ After the initial ``import`` statement, this simple query comprises three parts +==================================================================================================+===================================================================================================================+===================================================================================================+ | ``import java`` | Imports the standard CodeQL libraries for Java and Kotlin. | Every query begins with one or more ``import`` statements. | +--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+ -| ``from MethodAccess ma`` | Defines the variables for the query. | We use: | +| ``from MethodCall mc`` | Defines the variables for the query. | We use: | | | Declarations are of the form: | | -| | `` `` | - a ``MethodAccess`` variable for call expressions | +| | `` `` | - a ``MethodCall`` variable for call expressions | +--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+ -| ``where ma.getMethod().hasName("equals") and ma.getArgument(0).(StringLiteral).getValue() = ""`` | Defines a condition on the variables. | ``ma.getMethod().hasName("equals")`` restricts ``ma`` to only calls to methods call ``equals``. | +| ``where mc.getMethod().hasName("equals") and mc.getArgument(0).(StringLiteral).getValue() = ""`` | Defines a condition on the variables. | ``mc.getMethod().hasName("equals")`` restricts ``mc`` to only calls to methods call ``equals``. | | | | | -| | | ``ma.getArgument(0).(StringLiteral).getValue() = ""`` says the argument must be literal ``""``. | +| | | ``mc.getArgument(0).(StringLiteral).getValue() = ""`` says the argument must be literal ``""``. | +--------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------+ -| ``select ma, "This comparison to empty string is inefficient, use isEmpty() instead."`` | Defines what to report for each match. | Reports the resulting ``.equals`` expression with a string that explains the problem. | +| ``select mc, "This comparison to empty string is inefficient, use isEmpty() instead."`` | Defines what to report for each match. | Reports the resulting ``.equals`` expression with a string that explains the problem. | | | | | | | ``select`` statements for queries that are used to find instances of poor coding practice are always in the form: | | | | ``select , ""`` | | @@ -110,16 +110,16 @@ In this case, it is not possible to simply use ``o.isEmpty()`` instead, as ``o`` .. code-block:: ql - ma.getQualifier().getType() instanceof TypeString + mc.getQualifier().getType() instanceof TypeString The ``where`` clause is now: .. code-block:: ql where - ma.getQualifier().getType() instanceof TypeString and - ma.getMethod().hasName("equals") and - ma.getArgument(0).(StringLiteral).getValue() = "" + mc.getQualifier().getType() instanceof TypeString and + mc.getMethod().hasName("equals") and + mc.getArgument(0).(StringLiteral).getValue() = "" #. Re-run the query. @@ -141,4 +141,4 @@ Further reading .. |image-quick-query| image:: ../images/codeql-for-visual-studio-code/quick-query-tab-java.png -.. |result-col-1| replace:: The first column corresponds to the expression ``ma`` and is linked to the location in the source code of the project where ``ma`` occurs. \ No newline at end of file +.. |result-col-1| replace:: The first column corresponds to the expression ``mc`` and is linked to the location in the source code of the project where ``mc`` occurs. \ No newline at end of file diff --git a/docs/codeql/codeql-language-guides/navigating-the-call-graph.rst b/docs/codeql/codeql-language-guides/navigating-the-call-graph.rst index 6e1b443f96b..a36b029b1d3 100644 --- a/docs/codeql/codeql-language-guides/navigating-the-call-graph.rst +++ b/docs/codeql/codeql-language-guides/navigating-the-call-graph.rst @@ -8,7 +8,7 @@ CodeQL has classes for identifying code that calls other code, and code that can Call graph classes ------------------ -The CodeQL library for Java/Kotlin provides two abstract classes for representing a program's call graph: ``Callable`` and ``Call``. The former is simply the common superclass of ``Method`` and ``Constructor``, the latter is a common superclass of ``MethodAccess``, ``ClassInstanceExpression``, ``ThisConstructorInvocationStmt`` and ``SuperConstructorInvocationStmt``. Simply put, a ``Callable`` is something that can be invoked, and a ``Call`` is something that invokes a ``Callable``. +The CodeQL library for Java/Kotlin provides two abstract classes for representing a program's call graph: ``Callable`` and ``Call``. The former is simply the common superclass of ``Method`` and ``Constructor``, the latter is a common superclass of ``MethodCall``, ``ClassInstanceExpression``, ``ThisConstructorInvocationStmt`` and ``SuperConstructorInvocationStmt``. Simply put, a ``Callable`` is something that can be invoked, and a ``Call`` is something that invokes a ``Callable``. For example, in the following program all callables and calls have been annotated with comments: diff --git a/docs/codeql/codeql-language-guides/types-in-java.rst b/docs/codeql/codeql-language-guides/types-in-java.rst index bed021489ea..2633f8d012f 100644 --- a/docs/codeql/codeql-language-guides/types-in-java.rst +++ b/docs/codeql/codeql-language-guides/types-in-java.rst @@ -113,7 +113,7 @@ To identify these cases, we can create two CodeQL classes that represent, respec } /** class representing calls to java.util.Collection.toArray(T[]) */ - class CollectionToArrayCall extends MethodAccess { + class CollectionToArrayCall extends MethodCall { CollectionToArrayCall() { exists(CollectionToArray m | this.getMethod().getSourceDeclaration().overridesOrInstantiates*(m) @@ -210,7 +210,7 @@ Now we want to identify all calls to ``Collection.contains``, including any meth .. code-block:: ql - class JavaUtilCollectionContainsCall extends MethodAccess { + class JavaUtilCollectionContainsCall extends MethodCall { JavaUtilCollectionContainsCall() { exists(JavaUtilCollectionContains jucc | this.getMethod().getSourceDeclaration().overrides*(jucc) @@ -297,7 +297,7 @@ Adding these three improvements, our final query becomes: } } - class JavaUtilCollectionContainsCall extends MethodAccess { + class JavaUtilCollectionContainsCall extends MethodCall { JavaUtilCollectionContainsCall() { exists(JavaUtilCollectionContains jucc | this.getMethod().getSourceDeclaration().overrides*(jucc) diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.5.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.5.rst new file mode 100644 index 00000000000..9022a09444f --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.5.rst @@ -0,0 +1,134 @@ +.. _codeql-cli-2.23.5: + +========================== +CodeQL 2.23.5 (2025-11-13) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.23.5 runs a total of 483 security queries when configured with the Default suite (covering 166 CWE). The Extended suite enables an additional 135 queries (covering 35 more CWE). 3 security queries have been added with this release. + +CodeQL CLI +---------- + +Breaking Changes +~~~~~~~~~~~~~~~~ + +* In order to make a :code:`@kind path-problem` query diff-informed, the :code:`getASelectedSourceLocation` and :code:`getASelectedSinkLocation` predicates in the dataflow configuration now need to be overridden to always return the location of the source/sink *in addition to* any other locations that are selected by the query. See the `QLdoc `__ for more details. + +Query Packs +----------- + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* the :code:`cs/web/missing-x-frame-options` query now correctly handles configuration nested in root :code:`` elements. + +Java/Kotlin +""""""""""" + +* Calls to :code:`String.matches` are now treated as sanitizers for the :code:`java/ssrf` query. + +Python +"""""" + +* The :code:`py/insecure-cookie` query has been split into multiple queries; with :code:`py/insecure-cookie` checking for cases in which :code:`Secure` flag is not set, :code:`py/client-exposed-cookie` checking for cases in which the :code:`HttpOnly` flag is not set, and the :code:`py/samesite-none` query checking for cases in which the :code:`SameSite` attribute is set to :code:`None`. These queries also now only alert for cases in which the cookie is detected to contain sensitive data. + +Rust +"""" + +* The "Low Rust analysis quality" query (:code:`rust/diagnostic/database-quality`), used by the tool status page, has been extended with a measure of successful type inference. + +New Queries +~~~~~~~~~~~ + +Java/Kotlin +""""""""""" + +* The :code:`java/sensitive-cookie-not-httponly` query has been promoted from experimental to the main query pack. +* Added a new query, :code:`java/escaping`, to detect values escaping from classes marked as :code:`@ThreadSafe`. +* Added a new query, :code:`java/not-threadsafe`, to detect data races in classes marked as :code:`@ThreadSafe`. +* Added a new query, :code:`java/safe-publication`, to detect unsafe publication in classes marked as :code:`@ThreadSafe`. + +Language Libraries +------------------ + +Breaking Changes +~~~~~~~~~~~~~~~~ + +Swift +""""" + +* The :code:`OpenedArchetypeType` class has been renamed as :code:`ExistentialArchetypeType`. +* The :code:`OtherAvailabilitySpec` class has been removed. Use :code:`AvailabilitySpec::isWildcard` instead. +* The :code:`PlatformVersionAvailabilitySpec` has been removed. Use :code:`AvailabilitySpec::getPlatform` and :code:`AvailabilitySpec::getVersion` instead. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* The representation of the C# control-flow graph has been significantly changed. This has minor effects on a wide range of queries including both minor improvements and minor regressions, for example, improved precision has been observed for :code:`cs/inefficient-containskey` and :code:`cs/stringbuilder-creation-in-loop`. Two queries stand out as being significantly affected with great improvements: :code:`cs/dereferenced-value-may-be-null` has been completely rewritten which removes a very significant number of false positives. Furthermore, :code:`cs/constant-condition` has been updated to report many new results - these new results are primarily expected to be true positives, but a few new false positives are expected as well. As part of these changes, :code:`cs/dereferenced-value-may-be-null` has been changed from a :code:`path-problem` query to a :code:`problem` query, so paths are no longer reported for this query. + +Swift +""""" + +* Upgraded to allow analysis of Swift 6.2. +* Support for experimental Embedded Swift has been dropped. + +Rust +"""" + +* Resolution of calls to functions has been improved in a number of ways, to make it more aligned with the behavior of the Rust compiler. This may impact queries that rely on call resolution, such as data flow queries. +* Added basic models for the :code:`actix-web` web framework. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* Added tracer support for macOS and Linux when the .NET CLI (:code:`dotnet`) directly invokes the C# compiler (:code:`csc`). This enhancement provides basic tracing and extraction capabilities for .NET 10 RC2 on these platforms. +* The extraction of location information for source code entities has been updated to use star IDs (:code:`*` IDs). This change should be transparent to end-users but may improve extraction performance in some cases by reducing TRAP file size and eliminating overhead from location de-duplication. + +Rust +"""" + +* Added :code:`ExtractedFile::hasSemantics` and :code:`ExtractedFile::isSkippedByCompilation` predicates. +* Generalized some existing models to improve data flow. +* Added models for the :code:`mysql` and :code:`mysql_async` libraries. + +Deprecated APIs +~~~~~~~~~~~~~~~ + +C# +"" + +* The class :code:`AbstractValue` in the :code:`Guards` library has been deprecated and replaced with the class :code:`GuardValue`. + +New Features +~~~~~~~~~~~~ + +Python +"""""" + +* Initial support for incremental Python databases via :code:`codeql database create --overlay-base`\ /\ :code:`--overlay-changes`. + +Swift +""""" + +* Added AST nodes :code:`UsingDecl`, :code:`UnsafeExpr`, and :code:`InlineArrayType` that correspond to new nodes in Swift 6.2. +* Added new predicates :code:`isDistributedGet`, :code:`isRead2`, :code:`isModify2`, and :code:`isInit` to the :code:`Accessor` class that correspond to new accessors in Swift 6.2. +* Added a new predicate :code:`isApply` to the :code:`KeyPathComponent` class that corresponds to method and initializer key path components in Swift 6.2. diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.6.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.6.rst new file mode 100644 index 00000000000..67fe1ed487f --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.6.rst @@ -0,0 +1,144 @@ +.. _codeql-cli-2.23.6: + +========================== +CodeQL 2.23.6 (2025-11-24) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.23.6 runs a total of 485 security queries when configured with the Default suite (covering 166 CWE). The Extended suite enables an additional 135 queries (covering 35 more CWE). 2 security queries have been added with this release. + +CodeQL CLI +---------- + +Breaking Changes +~~~~~~~~~~~~~~~~ + +* The LGTM results format for uploading to LGTM has been removed. + +Query Packs +----------- + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* An improvement to the Guards library for recognizing disjunctions means improved precision for :code:`cs/constant-condition`, :code:`cs/inefficient-containskey`, and :code:`cs/dereferenced-value-may-be-null`. The two former can have additional findings, and the latter will have fewer false positives. + +Rust +"""" + +* Taint flow barriers have been added to the :code:`rust/regex-injection`, :code:`rust/sql-injection` and :code:`rust/log-injection`, reducing the frequency of false positive results for these queries. + +New Queries +~~~~~~~~~~~ + +C# +"" + +* The :code:`cs/web/cookie-secure-not-set` and :code:`cs/web/cookie-httponly-not-set` queries have been promoted from experimental to the main query pack. + +Query Metadata Changes +~~~~~~~~~~~~~~~~~~~~~~ + +Java/Kotlin +""""""""""" + +* Reduced the :code:`security-severity` score of the :code:`java/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. +* Reduced the :code:`security-severity` score of the :code:`java/insecure-cookie` query from 5.0 to 4.0 to better reflect its impact. + +JavaScript/TypeScript +""""""""""""""""""""" + +* Increased the :code:`security-severity` score of the :code:`js/xss-through-dom` query from 6.1 to 7.8 to align with other XSS queries. +* Reduced the :code:`security-severity` score of the :code:`js/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. + +Python +"""""" + +* Reduced the :code:`security-severity` score of the :code:`py/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. + +Ruby +"""" + +* Reduced the :code:`security-severity` score of the :code:`rb/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. + +Language Libraries +------------------ + +Bug Fixes +~~~~~~~~~ + +C/C++ +""""" + +* Improve performance of the range analysis in cases where it would otherwise take an exorbitant amount of time. + +Golang +"""""" + +* Some fixes relating to use of path transformers when extracting a database: + + * Fixed a problem where the path transformer would be ignored when extracting older codebases that predate the use of Go modules. + * The environment variable :code:`CODEQL_PATH_TRANSFORMER` is now recognized, in addition to :code:`SEMMLE_PATH_TRANSFORMER`. + * Fixed some cases where the extractor emitted paths without applying the path transformer. + +Breaking Changes +~~~~~~~~~~~~~~~~ + +Python +"""""" + +* The classes :code:`ControlFlowNode`, :code:`Expr`, and :code:`Module` no longer expose predicates that invoke the points-to analysis. To access these predicates, import the module :code:`LegacyPointsTo` and follow the instructions given therein. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Swift +""""" + +* Upgraded to allow analysis of Swift 6.2.1. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* Updated *roslyn* and *binlog* dependencies in the extractor, which may improve database and analysis quality. + +Rust +"""" + +* Added models for cookie methods in the :code:`poem` crate. + +Deprecated APIs +~~~~~~~~~~~~~~~ + +C# +"" + +* :code:`ControlFlowElement.controlsBlock` has been deprecated in favor of the Guards library. + +New Features +~~~~~~~~~~~~ + +C/C++ +""""" + +* New predicates :code:`getAnExpandedArgument` and :code:`getExpandedArgument` were added to the :code:`Compilation` class, yielding compilation arguments after expansion of response files. + +C# +"" + +* Initial support for incremental C# databases via :code:`codeql database create --overlay-base`\ /\ :code:`--overlay-changes`. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index 4b3e1f5bb98..195a9782088 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,8 @@ A list of queries for each suite and language `is available here `__ +- `Example queries for Rust `__ - `CodeQL library reference for Rust `__ diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 8dcfd1a5dc0..a51d9de265e 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -15,7 +15,7 @@ .NET Core up to 3.1 - .NET 5, .NET 6, .NET 7, .NET 8, .NET 9","``.sln``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" + .NET 5, .NET 6, .NET 7, .NET 8, .NET 9","``.sln``, ``.slnx``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" GitHub Actions,"Not applicable",Not applicable,"``.github/workflows/*.yml``, ``.github/workflows/*.yaml``, ``**/action.yml``, ``**/action.yaml``" Go (aka Golang), "Go up to 1.25", "Go 1.11 or more recent", ``.go`` Java,"Java 7 to 25 [6]_","javac (OpenJDK and Oracle JDK), diff --git a/go/Makefile b/go/Makefile index ac3182ae571..0b9dc9e4ea4 100644 --- a/go/Makefile +++ b/go/Makefile @@ -54,9 +54,9 @@ ql/lib/go.dbscheme.stats: ql/lib/go.dbscheme build/stats/src.stamp extractor codeql dataset measure -o $@ build/stats/database/db-go test: all build/testdb/check-upgrade-path - codeql test run -j0 ql/test --search-path .. --check-diff-informed --consistency-queries ql/test/consistency --compilation-cache=$(cache) --dynamic-join-order-mode=$(rtjo) --check-databases --fail-on-trap-errors --check-undefined-labels --check-unused-labels --check-repeated-labels --check-redefined-labels --check-use-before-definition + codeql test run -j0 ql/test --search-path .. --check-diff-informed --consistency-queries ql/consistency-queries --compilation-cache=$(cache) --dynamic-join-order-mode=$(rtjo) --check-databases --fail-on-trap-errors --check-undefined-labels --check-unused-labels --check-repeated-labels --check-redefined-labels --check-use-before-definition # use GOOS=linux because GOOS=darwin GOARCH=386 is no longer supported - env GOOS=linux GOARCH=386 codeql$(EXE) test run -j0 ql/test/query-tests/Security/CWE-681 --search-path .. --check-diff-informed --consistency-queries ql/test/consistency --compilation-cache=$(cache) --dynamic-join-order-mode=$(rtjo) + env GOOS=linux GOARCH=386 codeql$(EXE) test run -j0 ql/test/query-tests/Security/CWE-681 --search-path .. --check-diff-informed --consistency-queries ql/consistency-queries --compilation-cache=$(cache) --dynamic-join-order-mode=$(rtjo) cd extractor; $(BAZEL) test ... bash extractor-smoke-test/test.sh || (echo "Extractor smoke test FAILED"; exit 1) diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index 09dd1b3f575..314fb8a56c1 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -815,12 +815,12 @@ func (extraction *Extraction) extractFileInfo(tw *trap.Writer, file string, isDu displayPath = rawPath } if i == len(components)-1 { - lbl := tw.Labeler.FileLabelFor(path) + lbl := tw.Labeler.FileLabelFor(file) dbscheme.FilesTable.Emit(tw, lbl, displayPath) dbscheme.ContainerParentTable.Emit(tw, parentLbl, lbl) dbscheme.HasLocationTable.Emit(tw, lbl, emitLocation(tw, lbl, 0, 0, 0, 0)) extraction.Lock.Lock() - slbl := extraction.StatWriter.Labeler.FileLabelFor(path) + slbl := extraction.StatWriter.Labeler.FileLabelFor(file) if !isDummy { dbscheme.CompilationCompilingFilesTable.Emit(extraction.StatWriter, extraction.Label, extraction.GetFileIdx(file), slbl) } diff --git a/go/extractor/go.mod b/go/extractor/go.mod index b73963c45cf..2729c7dfcc5 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -9,8 +9,8 @@ toolchain go1.25.0 // when adding or removing dependencies, run // bazel mod tidy require ( - golang.org/x/mod v0.30.0 - golang.org/x/tools v0.38.0 + golang.org/x/mod v0.31.0 + golang.org/x/tools v0.40.0 ) -require golang.org/x/sync v0.17.0 // indirect +require golang.org/x/sync v0.19.0 // indirect diff --git a/go/extractor/go.sum b/go/extractor/go.sum index 71824432ff5..488d2003193 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -1,8 +1,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= diff --git a/go/extractor/trap/labels.go b/go/extractor/trap/labels.go index 3fc02d066cf..473e2e761f2 100644 --- a/go/extractor/trap/labels.go +++ b/go/extractor/trap/labels.go @@ -69,14 +69,14 @@ func (l *Labeler) GlobalID(key string) Label { // FileLabel returns the label for a file with path `path`. func (l *Labeler) FileLabel() Label { if l.fileLabel == InvalidLabel { - l.fileLabel = l.FileLabelFor(srcarchive.TransformPath(l.tw.path)) + l.fileLabel = l.FileLabelFor(l.tw.path) } return l.fileLabel } // FileLabelFor returns the label for the file for which the trap writer `tw` is associated func (l *Labeler) FileLabelFor(path string) Label { - return l.GlobalID(util.EscapeTrapSpecialChars(filepath.ToSlash(path)) + ";sourcefile") + return l.GlobalID(util.EscapeTrapSpecialChars(filepath.ToSlash(srcarchive.TransformPath(path))) + ";sourcefile") } // LocalID associates a label with the given AST node `nd` and returns it diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 870695d684c..00273047253 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/go/ql/test/consistency/UnexpectedFrontendErrors.ql b/go/ql/consistency-queries/UnexpectedFrontendErrors.ql similarity index 100% rename from go/ql/test/consistency/UnexpectedFrontendErrors.ql rename to go/ql/consistency-queries/UnexpectedFrontendErrors.ql diff --git a/go/ql/consistency-queries/change-notes/released/1.0.35.md b/go/ql/consistency-queries/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.36.md b/go/ql/consistency-queries/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.37.md b/go/ql/consistency-queries/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.38.md b/go/ql/consistency-queries/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index be82fc786d2..8bb3c230c3e 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.35-dev +version: 1.0.39-dev groups: - go - queries diff --git a/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected b/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected index 20fcacbc389..4e58a49e12d 100644 --- a/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected +++ b/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected @@ -12,18 +12,22 @@ ql/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql ql/go/ql/src/Security/CWE-079/ReflectedXss.ql ql/go/ql/src/Security/CWE-089/SqlInjection.ql ql/go/ql/src/Security/CWE-089/StringBreak.ql +ql/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.ql ql/go/ql/src/Security/CWE-190/AllocationSizeOverflow.ql ql/go/ql/src/Security/CWE-209/StackTraceExposure.ql ql/go/ql/src/Security/CWE-295/DisabledCertificateCheck.ql ql/go/ql/src/Security/CWE-312/CleartextLogging.ql ql/go/ql/src/Security/CWE-322/InsecureHostKeyCallback.ql ql/go/ql/src/Security/CWE-326/InsufficientKeySize.ql +ql/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql ql/go/ql/src/Security/CWE-327/InsecureTLS.ql +ql/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql ql/go/ql/src/Security/CWE-338/InsecureRandomness.ql ql/go/ql/src/Security/CWE-347/MissingJwtSignatureCheck.ql ql/go/ql/src/Security/CWE-352/ConstantOauth2State.ql ql/go/ql/src/Security/CWE-601/BadRedirectCheck.ql ql/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql +ql/go/ql/src/Security/CWE-614/CookieWithoutSecure.ql ql/go/ql/src/Security/CWE-640/EmailInjection.ql ql/go/ql/src/Security/CWE-643/XPathInjection.ql ql/go/ql/src/Security/CWE-681/IncorrectIntegerConversionQuery.ql diff --git a/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected b/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected index ee0ec8f42ba..53624256090 100644 --- a/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected +++ b/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected @@ -34,6 +34,7 @@ ql/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql ql/go/ql/src/Security/CWE-079/ReflectedXss.ql ql/go/ql/src/Security/CWE-089/SqlInjection.ql ql/go/ql/src/Security/CWE-089/StringBreak.ql +ql/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.ql ql/go/ql/src/Security/CWE-117/LogInjection.ql ql/go/ql/src/Security/CWE-190/AllocationSizeOverflow.ql ql/go/ql/src/Security/CWE-209/StackTraceExposure.ql @@ -41,12 +42,15 @@ ql/go/ql/src/Security/CWE-295/DisabledCertificateCheck.ql ql/go/ql/src/Security/CWE-312/CleartextLogging.ql ql/go/ql/src/Security/CWE-322/InsecureHostKeyCallback.ql ql/go/ql/src/Security/CWE-326/InsufficientKeySize.ql +ql/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql ql/go/ql/src/Security/CWE-327/InsecureTLS.ql +ql/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql ql/go/ql/src/Security/CWE-338/InsecureRandomness.ql ql/go/ql/src/Security/CWE-347/MissingJwtSignatureCheck.ql ql/go/ql/src/Security/CWE-352/ConstantOauth2State.ql ql/go/ql/src/Security/CWE-601/BadRedirectCheck.ql ql/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql +ql/go/ql/src/Security/CWE-614/CookieWithoutSecure.ql ql/go/ql/src/Security/CWE-640/EmailInjection.ql ql/go/ql/src/Security/CWE-643/XPathInjection.ql ql/go/ql/src/Security/CWE-681/IncorrectIntegerConversionQuery.ql diff --git a/go/ql/integration-tests/query-suite/go-security-extended.qls.expected b/go/ql/integration-tests/query-suite/go-security-extended.qls.expected index 9116f7b7ebf..97f0937346a 100644 --- a/go/ql/integration-tests/query-suite/go-security-extended.qls.expected +++ b/go/ql/integration-tests/query-suite/go-security-extended.qls.expected @@ -12,6 +12,7 @@ ql/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql ql/go/ql/src/Security/CWE-079/ReflectedXss.ql ql/go/ql/src/Security/CWE-089/SqlInjection.ql ql/go/ql/src/Security/CWE-089/StringBreak.ql +ql/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.ql ql/go/ql/src/Security/CWE-117/LogInjection.ql ql/go/ql/src/Security/CWE-190/AllocationSizeOverflow.ql ql/go/ql/src/Security/CWE-209/StackTraceExposure.ql @@ -19,12 +20,15 @@ ql/go/ql/src/Security/CWE-295/DisabledCertificateCheck.ql ql/go/ql/src/Security/CWE-312/CleartextLogging.ql ql/go/ql/src/Security/CWE-322/InsecureHostKeyCallback.ql ql/go/ql/src/Security/CWE-326/InsufficientKeySize.ql +ql/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql ql/go/ql/src/Security/CWE-327/InsecureTLS.ql +ql/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql ql/go/ql/src/Security/CWE-338/InsecureRandomness.ql ql/go/ql/src/Security/CWE-347/MissingJwtSignatureCheck.ql ql/go/ql/src/Security/CWE-352/ConstantOauth2State.ql ql/go/ql/src/Security/CWE-601/BadRedirectCheck.ql ql/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql +ql/go/ql/src/Security/CWE-614/CookieWithoutSecure.ql ql/go/ql/src/Security/CWE-640/EmailInjection.ql ql/go/ql/src/Security/CWE-643/XPathInjection.ql ql/go/ql/src/Security/CWE-681/IncorrectIntegerConversionQuery.ql diff --git a/go/ql/integration-tests/query-suite/not_included_in_qls.expected b/go/ql/integration-tests/query-suite/not_included_in_qls.expected index 3b79e47da44..93775742500 100644 --- a/go/ql/integration-tests/query-suite/not_included_in_qls.expected +++ b/go/ql/integration-tests/query-suite/not_included_in_qls.expected @@ -9,12 +9,10 @@ ql/go/ql/src/Security/CWE-079/StoredXss.ql ql/go/ql/src/Security/CWE-798/HardcodedCredentials.ql ql/go/ql/src/definitions.ql ql/go/ql/src/experimental/CWE-090/LDAPInjection.ql -ql/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.ql ql/go/ql/src/experimental/CWE-203/Timing.ql ql/go/ql/src/experimental/CWE-285/PamAuthBypass.ql ql/go/ql/src/experimental/CWE-287/ImproperLdapAuth.ql ql/go/ql/src/experimental/CWE-321-V2/HardCodedKeys.ql -ql/go/ql/src/experimental/CWE-327/WeakCryptoAlgorithm.ql ql/go/ql/src/experimental/CWE-369/DivideByZero.ql ql/go/ql/src/experimental/CWE-400/DatabaseCallInLoop.ql ql/go/ql/src/experimental/CWE-522-DecompressionBombs/DecompressionBombs.ql diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index e2d2a71f6bd..5f0fda7c3e6 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,24 @@ +## 5.0.5 + +No user-facing changes. + +## 5.0.4 + +No user-facing changes. + +## 5.0.3 + +No user-facing changes. + +## 5.0.2 + +### Bug Fixes + +* Some fixes relating to use of path transformers when extracting a database: + * Fixed a problem where the path transformer would be ignored when extracting older codebases that predate the use of Go modules. + * The environment variable `CODEQL_PATH_TRANSFORMER` is now recognized, in addition to `SEMMLE_PATH_TRANSFORMER`. + * Fixed some cases where the extractor emitted paths without applying the path transformer. + ## 5.0.1 No user-facing changes. diff --git a/go/ql/lib/change-notes/2025-11-26-unexpected-frontend-errors-query-moved.md b/go/ql/lib/change-notes/2025-11-26-unexpected-frontend-errors-query-moved.md new file mode 100644 index 00000000000..cf4b724dbd9 --- /dev/null +++ b/go/ql/lib/change-notes/2025-11-26-unexpected-frontend-errors-query-moved.md @@ -0,0 +1,4 @@ +--- +category: breaking +--- +* The query `go/unexpected-frontend-error` has been moved from the `codeql/go-queries` query to the `codeql-go-consistency-queries` query pack. diff --git a/go/ql/lib/change-notes/2025-11-11-path-transformer.md b/go/ql/lib/change-notes/released/5.0.2.md similarity index 94% rename from go/ql/lib/change-notes/2025-11-11-path-transformer.md rename to go/ql/lib/change-notes/released/5.0.2.md index c36cf8fb83e..1c95b433dac 100644 --- a/go/ql/lib/change-notes/2025-11-11-path-transformer.md +++ b/go/ql/lib/change-notes/released/5.0.2.md @@ -1,6 +1,7 @@ ---- -category: fix ---- +## 5.0.2 + +### Bug Fixes + * Some fixes relating to use of path transformers when extracting a database: * Fixed a problem where the path transformer would be ignored when extracting older codebases that predate the use of Go modules. * The environment variable `CODEQL_PATH_TRANSFORMER` is now recognized, in addition to `SEMMLE_PATH_TRANSFORMER`. diff --git a/go/ql/lib/change-notes/released/5.0.3.md b/go/ql/lib/change-notes/released/5.0.3.md new file mode 100644 index 00000000000..57074925279 --- /dev/null +++ b/go/ql/lib/change-notes/released/5.0.3.md @@ -0,0 +1,3 @@ +## 5.0.3 + +No user-facing changes. diff --git a/go/ql/lib/change-notes/released/5.0.4.md b/go/ql/lib/change-notes/released/5.0.4.md new file mode 100644 index 00000000000..5c625c33d52 --- /dev/null +++ b/go/ql/lib/change-notes/released/5.0.4.md @@ -0,0 +1,3 @@ +## 5.0.4 + +No user-facing changes. diff --git a/go/ql/lib/change-notes/released/5.0.5.md b/go/ql/lib/change-notes/released/5.0.5.md new file mode 100644 index 00000000000..be08f873636 --- /dev/null +++ b/go/ql/lib/change-notes/released/5.0.5.md @@ -0,0 +1,3 @@ +## 5.0.5 + +No user-facing changes. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index ae7df5e18b7..02e5f00fa9e 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.1 +lastReleaseVersion: 5.0.5 diff --git a/go/ql/lib/ext/empty.model.yml b/go/ql/lib/ext/empty.model.yml index 8d661a9f1db..1709a6098eb 100644 --- a/go/ql/lib/ext/empty.model.yml +++ b/go/ql/lib/ext/empty.model.yml @@ -9,6 +9,14 @@ extensions: pack: codeql/go-all extensible: sinkModel data: [] + - addsTo: + pack: codeql/go-all + extensible: barrierModel + data: [] + - addsTo: + pack: codeql/go-all + extensible: barrierGuardModel + data: [] - addsTo: pack: codeql/go-all extensible: summaryModel diff --git a/go/ql/lib/go.qll b/go/ql/lib/go.qll index 16f2f1702fa..1b8bf94a0d2 100644 --- a/go/ql/lib/go.qll +++ b/go/ql/lib/go.qll @@ -33,6 +33,7 @@ import semmle.go.frameworks.AwsLambda import semmle.go.frameworks.Beego import semmle.go.frameworks.BeegoOrm import semmle.go.frameworks.Bun +import semmle.go.frameworks.CryptoLibraries import semmle.go.frameworks.RsCors import semmle.go.frameworks.Couchbase import semmle.go.frameworks.Echo @@ -40,6 +41,7 @@ import semmle.go.frameworks.ElazarlGoproxy import semmle.go.frameworks.Email import semmle.go.frameworks.Encoding import semmle.go.frameworks.Fasthttp +import semmle.go.frameworks.Gin import semmle.go.frameworks.GinCors import semmle.go.frameworks.Glog import semmle.go.frameworks.GoJose diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 058e65978f2..64cb6fbf98c 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,11 +1,12 @@ name: codeql/go-all -version: 5.0.2-dev +version: 5.0.6-dev groups: go dbscheme: go.dbscheme extractor: go library: true upgrades: upgrades dependencies: + codeql/concepts: ${workspace} codeql/dataflow: ${workspace} codeql/mad: ${workspace} codeql/threat-models: ${workspace} diff --git a/go/ql/lib/semmle/go/Concepts.qll b/go/ql/lib/semmle/go/Concepts.qll index 1931f16871a..acb16b62d07 100644 --- a/go/ql/lib/semmle/go/Concepts.qll +++ b/go/ql/lib/semmle/go/Concepts.qll @@ -8,6 +8,10 @@ import go import semmle.go.dataflow.FunctionInputsAndOutputs import semmle.go.concepts.HTTP import semmle.go.concepts.GeneratedFile +private import codeql.concepts.ConceptsShared +private import semmle.go.dataflow.internal.DataFlowImplSpecific + +private module ConceptsShared = ConceptsMake; /** * A data-flow node that executes an operating system command, @@ -505,3 +509,98 @@ module UnmarshalingFunction { abstract string getFormat(); } } + +/** + * Provides models for cryptographic things. + */ +module Cryptography { + private import ConceptsShared::Cryptography as SC + + /** + * A data-flow node that is an application of a cryptographic algorithm. For example, + * encryption, decryption, signature-validation. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `CryptographicOperation::Range` instead. + */ + class CryptographicOperation extends SC::CryptographicOperation { } + + class EncryptionAlgorithm = SC::EncryptionAlgorithm; + + class HashingAlgorithm = SC::HashingAlgorithm; + + class PasswordHashingAlgorithm = SC::PasswordHashingAlgorithm; + + module CryptographicOperation = SC::CryptographicOperation; + + class BlockMode = SC::BlockMode; + + class CryptographicAlgorithm = SC::CryptographicAlgorithm; + + /** A data flow node that initializes a hash algorithm. */ + abstract class HashAlgorithmInit extends DataFlow::Node { + /** Gets the hash algorithm being initialized. */ + abstract HashingAlgorithm getAlgorithm(); + } + + /** A data flow node that is an application of a hash algorithm. */ + abstract class HashOperation extends CryptographicOperation::Range { + override BlockMode getBlockMode() { none() } + } + + /** A data flow node that initializes an encryption algorithm. */ + abstract class EncryptionAlgorithmInit extends DataFlow::Node { + /** Gets the encryption algorithm being initialized. */ + abstract EncryptionAlgorithm getAlgorithm(); + } + + /** + * A data flow node that initializes a block cipher mode of operation, and + * may also propagate taint for encryption algorithms. + */ + abstract class BlockModeInit extends DataFlow::CallNode { + /** Gets the block cipher mode of operation being initialized. */ + abstract BlockMode getMode(); + + /** Gets a step propagating the encryption algorithm through this call. */ + abstract predicate step(DataFlow::Node node1, DataFlow::Node node2); + } + + /** + * A data flow node that is an application of an encryption algorithm, where + * the encryption algorithm and the block cipher mode of operation (if there + * is one) have been initialized separately. + */ + abstract class EncryptionOperation extends CryptographicOperation::Range { + DataFlow::Node encryptionFlowTarget; + DataFlow::Node inputNode; + + override DataFlow::Node getInitialization() { + EncryptionFlow::flow(result, encryptionFlowTarget) + } + + override EncryptionAlgorithm getAlgorithm() { + result = this.getInitialization().(EncryptionAlgorithmInit).getAlgorithm() + } + + override DataFlow::Node getAnInput() { result = inputNode } + + override BlockMode getBlockMode() { + result = this.getInitialization().(BlockModeInit).getMode() + } + } + + /** + * An `EncryptionOperation` which is a method call where the encryption + * algorithm and block cipher mode of operation (if there is one) flow to the + * receiver and the input is an argument. + */ + abstract class EncryptionMethodCall extends EncryptionOperation instanceof DataFlow::CallNode { + int inputArg; + + EncryptionMethodCall() { + encryptionFlowTarget = super.getReceiver() and + inputNode = super.getArgument(inputArg) + } + } +} diff --git a/go/ql/lib/semmle/go/Overlay.qll b/go/ql/lib/semmle/go/Overlay.qll index 97d7f788fdb..f4aa6b88a55 100644 --- a/go/ql/lib/semmle/go/Overlay.qll +++ b/go/ql/lib/semmle/go/Overlay.qll @@ -4,6 +4,8 @@ overlay[local] module; +private import internal.OverlayXml + /** * A local predicate that always holds for the overlay variant and never holds for the base variant. * This is used to define local predicates that behave differently for the base and overlay variant. @@ -52,40 +54,3 @@ private predicate discardLocatable(@locatable locatable) { discardableLocatable(file, locatable) and discardableFile(path) ) } - -private @file getXmlFile(@xmllocatable locatable) { - exists(@location_default location | xmllocations(locatable, location) | - locations_default(location, result, _, _, _, _) - ) -} - -private @file getXmlFileInBase(@xmllocatable locatable) { - not isOverlay() and - result = getXmlFile(locatable) -} - -/** - * Holds if the given `file` was extracted as part of the overlay and was extracted by the HTML/XML - * extractor. - */ -private predicate overlayXmlExtracted(@file file) { - isOverlay() and - exists(@xmllocatable locatable | - not files(locatable, _) and not xmlNs(locatable, _, _, _) and file = getXmlFile(locatable) - ) -} - -/** - * Holds if the given XML `locatable` should be discarded, because it is part of the overlay base - * and is in a file that was also extracted as part of the overlay database. - */ -overlay[discard_entity] -private predicate discardXmlLocatable(@xmllocatable locatable) { - exists(@file file | file = getXmlFileInBase(locatable) | - exists(string path | files(file, path) | overlayChangedFiles(path)) - or - // The HTML/XML extractor is currently not incremental and may extract more files than those - // included in overlayChangedFiles. - overlayXmlExtracted(file) - ) -} diff --git a/go/ql/lib/semmle/go/concepts/HTTP.qll b/go/ql/lib/semmle/go/concepts/HTTP.qll index 9bf5b6a7ad8..479cc19bfcc 100644 --- a/go/ql/lib/semmle/go/concepts/HTTP.qll +++ b/go/ql/lib/semmle/go/concepts/HTTP.qll @@ -380,4 +380,96 @@ module Http { /** Gets a node that is used in a check that is tested before this handler is run. */ predicate guardedBy(DataFlow::Node check) { super.guardedBy(check) } } + + /** Provides a class for modeling new HTTP response cookie write APIs. */ + module CookieWrite { + /** + * A write of an HTTP Cookie to an HTTP response. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::CookieWrite` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets the name of the cookie written. */ + abstract DataFlow::Node getName(); + + /** Gets the value of the cookie written. */ + abstract DataFlow::Node getValue(); + + /** Gets the `Secure` attribute of the cookie written. */ + abstract DataFlow::Node getSecure(); + + /** Gets the `HttpOnly` attribute of the cookie written. */ + abstract DataFlow::Node getHttpOnly(); + } + } + + /** + * A write of an HTTP Cookie to an HTTP response. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::CookieWrite::Range` instead. + */ + class CookieWrite extends DataFlow::Node instanceof CookieWrite::Range { + /** Gets the name of the cookie written. */ + DataFlow::Node getName() { result = super.getName() } + + /** Gets the value of the cookie written. */ + DataFlow::Node getValue() { result = super.getValue() } + + /** Gets the `Secure` attribute of the cookie written. */ + DataFlow::Node getSecure() { result = super.getSecure() } + + /** Gets the `HttpOnly` attribute of the cookie written. */ + DataFlow::Node getHttpOnly() { result = super.getHttpOnly() } + } + + /** Provides a class for modeling the new APIs for writes to options of an HTTP cookie. */ + module CookieOptionWrite { + /** + * A write to an option of an HTTP cookie object. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `HTTP::CookieOptionWrite` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets the node representing the cookie object for the options being set. */ + abstract DataFlow::Node getCookieOutput(); + + /** Gets the name of the cookie represented, if any. */ + abstract DataFlow::Node getName(); + + /** Gets the value of the cookie represented, if any. */ + abstract DataFlow::Node getValue(); + + /** Gets the `Secure` attribute of the cookie represented, if any. */ + abstract DataFlow::Node getSecure(); + + /** Gets the `HttpOnly` attribute of the cookie represented, if any. */ + abstract DataFlow::Node getHttpOnly(); + } + } + + /** + * A write to an option of an HTTP cookie object. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `HTTP::CookieOptionWrite::Range` instead. + */ + class CookieOptionWrite extends DataFlow::Node instanceof CookieOptionWrite::Range { + /** Gets the node representing the cookie object for the options being set. */ + DataFlow::Node getCookieOutput() { result = super.getCookieOutput() } + + /** Gets the name of the cookie represented, if any. */ + DataFlow::Node getName() { result = super.getName() } + + /** Gets the value of the cookie represented, if any. */ + DataFlow::Node getValue() { result = super.getValue() } + + /** Gets the `Secure` attribute of the cookie represented, if any. */ + DataFlow::Node getSecure() { result = super.getSecure() } + + /** Gets the `HttpOnly` attribute of the cookie represented, if any. */ + DataFlow::Node getHttpOnly() { result = super.getHttpOnly() } + } } diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 2c8b673184e..144f0df6e7d 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -1588,4 +1588,9 @@ module IR { * in a field/method access, element access, or slice expression. */ EvalImplicitDerefInstruction implicitDerefInstruction(Expr e) { result = MkImplicitDeref(e) } + + /** Gets the base of `insn`, if `insn` is an implicit field read. */ + Instruction lookThroughImplicitFieldRead(Instruction insn) { + result = insn.(ImplicitFieldReadInstruction).getBaseInstruction() + } } diff --git a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll index 3228f424885..de1e3da6281 100644 --- a/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/ExternalFlow.qll @@ -86,7 +86,7 @@ */ private import go -import internal.ExternalFlowExtensions as FlowExtensions +private import internal.ExternalFlowExtensions::Extensions as Extensions private import FlowSummary as FlowSummary private import internal.DataFlowPrivate private import internal.FlowSummaryImpl @@ -94,202 +94,33 @@ private import internal.FlowSummaryImpl::Public as Public private import internal.FlowSummaryImpl::Private private import internal.FlowSummaryImpl::Private::External private import codeql.mad.ModelValidation as SharedModelVal +private import codeql.mad.static.ModelsAsData as SharedMaD + +private module MadInput implements SharedMaD::InputSig { + string namespaceSegmentSeparator() { result = "/" } + + bindingset[p] + string cleanNamespace(string p) { + exists(string noPrefix | + p = fixedVersionPrefix() + noPrefix + or + not p = fixedVersionPrefix() + any(string s) and + noPrefix = p + | + result = noPrefix.regexpReplaceAll(majorVersionSuffixRegex(), "") + ) + } +} + +private module MaD = SharedMaD::ModelsAsData; + +import MaD + +module FlowExtensions = Extensions; /** Gets the prefix for a group of packages. */ private string groupPrefix() { result = "group:" } -/** - * Gets a package represented by `packageOrGroup`. - * - * If `packageOrGroup` is of the form `group:` then `result` is a - * package in the group ``, as determined by `packageGrouping`. - * Otherwise, `result` is `packageOrGroup`. - */ -bindingset[packageOrGroup] -private string getPackage(string packageOrGroup) { - not exists(string group | packageOrGroup = groupPrefix() + group) and result = packageOrGroup - or - exists(string group | - FlowExtensions::packageGrouping(group, result) and - packageOrGroup = groupPrefix() + group - ) -} - -/** - * Holds if a source model exists for the given parameters. - * - * Note that `group:` references are expanded into one or more actual packages - * by this predicate. - */ -predicate sourceModel( - string package, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind, string provenance, QlBuiltins::ExtensionId madId -) { - exists(string packageOrGroup | - package = getPackage(packageOrGroup) and - FlowExtensions::sourceModel(packageOrGroup, type, subtypes, name, signature, ext, output, kind, - provenance, madId) - ) -} - -/** - * Holds if a sink model exists for the given parameters. - * - * Note that `group:` references are expanded into one or more actual packages - * by this predicate. - */ -predicate sinkModel( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance, QlBuiltins::ExtensionId madId -) { - exists(string packageOrGroup | package = getPackage(packageOrGroup) | - FlowExtensions::sinkModel(packageOrGroup, type, subtypes, name, signature, ext, input, kind, - provenance, madId) - ) -} - -/** - * Holds if a summary model exists for the given parameters. - * - * Note that `group:` references are expanded into one or more actual packages - * by this predicate. - */ -predicate summaryModel( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId -) { - exists(string packageOrGroup | package = getPackage(packageOrGroup) | - FlowExtensions::summaryModel(packageOrGroup, type, subtypes, name, signature, ext, input, - output, kind, provenance, madId) - ) -} - -/** - * Holds if a neutral model exists for the given parameters. - * - * Note that `group:` references are expanded into one or more actual packages - * by this predicate. - */ -predicate neutralModel( - string package, string type, string name, string signature, string kind, string provenance -) { - exists(string packageOrGroup | package = getPackage(packageOrGroup) | - FlowExtensions::neutralModel(packageOrGroup, type, name, signature, kind, provenance) - ) -} - -/** - * Holds if the given extension tuple `madId` should pretty-print as `model`. - * - * This predicate should only be used in tests. - */ -predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { - exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind, string provenance - | - FlowExtensions::sourceModel(package, type, subtypes, name, signature, ext, output, kind, - provenance, madId) and - model = - "Source: " + package + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " + - ext + "; " + output + "; " + kind + "; " + provenance - ) - or - exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance - | - FlowExtensions::sinkModel(package, type, subtypes, name, signature, ext, input, kind, - provenance, madId) and - model = - "Sink: " + package + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " + - ext + "; " + input + "; " + kind + "; " + provenance - ) - or - exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind, string provenance - | - FlowExtensions::summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) and - model = - "Summary: " + package + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " + - ext + "; " + input + "; " + output + "; " + kind + "; " + provenance - ) -} - -bindingset[p] -private string cleanPackage(string p) { - exists(string noPrefix | - p = fixedVersionPrefix() + noPrefix - or - not p = fixedVersionPrefix() + any(string s) and - noPrefix = p - | - result = noPrefix.regexpReplaceAll(majorVersionSuffixRegex(), "") - ) -} - -private predicate relevantPackage(string package) { - exists(string p | package = cleanPackage(p) | - sourceModel(p, _, _, _, _, _, _, _, _, _) or - sinkModel(p, _, _, _, _, _, _, _, _, _) or - summaryModel(p, _, _, _, _, _, _, _, _, _, _) - ) -} - -private predicate packageLink(string shortpkg, string longpkg) { - relevantPackage(shortpkg) and - relevantPackage(longpkg) and - longpkg.prefix(longpkg.indexOf("/")) = shortpkg -} - -private predicate canonicalPackage(string package) { - relevantPackage(package) and not packageLink(_, package) -} - -private predicate canonicalPkgLink(string package, string subpkg) { - canonicalPackage(package) and - (subpkg = package or packageLink(package, subpkg)) -} - -/** - * Holds if MaD framework coverage of `package` is `n` api endpoints of the - * kind `(kind, part)`, and `pkgs` is the number of subpackages of `package` - * which have MaD framework coverage (including `package` itself). - */ -predicate modelCoverage(string package, int pkgs, string kind, string part, int n) { - pkgs = strictcount(string subpkg | canonicalPkgLink(package, subpkg)) and - ( - part = "source" and - n = - strictcount(string subpkg, string type, boolean subtypes, string name, string signature, - string ext, string output, string provenance, string x | - canonicalPkgLink(package, subpkg) and - subpkg = cleanPackage(x) and - sourceModel(x, type, subtypes, name, signature, ext, output, kind, provenance, _) - ) - or - part = "sink" and - n = - strictcount(string subpkg, string type, boolean subtypes, string name, string signature, - string ext, string input, string provenance, string x | - canonicalPkgLink(package, subpkg) and - subpkg = cleanPackage(x) and - sinkModel(x, type, subtypes, name, signature, ext, input, kind, provenance, _) - ) - or - part = "summary" and - n = - strictcount(string subpkg, string type, boolean subtypes, string name, string signature, - string ext, string input, string output, string provenance, string x | - canonicalPkgLink(package, subpkg) and - subpkg = cleanPackage(x) and - summaryModel(x, type, subtypes, name, signature, ext, input, output, kind, provenance, _) - ) - ) -} - /** Provides a query predicate to check the MaD models for validation errors. */ module ModelValidation { private import codeql.dataflow.internal.AccessPathSyntax as AccessPathSyntax diff --git a/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll b/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll index ba3a3c73302..e566ca41c2f 100644 --- a/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll +++ b/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll @@ -255,8 +255,6 @@ private predicate globalValueNumbers(DataFlow::CallNode ce, int start, GVN head, * methods. */ class GVN extends GvnBase { - GVN() { this instanceof GvnBase } - /** Gets a data-flow node that has this GVN. */ DataFlow::Node getANode() { this = globalValueNumber(result) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll index aa9c9da1bd1..b4d92771150 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll @@ -5,10 +5,25 @@ private import go private import DataFlowImplSpecific as Impl +private import DataFlowUtil private import TaintTrackingImplSpecific private import codeql.dataflow.internal.DataFlowImplConsistency private import semmle.go.dataflow.internal.DataFlowNodes -private module Input implements InputSig { } +private module Input implements InputSig { + predicate missingLocationExclude(DataFlow::Node n) { + n instanceof DataFlow::GlobalFunctionNode or n instanceof Private::FlowSummaryNode + } + + predicate uniqueNodeLocationExclude(DataFlow::Node n) { missingLocationExclude(n) } + + predicate localFlowIsLocalExclude(DataFlow::Node n1, DataFlow::Node n2) { + n1 instanceof DataFlow::FunctionNode and simpleLocalFlowStep(n1, n2, _) + } + + predicate argHasPostUpdateExclude(DataFlow::ArgumentNode n) { + not DataFlow::insnHasPostUpdateNode(n.asInstruction()) + } +} module Consistency = MakeConsistency; diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index d48335d299f..4fb767e548c 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -838,7 +838,11 @@ module Public { exists(IR::MethodReadInstruction mri | ce.getTarget() instanceof Method and mri = IR::evalExprInstruction(ce.getCalleeExpr()) and - insn = mri.getReceiver() + // If a.x is reading a promoted field, and it's equivalent to a.b.c.x, + // then mri.getReceiver() will give us the implicit field read a.b.c + // and we want to have post-update nodes for a, the implicit field + // read a.b and the implicit field read a.b.c. + insn = IR::lookThroughImplicitFieldRead*(mri.getReceiver()) ) ) and mutableType(insn.getResultType()) @@ -1347,7 +1351,6 @@ module Public { } } -private import Private private import Public class SummaryPostUpdateNode extends FlowSummaryNode, PostUpdateNode { diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll index 94609d1c111..76b0ef363e3 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll @@ -89,7 +89,8 @@ predicate basicLocalFlowStep(Node nodeFrom, Node nodeTo) { nodeFrom = instructionNode(pred) or nodeFrom.(PostUpdateNode).getPreUpdateNode() = instructionNode(pred) ) and - nodeTo = instructionNode(succ) + nodeTo = instructionNode(succ) and + nodeTo != nodeFrom ) or // GlobalFunctionNode -> use diff --git a/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll b/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll index b1e1c906028..2e962299f3e 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ExternalFlowExtensions.qll @@ -2,6 +2,8 @@ * This module provides extensible predicates for defining MaD models. */ +private import codeql.mad.static.ModelsAsData as SharedMaD + /** * Holds if a source model exists for the given parameters. */ @@ -18,6 +20,22 @@ extensible predicate sinkModel( string input, string kind, string provenance, QlBuiltins::ExtensionId madId ); +/** + * Holds if a barrier model exists for the given parameters. + */ +extensible predicate barrierModel( + string package, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, QlBuiltins::ExtensionId madId +); + +/** + * Holds if a barrier guard model exists for the given parameters. + */ +extensible predicate barrierGuardModel( + string package, string type, boolean subtypes, string name, string signature, string ext, + string input, string acceptingvalue, string kind, string provenance, QlBuiltins::ExtensionId madId +); + /** * Holds if a summary model exists for the given parameters. */ @@ -37,3 +55,9 @@ extensible predicate neutralModel( * Holds if the package `package` is part of the group `group`. */ extensible predicate packageGrouping(string group, string package); + +module Extensions implements SharedMaD::ExtensionsSig { + import ExternalFlowExtensions + + predicate namespaceGrouping = packageGrouping/2; +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll index f12c9e6eeb1..6c49cb75bd3 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll @@ -137,11 +137,9 @@ module SourceSinkInterpretationInput implements SourceOrSinkElement e, string output, string kind, Public::Provenance provenance, string model ) { exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - QlBuiltins::ExtensionId madId + string package, string type, boolean subtypes, string name, string signature, string ext | - sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance, madId) and - model = "MaD:" + madId.toString() and + sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance, model) and e = interpretElement(package, type, subtypes, name, signature, ext) ) } @@ -154,15 +152,26 @@ module SourceSinkInterpretationInput implements SourceOrSinkElement e, string input, string kind, Public::Provenance provenance, string model ) { exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - QlBuiltins::ExtensionId madId + string package, string type, boolean subtypes, string name, string signature, string ext | - sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, madId) and - model = "MaD:" + madId.toString() and + sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, model) and e = interpretElement(package, type, subtypes, name, signature, ext) ) } + predicate barrierElement( + Element n, string output, string kind, Public::Provenance provenance, string model + ) { + none() + } + + predicate barrierGuardElement( + Element n, string input, Public::AcceptingValue acceptingvalue, string kind, + Public::Provenance provenance, string model + ) { + none() + } + // Note that due to embedding, which is currently implemented via some // Methods having multiple qualified names, a given Method is liable to have // more than one SourceOrSinkElement, one for each of the names it claims. @@ -384,17 +393,13 @@ module SourceSinkInterpretationInput implements } private DataFlow::Node skipImplicitFieldReads(DataFlow::Node n) { - not exists(lookThroughImplicitFieldRead(n)) and result = n + not exists(IR::lookThroughImplicitFieldRead(n.asInstruction())) and result = n or - result = skipImplicitFieldReads(lookThroughImplicitFieldRead(n)) - } - - private DataFlow::Node lookThroughImplicitFieldRead(DataFlow::Node n) { - result.asInstruction() = - n.(DataFlow::InstructionNode) - .asInstruction() - .(IR::ImplicitFieldReadInstruction) - .getBaseInstruction() + exists(DataFlow::Node mid | + mid.asInstruction() = IR::lookThroughImplicitFieldRead(n.asInstruction()) + | + result = skipImplicitFieldReads(mid) + ) } /** Provides additional sink specification logic. */ @@ -491,12 +496,10 @@ module Private { string model ) { exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - QlBuiltins::ExtensionId madId + string namespace, string type, boolean subtypes, string name, string signature, string ext | summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) and - model = "MaD:" + madId.toString() and + provenance, model) and c.asFunction() = interpretElement(namespace, type, subtypes, name, signature, ext).asEntity() ) diff --git a/go/ql/lib/semmle/go/frameworks/CryptoLibraries.qll b/go/ql/lib/semmle/go/frameworks/CryptoLibraries.qll new file mode 100644 index 00000000000..154ac82e7a2 --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/CryptoLibraries.qll @@ -0,0 +1,484 @@ +/** + * Provides classes for modeling cryptographic libraries. + */ + +import go +import semmle.go.Concepts::Cryptography +private import codeql.concepts.internal.CryptoAlgorithmNames + +/** + * A data flow call node that is an application of a hash operation where the + * hash algorithm is defined in any earlier initialization node, and the input + * is the first argument of the call. + */ +abstract class DirectHashOperation extends HashOperation instanceof DataFlow::CallNode { + override DataFlow::Node getInitialization() { result = this } + + override DataFlow::Node getAnInput() { result = super.getArgument(0) } +} + +private module HashConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof HashAlgorithmInit } + + predicate isSink(DataFlow::Node sink) { any() } +} + +/** Tracks the flow of hash algorithms. */ +module HashFlow = DataFlow::Global; + +/** + * A data flow node that initializes a block mode and propagates the encryption + * algorithm from the first argument to the receiver. + */ +abstract class StdLibNewEncrypter extends BlockModeInit { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + node1 = this.getArgument(0) and + node2 = this.getResult(0) + } +} + +private module EncryptionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source instanceof EncryptionAlgorithmInit or + source instanceof BlockModeInit + } + + predicate isSink(DataFlow::Node sink) { any() } + + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + any(BlockModeInit nbcm).step(node1, node2) + } +} + +/** + * Tracks algorithms and block cipher modes of operation used for encryption. + */ +module EncryptionFlow = DataFlow::Global; + +private module Crypto { + private module Aes { + private class NewCipher extends EncryptionAlgorithmInit { + NewCipher() { + exists(Function f | this = f.getACall().getResult(0) | + f.hasQualifiedName("crypto/aes", "NewCipher") + ) + } + + override EncryptionAlgorithm getAlgorithm() { result.matchesName("AES") } + } + } + + private module Des { + private class NewCipher extends EncryptionAlgorithmInit { + NewCipher() { + exists(Function f | this = f.getACall().getResult(0) | + f.hasQualifiedName("crypto/des", "NewCipher") + ) + } + + override EncryptionAlgorithm getAlgorithm() { result.matchesName("DES") } + } + + private class NewTripleDESCipher extends EncryptionAlgorithmInit { + NewTripleDESCipher() { + exists(Function f | this = f.getACall().getResult(0) | + f.hasQualifiedName("crypto/des", "NewTripleDESCipher") + ) + } + + override EncryptionAlgorithm getAlgorithm() { result.matchesName("TRIPLEDES") } + } + } + + private module Md5 { + private class Sum extends DirectHashOperation instanceof DataFlow::CallNode { + Sum() { this.getTarget().hasQualifiedName("crypto/md5", "Sum") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("MD5") } + } + + private class New extends HashAlgorithmInit instanceof DataFlow::CallNode { + New() { this.getTarget().hasQualifiedName("crypto/md5", "New") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("MD5") } + } + } + + private module Rc4 { + private class CipherXorKeyStream extends CryptographicOperation::Range instanceof DataFlow::CallNode + { + CipherXorKeyStream() { + this.(DataFlow::MethodCallNode) + .getTarget() + .hasQualifiedName("crypto/rc4", "Cipher", "XORKeyStream") + } + + override DataFlow::Node getInitialization() { result = this } + + override EncryptionAlgorithm getAlgorithm() { result.matchesName("RC4") } + + override DataFlow::Node getAnInput() { result = super.getArgument(1) } + + override BlockMode getBlockMode() { none() } + } + } + + /** + * Cryptographic operations from the `crypto/sha1` package. + */ + private module Sha1 { + private class Sum extends DirectHashOperation instanceof DataFlow::CallNode { + Sum() { this.getTarget().hasQualifiedName("crypto/sha1", "Sum") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA1") } + } + + private class New extends HashAlgorithmInit instanceof DataFlow::CallNode { + New() { this.getTarget().hasQualifiedName("crypto/sha1", "New") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA1") } + } + } + + /** + * Cryptographic operations from the `crypto/sha256` package. + */ + private module Sha256 { + private class Sum256 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum256() { this.getTarget().hasQualifiedName("crypto/sha256", "Sum256") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA256") } + } + + private class Sum224 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum224() { this.getTarget().hasQualifiedName("crypto/sha256", "Sum224") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA224") } + } + + private class New extends HashAlgorithmInit instanceof DataFlow::CallNode { + New() { this.getTarget().hasQualifiedName("crypto/sha256", "New") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA256") } + } + + private class New224 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New224() { this.getTarget().hasQualifiedName("crypto/sha256", "New224") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA224") } + } + } + + private module Sha3 { + private class Sum224 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum224() { this.getTarget().hasQualifiedName("crypto/sha3", "Sum224") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3224") } + } + + private class Sum256 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum256() { this.getTarget().hasQualifiedName("crypto/sha3", "Sum256") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3256") } + } + + private class Sum384 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum384() { this.getTarget().hasQualifiedName("crypto/sha3", "Sum384") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3384") } + } + + private class Sum512 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum512() { this.getTarget().hasQualifiedName("crypto/sha3", "Sum512") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3512") } + } + + private class SumShake128 extends DirectHashOperation instanceof DataFlow::CallNode { + SumShake128() { this.getTarget().hasQualifiedName("crypto/sha3", "SumSHAKE128") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHAKE128") } + } + + private class SumShake256 extends DirectHashOperation instanceof DataFlow::CallNode { + SumShake256() { this.getTarget().hasQualifiedName("crypto/sha3", "SumSHAKE256") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHAKE256") } + } + + private class New224 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New224() { this.getTarget().hasQualifiedName("crypto/sha3", "New224") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3224") } + } + + private class New256 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New256() { this.getTarget().hasQualifiedName("crypto/sha3", "New256") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3256") } + } + + private class New384 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New384() { this.getTarget().hasQualifiedName("crypto/sha3", "New384") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3384") } + } + + private class New512 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New512() { this.getTarget().hasQualifiedName("crypto/sha3", "New512") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA3512") } + } + + private class NewShake128 extends HashAlgorithmInit instanceof DataFlow::CallNode { + NewShake128() { + this.getTarget().hasQualifiedName("crypto/sha3", ["NewCSHAKE128", "NewSHAKE128"]) + } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHAKE128") } + } + + private class NewShake256 extends HashAlgorithmInit instanceof DataFlow::CallNode { + NewShake256() { + this.getTarget().hasQualifiedName("crypto/sha3", ["NewCSHAKE256", "NewSHAKE256"]) + } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHAKE256") } + } + + private class ShakeWrite extends HashOperation instanceof DataFlow::MethodCallNode { + ShakeWrite() { this.getTarget().hasQualifiedName("crypto/sha3", "SHAKE", "Write") } + + override HashAlgorithmInit getInitialization() { HashFlow::flow(result, super.getReceiver()) } + + override HashingAlgorithm getAlgorithm() { result = this.getInitialization().getAlgorithm() } + + override DataFlow::Node getAnInput() { result = super.getArgument(0) } + } + } + + private module Sha512 { + private class Sum384 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum384() { this.getTarget().hasQualifiedName("crypto/sha512", "Sum384") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA384") } + } + + private class Sum512 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum512() { this.getTarget().hasQualifiedName("crypto/sha512", "Sum512") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA512") } + } + + private class Sum512_224 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum512_224() { this.getTarget().hasQualifiedName("crypto/sha512", "Sum512_224") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA512224") } + } + + private class Sum512_256 extends DirectHashOperation instanceof DataFlow::CallNode { + Sum512_256() { this.getTarget().hasQualifiedName("crypto/sha512", "Sum512_256") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA512256") } + } + + private class New extends HashAlgorithmInit instanceof DataFlow::CallNode { + New() { this.getTarget().hasQualifiedName("crypto/sha512", "New") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA512") } + } + + private class New384 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New384() { this.getTarget().hasQualifiedName("crypto/sha512", "New384") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA384") } + } + + private class New512_224 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New512_224() { this.getTarget().hasQualifiedName("crypto/sha512", "New512_224") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA512224") } + } + + private class New512_256 extends HashAlgorithmInit instanceof DataFlow::CallNode { + New512_256() { this.getTarget().hasQualifiedName("crypto/sha512", "New512_256") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("SHA512256") } + } + } + + private module Cipher { + private class NewCbcEncrypter extends StdLibNewEncrypter { + NewCbcEncrypter() { this.getTarget().hasQualifiedName("crypto/cipher", "NewCBCEncrypter") } + + override BlockMode getMode() { result = "CBC" } + } + + private class NewCfbEncrypter extends StdLibNewEncrypter { + NewCfbEncrypter() { this.getTarget().hasQualifiedName("crypto/cipher", "NewCFBEncrypter") } + + override BlockMode getMode() { result = "CFB" } + } + + private class NewCtr extends StdLibNewEncrypter { + NewCtr() { this.getTarget().hasQualifiedName("crypto/cipher", "NewCTR") } + + override BlockMode getMode() { result = "CTR" } + } + + private class NewGcm extends StdLibNewEncrypter { + NewGcm() { + exists(string name | this.getTarget().hasQualifiedName("crypto/cipher", name) | + name = ["NewGCM", "NewGCMWithNonceSize", "NewGCMWithRandomNonce", "NewGCMWithTagSize"] + ) + } + + override BlockMode getMode() { result = "GCM" } + } + + private class NewOfb extends StdLibNewEncrypter { + NewOfb() { this.getTarget().hasQualifiedName("crypto/cipher", "NewOFB") } + + override BlockMode getMode() { result = "OFB" } + } + + private class AeadSeal extends EncryptionMethodCall { + AeadSeal() { + this.(DataFlow::MethodCallNode) + .getTarget() + .hasQualifiedName("crypto/cipher", "AEAD", "Seal") and + inputArg = 2 + } + } + + private class BlockEncrypt extends EncryptionMethodCall { + BlockEncrypt() { + this.(DataFlow::MethodCallNode) + .getTarget() + .hasQualifiedName("crypto/cipher", "Block", "Encrypt") and + inputArg = 1 + } + } + + private class BlockModeCryptBlocks extends EncryptionMethodCall { + BlockModeCryptBlocks() { + this.(DataFlow::MethodCallNode) + .getTarget() + .hasQualifiedName("crypto/cipher", "BlockMode", "CryptBlocks") and + inputArg = 1 + } + } + + private class StreamXorKeyStream extends EncryptionMethodCall { + StreamXorKeyStream() { + this.(DataFlow::MethodCallNode) + .getTarget() + .hasQualifiedName("crypto/cipher", "Stream", "XORKeyStream") and + inputArg = 1 + } + } + + private class StreamReader extends EncryptionOperation { + StreamReader() { + lookThroughPointerType(this.getType()).hasQualifiedName("crypto/cipher", "StreamReader") and + exists(DataFlow::Write w, DataFlow::Node base, Field f | + f.hasQualifiedName("crypto/cipher", "StreamReader", "S") and + w.writesField(base, f, encryptionFlowTarget) and + DataFlow::localFlow(base, this) + ) and + exists(DataFlow::Write w, DataFlow::Node base, Field f | + f.hasQualifiedName("crypto/cipher", "StreamReader", "R") and + w.writesField(base, f, inputNode) and + DataFlow::localFlow(base, this) + ) + } + } + + /** + * Limitation: StreamWriter wraps a Writer, so we need to look forward to + * where the Writer is written to. Currently this is done using local flow, + * so it only works within one function. + */ + private class StreamWriter extends EncryptionOperation { + StreamWriter() { + lookThroughPointerType(this.getType()).hasQualifiedName("crypto/cipher", "StreamWriter") and + inputNode = this and + exists(DataFlow::Write w, DataFlow::Node base, Field f | + w.writesField(base, f, encryptionFlowTarget) and + f.hasQualifiedName("crypto/cipher", "StreamWriter", "S") + | + base = this or + TaintTracking::localTaint(base, this.(DataFlow::PostUpdateNode).getPreUpdateNode()) + ) + } + } + } +} + +private module Hash { + private class HashSum extends HashOperation instanceof DataFlow::MethodCallNode { + HashSum() { this.getTarget().implements("hash", "Hash", "Sum") } + + override HashAlgorithmInit getInitialization() { HashFlow::flow(result, super.getReceiver()) } + + override HashingAlgorithm getAlgorithm() { result = this.getInitialization().getAlgorithm() } + + override DataFlow::Node getAnInput() { result = super.getArgument(0) } + } +} + +private DataFlow::Node getANonIoWriterPredecessor(DataFlow::Node node) { + node.getType().implements("io", "Writer") and + exists(DataFlow::Node pre | TaintTracking::localTaintStep(pre, node) | + if pre.getType().implements("io", "Writer") + then result = getANonIoWriterPredecessor(pre) + else result = pre + ) +} + +/** + * Taint flowing to an `io.Writer` (such as `hash.Hash` or `*sha3.SHAKE`) via + * its implementation of the `io.Writer` interface. + */ +private class FlowToIoWriter extends HashOperation instanceof DataFlow::Node { + HashAlgorithmInit init; + DataFlow::Node input; + + FlowToIoWriter() { + this.getType().implements("io", "Writer") and + HashFlow::flow(init, this) and + // If we have `h.Write(taint)` or `io.WriteString(h, taint)` then it's + // the post-update node of `h` that gets tainted. + exists(DataFlow::PostUpdateNode pun | pun.getPreUpdateNode() = this | + input = getANonIoWriterPredecessor(pun) + ) + } + + override HashAlgorithmInit getInitialization() { result = init } + + override HashingAlgorithm getAlgorithm() { result = this.getInitialization().getAlgorithm() } + + override DataFlow::Node getAnInput() { result = input } +} + +/** + * Currently only weak algorithms from the `golang.org/x/crypto` module are + * modeled here. + */ +private module GolangOrgXCrypto { + private module Md4 { + private class New extends HashAlgorithmInit instanceof DataFlow::CallNode { + New() { this.getTarget().hasQualifiedName("golang.org/x/crypto/md4", "New") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("MD4") } + } + } + + private module Ripemd160 { + private class New extends HashAlgorithmInit instanceof DataFlow::CallNode { + New() { this.getTarget().hasQualifiedName("golang.org/x/crypto/ripemd160", "New") } + + override HashingAlgorithm getAlgorithm() { result.matchesName("RIPEMD160") } + } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/Gin.qll b/go/ql/lib/semmle/go/frameworks/Gin.qll new file mode 100644 index 00000000000..71ed5d931fa --- /dev/null +++ b/go/ql/lib/semmle/go/frameworks/Gin.qll @@ -0,0 +1,24 @@ +/** + * Provides classes for modeling the `github.com/gin-gonic/gin` package. + */ + +import go +import semmle.go.concepts.HTTP + +/** Provides models for the `gin-gonic/gin` package. */ +module Gin { + /** Gets the package name `github.com/gin-gonic/gin`. */ + string packagePath() { result = package("github.com/gin-gonic/gin", "") } + + private class GinCookieWrite extends Http::CookieWrite::Range, DataFlow::MethodCallNode { + GinCookieWrite() { this.getTarget().hasQualifiedName(packagePath(), "Context", "SetCookie") } + + override DataFlow::Node getName() { result = this.getArgument(0) } + + override DataFlow::Node getValue() { result = this.getArgument(1) } + + override DataFlow::Node getSecure() { result = this.getArgument(5) } + + override DataFlow::Node getHttpOnly() { result = this.getArgument(6) } + } +} diff --git a/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll b/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll index 88c9605502f..e798d116352 100644 --- a/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll +++ b/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll @@ -293,4 +293,38 @@ module NetHttp { override DataFlow::Node getAPathArgument() { result = this.getArgument(2) } } + + private class CookieWrite extends Http::CookieWrite::Range, DataFlow::CallNode { + CookieWrite() { this.getTarget().hasQualifiedName(package("net/http", ""), "SetCookie") } + + override DataFlow::Node getName() { result = this.getArgument(1) } + + override DataFlow::Node getValue() { result = this.getArgument(1) } + + override DataFlow::Node getSecure() { result = this.getArgument(1) } + + override DataFlow::Node getHttpOnly() { result = this.getArgument(1) } + } + + private class CookieFieldWrite extends Http::CookieOptionWrite::Range { + DataFlow::Node written; + string fieldName; + + CookieFieldWrite() { + exists(Write w, Field f | + f.hasQualifiedName(package("net/http", ""), "Cookie", fieldName) and + w.writesField(this, f, written) + ) + } + + override DataFlow::Node getCookieOutput() { result = this } + + override DataFlow::Node getName() { fieldName = "Name" and result = written } + + override DataFlow::Node getValue() { fieldName = "Value" and result = written } + + override DataFlow::Node getSecure() { fieldName = "Secure" and result = written } + + override DataFlow::Node getHttpOnly() { fieldName = "HttpOnly" and result = written } + } } diff --git a/go/ql/lib/semmle/go/internal/OverlayXml.qll b/go/ql/lib/semmle/go/internal/OverlayXml.qll new file mode 100644 index 00000000000..95d49f2d611 --- /dev/null +++ b/go/ql/lib/semmle/go/internal/OverlayXml.qll @@ -0,0 +1,46 @@ +overlay[local] +module; + +/** + * A local predicate that always holds for the overlay variant and never holds for the base variant. + * This is used to define local predicates that behave differently for the base and overlay variant. + */ +private predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +private string getXmlFile(@xmllocatable locatable) { + exists(@location_default location, @file file | xmllocations(locatable, location) | + locations_default(location, file, _, _, _, _) and + files(file, result) + ) +} + +private string getXmlFileInBase(@xmllocatable locatable) { + not isOverlay() and + result = getXmlFile(locatable) +} + +/** + * Holds if the given `file` was extracted as part of the overlay and was extracted by the HTML/XML + * extractor. + */ +private predicate overlayXmlExtracted(string file) { + isOverlay() and + exists(@xmllocatable locatable | + not files(locatable, _) and not xmlNs(locatable, _, _, _) and file = getXmlFile(locatable) + ) +} + +/** + * Holds if the given XML `locatable` should be discarded, because it is part of the overlay base + * and is in a file that was also extracted as part of the overlay database. + */ +overlay[discard_entity] +private predicate discardXmlLocatable(@xmllocatable locatable) { + exists(string file | file = getXmlFileInBase(locatable) | + overlayChangedFiles(file) + or + // The HTML/XML extractor is currently not incremental and may extract more files than those + // included in overlayChangedFiles. + overlayXmlExtracted(file) + ) +} diff --git a/go/ql/lib/semmle/go/security/AllocationSizeOverflow.qll b/go/ql/lib/semmle/go/security/AllocationSizeOverflow.qll index 079ab35ee36..03df0817975 100644 --- a/go/ql/lib/semmle/go/security/AllocationSizeOverflow.qll +++ b/go/ql/lib/semmle/go/security/AllocationSizeOverflow.qll @@ -27,7 +27,7 @@ module AllocationSizeOverflow { private module FindLargeLensFlow = TaintTracking::Global; private DataFlow::CallNode getALargeLenCall() { - exists(DataFlow::Node lenArg | FindLargeLensFlow::flow(_, lenArg) | + exists(DataFlow::Node lenArg | FindLargeLensFlow::flowTo(lenArg) | result.getArgument(0) = lenArg ) } diff --git a/go/ql/lib/semmle/go/security/CookieWithoutHttpOnly.qll b/go/ql/lib/semmle/go/security/CookieWithoutHttpOnly.qll new file mode 100644 index 00000000000..8eed50b8791 --- /dev/null +++ b/go/ql/lib/semmle/go/security/CookieWithoutHttpOnly.qll @@ -0,0 +1,77 @@ +/** Provides classes and predicates for identifying HTTP cookies without the `HttpOnly` attribute. */ + +import go +import semmle.go.concepts.HTTP +import semmle.go.dataflow.DataFlow + +private module SensitiveCookieNameConfig implements DataFlow::ConfigSig { + /** + * Holds if `source` is an expression with a name or literal value `val` indicating a sensitive cookie. + */ + additional predicate isSource(DataFlow::Node source, string val) { + ( + val = source.asExpr().getStringValue() or + val = source.asExpr().(Name).getTarget().getName() + ) and + val.regexpMatch("(?i).*(session|login|token|user|auth|credential).*") and + not val.regexpMatch("(?i).*(xsrf|csrf|forgery).*") + } + + predicate isSource(DataFlow::Node source) { isSource(source, _) } + + additional predicate isSink(DataFlow::Node sink, Http::CookieWrite cw) { sink = cw.getName() } + + predicate isSink(DataFlow::Node sink) { isSink(sink, _) } + + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { + exists(Http::CookieOptionWrite co | co.getName() = pred and co.getCookieOutput() = succ) + } +} + +/** Tracks flow from sensitive names to HTTP cookie writes. */ +module SensitiveCookieNameFlow = TaintTracking::Global; + +private module BooleanCookieHttpOnlyConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.getType().getUnderlyingType() instanceof BoolType + } + + predicate isSink(DataFlow::Node sink) { exists(Http::CookieWrite cw | sink = cw.getHttpOnly()) } + + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { + exists(Http::CookieOptionWrite co | co.getHttpOnly() = pred and co.getCookieOutput() = succ) + } +} + +/** Tracks flow from boolean expressions to the `HttpOnly` attribute of HTTP cookie writes. */ +module BooleanCookieHttpOnlyFlow = TaintTracking::Global; + +/** Holds if `cw` has the `HttpOnly` attribute left at its default value of `false`. */ +predicate isNonHttpOnlyDefault(Http::CookieWrite cw) { + not BooleanCookieHttpOnlyFlow::flowTo(cw.getHttpOnly()) +} + +/** Holds if `cw` has the `HttpOnly` attribute explicitly set to `false`, from the expression `boolFalse`. */ +predicate isNonHttpOnlyDirect(Http::CookieWrite cw, Expr boolFalse) { + BooleanCookieHttpOnlyFlow::flow(DataFlow::exprNode(boolFalse), cw.getHttpOnly()) and + boolFalse.getBoolValue() = false +} + +/** Holds if `cw` has the `HttpOnly` attribute set to `false`, either explicitly or by default. */ +predicate isNonHttpOnlyCookie(Http::CookieWrite cw) { + isNonHttpOnlyDefault(cw) or + isNonHttpOnlyDirect(cw, _) +} + +/** + * Holds if `cw` has the sensitive name `name`, from the expression `nameExpr`. + * `source` and `sink` represent the data flow path from the sensitive name expression to the cookie write. + */ +predicate isSensitiveCookie( + Http::CookieWrite cw, string name, SensitiveCookieNameFlow::PathNode source, + SensitiveCookieNameFlow::PathNode sink +) { + SensitiveCookieNameFlow::flowPath(source, sink) and + SensitiveCookieNameConfig::isSource(source.getNode(), name) and + SensitiveCookieNameConfig::isSink(sink.getNode(), cw) +} diff --git a/go/ql/lib/semmle/go/security/CookieWithoutSecure.qll b/go/ql/lib/semmle/go/security/CookieWithoutSecure.qll new file mode 100644 index 00000000000..1ba5315bf8b --- /dev/null +++ b/go/ql/lib/semmle/go/security/CookieWithoutSecure.qll @@ -0,0 +1,37 @@ +/** Provides classes and predicates for identifying HTTP cookies without the `Secure` attribute. */ + +import go +import semmle.go.concepts.HTTP +import semmle.go.dataflow.DataFlow + +private module BooleanCookieSecureConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.getType().getUnderlyingType() instanceof BoolType + } + + predicate isSink(DataFlow::Node sink) { exists(Http::CookieWrite cw | sink = cw.getSecure()) } + + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { + exists(Http::CookieOptionWrite co | co.getSecure() = pred and co.getCookieOutput() = succ) + } +} + +/** Tracks flow from boolean expressions to the `Secure` attribute of HTTP cookie writes. */ +module BooleanCookieSecureFlow = TaintTracking::Global; + +/** Holds if `cw` has the `Secure` attribute left at its default value of `false`. */ +predicate isInsecureDefault(Http::CookieWrite cw) { + not BooleanCookieSecureFlow::flowTo(cw.getSecure()) +} + +/** Holds if `cw` has the `Secure` attribute explicitly set to `false`, from the expression `boolFalse`. */ +predicate isInsecureDirect(Http::CookieWrite cw, Expr boolFalse) { + BooleanCookieSecureFlow::flow(DataFlow::exprNode(boolFalse), cw.getSecure()) and + boolFalse.getBoolValue() = false +} + +/** Holds if `cw` has the `Secure` attribute set to `false`, either explicitly or by default. */ +predicate isInsecureCookie(Http::CookieWrite cw) { + isInsecureDefault(cw) or + isInsecureDirect(cw, _) +} diff --git a/go/ql/lib/semmle/go/security/ExternalAPIs.qll b/go/ql/lib/semmle/go/security/ExternalAPIs.qll index f85f939258f..0a9be6bcc70 100644 --- a/go/ql/lib/semmle/go/security/ExternalAPIs.qll +++ b/go/ql/lib/semmle/go/security/ExternalAPIs.qll @@ -211,7 +211,7 @@ module UntrustedDataToUnknownExternalApiFlow = /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flowTo(this) } /** Gets a source of untrusted data which is passed to this external API data node. */ DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } diff --git a/go/ql/lib/semmle/go/security/MissingJwtSignatureCheck.qll b/go/ql/lib/semmle/go/security/MissingJwtSignatureCheck.qll index 15afe81944f..1f8185d4397 100644 --- a/go/ql/lib/semmle/go/security/MissingJwtSignatureCheck.qll +++ b/go/ql/lib/semmle/go/security/MissingJwtSignatureCheck.qll @@ -15,7 +15,7 @@ module MissingJwtSignatureCheck { module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source and - not SafeParse::flow(source, _) + not SafeParse::flowFrom(source) } predicate isSink(DataFlow::Node sink) { sink instanceof Sink } diff --git a/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll b/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll index 19047b12b78..0ced26c3eff 100644 --- a/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll +++ b/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll @@ -32,7 +32,7 @@ module UnsafeUnzipSymlink { * Holds if `node` is an archive header field read that flows to a `path/filepath.EvalSymlinks` call. */ private predicate symlinksEvald(DataFlow::Node node) { - EvalSymlinksFlow::flow(getASimilarReadNode(node), _) + EvalSymlinksFlow::flowFrom(getASimilarReadNode(node)) } private module Config implements DataFlow::ConfigSig { diff --git a/go/ql/lib/semmle/go/security/WeakSensitiveDataHashingCustomizations.qll b/go/ql/lib/semmle/go/security/WeakSensitiveDataHashingCustomizations.qll new file mode 100644 index 00000000000..4893193ef4f --- /dev/null +++ b/go/ql/lib/semmle/go/security/WeakSensitiveDataHashingCustomizations.qll @@ -0,0 +1,171 @@ +/** + * Provides default sources, sinks and sanitizers for detecting "use of a + * broken or weak cryptographic hashing algorithm on sensitive data" + * vulnerabilities, as well as extension points for adding your own. This is + * divided into two general cases: + * - hashing sensitive data + * - hashing passwords (which requires the hashing algorithm to be + * sufficiently computationally expensive in addition to other requirements) + */ + +import go +private import semmle.go.security.SensitiveActions + +/** + * Provides default sources, sinks and sanitizers for detecting "use of a broken or weak + * cryptographic hashing algorithm on sensitive data" vulnerabilities on sensitive data that does + * NOT require computationally expensive hashing, as well as extension points for adding your own. + * + * Also see the `ComputationallyExpensiveHashFunction` module. + */ +module NormalHashFunction { + /** + * A data flow source for "use of a broken or weak cryptographic hashing algorithm on sensitive + * data" vulnerabilities that does not require computationally expensive hashing. That is, a + * piece of sensitive data that is not a password. + */ + abstract class Source extends DataFlow::Node { + Source() { not this instanceof ComputationallyExpensiveHashFunction::Source } + + /** + * Gets the classification of the sensitive data. + */ + abstract string getClassification(); + } + + /** + * A data flow sink for "use of a broken or weak cryptographic hashing algorithm on sensitive + * data" vulnerabilities that applies to data that does not require computationally expensive + * hashing. That is, a broken or weak hashing algorithm. + */ + abstract class Sink extends DataFlow::Node { + /** + * Gets the name of the weak hashing algorithm. + */ + abstract string getAlgorithmName(); + } + + /** + * A barrier for "use of a broken or weak cryptographic hashing algorithm on sensitive data" + * vulnerabilities that applies to data that does not require computationally expensive hashing. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * A flow source modeled by the `SensitiveData` library. + */ + class SensitiveDataAsSource extends Source { + SensitiveExpr::Classification classification; + + SensitiveDataAsSource() { + classification = this.asExpr().(SensitiveExpr).getClassification() and + not classification = SensitiveExpr::password() and // (covered in ComputationallyExpensiveHashFunction) + not classification = SensitiveExpr::id() // (not accurate enough) + } + + override SensitiveExpr::Classification getClassification() { result = classification } + } + + /** + * A flow sink modeled by the `Cryptography` module. + */ + class WeakHashingOperationInputAsSink extends Sink { + Cryptography::HashingAlgorithm algorithm; + + WeakHashingOperationInputAsSink() { + exists(Cryptography::CryptographicOperation operation | + algorithm.isWeak() and + algorithm = operation.getAlgorithm() and + this = operation.getAnInput() + ) + } + + override string getAlgorithmName() { result = algorithm.getName() } + } +} + +/** + * Provides default sources, sinks and sanitizers for detecting "use of a broken or weak + * cryptographic hashing algorithm on sensitive data" vulnerabilities on sensitive data that DOES + * require computationally expensive hashing, as well as extension points for adding your own. + * + * Also see the `NormalHashFunction` module. + */ +module ComputationallyExpensiveHashFunction { + /** + * A data flow source for "use of a broken or weak cryptographic hashing algorithm on sensitive + * data" vulnerabilities that does require computationally expensive hashing. That is, a + * password. + */ + abstract class Source extends DataFlow::Node { + /** + * Gets the classification of the sensitive data. + */ + abstract string getClassification(); + } + + /** + * A data flow sink for "use of a broken or weak cryptographic hashing algorithm on sensitive + * data" vulnerabilities that applies to data that does require computationally expensive + * hashing. That is, a broken or weak hashing algorithm or one that is not computationally + * expensive enough for password hashing. + */ + abstract class Sink extends DataFlow::Node { + /** + * Gets the name of the weak hashing algorithm. + */ + abstract string getAlgorithmName(); + + /** + * Holds if this sink is for a computationally expensive hash function (meaning that hash + * function is just weak in some other regard. + */ + abstract predicate isComputationallyExpensive(); + } + + /** + * A barrier for "use of a broken or weak cryptographic hashing algorithm on sensitive data" + * vulnerabilities that applies to data that does require computationally expensive hashing. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * A flow source modeled by the `SensitiveData` library. + */ + class PasswordAsSource extends Source { + SensitiveExpr::Classification classification; + + PasswordAsSource() { + classification = this.asExpr().(SensitiveExpr).getClassification() and + classification = SensitiveExpr::password() + } + + override SensitiveExpr::Classification getClassification() { result = classification } + } + + /** + * A flow sink modeled by the `Cryptography` module. + */ + class WeakPasswordHashingOperationInputSink extends Sink { + Cryptography::CryptographicAlgorithm algorithm; + + WeakPasswordHashingOperationInputSink() { + exists(Cryptography::CryptographicOperation operation | + ( + algorithm instanceof Cryptography::PasswordHashingAlgorithm and + algorithm.isWeak() + or + algorithm instanceof Cryptography::HashingAlgorithm // Note that HashingAlgorithm and PasswordHashingAlgorithm are disjoint + ) and + algorithm = operation.getAlgorithm() and + this = operation.getAnInput() + ) + } + + override string getAlgorithmName() { result = algorithm.getName() } + + override predicate isComputationallyExpensive() { + algorithm instanceof Cryptography::PasswordHashingAlgorithm + } + } +} diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 786164b5fe4..126e2b8583c 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,24 @@ +## 1.5.2 + +No user-facing changes. + +## 1.5.1 + +No user-facing changes. + +## 1.5.0 + +### New Queries + +* The `go/cookie-http-only-not-set` query has been promoted from the experimental query pack. This query was originally contributed to the experimental query pack by @edvraa. +* A new query `go/cookie-secure-not-set` has been added to detect cookies without the `Secure` flag set. +* Added a new query, `go/weak-crypto-algorithm`, to detect the use of a broken or weak cryptographic algorithm. A very simple version of this query was originally contributed as an [experimental query by @dilanbhalla](https://github.com/github/codeql-go/pull/284). +* Added a new query, `go/weak-sensitive-data-hashing`, to detect the use of a broken or weak cryptographic hash algorithm on sensitive data. + +## 1.4.9 + +No user-facing changes. + ## 1.4.8 No user-facing changes. diff --git a/go/ql/src/Security/CWE-020/MissingRegexpAnchor.ql b/go/ql/src/Security/CWE-020/MissingRegexpAnchor.ql index 43a24b1aef3..a4b18bff8d3 100644 --- a/go/ql/src/Security/CWE-020/MissingRegexpAnchor.ql +++ b/go/ql/src/Security/CWE-020/MissingRegexpAnchor.ql @@ -81,5 +81,5 @@ module Config implements DataFlow::ConfigSig { module Flow = DataFlow::Global; from DataFlow::Node source, string msg -where Flow::flow(source, _) and Config::isSourceString(source, msg) +where Flow::flowFrom(source) and Config::isSourceString(source, msg) select source, msg diff --git a/go/ql/src/Security/CWE-020/UntrustedDataToExternalAPI.ql b/go/ql/src/Security/CWE-020/UntrustedDataToExternalAPI.ql index 6e8d99471ee..b9bf1be2c1d 100644 --- a/go/ql/src/Security/CWE-020/UntrustedDataToExternalAPI.ql +++ b/go/ql/src/Security/CWE-020/UntrustedDataToExternalAPI.ql @@ -6,7 +6,8 @@ * @precision low * @problem.severity error * @security-severity 7.8 - * @tags security external/cwe/cwe-020 + * @tags security + * external/cwe/cwe-020 */ import go diff --git a/go/ql/src/Security/CWE-020/UntrustedDataToUnknownExternalAPI.ql b/go/ql/src/Security/CWE-020/UntrustedDataToUnknownExternalAPI.ql index 45198047904..89ce5949245 100644 --- a/go/ql/src/Security/CWE-020/UntrustedDataToUnknownExternalAPI.ql +++ b/go/ql/src/Security/CWE-020/UntrustedDataToUnknownExternalAPI.ql @@ -6,7 +6,8 @@ * @precision low * @problem.severity error * @security-severity 7.8 - * @tags security external/cwe/cwe-020 + * @tags security + * external/cwe/cwe-020 */ import go diff --git a/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.qhelp b/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.qhelp new file mode 100644 index 00000000000..a9614e2a697 --- /dev/null +++ b/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.qhelp @@ -0,0 +1,34 @@ + + + + +

Cookies without the HttpOnly flag set are accessible to client-side scripts such as JavaScript running in the same origin. +In case of a Cross-Site Scripting (XSS) vulnerability, the cookie can be stolen by a malicious script. +If a sensitive cookie does not need to be accessed directly by client-side JS, the HttpOnly flag should be set.

+
+ + +

+Set the HttpOnly flag to true for authentication cookies to ensure they are not accessible to client-side scripts. +

+
+ + +

+In the following example, in the case marked BAD, the HttpOnly flag is not set, so the default value of false is used. +In the case marked GOOD, the HttpOnly flag is set to true. +

+ + + +
+ + + +
  • MDN: Set-Cookie Header.
  • +
  • PortSwigger: Cookie without HttpOnly flag set
  • + +
    +
    \ No newline at end of file diff --git a/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.ql b/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.ql new file mode 100644 index 00000000000..8d11d8c40a6 --- /dev/null +++ b/go/ql/src/Security/CWE-1004/CookieWithoutHttpOnly.ql @@ -0,0 +1,25 @@ +/** + * @name Cookie 'HttpOnly' attribute is not set to true + * @description Sensitive cookies without the `HttpOnly` property set are accessible by client-side scripts such as JavaScript. + * This makes them more vulnerable to being stolen by an XSS attack. + * @kind path-problem + * @problem.severity warning + * @precision high + * @security-severity 5.0 + * @id go/cookie-httponly-not-set + * @tags security + * external/cwe/cwe-1004 + */ + +import go +import semmle.go.security.CookieWithoutHttpOnly +import SensitiveCookieNameFlow::PathGraph + +from + Http::CookieWrite cw, string name, SensitiveCookieNameFlow::PathNode source, + SensitiveCookieNameFlow::PathNode sink +where + isSensitiveCookie(cw, name, source, sink) and + isNonHttpOnlyCookie(cw) +select cw, source, sink, "Sensitive cookie $@ does not set HttpOnly attribute to true.", source, + name diff --git a/go/ql/src/Security/CWE-1004/examples/CookieWithoutHttpOnly.go b/go/ql/src/Security/CWE-1004/examples/CookieWithoutHttpOnly.go new file mode 100644 index 00000000000..a4a78b9f962 --- /dev/null +++ b/go/ql/src/Security/CWE-1004/examples/CookieWithoutHttpOnly.go @@ -0,0 +1,22 @@ +package main + +import ( + "net/http" +) + +func handlerBad(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + } + http.SetCookie(w, &c) // BAD: The HttpOnly flag is set to false by default. +} + +func handlerGood(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + HttpOnly: true, + } + http.SetCookie(w, &c) // GOOD: The HttpOnly flag is set to true. +} diff --git a/go/ql/src/experimental/CWE-327/WeakCryptoAlgorithm.qhelp b/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp similarity index 88% rename from go/ql/src/experimental/CWE-327/WeakCryptoAlgorithm.qhelp rename to go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp index 0283e142fba..a65af78c0ae 100644 --- a/go/ql/src/experimental/CWE-327/WeakCryptoAlgorithm.qhelp +++ b/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.qhelp @@ -28,10 +28,10 @@

    - The following code uses the different packages to encrypt/hash - some secret data. The first few examples uses DES, MD5, RC4, and SHA1, - which are older algorithms that are now considered weak. The following - examples use AES and SHA256, which are stronger, more modern algorithms. + The following code uses the different packages to encrypt + some secret data. The first example uses DES, + which is an older algorithm that is now considered weak. The following + example uses AES, which is a stronger, more modern algorithm.

    diff --git a/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql b/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql new file mode 100644 index 00000000000..67b2d0d6d2b --- /dev/null +++ b/go/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql @@ -0,0 +1,33 @@ +/** + * @name Use of a broken or weak cryptographic algorithm + * @description Using broken or weak cryptographic algorithms can compromise security. + * @kind problem + * @problem.severity warning + * @security-severity 7.5 + * @precision high + * @id go/weak-cryptographic-algorithm + * @tags security + * external/cwe/cwe-327 + * external/cwe/cwe-328 + */ + +import go + +from Cryptography::CryptographicOperation operation, string msgPrefix, DataFlow::Node init +where + init = operation.getInitialization() and + // `init` may be a `BlockModeInit`, a `EncryptionAlgorithmInit`, or `operation` itself. + ( + not init instanceof BlockModeInit and + exists(Cryptography::CryptographicAlgorithm algorithm | + algorithm = operation.getAlgorithm() and + algorithm.isWeak() and + msgPrefix = "The cryptographic algorithm " + algorithm.getName() and + not algorithm instanceof Cryptography::HashingAlgorithm + ) + or + not init instanceof EncryptionAlgorithmInit and + operation.getBlockMode().isWeak() and + msgPrefix = "The block mode " + operation.getBlockMode() + ) +select operation, "$@ is broken or weak, and should not be used.", init, msgPrefix diff --git a/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.qhelp b/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.qhelp new file mode 100644 index 00000000000..1fa64e4adaf --- /dev/null +++ b/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.qhelp @@ -0,0 +1,97 @@ + + + +

    + Using a broken or weak cryptographic hash function can leave data + vulnerable, and should not be used in security related code. +

    + +

    + A strong cryptographic hash function should be resistant to: +

    +
      +
    • + pre-image attacks: if you know a hash value h(x), + you should not be able to easily find the input x. +
    • +
    • + collision attacks: if you know a hash value h(x), + you should not be able to easily find a different input y + with the same hash value h(x) = h(y). +
    • +
    +

    + In cases with a limited input space, such as for passwords, the hash + function also needs to be computationally expensive to be resistant to + brute-force attacks. Passwords should also have an unique salt applied + before hashing, but that is not considered by this query. +

    + +

    + As an example, both MD5 and SHA-1 are known to be vulnerable to collision attacks. +

    + +

    + Since it's OK to use a weak cryptographic hash function in a non-security + context, this query only alerts when these are used to hash sensitive + data (such as passwords, certificates, usernames). +

    + +

    + Use of broken or weak cryptographic algorithms that are not hashing algorithms, is + handled by the rb/weak-cryptographic-algorithm query. +

    + +
    + + +

    + Ensure that you use a strong, modern cryptographic hash function: +

    + +
      +
    • + such as Argon2, scrypt, bcrypt, or PBKDF2 for passwords and other data with limited input space. +
    • +
    • + such as SHA-2, or SHA-3 in other cases. +
    • +
    + +
    + + +

    + The following example shows two functions for checking whether the hash + of a secret matches a known value. + + The first function uses SHA-1 that is known to be vulnerable to collision attacks. + + The second function uses SHA-256 that is a strong cryptographic hashing function. +

    + + + +
    + +

    + The following example shows two functions for hashing passwords. + + The first example uses SHA-256 to hash passwords. Although + SHA-256 is a strong cryptographic hash function, it is not suitable for password + hashing since it is not computationally expensive. + + The second function uses PBKDF2, which is a strong password hashing algorithm. +

    + + + +
    + + +
  • OWASP: Password Storage Cheat Sheet
  • +
    + +
    diff --git a/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql b/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql new file mode 100644 index 00000000000..0a38d9729f0 --- /dev/null +++ b/go/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql @@ -0,0 +1,118 @@ +/** + * @name Use of a broken or weak cryptographic hashing algorithm on sensitive data + * @description Using broken or weak cryptographic hashing algorithms can compromise security. + * @kind path-problem + * @problem.severity warning + * @security-severity 7.5 + * @precision high + * @id go/weak-sensitive-data-hashing + * @tags security + * external/cwe/cwe-327 + * external/cwe/cwe-328 + * external/cwe/cwe-916 + */ + +import go +import semmle.go.security.WeakSensitiveDataHashingCustomizations + +/** + * Provides a taint-tracking configuration for detecting use of a broken or weak + * cryptographic hash function on sensitive data, that does NOT require a + * computationally expensive hash function. + */ +module NormalHashFunctionFlow { + import NormalHashFunction + + private module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Barrier } + + predicate isBarrierIn(DataFlow::Node node) { + // make sources barriers so that we only report the closest instance + isSource(node) + } + + predicate isBarrierOut(DataFlow::Node node) { + // make sinks barriers so that we only report the closest instance + isSink(node) + } + + predicate observeDiffInformedIncrementalMode() { any() } + } + + import TaintTracking::Global +} + +/** + * Provides a taint-tracking configuration for detecting use of a broken or weak + * cryptographic hashing algorithm on passwords. + * + * Passwords has stricter requirements on the hashing algorithm used (must be + * computationally expensive to prevent brute-force attacks). + */ +module ComputationallyExpensiveHashFunctionFlow { + import ComputationallyExpensiveHashFunction + + private module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Barrier } + + predicate isBarrierIn(DataFlow::Node node) { + // make sources barriers so that we only report the closest instance + isSource(node) + } + + predicate isBarrierOut(DataFlow::Node node) { + // make sinks barriers so that we only report the closest instance + isSink(node) + } + + predicate observeDiffInformedIncrementalMode() { any() } + } + + import TaintTracking::Global +} + +/** + * Global taint-tracking for detecting both variants of "use of a broken or weak + * cryptographic hashing algorithm on sensitive data" vulnerabilities. The two configurations are + * merged to generate a combined path graph. + */ +module WeakSensitiveDataHashingFlow = + DataFlow::MergePathGraph; + +import WeakSensitiveDataHashingFlow::PathGraph + +from + WeakSensitiveDataHashingFlow::PathNode source, WeakSensitiveDataHashingFlow::PathNode sink, + string ending, string algorithmName, string classification +where + NormalHashFunctionFlow::flowPath(source.asPathNode1(), sink.asPathNode1()) and + algorithmName = sink.getNode().(NormalHashFunction::Sink).getAlgorithmName() and + classification = source.getNode().(NormalHashFunction::Source).getClassification() and + ending = "." + or + ComputationallyExpensiveHashFunctionFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) and + algorithmName = sink.getNode().(ComputationallyExpensiveHashFunction::Sink).getAlgorithmName() and + classification = + source.getNode().(ComputationallyExpensiveHashFunction::Source).getClassification() and + ( + sink.getNode().(ComputationallyExpensiveHashFunction::Sink).isComputationallyExpensive() and + ending = "." + or + not sink.getNode().(ComputationallyExpensiveHashFunction::Sink).isComputationallyExpensive() and + ending = + " for " + classification + + " hashing, since it is not a computationally expensive hash function." + ) +select sink.getNode(), source, sink, + "$@ is used in a hashing algorithm (" + algorithmName + ") that is insecure" + ending, + source.getNode(), "Sensitive data (" + classification + ")" diff --git a/go/ql/src/Security/CWE-327/examples/Crypto.go b/go/ql/src/Security/CWE-327/examples/Crypto.go new file mode 100644 index 00000000000..b3f71f0772b --- /dev/null +++ b/go/ql/src/Security/CWE-327/examples/Crypto.go @@ -0,0 +1,20 @@ +package main + +import ( + "crypto/aes" + "crypto/des" +) + +func EncryptMessageWeak(key []byte, message []byte) (dst []byte) { + // BAD, DES is a weak crypto algorithm + block, _ := des.NewCipher(key) + block.Encrypt(dst, message) + return +} + +func EncryptMessageStrong(key []byte, message []byte) (dst []byte) { + // GOOD, AES is a weak crypto algorithm + block, _ := aes.NewCipher(key) + block.Encrypt(dst, message) + return +} diff --git a/go/ql/src/experimental/CWE-327/examples/InsecureRandomness.go b/go/ql/src/Security/CWE-327/examples/InsecureRandomness.go similarity index 100% rename from go/ql/src/experimental/CWE-327/examples/InsecureRandomness.go rename to go/ql/src/Security/CWE-327/examples/InsecureRandomness.go diff --git a/go/ql/src/Security/CWE-327/examples/WeakPasswordHashing.go b/go/ql/src/Security/CWE-327/examples/WeakPasswordHashing.go new file mode 100644 index 00000000000..671edede7d3 --- /dev/null +++ b/go/ql/src/Security/CWE-327/examples/WeakPasswordHashing.go @@ -0,0 +1,21 @@ +package main + +import ( + "crypto/pbkdf2" + "crypto/rand" + "crypto/sha256" + "crypto/sha512" +) + +func GetPasswordHashBad(password string) [32]byte { + // BAD, SHA256 is a strong hashing algorithm but it is not computationally expensive + return sha256.Sum256([]byte(password)) +} + +func GetPasswordHashGood(password string) []byte { + // GOOD, PBKDF2 is a strong hashing algorithm and it is computationally expensive + salt := make([]byte, 16) + rand.Read(salt) + key, _ := pbkdf2.Key(sha512.New, password, salt, 4096, 32) + return key +} diff --git a/go/ql/src/Security/CWE-327/examples/WeakSecretHashing.go b/go/ql/src/Security/CWE-327/examples/WeakSecretHashing.go new file mode 100644 index 00000000000..fd65b802548 --- /dev/null +++ b/go/ql/src/Security/CWE-327/examples/WeakSecretHashing.go @@ -0,0 +1,19 @@ +package main + +import ( + "crypto/sha1" + "crypto/sha256" + "slices" +) + +func SecretMatchesKnownHashBad(secret []byte, known_hash []byte) bool { + // BAD, SHA1 is a weak crypto algorithm and secret is sensitive data + h := sha1.New() + return slices.Equal(h.Sum(secret), known_hash) +} + +func SecretMatchesKnownHashGood(secret []byte, known_hash []byte) bool { + // GOOD, SHA256 is a strong hashing algorithm + h := sha256.New() + return slices.Equal(h.Sum(secret), known_hash) +} diff --git a/go/ql/src/Security/CWE-352/ConstantOauth2State.ql b/go/ql/src/Security/CWE-352/ConstantOauth2State.ql index 501eb6109c7..edbb41782b8 100644 --- a/go/ql/src/Security/CWE-352/ConstantOauth2State.ql +++ b/go/ql/src/Security/CWE-352/ConstantOauth2State.ql @@ -154,7 +154,7 @@ module FlowToPrintFlow = DataFlow::Global; /** Holds if the provided `CallNode`'s result flows to an argument of a printer call. */ predicate resultFlowsToPrinter(DataFlow::CallNode authCodeUrlCall) { - FlowToPrintFlow::flow(authCodeUrlCall.getResult(), _) + FlowToPrintFlow::flowFrom(authCodeUrlCall.getResult()) } /** Get a data-flow node that reads the value of `os.Stdin`. */ diff --git a/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql b/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql index 17ec112955f..34023f6161e 100644 --- a/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql +++ b/go/ql/src/Security/CWE-601/OpenUrlRedirect.ql @@ -21,6 +21,6 @@ where OpenUrlRedirect::Flow::flowPath(source, sink) and // this excludes flow from safe parts of request URLs, for example the full URL when the // doing a redirect from `http://` to `https://` - not SafeUrlFlow::Flow::flow(_, sink.getNode()) + not SafeUrlFlow::Flow::flowTo(sink.getNode()) select sink.getNode(), source, sink, "This path to an untrusted URL redirection depends on a $@.", source.getNode(), "user-provided value" diff --git a/go/ql/src/Security/CWE-614/CookieWithoutSecure.qhelp b/go/ql/src/Security/CWE-614/CookieWithoutSecure.qhelp new file mode 100644 index 00000000000..4ee969e475c --- /dev/null +++ b/go/ql/src/Security/CWE-614/CookieWithoutSecure.qhelp @@ -0,0 +1,35 @@ + + + + +

    Cookies without the Secure flag set may be transmitted using HTTP instead of HTTPS. +This leaves them vulnerable to being read by a third party attacker. If a sensitive cookie such as a session +key is intercepted this way, it would allow the attacker to perform actions on a user's behalf.

    +
    + + +

    +Set the Secure flag to true to ensure cookies are only transmitted over secure HTTPS connections. +

    +
    + + +

    +In the following example, in the case marked BAD, the Secure flag is set to false by default. +In the case marked GOOD, the Secure flag is set to true. +

    + + + +
    + + + +
  • MDN: Set-Cookie Header.
  • +
  • Detectify: Cookie lack Secure flag.
  • +
  • PortSwigger: TLS cookie without secure flag set.
  • + +
    +
    \ No newline at end of file diff --git a/go/ql/src/Security/CWE-614/CookieWithoutSecure.ql b/go/ql/src/Security/CWE-614/CookieWithoutSecure.ql new file mode 100644 index 00000000000..7c3c4ed1dd3 --- /dev/null +++ b/go/ql/src/Security/CWE-614/CookieWithoutSecure.ql @@ -0,0 +1,19 @@ +/** + * @name Cookie 'Secure' attribute is not set to true + * @description Cookies without the `Secure` flag may be sent in cleartext. + * This makes them vulnerable to be intercepted by an attacker. + * @kind problem + * @problem.severity warning + * @precision high + * @security-severity 4.0 + * @id go/cookie-secure-not-set + * @tags security + * external/cwe/cwe-614 + */ + +import go +import semmle.go.security.CookieWithoutSecure + +from Http::CookieWrite cw +where isInsecureCookie(cw) +select cw, "Cookie does not set Secure attribute to true." diff --git a/go/ql/src/Security/CWE-614/examples/CookieWithoutSecure.go b/go/ql/src/Security/CWE-614/examples/CookieWithoutSecure.go new file mode 100644 index 00000000000..dc46c918d36 --- /dev/null +++ b/go/ql/src/Security/CWE-614/examples/CookieWithoutSecure.go @@ -0,0 +1,22 @@ +package main + +import ( + "net/http" +) + +func handlerBad(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + } + http.SetCookie(w, &c) // BAD: The Secure flag is set to false by default. +} + +func handlerGood(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + Secure: true, + } + http.SetCookie(w, &c) // GOOD: The Secure flag is set to true. +} diff --git a/go/ql/src/Security/CWE-918/RequestForgery.ql b/go/ql/src/Security/CWE-918/RequestForgery.ql index 5a5c3265483..a54f51db9ce 100644 --- a/go/ql/src/Security/CWE-918/RequestForgery.ql +++ b/go/ql/src/Security/CWE-918/RequestForgery.ql @@ -21,6 +21,6 @@ where RequestForgery::Flow::flowPath(source, sink) and request = sink.getNode().(RequestForgery::Sink).getARequest() and // this excludes flow from safe parts of request URLs, for example the full URL - not SafeUrlFlow::Flow::flow(_, sink.getNode()) + not SafeUrlFlow::Flow::flowTo(sink.getNode()) select request, source, sink, "The $@ of this request depends on a $@.", sink.getNode(), sink.getNode().(RequestForgery::Sink).getKind(), source, "user-provided value" diff --git a/go/ql/src/change-notes/released/1.4.9.md b/go/ql/src/change-notes/released/1.4.9.md new file mode 100644 index 00000000000..23b8222662c --- /dev/null +++ b/go/ql/src/change-notes/released/1.4.9.md @@ -0,0 +1,3 @@ +## 1.4.9 + +No user-facing changes. diff --git a/go/ql/src/change-notes/released/1.5.0.md b/go/ql/src/change-notes/released/1.5.0.md new file mode 100644 index 00000000000..a1a1f5158cc --- /dev/null +++ b/go/ql/src/change-notes/released/1.5.0.md @@ -0,0 +1,8 @@ +## 1.5.0 + +### New Queries + +* The `go/cookie-http-only-not-set` query has been promoted from the experimental query pack. This query was originally contributed to the experimental query pack by @edvraa. +* A new query `go/cookie-secure-not-set` has been added to detect cookies without the `Secure` flag set. +* Added a new query, `go/weak-crypto-algorithm`, to detect the use of a broken or weak cryptographic algorithm. A very simple version of this query was originally contributed as an [experimental query by @dilanbhalla](https://github.com/github/codeql-go/pull/284). +* Added a new query, `go/weak-sensitive-data-hashing`, to detect the use of a broken or weak cryptographic hash algorithm on sensitive data. diff --git a/go/ql/src/change-notes/released/1.5.1.md b/go/ql/src/change-notes/released/1.5.1.md new file mode 100644 index 00000000000..7b24a64aca3 --- /dev/null +++ b/go/ql/src/change-notes/released/1.5.1.md @@ -0,0 +1,3 @@ +## 1.5.1 + +No user-facing changes. diff --git a/go/ql/src/change-notes/released/1.5.2.md b/go/ql/src/change-notes/released/1.5.2.md new file mode 100644 index 00000000000..384c27833f1 --- /dev/null +++ b/go/ql/src/change-notes/released/1.5.2.md @@ -0,0 +1,3 @@ +## 1.5.2 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 16e6425ae7e..7eb901bae56 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.8 +lastReleaseVersion: 1.5.2 diff --git a/go/ql/src/experimental/CWE-1004/AuthCookie.qll b/go/ql/src/experimental/CWE-1004/AuthCookie.qll deleted file mode 100644 index 58c9f8642b3..00000000000 --- a/go/ql/src/experimental/CWE-1004/AuthCookie.qll +++ /dev/null @@ -1,245 +0,0 @@ -import go - -private class NetHttpCookieType extends Type { - NetHttpCookieType() { this.hasQualifiedName(package("net/http", ""), "Cookie") } -} - -private class GinContextSetCookieMethod extends Method { - GinContextSetCookieMethod() { - this.hasQualifiedName(package("github.com/gin-gonic/gin", ""), "Context", "SetCookie") - } -} - -private class GorillaSessionOptionsField extends Field { - GorillaSessionOptionsField() { - this.hasQualifiedName(package("github.com/gorilla/sessions", ""), "Session", "Options") - } -} - -/** - * A simplistic points-to alternative: given a struct creation and a field name, get the values that field can be assigned. - * - * Assumptions: - * - we don't reassign the variable that the creation is stored in - * - we always access the creation through the same variable it is initially assigned to - * - * This should cover most typical patterns... - */ -private DataFlow::Node getValueForFieldWrite(StructLit sl, string field) { - exists(Write w, DataFlow::Node base, Field f | - f.getName() = field and - w.writesFieldPreUpdate(base, f, result) and - ( - sl = base.asExpr() - or - base.asExpr() instanceof VariableName and - base.getAPredecessor*().asExpr() = sl - ) - ) -} - -/** - * Holds if the expression or its value has a sensitive name - */ -private predicate isAuthVariable(Expr expr) { - exists(string val | - ( - val = expr.getStringValue() or - val = expr.(Name).getTarget().getName() - ) and - val.regexpMatch("(?i).*(session|login|token|user|auth|credential).*") and - not val.regexpMatch("(?i).*(xsrf|csrf|forgery).*") - ) -} - -/** - * A cookie passed as the second parameter to `net/http.SetCookie`. - */ -private class SetCookieSink extends DataFlow::Node { - SetCookieSink() { - exists(DataFlow::CallNode cn | - cn.getTarget().hasQualifiedName(package("net/http", ""), "SetCookie") and - this = cn.getArgument(1) - ) - } -} - -private module NameToNetHttpCookieTrackingConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } - - predicate isSink(DataFlow::Node sink) { sink instanceof SetCookieSink } - - predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(StructLit sl | - sl.getType() instanceof NetHttpCookieType and - getValueForFieldWrite(sl, "Name") = pred and - sl = succ.asExpr() - ) - } -} - -/** Tracks taint flow from sensitive names to `net/http.SetCookie`. */ -module NameToNetHttpCookieTrackingFlow = TaintTracking::Global; - -private module BoolToNetHttpCookieTrackingConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source.getType().getUnderlyingType() instanceof BoolType - } - - predicate isSink(DataFlow::Node sink) { sink instanceof SetCookieSink } - - predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(StructLit sl | - sl.getType() instanceof NetHttpCookieType and - getValueForFieldWrite(sl, "HttpOnly") = pred and - sl = succ.asExpr() - ) - } -} - -/** - * Tracks taint flow from a `bool` assigned to `HttpOnly` to - * `net/http.SetCookie`. - */ -module BoolToNetHttpCookieTrackingFlow = TaintTracking::Global; - -private module BoolToGinSetCookieTrackingConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { source.getBoolValue() = false } - - predicate isSink(DataFlow::Node sink) { - exists(DataFlow::MethodCallNode mcn | - mcn.getTarget() instanceof GinContextSetCookieMethod and - mcn.getArgument(6) = sink and - exists(DataFlow::Node nameArg | - NameToGinSetCookieTrackingFlow::flowTo(nameArg) and - mcn.getArgument(0) = nameArg - ) - ) - } - - predicate observeDiffInformedIncrementalMode() { - any() // Merged with other flows in CookieWithoutHttpOnly.ql - } - - Location getASelectedSourceLocation(DataFlow::Node source) { none() } -} - -/** - * Tracks data flow from `HttpOnly` set to `false` to - * `gin-gonic/gin.Context.SetCookie`. - */ -module BoolToGinSetCookieTrackingFlow = DataFlow::Global; - -private module NameToGinSetCookieTrackingConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } - - predicate isSink(DataFlow::Node sink) { - exists(DataFlow::MethodCallNode mcn | - mcn.getTarget() instanceof GinContextSetCookieMethod and - mcn.getArgument(0) = sink - ) - } -} - -/** - * Tracks taint flow from sensitive names to `gin-gonic/gin.Context.SetCookie`. - */ -private module NameToGinSetCookieTrackingFlow = DataFlow::Global; - -/** - * The receiver of `gorilla/sessions.Session.Save` call. - */ -private class GorillaSessionSaveSink extends DataFlow::Node { - GorillaSessionSaveSink() { - exists(DataFlow::MethodCallNode mcn | - this = mcn.getReceiver() and - mcn.getTarget() - .hasQualifiedName(package("github.com/gorilla/sessions", ""), "Session", "Save") - ) - } -} - -private class GorillaStoreSaveSink extends DataFlow::Node { - GorillaStoreSaveSink() { - exists(DataFlow::MethodCallNode mcn | - this = mcn.getArgument(2) and - mcn.getTarget() - .hasQualifiedName(package("github.com/gorilla/sessions", ""), "CookieStore", "Save") - ) - } -} - -private module GorillaCookieStoreSaveTrackingConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source - .(DataFlow::CallNode) - .getTarget() - .hasQualifiedName(package("github.com/gorilla/sessions", ""), "NewCookieStore") - } - - predicate isSink(DataFlow::Node sink) { - sink instanceof GorillaSessionSaveSink or - sink instanceof GorillaStoreSaveSink - } - - predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(DataFlow::MethodCallNode cn | - cn.getTarget() - .hasQualifiedName(package("github.com/gorilla/sessions", ""), "CookieStore", "Get") and - pred = cn.getReceiver() and - succ = cn.getResult(0) - ) - } -} - -/** - * Tracks data flow from gorilla cookie store creation to - * `gorilla/sessions.Session.Save`. - */ -module GorillaCookieStoreSaveTrackingFlow = DataFlow::Global; - -private module GorillaSessionOptionsTrackingConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - exists(StructLit sl | - sl.getType().hasQualifiedName(package("github.com/gorilla/sessions", ""), "Options") and - source.asExpr() = sl - ) - } - - predicate isSink(DataFlow::Node sink) { sink instanceof GorillaSessionSaveSink } - - predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(GorillaSessionOptionsField f, DataFlow::Write w | w.writesField(succ, f, pred)) - } -} - -/** - * Tracks taint flow from session options to - * `gorilla/sessions.Session.Save`. - */ -module GorillaSessionOptionsTrackingFlow = - TaintTracking::Global; - -private module BoolToGorillaSessionOptionsTrackingConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source.getType().getUnderlyingType() instanceof BoolType - } - - predicate isSink(DataFlow::Node sink) { sink instanceof GorillaSessionSaveSink } - - predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(StructLit sl | - getValueForFieldWrite(sl, "HttpOnly") = pred and - sl = succ.asExpr() - ) - or - exists(GorillaSessionOptionsField f, DataFlow::Write w | w.writesField(succ, f, pred)) - } -} - -/** - * Tracks taint flow from a `bool` assigned to `HttpOnly` to - * `gorilla/sessions.Session.Save`. - */ -module BoolToGorillaSessionOptionsTrackingFlow = - TaintTracking::Global; diff --git a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.qhelp b/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.qhelp deleted file mode 100644 index 2e88a610c9d..00000000000 --- a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.qhelp +++ /dev/null @@ -1,42 +0,0 @@ - - - - -

    -Cookies without HttpOnly attribute are accessible to JavaScript running in the same origin. In case of -Cross-Site Scripting (XSS) vulnerability the cookie can be stolen by malicious script. -

    -
    - - -

    -Protect sensitive cookies, such as related to authentication, by setting HttpOnly to true to make -them not accessible to JavaScript. -

    -
    - - - -

    -In the following example the default HttpOnly value is false. -

    - - - -

    -In the example below HttpOnly is set to true. -

    - - - -
    - - - -
  • type Cookie,
  • -
  • Set-Cookie Header,
  • - -
    -
    \ No newline at end of file diff --git a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.ql b/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.ql deleted file mode 100644 index 1b135ae87f9..00000000000 --- a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnly.ql +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @name 'HttpOnly' attribute is not set to true - * @description Omitting the 'HttpOnly' attribute for security sensitive data allows - * malicious JavaScript to steal it in case of XSS vulnerability. Always set - * 'HttpOnly' to 'true' to authentication related cookie to make it - * not accessible by JavaScript. - * @kind path-problem - * @problem.severity warning - * @precision high - * @id go/cookie-httponly-not-set - * @tags security - * experimental - * external/cwe/cwe-1004 - */ - -import go -import AuthCookie - -module NetHttpCookieTrackingFlow = - DataFlow::MergePathGraph; - -module GorillaTrackingFlow = - DataFlow::MergePathGraph3; - -module MergedFlow = - DataFlow::MergePathGraph3; - -import MergedFlow::PathGraph - -/** Holds if `HttpOnly` of `net/http.SetCookie` is set to `false` or not set (default value is used). */ -predicate isNetHttpCookieFlow( - NetHttpCookieTrackingFlow::PathNode source, NetHttpCookieTrackingFlow::PathNode sink -) { - exists( - NameToNetHttpCookieTrackingFlow::PathNode sensitiveName, - NameToNetHttpCookieTrackingFlow::PathNode setCookieSink - | - NameToNetHttpCookieTrackingFlow::flowPath(sensitiveName, setCookieSink) and - ( - not BoolToNetHttpCookieTrackingFlow::flowTo(sink.getNode()) and - source.asPathNode1() = sensitiveName and - sink.asPathNode1() = setCookieSink - or - BoolToNetHttpCookieTrackingFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) and - source.getNode().getBoolValue() = false and - setCookieSink.getNode() = sink.getNode() - ) - ) -} - -/** - * Holds if there is gorilla cookie store creation to `Save` path and - * `HttpOnly` is set to `false` or not set (default value is used). - */ -predicate isGorillaSessionsCookieFlow( - GorillaTrackingFlow::PathNode source, GorillaTrackingFlow::PathNode sink -) { - exists( - GorillaCookieStoreSaveTrackingFlow::PathNode cookieStoreCreate, - GorillaCookieStoreSaveTrackingFlow::PathNode sessionSave - | - GorillaCookieStoreSaveTrackingFlow::flowPath(cookieStoreCreate, sessionSave) and - ( - not GorillaSessionOptionsTrackingFlow::flowTo(sink.getNode()) and - source.asPathNode1() = cookieStoreCreate and - sink.asPathNode1() = sessionSave - or - exists(GorillaTrackingFlow::PathNode options, GorillaTrackingFlow::PathNode sessionSave2 | - GorillaSessionOptionsTrackingFlow::flowPath(options.asPathNode2(), - sessionSave2.asPathNode2()) and - ( - not BoolToGorillaSessionOptionsTrackingFlow::flowTo(sink.getNode()) and - sink = sessionSave2 and - source = options and - sessionSave.getNode() = sessionSave2.getNode() - or - BoolToGorillaSessionOptionsTrackingFlow::flowPath(source.asPathNode3(), sink.asPathNode3()) and - source.getNode().getBoolValue() = false and - sink.getNode() = sessionSave.getNode() - ) - ) - ) - ) -} - -from MergedFlow::PathNode source, MergedFlow::PathNode sink -where - isNetHttpCookieFlow(source.asPathNode1(), sink.asPathNode1()) or - BoolToGinSetCookieTrackingFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) or - isGorillaSessionsCookieFlow(source.asPathNode3(), sink.asPathNode3()) -select sink.getNode(), source, sink, "Cookie attribute 'HttpOnly' is not set to true." diff --git a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnlyBad.go b/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnlyBad.go deleted file mode 100644 index 852e2f3f3db..00000000000 --- a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnlyBad.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "net/http" -) - -func handler(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "session", - Value: "secret", - } - http.SetCookie(w, &c) -} - -func main() { - http.HandleFunc("/", handler) -} diff --git a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnlyGood.go b/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnlyGood.go deleted file mode 100644 index b0b505e2007..00000000000 --- a/go/ql/src/experimental/CWE-1004/CookieWithoutHttpOnlyGood.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "net/http" -) - -func handler(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "session", - Value: "secret", - HttpOnly: true, - } - http.SetCookie(w, &c) -} - -func main() { - http.HandleFunc("/", handler) -} diff --git a/go/ql/src/experimental/CWE-285/PamAuthBypass.ql b/go/ql/src/experimental/CWE-285/PamAuthBypass.ql index 755a023ef62..daba2f89544 100644 --- a/go/ql/src/experimental/CWE-285/PamAuthBypass.ql +++ b/go/ql/src/experimental/CWE-285/PamAuthBypass.ql @@ -70,5 +70,6 @@ module PamStartToAuthenticateFlow = TaintTracking::Global; -} diff --git a/go/ql/src/experimental/CWE-327/examples/Crypto.go b/go/ql/src/experimental/CWE-327/examples/Crypto.go deleted file mode 100644 index bc2b2fdeba4..00000000000 --- a/go/ql/src/experimental/CWE-327/examples/Crypto.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "crypto/aes" - "crypto/des" - "crypto/md5" - "crypto/rc4" - "crypto/sha1" - "crypto/sha256" -) - -func main() { - public := []byte("hello") - - password := []byte("123456") - buf := password // testing dataflow by passing into different variable - - // BAD, des is a weak crypto algorithm and password is sensitive data - des.NewTripleDESCipher(buf) - - // BAD, md5 is a weak crypto algorithm and password is sensitive data - md5.Sum(buf) - - // BAD, rc4 is a weak crypto algorithm and password is sensitive data - rc4.NewCipher(buf) - - // BAD, sha1 is a weak crypto algorithm and password is sensitive data - sha1.Sum(buf) - - // GOOD, password is sensitive data but aes is a strong crypto algorithm - aes.NewCipher(buf) - - // GOOD, password is sensitive data but sha256 is a strong crypto algorithm - sha256.Sum256(buf) - - // GOOD, des is a weak crypto algorithm but public is not sensitive data - des.NewTripleDESCipher(public) - - // GOOD, md5 is a weak crypto algorithm but public is not sensitive data - md5.Sum(public) - - // GOOD, rc4 is a weak crypto algorithm but public is not sensitive data - rc4.NewCipher(public) - - // GOOD, sha1 is a weak crypto algorithm but public is not sensitive data - sha1.Sum(public) - - // GOOD, aes is a strong crypto algorithm and public is not sensitive data - aes.NewCipher(public) - - // GOOD, sha256 is a strong crypto algorithm and public is not sensitive data - sha256.Sum256(public) -} diff --git a/go/ql/src/experimental/CWE-918/validator.qll b/go/ql/src/experimental/CWE-918/validator.qll index 5b9840b8494..2c9dc0592f3 100644 --- a/go/ql/src/experimental/CWE-918/validator.qll +++ b/go/ql/src/experimental/CWE-918/validator.qll @@ -24,7 +24,7 @@ class FieldWithTags extends FieldDecl { * For example: the tag `json:"word" binding:"required,alpha"` yields `key: "json", value: "word"` * and `key: "binding" values: "required","alpha"`. */ - predicate getTagByKeyValue(string key, string value) { + predicate hasTagKeyValue(string key, string value) { exists(string tag, string key_value, string values | this.getTag().toString() = tag and // Each key_value is like key:"value1,value2" @@ -50,7 +50,7 @@ class AlphanumericStructFieldRead extends DataFlow::Node { exists(FieldWithTags decl, Field field, string tag | this = field.getARead() and field.getDeclaration() = decl.getNameExpr(0) and - decl.getTagByKeyValue(key, tag) and + decl.hasTagKeyValue(key, tag) and isAlphanumericValidationKind(tag) ) } diff --git a/go/ql/src/experimental/frameworks/DecompressionBombsCustomizations.qll b/go/ql/src/experimental/frameworks/DecompressionBombsCustomizations.qll index 50fc7d06b56..063836b5513 100644 --- a/go/ql/src/experimental/frameworks/DecompressionBombsCustomizations.qll +++ b/go/ql/src/experimental/frameworks/DecompressionBombsCustomizations.qll @@ -511,7 +511,7 @@ module DecompressionBombs { } /** - * Provides decompression bomb sinks for packages that use some standard IO interfaces/methods for reading decompressed data + * A standard IO function for reading decompressed data. */ class GeneralReadIoSink extends Sink { GeneralReadIoSink() { diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 4a0baaa7836..d0c0874c987 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.4.9-dev +version: 1.5.3-dev groups: - go - queries diff --git a/go/ql/test/consistency/UnexpectedFrontendErrors.expected b/go/ql/test/consistency/UnexpectedFrontendErrors.expected deleted file mode 100644 index 4c318786b77..00000000000 --- a/go/ql/test/consistency/UnexpectedFrontendErrors.expected +++ /dev/null @@ -1 +0,0 @@ -| test.go:7:1:7:1 | expected declaration, found This | diff --git a/go/ql/test/consistency/dummy.expected b/go/ql/test/consistency/dummy.expected new file mode 100644 index 00000000000..86b15f71325 --- /dev/null +++ b/go/ql/test/consistency/dummy.expected @@ -0,0 +1 @@ +| This is a dummy query which is only needed so that the consistency tests will run | diff --git a/go/ql/test/consistency/dummy.ql b/go/ql/test/consistency/dummy.ql new file mode 100644 index 00000000000..64eedb5a201 --- /dev/null +++ b/go/ql/test/consistency/dummy.ql @@ -0,0 +1 @@ +select "This is a dummy query which is only needed so that the consistency tests will run" diff --git a/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.expected b/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.expected deleted file mode 100644 index 355c0a62b1b..00000000000 --- a/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.expected +++ /dev/null @@ -1,432 +0,0 @@ -edges -| CookieWithoutHttpOnly.go:11:7:14:2 | struct literal | CookieWithoutHttpOnly.go:15:20:15:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:11:7:14:2 | struct literal | CookieWithoutHttpOnly.go:15:21:15:21 | c | provenance | | -| CookieWithoutHttpOnly.go:12:10:12:18 | "session" | CookieWithoutHttpOnly.go:11:7:14:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:15:20:15:21 | &... [pointer] | CookieWithoutHttpOnly.go:15:20:15:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:15:21:15:21 | c | CookieWithoutHttpOnly.go:15:20:15:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:15:21:15:21 | c | CookieWithoutHttpOnly.go:15:20:15:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | CookieWithoutHttpOnly.go:24:20:24:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | CookieWithoutHttpOnly.go:24:20:24:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | CookieWithoutHttpOnly.go:24:21:24:21 | c | provenance | | -| CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | CookieWithoutHttpOnly.go:24:21:24:21 | c | provenance | | -| CookieWithoutHttpOnly.go:20:13:20:21 | "session" | CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:22:13:22:17 | false | CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:24:20:24:21 | &... [pointer] | CookieWithoutHttpOnly.go:24:20:24:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:24:20:24:21 | &... [pointer] | CookieWithoutHttpOnly.go:24:20:24:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:24:21:24:21 | c | CookieWithoutHttpOnly.go:24:20:24:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:24:21:24:21 | c | CookieWithoutHttpOnly.go:24:20:24:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:24:21:24:21 | c | CookieWithoutHttpOnly.go:24:20:24:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:24:21:24:21 | c | CookieWithoutHttpOnly.go:24:20:24:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | CookieWithoutHttpOnly.go:33:20:33:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | CookieWithoutHttpOnly.go:33:20:33:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | CookieWithoutHttpOnly.go:33:21:33:21 | c | provenance | | -| CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | CookieWithoutHttpOnly.go:33:21:33:21 | c | provenance | | -| CookieWithoutHttpOnly.go:29:13:29:21 | "session" | CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:31:13:31:16 | true | CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:33:20:33:21 | &... [pointer] | CookieWithoutHttpOnly.go:33:20:33:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:33:20:33:21 | &... [pointer] | CookieWithoutHttpOnly.go:33:20:33:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:33:21:33:21 | c | CookieWithoutHttpOnly.go:33:20:33:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:33:21:33:21 | c | CookieWithoutHttpOnly.go:33:20:33:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:33:21:33:21 | c | CookieWithoutHttpOnly.go:33:20:33:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:33:21:33:21 | c | CookieWithoutHttpOnly.go:33:20:33:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | CookieWithoutHttpOnly.go:42:20:42:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | CookieWithoutHttpOnly.go:42:20:42:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | CookieWithoutHttpOnly.go:42:21:42:21 | c | provenance | | -| CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | CookieWithoutHttpOnly.go:42:21:42:21 | c | provenance | | -| CookieWithoutHttpOnly.go:38:10:38:18 | "session" | CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:41:15:41:18 | true | CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:42:20:42:21 | &... [pointer] | CookieWithoutHttpOnly.go:42:20:42:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:42:20:42:21 | &... [pointer] | CookieWithoutHttpOnly.go:42:20:42:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:42:21:42:21 | c | CookieWithoutHttpOnly.go:42:20:42:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:42:21:42:21 | c | CookieWithoutHttpOnly.go:42:20:42:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:42:21:42:21 | c | CookieWithoutHttpOnly.go:42:20:42:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:42:21:42:21 | c | CookieWithoutHttpOnly.go:42:20:42:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | CookieWithoutHttpOnly.go:51:20:51:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | CookieWithoutHttpOnly.go:51:20:51:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | CookieWithoutHttpOnly.go:51:21:51:21 | c | provenance | | -| CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | CookieWithoutHttpOnly.go:51:21:51:21 | c | provenance | | -| CookieWithoutHttpOnly.go:47:10:47:18 | "session" | CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:50:15:50:19 | false | CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:51:20:51:21 | &... [pointer] | CookieWithoutHttpOnly.go:51:20:51:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:51:20:51:21 | &... [pointer] | CookieWithoutHttpOnly.go:51:20:51:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:51:21:51:21 | c | CookieWithoutHttpOnly.go:51:20:51:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:51:21:51:21 | c | CookieWithoutHttpOnly.go:51:20:51:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:51:21:51:21 | c | CookieWithoutHttpOnly.go:51:20:51:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:51:21:51:21 | c | CookieWithoutHttpOnly.go:51:20:51:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:55:2:55:4 | definition of val | CookieWithoutHttpOnly.go:59:13:59:15 | val | provenance | | -| CookieWithoutHttpOnly.go:55:9:55:13 | false | CookieWithoutHttpOnly.go:59:13:59:15 | val | provenance | | -| CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | CookieWithoutHttpOnly.go:61:20:61:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | CookieWithoutHttpOnly.go:61:20:61:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | CookieWithoutHttpOnly.go:61:21:61:21 | c | provenance | | -| CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | CookieWithoutHttpOnly.go:61:21:61:21 | c | provenance | | -| CookieWithoutHttpOnly.go:57:13:57:21 | "session" | CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:59:13:59:15 | val | CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:61:20:61:21 | &... [pointer] | CookieWithoutHttpOnly.go:61:20:61:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:61:20:61:21 | &... [pointer] | CookieWithoutHttpOnly.go:61:20:61:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:61:21:61:21 | c | CookieWithoutHttpOnly.go:61:20:61:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:61:21:61:21 | c | CookieWithoutHttpOnly.go:61:20:61:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:61:21:61:21 | c | CookieWithoutHttpOnly.go:61:20:61:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:61:21:61:21 | c | CookieWithoutHttpOnly.go:61:20:61:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:65:2:65:4 | definition of val | CookieWithoutHttpOnly.go:69:13:69:15 | val | provenance | | -| CookieWithoutHttpOnly.go:65:9:65:12 | true | CookieWithoutHttpOnly.go:69:13:69:15 | val | provenance | | -| CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | CookieWithoutHttpOnly.go:71:20:71:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | CookieWithoutHttpOnly.go:71:20:71:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | CookieWithoutHttpOnly.go:71:21:71:21 | c | provenance | | -| CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | CookieWithoutHttpOnly.go:71:21:71:21 | c | provenance | | -| CookieWithoutHttpOnly.go:67:13:67:21 | "session" | CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:69:13:69:15 | val | CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:71:20:71:21 | &... [pointer] | CookieWithoutHttpOnly.go:71:20:71:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:71:20:71:21 | &... [pointer] | CookieWithoutHttpOnly.go:71:20:71:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:71:21:71:21 | c | CookieWithoutHttpOnly.go:71:20:71:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:71:21:71:21 | c | CookieWithoutHttpOnly.go:71:20:71:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:71:21:71:21 | c | CookieWithoutHttpOnly.go:71:20:71:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:71:21:71:21 | c | CookieWithoutHttpOnly.go:71:20:71:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:75:2:75:4 | definition of val | CookieWithoutHttpOnly.go:80:15:80:17 | val | provenance | | -| CookieWithoutHttpOnly.go:75:9:75:12 | true | CookieWithoutHttpOnly.go:80:15:80:17 | val | provenance | | -| CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | CookieWithoutHttpOnly.go:81:20:81:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | CookieWithoutHttpOnly.go:81:20:81:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | CookieWithoutHttpOnly.go:81:21:81:21 | c | provenance | | -| CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | CookieWithoutHttpOnly.go:81:21:81:21 | c | provenance | | -| CookieWithoutHttpOnly.go:77:10:77:18 | "session" | CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:80:15:80:17 | val | CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:81:20:81:21 | &... [pointer] | CookieWithoutHttpOnly.go:81:20:81:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:81:20:81:21 | &... [pointer] | CookieWithoutHttpOnly.go:81:20:81:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:81:21:81:21 | c | CookieWithoutHttpOnly.go:81:20:81:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:81:21:81:21 | c | CookieWithoutHttpOnly.go:81:20:81:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:81:21:81:21 | c | CookieWithoutHttpOnly.go:81:20:81:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:81:21:81:21 | c | CookieWithoutHttpOnly.go:81:20:81:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:85:2:85:4 | definition of val | CookieWithoutHttpOnly.go:90:15:90:17 | val | provenance | | -| CookieWithoutHttpOnly.go:85:9:85:13 | false | CookieWithoutHttpOnly.go:90:15:90:17 | val | provenance | | -| CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | CookieWithoutHttpOnly.go:91:20:91:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | CookieWithoutHttpOnly.go:91:20:91:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | CookieWithoutHttpOnly.go:91:21:91:21 | c | provenance | | -| CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | CookieWithoutHttpOnly.go:91:21:91:21 | c | provenance | | -| CookieWithoutHttpOnly.go:87:10:87:18 | "session" | CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:90:15:90:17 | val | CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:91:20:91:21 | &... [pointer] | CookieWithoutHttpOnly.go:91:20:91:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:91:20:91:21 | &... [pointer] | CookieWithoutHttpOnly.go:91:20:91:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:91:21:91:21 | c | CookieWithoutHttpOnly.go:91:20:91:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:91:21:91:21 | c | CookieWithoutHttpOnly.go:91:20:91:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:91:21:91:21 | c | CookieWithoutHttpOnly.go:91:20:91:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:91:21:91:21 | c | CookieWithoutHttpOnly.go:91:20:91:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:95:7:98:2 | struct literal | CookieWithoutHttpOnly.go:100:20:100:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:95:7:98:2 | struct literal | CookieWithoutHttpOnly.go:100:21:100:21 | c | provenance | | -| CookieWithoutHttpOnly.go:99:15:99:19 | false | CookieWithoutHttpOnly.go:95:7:98:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:100:20:100:21 | &... [pointer] | CookieWithoutHttpOnly.go:100:20:100:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:100:21:100:21 | c | CookieWithoutHttpOnly.go:100:20:100:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:100:21:100:21 | c | CookieWithoutHttpOnly.go:100:20:100:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:104:10:104:18 | "session" | CookieWithoutHttpOnly.go:106:10:106:13 | name | provenance | | -| CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | CookieWithoutHttpOnly.go:110:20:110:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | CookieWithoutHttpOnly.go:110:20:110:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | CookieWithoutHttpOnly.go:110:21:110:21 | c | provenance | | -| CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | CookieWithoutHttpOnly.go:110:21:110:21 | c | provenance | | -| CookieWithoutHttpOnly.go:106:10:106:13 | name | CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:109:15:109:19 | false | CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:110:20:110:21 | &... [pointer] | CookieWithoutHttpOnly.go:110:20:110:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:110:20:110:21 | &... [pointer] | CookieWithoutHttpOnly.go:110:20:110:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:110:21:110:21 | c | CookieWithoutHttpOnly.go:110:20:110:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:110:21:110:21 | c | CookieWithoutHttpOnly.go:110:20:110:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:110:21:110:21 | c | CookieWithoutHttpOnly.go:110:20:110:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:110:21:110:21 | c | CookieWithoutHttpOnly.go:110:20:110:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:114:13:114:24 | "login_name" | CookieWithoutHttpOnly.go:116:10:116:16 | session | provenance | | -| CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | CookieWithoutHttpOnly.go:120:20:120:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | CookieWithoutHttpOnly.go:120:20:120:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | CookieWithoutHttpOnly.go:120:21:120:21 | c | provenance | | -| CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | CookieWithoutHttpOnly.go:120:21:120:21 | c | provenance | | -| CookieWithoutHttpOnly.go:116:10:116:16 | session | CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:119:15:119:19 | false | CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:120:20:120:21 | &... [pointer] | CookieWithoutHttpOnly.go:120:20:120:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:120:20:120:21 | &... [pointer] | CookieWithoutHttpOnly.go:120:20:120:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:120:21:120:21 | c | CookieWithoutHttpOnly.go:120:20:120:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:120:21:120:21 | c | CookieWithoutHttpOnly.go:120:20:120:21 | &... | provenance | | -| CookieWithoutHttpOnly.go:120:21:120:21 | c | CookieWithoutHttpOnly.go:120:20:120:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:120:21:120:21 | c | CookieWithoutHttpOnly.go:120:20:120:21 | &... [pointer] | provenance | | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:126:16:126:20 | store | provenance | | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:134:16:134:20 | store | provenance | | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:146:16:146:20 | store | provenance | | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:158:16:158:20 | store | provenance | | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:170:16:170:20 | store | provenance | | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:183:16:183:20 | store | provenance | | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:195:16:195:20 | store | provenance | | -| CookieWithoutHttpOnly.go:126:2:126:43 | ... := ...[0] | CookieWithoutHttpOnly.go:129:2:129:8 | session | provenance | | -| CookieWithoutHttpOnly.go:126:16:126:20 | store | CookieWithoutHttpOnly.go:126:2:126:43 | ... := ...[0] | provenance | Config | -| CookieWithoutHttpOnly.go:133:2:133:9 | definition of httpOnly | CookieWithoutHttpOnly.go:139:13:139:20 | httpOnly | provenance | | -| CookieWithoutHttpOnly.go:133:14:133:18 | false | CookieWithoutHttpOnly.go:139:13:139:20 | httpOnly | provenance | | -| CookieWithoutHttpOnly.go:134:2:134:43 | ... := ...[0] | CookieWithoutHttpOnly.go:142:2:142:8 | session | provenance | | -| CookieWithoutHttpOnly.go:134:16:134:20 | store | CookieWithoutHttpOnly.go:134:2:134:43 | ... := ...[0] | provenance | Config | -| CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | provenance | | -| CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | provenance | | -| CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] [pointer] | provenance | | -| CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] [pointer] | provenance | | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | CookieWithoutHttpOnly.go:142:2:142:8 | session | provenance | | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | CookieWithoutHttpOnly.go:142:2:142:8 | session | provenance | | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] [pointer] | CookieWithoutHttpOnly.go:142:2:142:8 | session | provenance | | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] [pointer] | CookieWithoutHttpOnly.go:142:2:142:8 | session | provenance | | -| CookieWithoutHttpOnly.go:137:20:140:2 | &... | CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:137:20:140:2 | &... | CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:137:20:140:2 | &... | CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:137:20:140:2 | &... | CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:137:21:140:2 | struct literal | CookieWithoutHttpOnly.go:137:20:140:2 | &... | provenance | | -| CookieWithoutHttpOnly.go:137:21:140:2 | struct literal | CookieWithoutHttpOnly.go:137:20:140:2 | &... | provenance | | -| CookieWithoutHttpOnly.go:139:13:139:20 | httpOnly | CookieWithoutHttpOnly.go:137:21:140:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:146:2:146:43 | ... := ...[0] | CookieWithoutHttpOnly.go:153:2:153:8 | session | provenance | | -| CookieWithoutHttpOnly.go:146:16:146:20 | store | CookieWithoutHttpOnly.go:146:2:146:43 | ... := ...[0] | provenance | Config | -| CookieWithoutHttpOnly.go:149:2:149:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:149:2:149:8 | session [postupdate] | provenance | | -| CookieWithoutHttpOnly.go:149:2:149:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:149:2:149:8 | session [postupdate] [pointer] | provenance | | -| CookieWithoutHttpOnly.go:149:2:149:8 | session [postupdate] | CookieWithoutHttpOnly.go:153:2:153:8 | session | provenance | | -| CookieWithoutHttpOnly.go:149:2:149:8 | session [postupdate] [pointer] | CookieWithoutHttpOnly.go:153:2:153:8 | session | provenance | | -| CookieWithoutHttpOnly.go:149:20:151:2 | &... | CookieWithoutHttpOnly.go:149:2:149:8 | implicit dereference [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:149:20:151:2 | &... | CookieWithoutHttpOnly.go:149:2:149:8 | session [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:149:21:151:2 | struct literal | CookieWithoutHttpOnly.go:149:20:151:2 | &... | provenance | | -| CookieWithoutHttpOnly.go:157:2:157:9 | definition of httpOnly | CookieWithoutHttpOnly.go:163:13:163:20 | httpOnly | provenance | | -| CookieWithoutHttpOnly.go:157:14:157:17 | true | CookieWithoutHttpOnly.go:163:13:163:20 | httpOnly | provenance | | -| CookieWithoutHttpOnly.go:158:2:158:43 | ... := ...[0] | CookieWithoutHttpOnly.go:166:2:166:8 | session | provenance | | -| CookieWithoutHttpOnly.go:158:16:158:20 | store | CookieWithoutHttpOnly.go:158:2:158:43 | ... := ...[0] | provenance | Config | -| CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | provenance | | -| CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | provenance | | -| CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] [pointer] | provenance | | -| CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] [pointer] | provenance | | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | CookieWithoutHttpOnly.go:166:2:166:8 | session | provenance | | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | CookieWithoutHttpOnly.go:166:2:166:8 | session | provenance | | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] [pointer] | CookieWithoutHttpOnly.go:166:2:166:8 | session | provenance | | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] [pointer] | CookieWithoutHttpOnly.go:166:2:166:8 | session | provenance | | -| CookieWithoutHttpOnly.go:161:20:164:2 | &... | CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:161:20:164:2 | &... | CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:161:20:164:2 | &... | CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:161:20:164:2 | &... | CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:161:21:164:2 | struct literal | CookieWithoutHttpOnly.go:161:20:164:2 | &... | provenance | | -| CookieWithoutHttpOnly.go:161:21:164:2 | struct literal | CookieWithoutHttpOnly.go:161:20:164:2 | &... | provenance | | -| CookieWithoutHttpOnly.go:163:13:163:20 | httpOnly | CookieWithoutHttpOnly.go:161:21:164:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:169:56:169:63 | argument corresponding to httpOnly | CookieWithoutHttpOnly.go:175:13:175:20 | httpOnly | provenance | | -| CookieWithoutHttpOnly.go:169:56:169:63 | definition of httpOnly | CookieWithoutHttpOnly.go:175:13:175:20 | httpOnly | provenance | | -| CookieWithoutHttpOnly.go:170:2:170:43 | ... := ...[0] | CookieWithoutHttpOnly.go:178:2:178:8 | session | provenance | | -| CookieWithoutHttpOnly.go:170:16:170:20 | store | CookieWithoutHttpOnly.go:170:2:170:43 | ... := ...[0] | provenance | Config | -| CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | provenance | | -| CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | provenance | | -| CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] [pointer] | provenance | | -| CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] [pointer] | provenance | | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | CookieWithoutHttpOnly.go:178:2:178:8 | session | provenance | | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | CookieWithoutHttpOnly.go:178:2:178:8 | session | provenance | | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] [pointer] | CookieWithoutHttpOnly.go:178:2:178:8 | session | provenance | | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] [pointer] | CookieWithoutHttpOnly.go:178:2:178:8 | session | provenance | | -| CookieWithoutHttpOnly.go:173:20:176:2 | &... | CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:173:20:176:2 | &... | CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:173:20:176:2 | &... | CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:173:20:176:2 | &... | CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | provenance | Config | -| CookieWithoutHttpOnly.go:173:21:176:2 | struct literal | CookieWithoutHttpOnly.go:173:20:176:2 | &... | provenance | | -| CookieWithoutHttpOnly.go:173:21:176:2 | struct literal | CookieWithoutHttpOnly.go:173:20:176:2 | &... | provenance | | -| CookieWithoutHttpOnly.go:175:13:175:20 | httpOnly | CookieWithoutHttpOnly.go:173:21:176:2 | struct literal | provenance | Config | -| CookieWithoutHttpOnly.go:183:2:183:43 | ... := ...[0] | CookieWithoutHttpOnly.go:191:19:191:25 | session | provenance | | -| CookieWithoutHttpOnly.go:183:16:183:20 | store | CookieWithoutHttpOnly.go:183:2:183:43 | ... := ...[0] | provenance | Config | -| CookieWithoutHttpOnly.go:195:2:195:43 | ... := ...[0] | CookieWithoutHttpOnly.go:202:19:202:25 | session | provenance | | -| CookieWithoutHttpOnly.go:195:16:195:20 | store | CookieWithoutHttpOnly.go:195:2:195:43 | ... := ...[0] | provenance | Config | -nodes -| CookieWithoutHttpOnly.go:11:7:14:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:12:10:12:18 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:15:20:15:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:15:20:15:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:15:21:15:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:19:7:23:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:20:13:20:21 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:22:13:22:17 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:24:20:24:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:24:20:24:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:24:20:24:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:24:20:24:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:24:21:24:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:24:21:24:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:28:7:32:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:29:13:29:21 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:31:13:31:16 | true | semmle.label | true | -| CookieWithoutHttpOnly.go:33:20:33:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:33:20:33:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:33:20:33:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:33:20:33:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:33:21:33:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:33:21:33:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:37:7:40:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:38:10:38:18 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:41:15:41:18 | true | semmle.label | true | -| CookieWithoutHttpOnly.go:42:20:42:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:42:20:42:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:42:20:42:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:42:20:42:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:42:21:42:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:42:21:42:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:46:7:49:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:47:10:47:18 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:50:15:50:19 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:51:20:51:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:51:20:51:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:51:20:51:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:51:20:51:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:51:21:51:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:51:21:51:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:55:2:55:4 | definition of val | semmle.label | definition of val | -| CookieWithoutHttpOnly.go:55:9:55:13 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:56:7:60:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:57:13:57:21 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:59:13:59:15 | val | semmle.label | val | -| CookieWithoutHttpOnly.go:61:20:61:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:61:20:61:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:61:20:61:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:61:20:61:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:61:21:61:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:61:21:61:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:65:2:65:4 | definition of val | semmle.label | definition of val | -| CookieWithoutHttpOnly.go:65:9:65:12 | true | semmle.label | true | -| CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:66:7:70:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:67:13:67:21 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:69:13:69:15 | val | semmle.label | val | -| CookieWithoutHttpOnly.go:71:20:71:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:71:20:71:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:71:20:71:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:71:20:71:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:71:21:71:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:71:21:71:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:75:2:75:4 | definition of val | semmle.label | definition of val | -| CookieWithoutHttpOnly.go:75:9:75:12 | true | semmle.label | true | -| CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:76:7:79:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:77:10:77:18 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:80:15:80:17 | val | semmle.label | val | -| CookieWithoutHttpOnly.go:81:20:81:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:81:20:81:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:81:20:81:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:81:20:81:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:81:21:81:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:81:21:81:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:85:2:85:4 | definition of val | semmle.label | definition of val | -| CookieWithoutHttpOnly.go:85:9:85:13 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:86:7:89:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:87:10:87:18 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:90:15:90:17 | val | semmle.label | val | -| CookieWithoutHttpOnly.go:91:20:91:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:91:20:91:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:91:20:91:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:91:20:91:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:91:21:91:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:91:21:91:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:95:7:98:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:99:15:99:19 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:100:20:100:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:100:20:100:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:100:21:100:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:104:10:104:18 | "session" | semmle.label | "session" | -| CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:105:7:108:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:106:10:106:13 | name | semmle.label | name | -| CookieWithoutHttpOnly.go:109:15:109:19 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:110:20:110:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:110:20:110:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:110:20:110:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:110:20:110:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:110:21:110:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:110:21:110:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:114:13:114:24 | "login_name" | semmle.label | "login_name" | -| CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:115:7:118:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:116:10:116:16 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:119:15:119:19 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:120:20:120:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:120:20:120:21 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:120:20:120:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:120:20:120:21 | &... [pointer] | semmle.label | &... [pointer] | -| CookieWithoutHttpOnly.go:120:21:120:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:120:21:120:21 | c | semmle.label | c | -| CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | semmle.label | call to NewCookieStore | -| CookieWithoutHttpOnly.go:126:2:126:43 | ... := ...[0] | semmle.label | ... := ...[0] | -| CookieWithoutHttpOnly.go:126:16:126:20 | store | semmle.label | store | -| CookieWithoutHttpOnly.go:129:2:129:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:133:2:133:9 | definition of httpOnly | semmle.label | definition of httpOnly | -| CookieWithoutHttpOnly.go:133:14:133:18 | false | semmle.label | false | -| CookieWithoutHttpOnly.go:134:2:134:43 | ... := ...[0] | semmle.label | ... := ...[0] | -| CookieWithoutHttpOnly.go:134:16:134:20 | store | semmle.label | store | -| CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| CookieWithoutHttpOnly.go:137:2:137:8 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | semmle.label | session [postupdate] | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] | semmle.label | session [postupdate] | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] [pointer] | semmle.label | session [postupdate] [pointer] | -| CookieWithoutHttpOnly.go:137:2:137:8 | session [postupdate] [pointer] | semmle.label | session [postupdate] [pointer] | -| CookieWithoutHttpOnly.go:137:20:140:2 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:137:20:140:2 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:137:21:140:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:137:21:140:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:139:13:139:20 | httpOnly | semmle.label | httpOnly | -| CookieWithoutHttpOnly.go:142:2:142:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:142:2:142:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:142:2:142:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:146:2:146:43 | ... := ...[0] | semmle.label | ... := ...[0] | -| CookieWithoutHttpOnly.go:146:16:146:20 | store | semmle.label | store | -| CookieWithoutHttpOnly.go:149:2:149:8 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| CookieWithoutHttpOnly.go:149:2:149:8 | session [postupdate] | semmle.label | session [postupdate] | -| CookieWithoutHttpOnly.go:149:2:149:8 | session [postupdate] [pointer] | semmle.label | session [postupdate] [pointer] | -| CookieWithoutHttpOnly.go:149:20:151:2 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:149:21:151:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:153:2:153:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:153:2:153:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:157:2:157:9 | definition of httpOnly | semmle.label | definition of httpOnly | -| CookieWithoutHttpOnly.go:157:14:157:17 | true | semmle.label | true | -| CookieWithoutHttpOnly.go:158:2:158:43 | ... := ...[0] | semmle.label | ... := ...[0] | -| CookieWithoutHttpOnly.go:158:16:158:20 | store | semmle.label | store | -| CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| CookieWithoutHttpOnly.go:161:2:161:8 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | semmle.label | session [postupdate] | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] | semmle.label | session [postupdate] | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] [pointer] | semmle.label | session [postupdate] [pointer] | -| CookieWithoutHttpOnly.go:161:2:161:8 | session [postupdate] [pointer] | semmle.label | session [postupdate] [pointer] | -| CookieWithoutHttpOnly.go:161:20:164:2 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:161:20:164:2 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:161:21:164:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:161:21:164:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:163:13:163:20 | httpOnly | semmle.label | httpOnly | -| CookieWithoutHttpOnly.go:166:2:166:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:166:2:166:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:166:2:166:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:169:56:169:63 | argument corresponding to httpOnly | semmle.label | argument corresponding to httpOnly | -| CookieWithoutHttpOnly.go:169:56:169:63 | definition of httpOnly | semmle.label | definition of httpOnly | -| CookieWithoutHttpOnly.go:170:2:170:43 | ... := ...[0] | semmle.label | ... := ...[0] | -| CookieWithoutHttpOnly.go:170:16:170:20 | store | semmle.label | store | -| CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| CookieWithoutHttpOnly.go:173:2:173:8 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | semmle.label | session [postupdate] | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] | semmle.label | session [postupdate] | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] [pointer] | semmle.label | session [postupdate] [pointer] | -| CookieWithoutHttpOnly.go:173:2:173:8 | session [postupdate] [pointer] | semmle.label | session [postupdate] [pointer] | -| CookieWithoutHttpOnly.go:173:20:176:2 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:173:20:176:2 | &... | semmle.label | &... | -| CookieWithoutHttpOnly.go:173:21:176:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:173:21:176:2 | struct literal | semmle.label | struct literal | -| CookieWithoutHttpOnly.go:175:13:175:20 | httpOnly | semmle.label | httpOnly | -| CookieWithoutHttpOnly.go:178:2:178:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:178:2:178:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:178:2:178:8 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:183:2:183:43 | ... := ...[0] | semmle.label | ... := ...[0] | -| CookieWithoutHttpOnly.go:183:16:183:20 | store | semmle.label | store | -| CookieWithoutHttpOnly.go:191:19:191:25 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:195:2:195:43 | ... := ...[0] | semmle.label | ... := ...[0] | -| CookieWithoutHttpOnly.go:195:16:195:20 | store | semmle.label | store | -| CookieWithoutHttpOnly.go:202:19:202:25 | session | semmle.label | session | -| CookieWithoutHttpOnly.go:214:66:214:70 | false | semmle.label | false | -subpaths -#select -| CookieWithoutHttpOnly.go:15:20:15:21 | &... | CookieWithoutHttpOnly.go:12:10:12:18 | "session" | CookieWithoutHttpOnly.go:15:20:15:21 | &... | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:24:20:24:21 | &... | CookieWithoutHttpOnly.go:22:13:22:17 | false | CookieWithoutHttpOnly.go:24:20:24:21 | &... | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:51:20:51:21 | &... | CookieWithoutHttpOnly.go:50:15:50:19 | false | CookieWithoutHttpOnly.go:51:20:51:21 | &... | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:61:20:61:21 | &... | CookieWithoutHttpOnly.go:55:9:55:13 | false | CookieWithoutHttpOnly.go:61:20:61:21 | &... | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:91:20:91:21 | &... | CookieWithoutHttpOnly.go:85:9:85:13 | false | CookieWithoutHttpOnly.go:91:20:91:21 | &... | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:110:20:110:21 | &... | CookieWithoutHttpOnly.go:109:15:109:19 | false | CookieWithoutHttpOnly.go:110:20:110:21 | &... | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:120:20:120:21 | &... | CookieWithoutHttpOnly.go:119:15:119:19 | false | CookieWithoutHttpOnly.go:120:20:120:21 | &... | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:129:2:129:8 | session | CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:129:2:129:8 | session | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:142:2:142:8 | session | CookieWithoutHttpOnly.go:133:14:133:18 | false | CookieWithoutHttpOnly.go:142:2:142:8 | session | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:153:2:153:8 | session | CookieWithoutHttpOnly.go:149:21:151:2 | struct literal | CookieWithoutHttpOnly.go:153:2:153:8 | session | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:191:19:191:25 | session | CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:191:19:191:25 | session | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:202:19:202:25 | session | CookieWithoutHttpOnly.go:123:13:123:49 | call to NewCookieStore | CookieWithoutHttpOnly.go:202:19:202:25 | session | Cookie attribute 'HttpOnly' is not set to true. | -| CookieWithoutHttpOnly.go:214:66:214:70 | false | CookieWithoutHttpOnly.go:214:66:214:70 | false | CookieWithoutHttpOnly.go:214:66:214:70 | false | Cookie attribute 'HttpOnly' is not set to true. | diff --git a/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.go b/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.go deleted file mode 100644 index 00be0bbf44a..00000000000 --- a/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.go +++ /dev/null @@ -1,219 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gorilla/sessions" -) - -func handler1(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "session", - Value: "secret", - } - http.SetCookie(w, &c) // BAD: HttpOnly set to false by default -} - -func handler2(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "session", - Value: "secret", - HttpOnly: false, - } - http.SetCookie(w, &c) // BAD: HttpOnly explicitly set to false -} - -func handler3(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "session", - Value: "secret", - HttpOnly: true, - } - http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true -} - -func handler4(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "session", - Value: "secret", - } - c.HttpOnly = true - http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true -} - -func handler5(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "session", - Value: "secret", - } - c.HttpOnly = false - http.SetCookie(w, &c) // BAD: HttpOnly explicitly set to false -} - -func handler6(w http.ResponseWriter, r *http.Request) { - val := false - c := http.Cookie{ - Name: "session", - Value: "secret", - HttpOnly: val, - } - http.SetCookie(w, &c) // BAD: HttpOnly explicitly set to false -} - -func handler7(w http.ResponseWriter, r *http.Request) { - val := true - c := http.Cookie{ - Name: "session", - Value: "secret", - HttpOnly: val, - } - http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true -} - -func handler8(w http.ResponseWriter, r *http.Request) { - val := true - c := http.Cookie{ - Name: "session", - Value: "secret", - } - c.HttpOnly = val - http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true -} - -func handler9(w http.ResponseWriter, r *http.Request) { - val := false - c := http.Cookie{ - Name: "session", - Value: "secret", - } - c.HttpOnly = val - http.SetCookie(w, &c) // BAD: HttpOnly explicitly set to false -} - -func handler10(w http.ResponseWriter, r *http.Request) { - c := http.Cookie{ - Name: "consent", - Value: "1", - } - c.HttpOnly = false - http.SetCookie(w, &c) // GOOD: Name is not auth related -} - -func handler11(w http.ResponseWriter, r *http.Request) { - name := "session" - c := http.Cookie{ - Name: name, - Value: "secret", - } - c.HttpOnly = false - http.SetCookie(w, &c) // BAD: auth related name -} - -func handler12(w http.ResponseWriter, r *http.Request) { - session := "login_name" - c := http.Cookie{ - Name: session, - Value: "secret", - } - c.HttpOnly = false - http.SetCookie(w, &c) // BAD: auth related name -} - -var store = sessions.NewCookieStore([]byte("aa")) - -func handler13(w http.ResponseWriter, r *http.Request) { - session, _ := store.Get(r, "session-name") - session.Values["foo"] = "secret" - - session.Save(r, w) // BAD: Default options are set (false) -} - -func handler14(w http.ResponseWriter, r *http.Request) { - httpOnly := false - session, _ := store.Get(r, "session-name") - session.Values["foo"] = "secret" - - session.Options = &sessions.Options{ - MaxAge: -1, - HttpOnly: httpOnly, - } - - session.Save(r, w) // BAD: Explicitly set to false -} - -func handler15(w http.ResponseWriter, r *http.Request) { - session, _ := store.Get(r, "session-name") - session.Values["foo"] = "secret" - - session.Options = &sessions.Options{ - MaxAge: -1, - } - - session.Save(r, w) // BAD: default (false) is used -} - -func handler16(w http.ResponseWriter, r *http.Request) { - httpOnly := true - session, _ := store.Get(r, "session-name") - session.Values["foo"] = "secret" - - session.Options = &sessions.Options{ - MaxAge: -1, - HttpOnly: httpOnly, - } - - session.Save(r, w) // GOOD: value is true -} - -func handler17(w http.ResponseWriter, r *http.Request, httpOnly bool) { - session, _ := store.Get(r, "session-name") - session.Values["foo"] = "secret" - - session.Options = &sessions.Options{ - MaxAge: -1, - HttpOnly: httpOnly, - } - - session.Save(r, w) // GOOD: value is unknown -} - -func handler18(w http.ResponseWriter, r *http.Request) { - httpOnly := false - session, _ := store.Get(r, "session-name") - session.Values["foo"] = "secret" - - session.Options = &sessions.Options{ - MaxAge: -1, - HttpOnly: httpOnly, - } - - store.Save(r, w, session) // BAD: Explicitly set to false -} - -func handler19(w http.ResponseWriter, r *http.Request) { - session, _ := store.Get(r, "session-name") - session.Values["foo"] = "secret" - - session.Options = &sessions.Options{ - MaxAge: -1, - } - - store.Save(r, w, session) // BAD: default (false) is used -} - -func main() { - - router := gin.Default() - - router.GET("/cookie", func(c *gin.Context) { - - _, err := c.Cookie("session") - - if err != nil { - c.SetCookie("session", "test", 3600, "/", "localhost", false, false) // BAD: httpOnly set to false - } - }) - - router.Run() -} diff --git a/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.qlref b/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.qlref deleted file mode 100644 index ca6a153038c..00000000000 --- a/go/ql/test/experimental/CWE-1004/CookieWithoutHttpOnly.qlref +++ /dev/null @@ -1 +0,0 @@ -experimental/CWE-1004/CookieWithoutHttpOnly.ql diff --git a/go/ql/test/experimental/CWE-1004/vendor/github.com/gorilla/sessions/stub.go b/go/ql/test/experimental/CWE-1004/vendor/github.com/gorilla/sessions/stub.go deleted file mode 100644 index 2ebc3858163..00000000000 --- a/go/ql/test/experimental/CWE-1004/vendor/github.com/gorilla/sessions/stub.go +++ /dev/null @@ -1,75 +0,0 @@ -// Code generated by depstubber. DO NOT EDIT. -// This is a simple stub for github.com/gorilla/sessions, strictly for use in testing. - -// See the LICENSE file for information about the licensing of the original library. -// Source: github.com/gorilla/sessions (exports: CookieStore; functions: NewCookieStore) - -// Package sessions is a stub of github.com/gorilla/sessions, generated by depstubber. -package sessions - -import ( - http "net/http" -) - -type CookieStore struct { - Codecs []interface{} - Options *Options -} - -func (_ *CookieStore) Get(_ *http.Request, _ string) (*Session, error) { - return nil, nil -} - -func (_ *CookieStore) MaxAge(_ int) {} - -func (_ *CookieStore) New(_ *http.Request, _ string) (*Session, error) { - return nil, nil -} - -func (_ *CookieStore) Save(_ *http.Request, _ http.ResponseWriter, _ *Session) error { - return nil -} - -func NewCookieStore(_ ...[]byte) *CookieStore { - return nil -} - -type Options struct { - Path string - Domain string - MaxAge int - Secure bool - HttpOnly bool - SameSite http.SameSite -} - -type Session struct { - ID string - Values map[interface{}]interface{} - Options *Options - IsNew bool -} - -func (_ *Session) AddFlash(_ interface{}, _ ...string) {} - -func (_ *Session) Flashes(_ ...string) []interface{} { - return nil -} - -func (_ *Session) Name() string { - return "" -} - -func (_ *Session) Save(_ *http.Request, _ http.ResponseWriter) error { - return nil -} - -func (_ *Session) Store() Store { - return nil -} - -type Store interface { - Get(_ *http.Request, _ string) (*Session, error) - New(_ *http.Request, _ string) (*Session, error) - Save(_ *http.Request, _ http.ResponseWriter, _ *Session) error -} diff --git a/go/ql/test/experimental/CWE-1004/vendor/modules.txt b/go/ql/test/experimental/CWE-1004/vendor/modules.txt deleted file mode 100644 index f38695b1ffc..00000000000 --- a/go/ql/test/experimental/CWE-1004/vendor/modules.txt +++ /dev/null @@ -1,6 +0,0 @@ -# github.com/gin-gonic/gin v1.7.1 -## explicit -github.com/gin-gonic/gin -# github.com/gorilla/sessions v1.2.1 -## explicit -github.com/gorilla/sessions diff --git a/go/ql/test/experimental/CWE-203/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-203/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..0bd77bfcaa2 --- /dev/null +++ b/go/ql/test/experimental/CWE-203/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,5 @@ +reverseRead +| timing.go:15:18:15:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| timing.go:28:18:28:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| timing.go:41:18:41:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| timing.go:53:18:53:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-287/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-287/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..c77e608378d --- /dev/null +++ b/go/ql/test/experimental/CWE-287/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,4 @@ +reverseRead +| ImproperLdapAuth.go:18:18:18:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ImproperLdapAuth.go:39:18:39:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ImproperLdapAuth.go:64:18:64:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-321-V2/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-321-V2/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..3a9dc028650 --- /dev/null +++ b/go/ql/test/experimental/CWE-321-V2/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| go-jose.v3.go:16:17:16:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| golang-jwt-v5.go:22:17:22:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-369/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-369/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..d2ae8651ea5 --- /dev/null +++ b/go/ql/test/experimental/CWE-369/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,10 @@ +reverseRead +| DivideByZero.go:10:12:10:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:17:12:17:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:24:12:24:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:31:12:31:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:38:12:38:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:45:12:45:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:54:12:54:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:63:12:63:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:72:12:72:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..455781c6b15 --- /dev/null +++ b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,36 @@ +reverseRead +| test.go:60:15:60:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:61:24:61:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:62:13:62:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:63:17:63:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:64:8:64:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:65:12:65:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:66:8:66:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:67:12:67:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:68:17:68:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:69:21:69:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:70:13:70:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:71:17:71:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:72:16:72:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:73:20:73:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:74:7:74:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:75:11:75:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:76:9:76:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:77:13:77:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:78:18:78:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:79:22:79:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:80:5:80:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:81:9:81:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:82:7:82:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:83:11:83:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:84:15:84:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:85:16:85:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:86:20:86:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:87:16:87:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:88:20:88:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:89:17:89:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:90:21:90:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:91:15:91:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:92:19:92:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:93:5:93:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:94:9:94:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-807/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-807/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..0b244f8f033 --- /dev/null +++ b/go/ql/test/experimental/CWE-807/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,13 @@ +reverseRead +| SensitiveConditionBypassBad.go:7:5:7:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:16:5:16:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:25:5:25:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:34:5:34:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:41:5:41:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:41:35:41:35 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:49:5:49:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:56:5:56:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:63:5:63:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:70:5:70:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:77:5:77:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:84:5:84:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-840/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-840/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..b2cb9694e61 --- /dev/null +++ b/go/ql/test/experimental/CWE-840/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,7 @@ +reverseRead +| ConditionalBypassBad.go:9:5:9:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ConditionalBypassGood.go:9:5:9:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:9:5:9:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:16:5:16:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:16:41:16:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| condition.go:23:5:23:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-918/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-918/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..082a5e7bd31 --- /dev/null +++ b/go/ql/test/experimental/CWE-918/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,8 @@ +reverseRead +| builtin.go:115:31:115:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| builtin.go:124:32:124:32 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| builtin.go:133:54:133:54 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| builtin.go:142:55:142:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| new-tests.go:62:31:62:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| new-tests.go:78:18:78:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| new-tests.go:81:37:81:39 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-942/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-942/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..736ff52258f --- /dev/null +++ b/go/ql/test/experimental/CWE-942/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,15 @@ +reverseRead +| CorsMisconfiguration.go:52:14:52:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:59:14:59:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:66:17:66:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:74:14:74:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:81:14:81:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:88:14:88:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:101:14:101:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:112:14:112:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:126:15:126:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:141:14:141:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:156:14:156:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:170:14:170:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:194:17:194:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:206:14:206:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/Unsafe/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/Unsafe/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..95ae768a95e --- /dev/null +++ b/go/ql/test/experimental/Unsafe/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,6 @@ +reverseRead +| WrongUsageOfUnsafe.go:34:40:34:47 | harmless | Origin of readStep is missing a PostUpdateNode. | +| WrongUsageOfUnsafe.go:55:40:55:47 | harmless | Origin of readStep is missing a PostUpdateNode. | +| WrongUsageOfUnsafe.go:77:43:77:50 | harmless | Origin of readStep is missing a PostUpdateNode. | +| WrongUsageOfUnsafe.go:111:47:111:54 | harmless | Origin of readStep is missing a PostUpdateNode. | +| WrongUsageOfUnsafe.go:211:47:211:54 | harmless | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/frameworks/CleverGo/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/frameworks/CleverGo/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..f2a42c6dbed --- /dev/null +++ b/go/ql/test/experimental/frameworks/CleverGo/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| RemoteSources.go:98:9:98:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/Types/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/Types/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..d0324c7c4eb --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/Types/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,5 @@ +reverseRead +| pkg1/tst.go:43:6:43:6 | t | Origin of readStep is missing a PostUpdateNode. | +| pkg1/tst.go:46:6:46:6 | t | Origin of readStep is missing a PostUpdateNode. | +| pkg1/tst.go:53:6:53:7 | t2 | Origin of readStep is missing a PostUpdateNode. | +| pkg1/tst.go:55:6:55:7 | t2 | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/concepts/HTTP/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/concepts/HTTP/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..ded5f21e3e6 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/concepts/HTTP/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,9 @@ +reverseRead +| main.go:49:2:49:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:50:2:50:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:58:2:58:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:63:49:63:49 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server.go:8:6:8:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server.go:9:6:9:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server.go:10:6:10:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server.go:13:6:13:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..cf59277a48b --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,6 @@ +reverseRead +| Builtin.go:7:2:7:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:13:2:13:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:22:2:22:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:32:2:32:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:39:2:39:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..44b43af6887 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,4 @@ +reverseRead +| test.go:90:10:90:15 | taint8 | Origin of readStep is missing a PostUpdateNode. | +| test.go:104:12:104:18 | taint10 | Origin of readStep is missing a PostUpdateNode. | +| test.go:150:10:150:14 | slice | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..44b43af6887 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,4 @@ +reverseRead +| test.go:90:10:90:15 | taint8 | Origin of readStep is missing a PostUpdateNode. | +| test.go:104:12:104:18 | taint10 | Origin of readStep is missing a PostUpdateNode. | +| test.go:150:10:150:14 | slice | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..3eb5ee54756 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| regressions.go:21:3:21:3 | x | Origin of readStep is missing a PostUpdateNode. | +| regressions.go:22:3:22:3 | y | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalVariableSideEffects/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalVariableSideEffects/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..c9202aa28e6 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalVariableSideEffects/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| globalVariable.go:17:7:17:17 | globalArray | Origin of readStep is missing a PostUpdateNode. | +| globalVariable.go:18:7:18:17 | globalSlice | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalVariableSideEffects/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/GlobalVariableSideEffects/Flows.ql index 171aee86824..e6ba4ce067b 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/GlobalVariableSideEffects/Flows.ql +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalVariableSideEffects/Flows.ql @@ -2,7 +2,6 @@ import go import utils.test.InlineFlowTest string getArgString(DataFlow::Node src, DataFlow::Node sink) { - exists(src) and result = "\"" + sink.toString() + " (from source " + src.(DataFlow::CallNode).getArgument(0).getExactValue() + ")\"" diff --git a/go/ql/test/library-tests/semmle/go/dataflow/PostUpdateNodes/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/PostUpdateNodes/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..a9ab5a81df3 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/PostUpdateNodes/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| test.go:23:12:23:12 | a | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..b435a5fa62d --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| main.go:97:2:97:8 | wrapper | Origin of readStep is missing a PostUpdateNode. | +| main.go:117:2:117:2 | p | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..b1b3608ee05 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| test.go:32:11:32:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Afero/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Afero/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..daba79d62f0 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Afero/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| test.go:19:14:19:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..42b10a988b5 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,16 @@ +reverseRead +| test.go:142:3:142:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:143:3:143:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:143:23:143:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:208:18:208:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:208:18:208:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:229:21:229:25 | files | Origin of readStep is missing a PostUpdateNode. | +| test.go:259:2:259:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:270:37:270:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:283:44:283:48 | files | Origin of readStep is missing a PostUpdateNode. | +| test.go:297:51:297:62 | genericFiles | Origin of readStep is missing a PostUpdateNode. | +| test.go:298:54:298:62 | untainted | Origin of readStep is missing a PostUpdateNode. | +| test.go:317:13:317:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:318:20:318:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:324:17:324:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:324:17:324:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..9f6ffe14c07 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| test.go:110:20:110:23 | objs | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Chi/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Chi/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..e87bbb9cdee --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Chi/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| test.go:13:12:13:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Echo/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Echo/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..1765ea13767 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Echo/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,4 @@ +reverseRead +| test.go:89:16:89:22 | cookies | Origin of readStep is missing a PostUpdateNode. | +| test.go:193:10:193:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:216:20:216:26 | cookies | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..b57f285e142 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,22 @@ +reverseRead +| fasthttp.go:75:28:75:35 | lbclient | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:102:7:102:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:162:3:162:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:163:3:163:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:164:3:164:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:165:15:165:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:166:15:166:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:167:15:167:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:168:15:168:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:170:3:170:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:172:3:172:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:173:3:173:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:174:3:174:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:175:3:175:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:183:3:183:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:184:3:184:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:185:16:185:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:194:3:194:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:195:3:195:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:196:3:196:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:197:3:197:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Gin/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Gin/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..d430ebd33f5 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Gin/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,5 @@ +reverseRead +| Gin.go:26:18:26:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Gin.go:26:28:26:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Gin.go:158:10:158:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Gin.go:162:13:162:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..0bbe91ae77e --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,14 @@ +reverseRead +| proto/Hello.pb.go:34:10:34:40 | file_proto_Hello_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:47:9:47:39 | file_proto_Hello_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:81:10:81:40 | file_proto_Hello_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:94:9:94:39 | file_proto_Hello_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:169:13:169:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:171:13:171:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:173:13:173:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:181:13:181:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:183:13:183:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:185:13:185:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.micro.go:55:9:55:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.micro.go:57:9:57:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.micro.go:86:9:86:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..b69ab06bee1 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,32 @@ +reverseRead +| protos/query/query.pb.go:58:9:58:34 | file_query_proto_enumTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:62:10:62:35 | file_query_proto_enumTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:88:10:88:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:101:9:101:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:156:10:156:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:169:9:169:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:204:10:204:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:217:9:217:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:318:13:318:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:320:13:320:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:322:13:322:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:330:13:330:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:332:13:332:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:334:13:334:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:342:13:342:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:344:13:344:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:346:13:346:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:74:24:74:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:85:24:85:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:98:13:98:24 | selection of Alerts | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:124:12:124:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:167:12:167:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:176:24:176:28 | query | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:94:12:94:21 | serialized | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:102:24:102:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:113:24:113:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:126:13:126:24 | selection of Alerts | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:162:12:162:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:186:12:186:21 | serialized | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:224:12:224:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:233:24:233:28 | query | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Revel/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Revel/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..0fd726cd886 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Revel/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,127 @@ +reverseRead +| EndToEnd.go:30:35:30:35 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:30:35:30:42 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:36:18:36:18 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:36:18:36:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:44:18:44:18 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:44:18:44:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:51:20:51:20 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:51:20:51:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:58:18:58:18 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:58:18:58:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:64:26:64:26 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:64:26:64:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:69:22:69:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:69:22:69:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:74:22:74:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:74:22:74:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:79:35:79:35 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:79:35:79:42 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:84:22:84:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:84:22:84:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:89:21:89:21 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:89:21:89:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:94:20:94:20 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:94:20:94:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:26:7:26:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:27:7:27:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:27:7:27:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:30:2:30:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:33:7:33:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:37:7:37:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:37:7:37:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:38:24:38:24 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:42:7:42:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:43:24:43:24 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:47:7:47:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:51:7:51:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:52:7:52:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:56:7:56:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:56:7:56:27 | index expression | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:60:7:60:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:60:7:60:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:63:2:63:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:70:22:70:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:75:7:75:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:76:7:76:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:77:7:77:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:77:7:77:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:78:7:78:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:79:7:79:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:80:7:80:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:82:13:82:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:85:13:85:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:88:13:88:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:89:7:89:28 | index expression | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:91:7:91:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:91:7:91:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:91:7:91:41 | index expression | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:93:28:93:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:96:15:96:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:99:7:99:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:101:7:101:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:103:15:103:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:109:7:109:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:111:7:111:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:116:2:116:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:116:2:116:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:120:2:120:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:120:2:120:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:125:13:125:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:125:13:125:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:128:14:128:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:128:14:128:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:133:13:133:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:34:2:34:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:47:2:47:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:56:2:56:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:57:2:57:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:59:16:59:16 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:61:5:61:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:62:3:62:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:68:2:68:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:79:5:79:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:81:5:81:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:83:4:83:4 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:89:2:89:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:95:10:95:10 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:44:3:44:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:51:2:51:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:143:26:143:26 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:144:2:144:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:146:2:146:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:148:5:148:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:149:3:149:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:153:2:153:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:166:19:166:19 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:168:5:168:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:168:33:168:33 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:169:3:169:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:174:5:174:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:175:3:175:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:176:4:176:10 | booking | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:184:2:184:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:36:44:36:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:40:49:40:49 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:52:2:52:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:52:2:52:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:53:2:53:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:53:2:53:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:54:2:54:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:54:2:54:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:33:13:33:19 | booking | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:34:13:34:19 | booking | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:35:13:35:19 | booking | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:36:13:36:19 | booking | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:49:9:49:9 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:53:14:53:14 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:53:38:53:38 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:67:3:67:3 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:68:3:68:3 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:69:3:69:3 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:73:39:73:39 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:73:47:73:47 | b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:81:13:81:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:82:14:82:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:83:17:83:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:84:18:84:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SystemCommandExecutors/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/SystemCommandExecutors/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..c7680b2b6ca --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/SystemCommandExecutors/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| SystemCommandExecutors.go:25:12:25:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..f07ffbe60cf --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| main.go:28:2:28:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:34:2:34:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..d4e53cf33a9 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,97 @@ +reverseRead +| rpc/notes/service.pb.go:36:10:36:46 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:49:9:49:45 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:97:10:97:46 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:110:9:110:45 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:142:10:142:46 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:155:9:155:45 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:182:10:182:46 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:195:9:195:45 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:297:13:297:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:299:13:299:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:301:13:301:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:309:13:309:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:311:13:311:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:313:13:313:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:321:13:321:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:323:13:323:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:325:13:325:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:333:13:333:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:335:13:335:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:337:13:337:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:82:40:82:49 | clientOpts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:118:37:118:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:118:47:118:52 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:124:24:124:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:128:34:128:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:164:37:164:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:164:47:164:52 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:170:24:170:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:174:34:174:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:221:40:221:49 | clientOpts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:257:33:257:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:257:43:257:48 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:263:24:263:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:267:34:267:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:303:33:303:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:303:43:303:48 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:309:24:309:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:313:34:313:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:350:45:350:54 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:360:29:360:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:389:38:389:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:397:58:397:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:402:47:402:49 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:404:48:404:50 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:405:58:405:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:409:95:409:97 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:410:58:410:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:422:48:422:50 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:423:58:423:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:429:12:429:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:440:53:440:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:441:43:441:45 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:449:36:449:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:455:23:455:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:477:13:477:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:494:41:494:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:507:34:507:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:524:24:524:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:526:24:526:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:532:36:532:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:538:25:538:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:558:13:558:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:575:41:575:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:588:34:588:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:603:24:603:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:605:24:605:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:609:12:609:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:620:53:620:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:621:43:621:45 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:629:36:629:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:635:23:635:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:657:13:657:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:674:41:674:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:687:34:687:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:704:24:704:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:706:24:706:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:712:36:712:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:718:25:718:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:738:13:738:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:755:41:755:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:768:34:768:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:783:24:783:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:785:24:785:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:969:8:969:13 | copied | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:984:2:984:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:985:2:985:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:986:2:986:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1032:15:1032:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1037:35:1037:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1116:66:1116:66 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1159:98:1159:98 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1227:21:1227:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1237:35:1237:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1278:11:1278:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1292:23:1292:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server/main.go:33:19:33:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..ace7b23eded --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| WebSocketReadWrite.go:27:9:27:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..e938aa2ca92 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,12 @@ +reverseRead +| test.go:12:12:12:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:17:24:17:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:20:36:20:42 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:23:33:23:39 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:24:22:24:26 | nodes | Origin of readStep is missing a PostUpdateNode. | +| test.go:26:45:26:51 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:27:22:27:27 | nodes2 | Origin of readStep is missing a PostUpdateNode. | +| test.go:31:33:31:39 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:39:49:39:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:43:31:43:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:48:32:48:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..fbede1f2120 --- /dev/null +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| testdata.go:206:7:206:7 | x | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegexp/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegexp/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..1861fe5d2b9 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegexp/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,5 @@ +reverseRead +| IncompleteHostnameRegexp.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| IncompleteHostnameRegexpGood2.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| IncompleteHostnameRegexpGood.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:18:57:18:57 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..a9e0caae769 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| MissingRegexpAnchor.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| MissingRegexpAnchorGood.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..69de1fc20fd --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| TaintedPath.go:15:18:15:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| TaintedPath.go:84:28:84:32 | files | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..51645e40047 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,11 @@ +reverseRead +| ArgumentInjection.go:9:10:9:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection2.go:13:15:13:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection2.go:21:15:21:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection2.go:41:15:41:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection.go:9:13:9:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| GitSubcommands.go:11:13:11:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| GitSubcommands.go:22:13:22:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| GitSubcommands.go:33:13:33:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SanitizingDoubleDash.go:9:13:9:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SanitizingDoubleDash.go:92:13:92:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-079/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-079/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..0b22e7c6251 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-079/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,21 @@ +reverseRead +| HtmlTemplateEscapingBypassXss.go:99:9:99:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ReflectedXss.go:11:15:11:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ReflectedXssGood.go:15:15:15:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:11:11:11:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:25:11:25:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:39:11:39:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:49:11:49:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:61:11:61:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:71:11:71:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:86:11:86:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:98:11:98:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:111:11:111:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| reflectedxsstest.go:15:13:15:13 | r | Origin of readStep is missing a PostUpdateNode. | +| reflectedxsstest.go:21:13:21:13 | r | Origin of readStep is missing a PostUpdateNode. | +| reflectedxsstest.go:51:14:51:14 | r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:14:15:14:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:33:15:33:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:48:14:48:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:66:15:66:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| websocketXss.go:26:9:26:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..bb9cf32663a --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,23 @@ +reverseRead +| SqlInjection.go:11:3:11:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SqlInjection.go:11:3:11:17 | call to Query | Origin of readStep is missing a PostUpdateNode. | +| SqlInjectionGood.go:10:14:10:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SqlInjectionGood.go:10:14:10:28 | call to Query | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:17:25:17:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:21:3:21:21 | RequestDataFromJson | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:27:26:27:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:31:3:31:22 | RequestDataFromJson2 | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:37:24:37:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:40:3:40:22 | RequestDataFromJson3 | Origin of readStep is missing a PostUpdateNode. | +| main.go:15:63:15:63 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:15:63:15:75 | call to Query | Origin of readStep is missing a PostUpdateNode. | +| main.go:16:63:16:63 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:30:13:30:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:34:3:34:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:40:25:40:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:43:3:43:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:49:28:49:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:52:3:52:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:58:28:58:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:61:4:61:15 | star expression | Origin of readStep is missing a PostUpdateNode. | +| main.go:68:18:68:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.expected b/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.expected new file mode 100644 index 00000000000..93988411db2 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.expected @@ -0,0 +1,139 @@ +#select +| CookieWithoutHttpOnly.go:14:2:14:22 | call to SetCookie | CookieWithoutHttpOnly.go:11:10:11:18 | "session" | CookieWithoutHttpOnly.go:14:20:14:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:11:10:11:18 | "session" | session | +| CookieWithoutHttpOnly.go:23:2:23:22 | call to SetCookie | CookieWithoutHttpOnly.go:19:13:19:21 | "session" | CookieWithoutHttpOnly.go:23:20:23:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:19:13:19:21 | "session" | session | +| CookieWithoutHttpOnly.go:50:2:50:22 | call to SetCookie | CookieWithoutHttpOnly.go:46:10:46:18 | "session" | CookieWithoutHttpOnly.go:50:20:50:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:46:10:46:18 | "session" | session | +| CookieWithoutHttpOnly.go:60:2:60:22 | call to SetCookie | CookieWithoutHttpOnly.go:56:13:56:21 | "session" | CookieWithoutHttpOnly.go:60:20:60:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:56:13:56:21 | "session" | session | +| CookieWithoutHttpOnly.go:90:2:90:22 | call to SetCookie | CookieWithoutHttpOnly.go:86:10:86:18 | "session" | CookieWithoutHttpOnly.go:90:20:90:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:86:10:86:18 | "session" | session | +| CookieWithoutHttpOnly.go:109:2:109:22 | call to SetCookie | CookieWithoutHttpOnly.go:103:10:103:18 | "session" | CookieWithoutHttpOnly.go:109:20:109:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:103:10:103:18 | "session" | session | +| CookieWithoutHttpOnly.go:119:2:119:22 | call to SetCookie | CookieWithoutHttpOnly.go:113:13:113:24 | "login_name" | CookieWithoutHttpOnly.go:119:20:119:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:113:13:113:24 | "login_name" | login_name | +| CookieWithoutHttpOnly.go:119:2:119:22 | call to SetCookie | CookieWithoutHttpOnly.go:115:10:115:16 | session | CookieWithoutHttpOnly.go:119:20:119:21 | &... | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:115:10:115:16 | session | session | +| CookieWithoutHttpOnly.go:131:4:131:71 | call to SetCookie | CookieWithoutHttpOnly.go:131:16:131:24 | "session" | CookieWithoutHttpOnly.go:131:16:131:24 | "session" | Sensitive cookie $@ does not set HttpOnly attribute to true. | CookieWithoutHttpOnly.go:131:16:131:24 | "session" | session | +edges +| CookieWithoutHttpOnly.go:10:7:13:2 | struct literal | CookieWithoutHttpOnly.go:14:20:14:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:10:7:13:2 | struct literal | CookieWithoutHttpOnly.go:14:21:14:21 | c | provenance | | +| CookieWithoutHttpOnly.go:11:10:11:18 | "session" | CookieWithoutHttpOnly.go:10:7:13:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:14:20:14:21 | &... [pointer] | CookieWithoutHttpOnly.go:14:20:14:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:14:21:14:21 | c | CookieWithoutHttpOnly.go:14:20:14:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:14:21:14:21 | c | CookieWithoutHttpOnly.go:14:20:14:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:18:7:22:2 | struct literal | CookieWithoutHttpOnly.go:23:20:23:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:18:7:22:2 | struct literal | CookieWithoutHttpOnly.go:23:21:23:21 | c | provenance | | +| CookieWithoutHttpOnly.go:19:13:19:21 | "session" | CookieWithoutHttpOnly.go:18:7:22:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:23:20:23:21 | &... [pointer] | CookieWithoutHttpOnly.go:23:20:23:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:23:21:23:21 | c | CookieWithoutHttpOnly.go:23:20:23:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:23:21:23:21 | c | CookieWithoutHttpOnly.go:23:20:23:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:27:7:31:2 | struct literal | CookieWithoutHttpOnly.go:32:20:32:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:27:7:31:2 | struct literal | CookieWithoutHttpOnly.go:32:21:32:21 | c | provenance | | +| CookieWithoutHttpOnly.go:28:13:28:21 | "session" | CookieWithoutHttpOnly.go:27:7:31:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:32:20:32:21 | &... [pointer] | CookieWithoutHttpOnly.go:32:20:32:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:32:21:32:21 | c | CookieWithoutHttpOnly.go:32:20:32:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:32:21:32:21 | c | CookieWithoutHttpOnly.go:32:20:32:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:36:7:39:2 | struct literal | CookieWithoutHttpOnly.go:41:20:41:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:36:7:39:2 | struct literal | CookieWithoutHttpOnly.go:41:21:41:21 | c | provenance | | +| CookieWithoutHttpOnly.go:37:10:37:18 | "session" | CookieWithoutHttpOnly.go:36:7:39:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:41:20:41:21 | &... [pointer] | CookieWithoutHttpOnly.go:41:20:41:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:41:21:41:21 | c | CookieWithoutHttpOnly.go:41:20:41:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:41:21:41:21 | c | CookieWithoutHttpOnly.go:41:20:41:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:45:7:48:2 | struct literal | CookieWithoutHttpOnly.go:50:20:50:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:45:7:48:2 | struct literal | CookieWithoutHttpOnly.go:50:21:50:21 | c | provenance | | +| CookieWithoutHttpOnly.go:46:10:46:18 | "session" | CookieWithoutHttpOnly.go:45:7:48:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:50:20:50:21 | &... [pointer] | CookieWithoutHttpOnly.go:50:20:50:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:50:21:50:21 | c | CookieWithoutHttpOnly.go:50:20:50:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:50:21:50:21 | c | CookieWithoutHttpOnly.go:50:20:50:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:55:7:59:2 | struct literal | CookieWithoutHttpOnly.go:60:20:60:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:55:7:59:2 | struct literal | CookieWithoutHttpOnly.go:60:21:60:21 | c | provenance | | +| CookieWithoutHttpOnly.go:56:13:56:21 | "session" | CookieWithoutHttpOnly.go:55:7:59:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:60:20:60:21 | &... [pointer] | CookieWithoutHttpOnly.go:60:20:60:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:60:21:60:21 | c | CookieWithoutHttpOnly.go:60:20:60:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:60:21:60:21 | c | CookieWithoutHttpOnly.go:60:20:60:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:65:7:69:2 | struct literal | CookieWithoutHttpOnly.go:70:20:70:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:65:7:69:2 | struct literal | CookieWithoutHttpOnly.go:70:21:70:21 | c | provenance | | +| CookieWithoutHttpOnly.go:66:13:66:21 | "session" | CookieWithoutHttpOnly.go:65:7:69:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:70:20:70:21 | &... [pointer] | CookieWithoutHttpOnly.go:70:20:70:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:70:21:70:21 | c | CookieWithoutHttpOnly.go:70:20:70:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:70:21:70:21 | c | CookieWithoutHttpOnly.go:70:20:70:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:75:7:78:2 | struct literal | CookieWithoutHttpOnly.go:80:20:80:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:75:7:78:2 | struct literal | CookieWithoutHttpOnly.go:80:21:80:21 | c | provenance | | +| CookieWithoutHttpOnly.go:76:10:76:18 | "session" | CookieWithoutHttpOnly.go:75:7:78:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:80:20:80:21 | &... [pointer] | CookieWithoutHttpOnly.go:80:20:80:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:80:21:80:21 | c | CookieWithoutHttpOnly.go:80:20:80:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:80:21:80:21 | c | CookieWithoutHttpOnly.go:80:20:80:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:85:7:88:2 | struct literal | CookieWithoutHttpOnly.go:90:20:90:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:85:7:88:2 | struct literal | CookieWithoutHttpOnly.go:90:21:90:21 | c | provenance | | +| CookieWithoutHttpOnly.go:86:10:86:18 | "session" | CookieWithoutHttpOnly.go:85:7:88:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:90:20:90:21 | &... [pointer] | CookieWithoutHttpOnly.go:90:20:90:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:90:21:90:21 | c | CookieWithoutHttpOnly.go:90:20:90:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:90:21:90:21 | c | CookieWithoutHttpOnly.go:90:20:90:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:103:10:103:18 | "session" | CookieWithoutHttpOnly.go:105:10:105:13 | name | provenance | | +| CookieWithoutHttpOnly.go:104:7:107:2 | struct literal | CookieWithoutHttpOnly.go:109:20:109:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:104:7:107:2 | struct literal | CookieWithoutHttpOnly.go:109:21:109:21 | c | provenance | | +| CookieWithoutHttpOnly.go:105:10:105:13 | name | CookieWithoutHttpOnly.go:104:7:107:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:109:20:109:21 | &... [pointer] | CookieWithoutHttpOnly.go:109:20:109:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:109:21:109:21 | c | CookieWithoutHttpOnly.go:109:20:109:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:109:21:109:21 | c | CookieWithoutHttpOnly.go:109:20:109:21 | &... [pointer] | provenance | | +| CookieWithoutHttpOnly.go:113:13:113:24 | "login_name" | CookieWithoutHttpOnly.go:115:10:115:16 | session | provenance | | +| CookieWithoutHttpOnly.go:114:7:117:2 | struct literal | CookieWithoutHttpOnly.go:119:20:119:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:114:7:117:2 | struct literal | CookieWithoutHttpOnly.go:119:21:119:21 | c | provenance | | +| CookieWithoutHttpOnly.go:115:10:115:16 | session | CookieWithoutHttpOnly.go:114:7:117:2 | struct literal | provenance | Config | +| CookieWithoutHttpOnly.go:119:20:119:21 | &... [pointer] | CookieWithoutHttpOnly.go:119:20:119:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:119:21:119:21 | c | CookieWithoutHttpOnly.go:119:20:119:21 | &... | provenance | | +| CookieWithoutHttpOnly.go:119:21:119:21 | c | CookieWithoutHttpOnly.go:119:20:119:21 | &... [pointer] | provenance | | +nodes +| CookieWithoutHttpOnly.go:10:7:13:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:11:10:11:18 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:14:20:14:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:14:20:14:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:14:21:14:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:18:7:22:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:19:13:19:21 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:23:20:23:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:23:20:23:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:23:21:23:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:27:7:31:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:28:13:28:21 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:32:20:32:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:32:20:32:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:32:21:32:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:36:7:39:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:37:10:37:18 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:41:20:41:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:41:20:41:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:41:21:41:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:45:7:48:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:46:10:46:18 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:50:20:50:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:50:20:50:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:50:21:50:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:55:7:59:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:56:13:56:21 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:60:20:60:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:60:20:60:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:60:21:60:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:65:7:69:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:66:13:66:21 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:70:20:70:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:70:20:70:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:70:21:70:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:75:7:78:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:76:10:76:18 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:80:20:80:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:80:20:80:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:80:21:80:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:85:7:88:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:86:10:86:18 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:90:20:90:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:90:20:90:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:90:21:90:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:103:10:103:18 | "session" | semmle.label | "session" | +| CookieWithoutHttpOnly.go:104:7:107:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:105:10:105:13 | name | semmle.label | name | +| CookieWithoutHttpOnly.go:109:20:109:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:109:20:109:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:109:21:109:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:113:13:113:24 | "login_name" | semmle.label | "login_name" | +| CookieWithoutHttpOnly.go:114:7:117:2 | struct literal | semmle.label | struct literal | +| CookieWithoutHttpOnly.go:115:10:115:16 | session | semmle.label | session | +| CookieWithoutHttpOnly.go:119:20:119:21 | &... | semmle.label | &... | +| CookieWithoutHttpOnly.go:119:20:119:21 | &... [pointer] | semmle.label | &... [pointer] | +| CookieWithoutHttpOnly.go:119:21:119:21 | c | semmle.label | c | +| CookieWithoutHttpOnly.go:131:16:131:24 | "session" | semmle.label | "session" | +subpaths diff --git a/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.go b/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.go new file mode 100644 index 00000000000..6a7e6ffbfe8 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.go @@ -0,0 +1,136 @@ +package main + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func handler1(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + } + http.SetCookie(w, &c) // $ Alert // BAD: HttpOnly set to false by default +} + +func handler2(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + HttpOnly: false, + } + http.SetCookie(w, &c) // $ Alert // BAD: HttpOnly explicitly set to false +} + +func handler3(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + HttpOnly: true, + } + http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true +} + +func handler4(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + } + c.HttpOnly = true + http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true +} + +func handler5(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + } + c.HttpOnly = false + http.SetCookie(w, &c) // $ Alert // BAD: HttpOnly explicitly set to false +} + +func handler6(w http.ResponseWriter, r *http.Request) { + val := false + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + HttpOnly: val, + } + http.SetCookie(w, &c) // $ Alert // BAD: HttpOnly explicitly set to false +} + +func handler7(w http.ResponseWriter, r *http.Request) { + val := true + c := http.Cookie{ + Name: "session", + Value: "secret", + HttpOnly: val, + } + http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true +} + +func handler8(w http.ResponseWriter, r *http.Request) { + val := true + c := http.Cookie{ + Name: "session", + Value: "secret", + } + c.HttpOnly = val + http.SetCookie(w, &c) // GOOD: HttpOnly explicitly set to true +} + +func handler9(w http.ResponseWriter, r *http.Request) { + val := false + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + } + c.HttpOnly = val + http.SetCookie(w, &c) // $ Alert //BAD: HttpOnly explicitly set to false +} + +func handler10(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "consent", + Value: "1", + } + c.HttpOnly = false + http.SetCookie(w, &c) // GOOD: Name is not auth related +} + +func handler11(w http.ResponseWriter, r *http.Request) { + name := "session" // $ Source + c := http.Cookie{ + Name: name, + Value: "secret", + } + c.HttpOnly = false + http.SetCookie(w, &c) // $ Alert // BAD: auth related name +} + +func handler12(w http.ResponseWriter, r *http.Request) { + session := "login_name" // $ Source + c := http.Cookie{ + Name: session, // $ Source + Value: "secret", + } + c.HttpOnly = false + http.SetCookie(w, &c) // $ Alert // BAD: auth related name +} + +func main() { + + router := gin.Default() + + router.GET("/cookie", func(c *gin.Context) { + + _, err := c.Cookie("session") + + if err != nil { + c.SetCookie("session", "test", 3600, "/", "localhost", false, false) // $ Alert // BAD: httpOnly set to false + } + }) + + router.Run() +} diff --git a/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.qlref b/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.qlref new file mode 100644 index 00000000000..399174134bb --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-1004/CookieWithoutHttpOnly.qlref @@ -0,0 +1,2 @@ +query: Security/CWE-1004/CookieWithoutHttpOnly.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/go/ql/test/experimental/CWE-1004/go.mod b/go/ql/test/query-tests/Security/CWE-1004/go.mod similarity index 68% rename from go/ql/test/experimental/CWE-1004/go.mod rename to go/ql/test/query-tests/Security/CWE-1004/go.mod index 5ab32129a9b..e0e296499fc 100644 --- a/go/ql/test/experimental/CWE-1004/go.mod +++ b/go/ql/test/query-tests/Security/CWE-1004/go.mod @@ -4,5 +4,4 @@ go 1.14 require ( github.com/gin-gonic/gin v1.7.1 - github.com/gorilla/sessions v1.2.1 ) diff --git a/go/ql/test/experimental/CWE-1004/vendor/github.com/gin-gonic/gin/LICENSE b/go/ql/test/query-tests/Security/CWE-1004/vendor/github.com/gin-gonic/gin/LICENSE similarity index 100% rename from go/ql/test/experimental/CWE-1004/vendor/github.com/gin-gonic/gin/LICENSE rename to go/ql/test/query-tests/Security/CWE-1004/vendor/github.com/gin-gonic/gin/LICENSE diff --git a/go/ql/test/experimental/CWE-1004/vendor/github.com/gin-gonic/gin/binding/stub.go b/go/ql/test/query-tests/Security/CWE-1004/vendor/github.com/gin-gonic/gin/binding/stub.go similarity index 100% rename from go/ql/test/experimental/CWE-1004/vendor/github.com/gin-gonic/gin/binding/stub.go rename to go/ql/test/query-tests/Security/CWE-1004/vendor/github.com/gin-gonic/gin/binding/stub.go diff --git a/go/ql/test/experimental/CWE-1004/vendor/github.com/gin-gonic/gin/stub.go b/go/ql/test/query-tests/Security/CWE-1004/vendor/github.com/gin-gonic/gin/stub.go similarity index 100% rename from go/ql/test/experimental/CWE-1004/vendor/github.com/gin-gonic/gin/stub.go rename to go/ql/test/query-tests/Security/CWE-1004/vendor/github.com/gin-gonic/gin/stub.go diff --git a/go/ql/test/query-tests/Security/CWE-1004/vendor/modules.txt b/go/ql/test/query-tests/Security/CWE-1004/vendor/modules.txt new file mode 100644 index 00000000000..e80eedb5cae --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-1004/vendor/modules.txt @@ -0,0 +1,3 @@ +# github.com/gin-gonic/gin v1.7.1 +## explicit +github.com/gin-gonic/gin diff --git a/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..2f4d9e320f8 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,11 @@ +reverseRead +| LogInjection.go:32:14:32:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:33:14:33:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:34:18:34:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:35:14:35:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:447:14:447:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:455:14:455:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:463:14:463:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:498:14:498:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:499:14:499:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:724:12:724:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-190/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-190/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..26d6a7eec8e --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-190/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| array_vs_contents.go:16:25:16:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| array_vs_contents.go:33:25:33:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-312/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-312/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..9161b6f3eb9 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-312/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,31 @@ +reverseRead +| CleartextLogging.go:11:11:11:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CleartextLogging.go:12:9:12:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CleartextLoggingGood.go:12:11:12:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CleartextLoggingGood.go:13:9:13:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CleartextLoggingGood.go:25:14:25:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| klog.go:27:13:27:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| klog.go:28:13:28:20 | selection of Header | Origin of readStep is missing a PostUpdateNode. | +| klog.go:29:13:29:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:58:9:58:34 | file_query_proto_enumTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:62:10:62:35 | file_query_proto_enumTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:88:10:88:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:101:9:101:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:156:10:156:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:169:9:169:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:204:10:204:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:217:9:217:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:318:13:318:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:320:13:320:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:322:13:322:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:330:13:330:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:332:13:332:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:334:13:334:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:342:13:342:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:344:13:344:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:346:13:346:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server1.go:11:11:11:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server1.go:13:11:13:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server1.go:14:11:14:14 | vals | Origin of readStep is missing a PostUpdateNode. | +| server1.go:17:41:17:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server1.go:21:46:21:46 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected b/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected new file mode 100644 index 00000000000..00eb67fea0b --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected @@ -0,0 +1,29 @@ +| encryption.go:30:2:30:36 | call to Encrypt | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:34:2:34:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:38:2:38:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:42:2:42:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:46:2:46:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:50:2:50:47 | call to CryptBlocks | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:54:2:54:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:56:22:56:91 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:59:21:59:68 | &... [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:59:22:59:68 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:59:22:59:68 | struct literal [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:60:10:60:24 | ctrStreamWriter [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:65:2:65:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:69:2:69:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | +| encryption.go:76:2:76:32 | call to Encrypt | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:80:2:80:38 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:84:2:84:38 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:88:2:88:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:92:2:92:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:96:2:96:43 | call to CryptBlocks | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:100:2:100:41 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:102:22:102:87 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:105:21:105:68 | &... [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:105:22:105:68 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:105:22:105:68 | struct literal [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:106:10:106:24 | ctrStreamWriter [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:111:2:111:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:115:2:115:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:166:2:166:33 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:166:2:166:33 | call to XORKeyStream | The cryptographic algorithm RC4 | diff --git a/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.qlref b/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.qlref new file mode 100644 index 00000000000..a618df1ed20 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.qlref @@ -0,0 +1,4 @@ +query: Security/CWE-327/BrokenCryptoAlgorithm.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/go/ql/test/query-tests/Security/CWE-327/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-327/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..95bea8fef59 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,4 @@ +reverseRead +| UnsafeTLS.go:329:32:329:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UnsafeTLS.go:336:33:336:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UnsafeTLS.go:353:40:353:45 | suites | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-327/Crypto.go b/go/ql/test/query-tests/Security/CWE-327/Crypto.go deleted file mode 100644 index 75229b020a8..00000000000 --- a/go/ql/test/query-tests/Security/CWE-327/Crypto.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "crypto/aes" - "crypto/des" - "crypto/md5" - "crypto/rc4" - "crypto/sha1" - "crypto/sha256" -) - -func crypto() { - public := []byte("hello") - - password := []byte("123456") - buf := password // testing dataflow by passing into different variable - - // BAD, des is a weak crypto algorithm and password is sensitive data - des.NewTripleDESCipher(buf) - - // BAD, md5 is a weak crypto algorithm and password is sensitive data - md5.Sum(buf) - - // BAD, rc4 is a weak crypto algorithm and password is sensitive data - rc4.NewCipher(buf) - - // BAD, sha1 is a weak crypto algorithm and password is sensitive data - sha1.Sum(buf) - - // GOOD, password is sensitive data but aes is a strong crypto algorithm - aes.NewCipher(buf) - - // GOOD, password is sensitive data but sha256 is a strong crypto algorithm - sha256.Sum256(buf) - - // GOOD, des is a weak crypto algorithm but public is not sensitive data - des.NewTripleDESCipher(public) - - // GOOD, md5 is a weak crypto algorithm but public is not sensitive data - md5.Sum(public) - - // GOOD, rc4 is a weak crypto algorithm but public is not sensitive data - rc4.NewCipher(public) - - // GOOD, sha1 is a weak crypto algorithm but public is not sensitive data - sha1.Sum(public) - - // GOOD, aes is a strong crypto algorithm and public is not sensitive data - aes.NewCipher(public) - - // GOOD, sha256 is a strong crypto algorithm and public is not sensitive data - sha256.Sum256(public) -} diff --git a/go/ql/test/query-tests/Security/CWE-327/CryptoAlgorithm.expected b/go/ql/test/query-tests/Security/CWE-327/CryptoAlgorithm.expected new file mode 100644 index 00000000000..55e9aed2e93 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/CryptoAlgorithm.expected @@ -0,0 +1,2 @@ +testFailures +invalidModelRow diff --git a/go/ql/test/query-tests/Security/CWE-327/CryptoAlgorithm.ql b/go/ql/test/query-tests/Security/CWE-327/CryptoAlgorithm.ql new file mode 100644 index 00000000000..e3b7147be3a --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/CryptoAlgorithm.ql @@ -0,0 +1,39 @@ +import go +import ModelValidation +import utils.test.InlineExpectationsTest + +module Test implements TestSig { + string getARelevantTag() { result = "CryptographicOperation" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "CryptographicOperation" and + exists( + CryptographicOperation::Range ho, string algorithm, string initialization, string blockMode + | + algorithm = ho.getAlgorithm().toString() + "." and + ( + blockMode = " blockMode: " + ho.getBlockMode().toString() + "." + or + not exists(ho.getBlockMode()) and blockMode = "" + ) and + exists(int c | c = count(ho.getInitialization()) | + c = 0 and initialization = "" + or + c > 0 and + initialization = + " init from " + + strictconcat(DataFlow::Node init, int n | + init = ho.getInitialization() and + n = ho.getStartLine() - init.getStartLine() + | + n.toString(), "," + ) + " lines above." + ) and + ho.getLocation() = location and + element = ho.toString() and + value = "\"" + algorithm + blockMode + initialization + "\"" + ) + } +} + +import MakeTest diff --git a/go/ql/test/query-tests/Security/CWE-327/WeakCryptoAlgorithm.expected b/go/ql/test/query-tests/Security/CWE-327/WeakCryptoAlgorithm.expected deleted file mode 100644 index 53cfd40145d..00000000000 --- a/go/ql/test/query-tests/Security/CWE-327/WeakCryptoAlgorithm.expected +++ /dev/null @@ -1,17 +0,0 @@ -edges -| Crypto.go:16:9:16:16 | password | Crypto.go:19:25:19:27 | buf | provenance | | -| Crypto.go:16:9:16:16 | password | Crypto.go:22:10:22:12 | buf | provenance | | -| Crypto.go:16:9:16:16 | password | Crypto.go:25:16:25:18 | buf | provenance | | -| Crypto.go:16:9:16:16 | password | Crypto.go:28:11:28:13 | buf | provenance | | -nodes -| Crypto.go:16:9:16:16 | password | semmle.label | password | -| Crypto.go:19:25:19:27 | buf | semmle.label | buf | -| Crypto.go:22:10:22:12 | buf | semmle.label | buf | -| Crypto.go:25:16:25:18 | buf | semmle.label | buf | -| Crypto.go:28:11:28:13 | buf | semmle.label | buf | -subpaths -#select -| Crypto.go:19:25:19:27 | buf | Crypto.go:16:9:16:16 | password | Crypto.go:19:25:19:27 | buf | $@ is used in a weak cryptographic algorithm. | Crypto.go:16:9:16:16 | password | Sensitive data | -| Crypto.go:22:10:22:12 | buf | Crypto.go:16:9:16:16 | password | Crypto.go:22:10:22:12 | buf | $@ is used in a weak cryptographic algorithm. | Crypto.go:16:9:16:16 | password | Sensitive data | -| Crypto.go:25:16:25:18 | buf | Crypto.go:16:9:16:16 | password | Crypto.go:25:16:25:18 | buf | $@ is used in a weak cryptographic algorithm. | Crypto.go:16:9:16:16 | password | Sensitive data | -| Crypto.go:28:11:28:13 | buf | Crypto.go:16:9:16:16 | password | Crypto.go:28:11:28:13 | buf | $@ is used in a weak cryptographic algorithm. | Crypto.go:16:9:16:16 | password | Sensitive data | diff --git a/go/ql/test/query-tests/Security/CWE-327/WeakCryptoAlgorithm.qlref b/go/ql/test/query-tests/Security/CWE-327/WeakCryptoAlgorithm.qlref deleted file mode 100644 index 00d68df5a7c..00000000000 --- a/go/ql/test/query-tests/Security/CWE-327/WeakCryptoAlgorithm.qlref +++ /dev/null @@ -1 +0,0 @@ -experimental/CWE-327/WeakCryptoAlgorithm.ql diff --git a/go/ql/test/query-tests/Security/CWE-327/WeakSensitiveDataHashing.expected b/go/ql/test/query-tests/Security/CWE-327/WeakSensitiveDataHashing.expected new file mode 100644 index 00000000000..e2ee4bdd7a7 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/WeakSensitiveDataHashing.expected @@ -0,0 +1,24 @@ +#select +| hashing.go:22:8:22:22 | secretByteSlice | hashing.go:22:8:22:22 | secretByteSlice | hashing.go:22:8:22:22 | secretByteSlice | $@ is used in a hashing algorithm (MD5) that is insecure. | hashing.go:22:8:22:22 | secretByteSlice | Sensitive data (secret) | +| hashing.go:23:10:23:24 | secretByteSlice | hashing.go:23:10:23:24 | secretByteSlice | hashing.go:23:10:23:24 | secretByteSlice | $@ is used in a hashing algorithm (MD5) that is insecure. | hashing.go:23:10:23:24 | secretByteSlice | Sensitive data (secret) | +| hashing.go:24:20:24:31 | secretString | hashing.go:24:20:24:31 | secretString | hashing.go:24:20:24:31 | secretString | $@ is used in a hashing algorithm (MD5) that is insecure. | hashing.go:24:20:24:31 | secretString | Sensitive data (secret) | +| hashing.go:25:10:25:24 | secretByteSlice | hashing.go:25:10:25:24 | secretByteSlice | hashing.go:25:10:25:24 | secretByteSlice | $@ is used in a hashing algorithm (MD5) that is insecure. | hashing.go:25:10:25:24 | secretByteSlice | Sensitive data (secret) | +| hashing.go:27:17:27:31 | secretByteSlice | hashing.go:27:17:27:31 | secretByteSlice | hashing.go:27:17:27:31 | secretByteSlice | $@ is used in a hashing algorithm (SHA1) that is insecure. | hashing.go:27:17:27:31 | secretByteSlice | Sensitive data (secret) | +| hashing.go:28:11:28:25 | secretByteSlice | hashing.go:28:11:28:25 | secretByteSlice | hashing.go:28:11:28:25 | secretByteSlice | $@ is used in a hashing algorithm (SHA1) that is insecure. | hashing.go:28:11:28:25 | secretByteSlice | Sensitive data (secret) | +| hashing.go:30:16:30:30 | secretByteSlice | hashing.go:30:16:30:30 | secretByteSlice | hashing.go:30:16:30:30 | secretByteSlice | $@ is used in a hashing algorithm (MD4) that is insecure. | hashing.go:30:16:30:30 | secretByteSlice | Sensitive data (secret) | +| hashing.go:31:22:31:36 | secretByteSlice | hashing.go:31:22:31:36 | secretByteSlice | hashing.go:31:22:31:36 | secretByteSlice | $@ is used in a hashing algorithm (RIPEMD160) that is insecure. | hashing.go:31:22:31:36 | secretByteSlice | Sensitive data (secret) | +| hashing.go:82:23:82:38 | type conversion | hashing.go:82:30:82:37 | password | hashing.go:82:23:82:38 | type conversion | $@ is used in a hashing algorithm (SHA256) that is insecure for password hashing, since it is not a computationally expensive hash function. | hashing.go:82:30:82:37 | password | Sensitive data (password) | +edges +| hashing.go:82:30:82:37 | password | hashing.go:82:23:82:38 | type conversion | provenance | | +nodes +| hashing.go:22:8:22:22 | secretByteSlice | semmle.label | secretByteSlice | +| hashing.go:23:10:23:24 | secretByteSlice | semmle.label | secretByteSlice | +| hashing.go:24:20:24:31 | secretString | semmle.label | secretString | +| hashing.go:25:10:25:24 | secretByteSlice | semmle.label | secretByteSlice | +| hashing.go:27:17:27:31 | secretByteSlice | semmle.label | secretByteSlice | +| hashing.go:28:11:28:25 | secretByteSlice | semmle.label | secretByteSlice | +| hashing.go:30:16:30:30 | secretByteSlice | semmle.label | secretByteSlice | +| hashing.go:31:22:31:36 | secretByteSlice | semmle.label | secretByteSlice | +| hashing.go:82:23:82:38 | type conversion | semmle.label | type conversion | +| hashing.go:82:30:82:37 | password | semmle.label | password | +subpaths diff --git a/go/ql/test/query-tests/Security/CWE-327/WeakSensitiveDataHashing.qlref b/go/ql/test/query-tests/Security/CWE-327/WeakSensitiveDataHashing.qlref new file mode 100644 index 00000000000..ec9ae0993a2 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/WeakSensitiveDataHashing.qlref @@ -0,0 +1,4 @@ +query: Security/CWE-327/WeakSensitiveDataHashing.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/go/ql/test/query-tests/Security/CWE-327/encryption.go b/go/ql/test/query-tests/Security/CWE-327/encryption.go new file mode 100644 index 00000000000..e6cc712474f --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/encryption.go @@ -0,0 +1,167 @@ +package main + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/des" + "crypto/rc4" + "io" + "os" +) + +var dst []byte = make([]byte, 16) +var secretByteSlice []byte = []byte("") + +const secretString string = "" + +var public []byte = []byte("") + +func getUserID() []byte { + return []byte("") +} + +// Note that we do not alert on decryption as we may need to decrypt legacy formats + +func BlockCipherDes() { + // BAD, des is a weak crypto algorithm + block, _ := des.NewCipher(nil) + + block.Encrypt(dst, secretByteSlice) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. init from 2 lines above." + block.Decrypt(dst, secretByteSlice) + + gcm1, _ := cipher.NewGCM(block) + gcm1.Seal(nil, nil, secretByteSlice, nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. init from 6 lines above." + gcm1.Open(nil, nil, secretByteSlice, nil) + + gcm2, _ := cipher.NewGCMWithNonceSize(block, 12) + gcm2.Seal(nil, nil, secretByteSlice, nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. init from 10 lines above." + gcm2.Open(nil, nil, secretByteSlice, nil) + + gcm3, _ := cipher.NewGCMWithRandomNonce(block) + gcm3.Seal(nil, nil, secretByteSlice, nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. init from 14 lines above." + gcm3.Open(nil, nil, secretByteSlice, nil) + + gcm4, _ := cipher.NewGCMWithTagSize(block, 12) + gcm4.Seal(nil, nil, secretByteSlice, nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. init from 18 lines above." + gcm4.Open(nil, nil, secretByteSlice, nil) + + cbcEncrypter := cipher.NewCBCEncrypter(block, nil) + cbcEncrypter.CryptBlocks(dst, secretByteSlice) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. blockMode: CBC. init from 1,22 lines above." + cipher.NewCBCDecrypter(block, nil).CryptBlocks(dst, secretByteSlice) + + ctrStream := cipher.NewCTR(block, nil) + ctrStream.XORKeyStream(dst, secretByteSlice) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. blockMode: CTR. init from 1,26 lines above." + + ctrStreamReader := &cipher.StreamReader{S: ctrStream, R: bytes.NewReader(secretByteSlice)} // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. blockMode: CTR. init from 28,3 lines above." + io.Copy(os.Stdout, ctrStreamReader) + + ctrStreamWriter := &cipher.StreamWriter{S: ctrStream, W: os.Stdout} // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. blockMode: CTR. init from 31,6 lines above." + io.Copy(ctrStreamWriter, bytes.NewReader(secretByteSlice)) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. blockMode: CTR. init from 32,7 lines above." + + // deprecated + + cfbStream := cipher.NewCFBEncrypter(block, nil) + cfbStream.XORKeyStream(dst, secretByteSlice) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. blockMode: CFB. init from 1,37 lines above." + cipher.NewCFBDecrypter(block, nil).XORKeyStream(dst, secretByteSlice) + + ofbStream := cipher.NewOFB(block, nil) + ofbStream.XORKeyStream(dst, secretByteSlice) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="DES. blockMode: OFB. init from 1,41 lines above." +} + +func BlockCipherTripleDes() { + // BAD, triple des is a weak crypto algorithm and secretByteSlice is sensitive data + block, _ := des.NewTripleDESCipher(nil) + + block.Encrypt(dst, getUserID()) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. init from 2 lines above." + block.Decrypt(dst, getUserID()) + + gcm1, _ := cipher.NewGCM(block) + gcm1.Seal(nil, nil, getUserID(), nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. init from 6 lines above." + gcm1.Open(nil, nil, getUserID(), nil) + + gcm2, _ := cipher.NewGCMWithNonceSize(block, 12) + gcm2.Seal(nil, nil, getUserID(), nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. init from 10 lines above." + gcm2.Open(nil, nil, getUserID(), nil) + + gcm3, _ := cipher.NewGCMWithRandomNonce(block) + gcm3.Seal(nil, nil, secretByteSlice, nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. init from 14 lines above." + gcm3.Open(nil, nil, secretByteSlice, nil) + + gcm4, _ := cipher.NewGCMWithTagSize(block, 12) + gcm4.Seal(nil, nil, secretByteSlice, nil) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. init from 18 lines above." + gcm4.Open(nil, nil, secretByteSlice, nil) + + cbcEncrypter := cipher.NewCBCEncrypter(block, nil) + cbcEncrypter.CryptBlocks(dst, getUserID()) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. blockMode: CBC. init from 1,22 lines above." + cipher.NewCBCDecrypter(block, nil).CryptBlocks(dst, getUserID()) + + ctrStream := cipher.NewCTR(block, nil) + ctrStream.XORKeyStream(dst, getUserID()) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. blockMode: CTR. init from 1,26 lines above." + + ctrStreamReader := &cipher.StreamReader{S: ctrStream, R: bytes.NewReader(getUserID())} // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. blockMode: CTR. init from 28,3 lines above." + io.Copy(os.Stdout, ctrStreamReader) + + ctrStreamWriter := &cipher.StreamWriter{S: ctrStream, W: os.Stdout} // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. blockMode: CTR. init from 31,6 lines above." + io.Copy(ctrStreamWriter, bytes.NewReader(getUserID())) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. blockMode: CTR. init from 32,7 lines above." + + // deprecated + + cfbStream := cipher.NewCFBEncrypter(block, nil) + cfbStream.XORKeyStream(dst, secretByteSlice) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. blockMode: CFB. init from 1,37 lines above." + cipher.NewCFBDecrypter(block, nil).XORKeyStream(dst, secretByteSlice) + + ofbStream := cipher.NewOFB(block, nil) + ofbStream.XORKeyStream(dst, secretByteSlice) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="TRIPLEDES. blockMode: OFB. init from 1,41 lines above." +} + +func BlockCipherAes() { + // GOOD, aes is a strong crypto algorithm + block, _ := aes.NewCipher(nil) + + block.Encrypt(dst, secretByteSlice) // $ CryptographicOperation="AES. init from 2 lines above." + block.Decrypt(dst, secretByteSlice) + + gcm1, _ := cipher.NewGCM(block) + gcm1.Seal(nil, nil, secretByteSlice, nil) // $ CryptographicOperation="AES. init from 6 lines above." + gcm1.Open(nil, nil, secretByteSlice, nil) + + gcm2, _ := cipher.NewGCMWithNonceSize(block, 12) + gcm2.Seal(nil, nil, secretByteSlice, nil) // $ CryptographicOperation="AES. init from 10 lines above." + gcm2.Open(nil, nil, secretByteSlice, nil) + + gcm3, _ := cipher.NewGCMWithRandomNonce(block) + gcm3.Seal(nil, nil, secretByteSlice, nil) // $ CryptographicOperation="AES. init from 14 lines above." + gcm3.Open(nil, nil, secretByteSlice, nil) + + gcm4, _ := cipher.NewGCMWithTagSize(block, 12) + gcm4.Seal(nil, nil, secretByteSlice, nil) // $ CryptographicOperation="AES. init from 18 lines above." + gcm4.Open(nil, nil, secretByteSlice, nil) + + cbcEncrypter := cipher.NewCBCEncrypter(block, nil) + cbcEncrypter.CryptBlocks(dst, secretByteSlice) // $ CryptographicOperation="AES. blockMode: CBC. init from 1,22 lines above." + cipher.NewCBCDecrypter(block, nil).CryptBlocks(dst, secretByteSlice) + + ctrStream := cipher.NewCTR(block, nil) + ctrStream.XORKeyStream(dst, secretByteSlice) // $ CryptographicOperation="AES. blockMode: CTR. init from 1,26 lines above." + + ctrStreamReader := &cipher.StreamReader{S: ctrStream, R: bytes.NewReader(secretByteSlice)} // $ CryptographicOperation="AES. blockMode: CTR. init from 28,3 lines above." + io.Copy(os.Stdout, ctrStreamReader) + + ctrStreamWriter := &cipher.StreamWriter{S: ctrStream, W: os.Stdout} // $ CryptographicOperation="AES. blockMode: CTR. init from 31,6 lines above." + io.Copy(ctrStreamWriter, bytes.NewReader(secretByteSlice)) // $ CryptographicOperation="AES. blockMode: CTR. init from 32,7 lines above." + + // deprecated + + cfbStream := cipher.NewCFBEncrypter(block, nil) + cfbStream.XORKeyStream(dst, secretByteSlice) // $ CryptographicOperation="AES. blockMode: CFB. init from 1,37 lines above." + cipher.NewCFBDecrypter(block, nil).XORKeyStream(dst, secretByteSlice) + + ofbStream := cipher.NewOFB(block, nil) + ofbStream.XORKeyStream(dst, secretByteSlice) // $ CryptographicOperation="AES. blockMode: OFB. init from 1,41 lines above." +} + +func CipherRc4() { + c, _ := rc4.NewCipher(nil) + c.XORKeyStream(dst, getUserID()) // $ Alert[go/weak-cryptographic-algorithm] CryptographicOperation="RC4. init from 0 lines above." +} diff --git a/go/ql/test/query-tests/Security/CWE-327/go.mod b/go/ql/test/query-tests/Security/CWE-327/go.mod new file mode 100644 index 00000000000..59c69723ef5 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/go.mod @@ -0,0 +1,5 @@ +module test + +go 1.24.0 + +require golang.org/x/crypto v0.43.0 diff --git a/go/ql/test/query-tests/Security/CWE-327/hashing.go b/go/ql/test/query-tests/Security/CWE-327/hashing.go new file mode 100644 index 00000000000..002e94568a2 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/hashing.go @@ -0,0 +1,91 @@ +package main + +//go:generate depstubber -vendor golang.org/x/crypto/md4 "" New +//go:generate depstubber -vendor golang.org/x/crypto/ripemd160 "" New + +import ( + "crypto/md5" + "crypto/pbkdf2" + "crypto/rand" + "crypto/sha1" + "crypto/sha256" + "crypto/sha3" + "crypto/sha512" + "io" + + "golang.org/x/crypto/md4" + "golang.org/x/crypto/ripemd160" +) + +func WeakHashes() { + h := md5.New() + h.Sum(secretByteSlice) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="MD5. init from 1 lines above." + h.Write(secretByteSlice) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="MD5. init from 2 lines above." + io.WriteString(h, secretString) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="MD5. init from 3 lines above." + md5.Sum(secretByteSlice) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="MD5. init from 0 lines above." + + sha1.New().Sum(secretByteSlice) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="SHA1. init from 0 lines above." + sha1.Sum(secretByteSlice) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="SHA1. init from 0 lines above." + + md4.New().Sum(secretByteSlice) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="MD4. init from 0 lines above." + ripemd160.New().Sum(secretByteSlice) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="RIPEMD160. init from 0 lines above." + + // Only alert when sensitive data is hashed. + md5.New().Sum(public) // $ CryptographicOperation="MD5. init from 0 lines above." + md5.Sum(public) // $ CryptographicOperation="MD5. init from 0 lines above." + sha1.New().Sum(public) // $ CryptographicOperation="SHA1. init from 0 lines above." + sha1.Sum(public) // $ CryptographicOperation="SHA1. init from 0 lines above." +} + +func StrongHashes() { + sha256.New224().Sum(secretByteSlice) // $ CryptographicOperation="SHA224. init from 0 lines above." + sha256.Sum224(secretByteSlice) // $ CryptographicOperation="SHA224. init from 0 lines above." + + sha256.New().Sum(secretByteSlice) // $ CryptographicOperation="SHA256. init from 0 lines above." + sha256.Sum256(secretByteSlice) // $ CryptographicOperation="SHA256. init from 0 lines above." + + sha512.New().Sum(secretByteSlice) // $ CryptographicOperation="SHA512. init from 0 lines above." + sha512.Sum512(secretByteSlice) // $ CryptographicOperation="SHA512. init from 0 lines above." + + sha512.New384().Sum(secretByteSlice) // $ CryptographicOperation="SHA384. init from 0 lines above." + sha512.Sum384(secretByteSlice) // $ CryptographicOperation="SHA384. init from 0 lines above." + + sha512.New512_224().Sum(secretByteSlice) // $ CryptographicOperation="SHA512224. init from 0 lines above." + sha512.Sum512_224(secretByteSlice) // $ CryptographicOperation="SHA512224. init from 0 lines above." + + sha512.New512_256().Sum(secretByteSlice) // $ CryptographicOperation="SHA512256. init from 0 lines above." + sha512.Sum512_256(secretByteSlice) // $ CryptographicOperation="SHA512256. init from 0 lines above." + + sha3.New224().Sum(secretByteSlice) // $ CryptographicOperation="SHA3224. init from 0 lines above." + sha3.Sum224(secretByteSlice) // $ CryptographicOperation="SHA3224. init from 0 lines above." + + sha3.New256().Sum(secretByteSlice) // $ CryptographicOperation="SHA3256. init from 0 lines above." + sha3.Sum256(secretByteSlice) // $ CryptographicOperation="SHA3256. init from 0 lines above." + + sha3.New384().Sum(secretByteSlice) // $ CryptographicOperation="SHA3384. init from 0 lines above." + sha3.Sum384(secretByteSlice) // $ CryptographicOperation="SHA3384. init from 0 lines above." + + sha3.New512().Sum(secretByteSlice) // $ CryptographicOperation="SHA3512. init from 0 lines above." + sha3.Sum512(secretByteSlice) // $ CryptographicOperation="SHA3512. init from 0 lines above." + + sha3.NewSHAKE128().Write(secretByteSlice) // $ CryptographicOperation="SHAKE128. init from 0 lines above." + sha3.NewCSHAKE128(nil, nil).Write(secretByteSlice) // $ CryptographicOperation="SHAKE128. init from 0 lines above." + sha3.SumSHAKE128(secretByteSlice, 100) // $ CryptographicOperation="SHAKE128. init from 0 lines above." + + sha3.NewSHAKE256().Write(secretByteSlice) // $ CryptographicOperation="SHAKE256. init from 0 lines above." + sha3.NewCSHAKE256(nil, nil).Write(secretByteSlice) // $ CryptographicOperation="SHAKE256. init from 0 lines above." + sha3.SumSHAKE256(secretByteSlice, 100) // $ CryptographicOperation="SHAKE256. init from 0 lines above." +} + +func GetPasswordHashBad(password string) [32]byte { + // BAD, SHA256 is a strong hashing algorithm but it is not computationally expensive + return sha256.Sum256([]byte(password)) // $ Alert[go/weak-sensitive-data-hashing] CryptographicOperation="SHA256. init from 0 lines above." +} + +func GetPasswordHashGood(password string) []byte { + // GOOD, PBKDF2 is a strong hashing algorithm and it is computationally expensive + salt := make([]byte, 16) + rand.Read(salt) + key, _ := pbkdf2.Key(sha512.New, password, salt, 4096, 32) + return key +} diff --git a/go/ql/test/query-tests/Security/CWE-327/vendor/golang.org/x/crypto/md4/stub.go b/go/ql/test/query-tests/Security/CWE-327/vendor/golang.org/x/crypto/md4/stub.go new file mode 100644 index 00000000000..777cc50c0c1 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/vendor/golang.org/x/crypto/md4/stub.go @@ -0,0 +1,16 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for golang.org/x/crypto/md4, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: golang.org/x/crypto/md4 (exports: ; functions: New) + +// Package md4 is a stub of golang.org/x/crypto/md4, generated by depstubber. +package md4 + +import ( + hash "hash" +) + +func New() hash.Hash { + return nil +} diff --git a/go/ql/test/query-tests/Security/CWE-327/vendor/golang.org/x/crypto/ripemd160/stub.go b/go/ql/test/query-tests/Security/CWE-327/vendor/golang.org/x/crypto/ripemd160/stub.go new file mode 100644 index 00000000000..995d3339d8c --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/vendor/golang.org/x/crypto/ripemd160/stub.go @@ -0,0 +1,16 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for golang.org/x/crypto/ripemd160, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: golang.org/x/crypto/ripemd160 (exports: ; functions: New) + +// Package ripemd160 is a stub of golang.org/x/crypto/ripemd160, generated by depstubber. +package ripemd160 + +import ( + hash "hash" +) + +func New() hash.Hash { + return nil +} diff --git a/go/ql/test/query-tests/Security/CWE-327/vendor/modules.txt b/go/ql/test/query-tests/Security/CWE-327/vendor/modules.txt new file mode 100644 index 00000000000..1927762821c --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-327/vendor/modules.txt @@ -0,0 +1,4 @@ +# golang.org/x/crypto v0.43.0 +## explicit +golang.org/x/crypto/md4 +golang.org/x/crypto/ripemd160 diff --git a/go/ql/test/query-tests/Security/CWE-347/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-347/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..922af8fad2e --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-347/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,5 @@ +reverseRead +| go-jose.v3.go:19:17:19:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| go-jose.v3.go:25:16:25:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| golang-jwt-v5.go:22:17:22:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| golang-jwt-v5.go:28:16:28:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..d6381960485 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,3 @@ +reverseRead +| cves.go:33:14:33:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| cves.go:41:14:41:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..f05017daafd --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,26 @@ +reverseRead +| OpenUrlRedirect.go:10:23:10:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| OpenUrlRedirectGood.go:12:16:12:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:13:13:13:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:22:13:22:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:33:13:33:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:48:13:48:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:56:13:56:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:68:13:68:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:77:13:77:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:85:13:85:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:93:13:93:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:102:13:102:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:115:6:115:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:117:24:117:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:126:13:126:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:138:13:138:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:150:13:150:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:163:11:163:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:176:6:176:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:177:35:177:35 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:220:3:220:3 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:226:23:226:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:227:23:227:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:228:23:228:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:232:23:232:33 | call to Cookies | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.expected b/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.expected new file mode 100644 index 00000000000..1695d82a4f7 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.expected @@ -0,0 +1,6 @@ +| CookieWithoutSecure.go:14:2:14:22 | call to SetCookie | Cookie does not set Secure attribute to true. | +| CookieWithoutSecure.go:23:2:23:22 | call to SetCookie | Cookie does not set Secure attribute to true. | +| CookieWithoutSecure.go:50:2:50:22 | call to SetCookie | Cookie does not set Secure attribute to true. | +| CookieWithoutSecure.go:60:2:60:22 | call to SetCookie | Cookie does not set Secure attribute to true. | +| CookieWithoutSecure.go:90:2:90:22 | call to SetCookie | Cookie does not set Secure attribute to true. | +| CookieWithoutSecure.go:102:4:102:71 | call to SetCookie | Cookie does not set Secure attribute to true. | diff --git a/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.go b/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.go new file mode 100644 index 00000000000..41ed48c0ba1 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.go @@ -0,0 +1,107 @@ +package main + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func handler1(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + } + http.SetCookie(w, &c) // $ Alert // BAD: Secure set to false by default +} + +func handler2(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + Secure: false, + } + http.SetCookie(w, &c) // $ Alert // BAD: Secure explicitly set to false +} + +func handler3(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + Secure: true, + } + http.SetCookie(w, &c) // GOOD: Secure explicitly set to true +} + +func handler4(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", + Value: "secret", + } + c.Secure = true + http.SetCookie(w, &c) // GOOD: Secure explicitly set to true +} + +func handler5(w http.ResponseWriter, r *http.Request) { + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + } + c.Secure = false + http.SetCookie(w, &c) // $ Alert // BAD: Secure explicitly set to false +} + +func handler6(w http.ResponseWriter, r *http.Request) { + val := false + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + Secure: val, + } + http.SetCookie(w, &c) // $ Alert // BAD: Secure explicitly set to false +} + +func handler7(w http.ResponseWriter, r *http.Request) { + val := true + c := http.Cookie{ + Name: "session", + Value: "secret", + Secure: val, + } + http.SetCookie(w, &c) // GOOD: Secure explicitly set to true +} + +func handler8(w http.ResponseWriter, r *http.Request) { + val := true + c := http.Cookie{ + Name: "session", + Value: "secret", + } + c.Secure = val + http.SetCookie(w, &c) // GOOD: Secure explicitly set to true +} + +func handler9(w http.ResponseWriter, r *http.Request) { + val := false + c := http.Cookie{ + Name: "session", // $ Source + Value: "secret", + } + c.Secure = val + http.SetCookie(w, &c) // $ Alert //BAD: Secure explicitly set to false +} + +func main() { + + router := gin.Default() + + router.GET("/cookie", func(c *gin.Context) { + + _, err := c.Cookie("session") + + if err != nil { + c.SetCookie("session", "test", 3600, "/", "localhost", false, false) // $ Alert // BAD: Secure set to false + } + }) + + router.Run() +} diff --git a/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.qlref b/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.qlref new file mode 100644 index 00000000000..9b6762358be --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/CookieWithoutSecure.qlref @@ -0,0 +1,2 @@ +query: Security/CWE-614/CookieWithoutSecure.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/go/ql/test/query-tests/Security/CWE-614/go.mod b/go/ql/test/query-tests/Security/CWE-614/go.mod new file mode 100644 index 00000000000..e0e296499fc --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/go.mod @@ -0,0 +1,7 @@ +module example.com/m + +go 1.14 + +require ( + github.com/gin-gonic/gin v1.7.1 + ) diff --git a/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/LICENSE b/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/LICENSE new file mode 100644 index 00000000000..1ff7f370605 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Manuel Martínez-Almeida + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/binding/stub.go b/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/binding/stub.go new file mode 100644 index 00000000000..43fd634edcd --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/binding/stub.go @@ -0,0 +1,12 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for github.com/gin-gonic/gin/binding, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: github.com/gin-gonic/gin/binding (exports: ; functions: YAML) + +// Package binding is a stub of github.com/gin-gonic/gin/binding, generated by depstubber. +package binding + +import () + +var YAML interface{} = nil diff --git a/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/stub.go b/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/stub.go new file mode 100644 index 00000000000..e343d5f2aa0 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/vendor/github.com/gin-gonic/gin/stub.go @@ -0,0 +1,677 @@ +// Code generated by depstubber. DO NOT EDIT. +// This is a simple stub for github.com/gin-gonic/gin, strictly for use in testing. + +// See the LICENSE file for information about the licensing of the original library. +// Source: github.com/gin-gonic/gin (exports: Context; functions: Default) + +// Package gin is a stub of github.com/gin-gonic/gin, generated by depstubber. +package gin + +import ( + bufio "bufio" + template "html/template" + io "io" + multipart "mime/multipart" + net "net" + http "net/http" + time "time" +) + +type Context struct { + Request *http.Request + Writer ResponseWriter + Params Params + Keys map[string]interface{} + Errors interface{} + Accepted []string +} + +func (_ *Context) Abort() {} + +func (_ *Context) AbortWithError(_ int, _ error) *Error { + return nil +} + +func (_ *Context) AbortWithStatus(_ int) {} + +func (_ *Context) AbortWithStatusJSON(_ int, _ interface{}) {} + +func (_ *Context) AsciiJSON(_ int, _ interface{}) {} + +func (_ *Context) Bind(_ interface{}) error { + return nil +} + +func (_ *Context) BindHeader(_ interface{}) error { + return nil +} + +func (_ *Context) BindJSON(_ interface{}) error { + return nil +} + +func (_ *Context) BindQuery(_ interface{}) error { + return nil +} + +func (_ *Context) BindUri(_ interface{}) error { + return nil +} + +func (_ *Context) BindWith(_ interface{}, _ interface{}) error { + return nil +} + +func (_ *Context) BindXML(_ interface{}) error { + return nil +} + +func (_ *Context) BindYAML(_ interface{}) error { + return nil +} + +func (_ *Context) ClientIP() string { + return "" +} + +func (_ *Context) ContentType() string { + return "" +} + +func (_ *Context) Cookie(_ string) (string, error) { + return "", nil +} + +func (_ *Context) Copy() *Context { + return nil +} + +func (_ *Context) Data(_ int, _ string, _ []byte) {} + +func (_ *Context) DataFromReader(_ int, _ int64, _ string, _ io.Reader, _ map[string]string) {} + +func (_ *Context) Deadline() (time.Time, bool) { + return time.Time{}, false +} + +func (_ *Context) DefaultPostForm(_ string, _ string) string { + return "" +} + +func (_ *Context) DefaultQuery(_ string, _ string) string { + return "" +} + +func (_ *Context) Done() <-chan struct{} { + return nil +} + +func (_ *Context) Err() error { + return nil +} + +func (_ *Context) Error(_ error) *Error { + return nil +} + +func (_ *Context) File(_ string) {} + +func (_ *Context) FileAttachment(_ string, _ string) {} + +func (_ *Context) FileFromFS(_ string, _ http.FileSystem) {} + +func (_ *Context) FormFile(_ string) (*multipart.FileHeader, error) { + return nil, nil +} + +func (_ *Context) FullPath() string { + return "" +} + +func (_ *Context) Get(_ string) (interface{}, bool) { + return nil, false +} + +func (_ *Context) GetBool(_ string) bool { + return false +} + +func (_ *Context) GetDuration(_ string) time.Duration { + return 0 +} + +func (_ *Context) GetFloat64(_ string) float64 { + return 0 +} + +func (_ *Context) GetHeader(_ string) string { + return "" +} + +func (_ *Context) GetInt(_ string) int { + return 0 +} + +func (_ *Context) GetInt64(_ string) int64 { + return 0 +} + +func (_ *Context) GetPostForm(_ string) (string, bool) { + return "", false +} + +func (_ *Context) GetPostFormArray(_ string) ([]string, bool) { + return nil, false +} + +func (_ *Context) GetPostFormMap(_ string) (map[string]string, bool) { + return nil, false +} + +func (_ *Context) GetQuery(_ string) (string, bool) { + return "", false +} + +func (_ *Context) GetQueryArray(_ string) ([]string, bool) { + return nil, false +} + +func (_ *Context) GetQueryMap(_ string) (map[string]string, bool) { + return nil, false +} + +func (_ *Context) GetRawData() ([]byte, error) { + return nil, nil +} + +func (_ *Context) GetString(_ string) string { + return "" +} + +func (_ *Context) GetStringMap(_ string) map[string]interface{} { + return nil +} + +func (_ *Context) GetStringMapString(_ string) map[string]string { + return nil +} + +func (_ *Context) GetStringMapStringSlice(_ string) map[string][]string { + return nil +} + +func (_ *Context) GetStringSlice(_ string) []string { + return nil +} + +func (_ *Context) GetTime(_ string) time.Time { + return time.Time{} +} + +func (_ *Context) GetUint(_ string) uint { + return 0 +} + +func (_ *Context) GetUint64(_ string) uint64 { + return 0 +} + +func (_ *Context) HTML(_ int, _ string, _ interface{}) {} + +func (_ *Context) Handler() HandlerFunc { + return nil +} + +func (_ *Context) HandlerName() string { + return "" +} + +func (_ *Context) HandlerNames() []string { + return nil +} + +func (_ *Context) Header(_ string, _ string) {} + +func (_ *Context) IndentedJSON(_ int, _ interface{}) {} + +func (_ *Context) IsAborted() bool { + return false +} + +func (_ *Context) IsWebsocket() bool { + return false +} + +func (_ *Context) JSON(_ int, _ interface{}) {} + +func (_ *Context) JSONP(_ int, _ interface{}) {} + +func (_ *Context) MultipartForm() (*multipart.Form, error) { + return nil, nil +} + +func (_ *Context) MustBindWith(_ interface{}, _ interface{}) error { + return nil +} + +func (_ *Context) MustGet(_ string) interface{} { + return nil +} + +func (_ *Context) Negotiate(_ int, _ Negotiate) {} + +func (_ *Context) NegotiateFormat(_ ...string) string { + return "" +} + +func (_ *Context) Next() {} + +func (_ *Context) Param(_ string) string { + return "" +} + +func (_ *Context) PostForm(_ string) string { + return "" +} + +func (_ *Context) PostFormArray(_ string) []string { + return nil +} + +func (_ *Context) PostFormMap(_ string) map[string]string { + return nil +} + +func (_ *Context) ProtoBuf(_ int, _ interface{}) {} + +func (_ *Context) PureJSON(_ int, _ interface{}) {} + +func (_ *Context) Query(_ string) string { + return "" +} + +func (_ *Context) QueryArray(_ string) []string { + return nil +} + +func (_ *Context) QueryMap(_ string) map[string]string { + return nil +} + +func (_ *Context) Redirect(_ int, _ string) {} + +func (_ *Context) RemoteIP() (net.IP, bool) { + return nil, false +} + +func (_ *Context) Render(_ int, _ interface{}) {} + +func (_ *Context) SSEvent(_ string, _ interface{}) {} + +func (_ *Context) SaveUploadedFile(_ *multipart.FileHeader, _ string) error { + return nil +} + +func (_ *Context) SecureJSON(_ int, _ interface{}) {} + +func (_ *Context) Set(_ string, _ interface{}) {} + +func (_ *Context) SetAccepted(_ ...string) {} + +func (_ *Context) SetCookie(_ string, _ string, _ int, _ string, _ string, _ bool, _ bool) {} + +func (_ *Context) SetSameSite(_ http.SameSite) {} + +func (_ *Context) ShouldBind(_ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindBodyWith(_ interface{}, _ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindHeader(_ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindJSON(_ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindQuery(_ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindUri(_ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindWith(_ interface{}, _ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindXML(_ interface{}) error { + return nil +} + +func (_ *Context) ShouldBindYAML(_ interface{}) error { + return nil +} + +func (_ *Context) Status(_ int) {} + +func (_ *Context) Stream(_ func(io.Writer) bool) bool { + return false +} + +func (_ *Context) String(_ int, _ string, _ ...interface{}) {} + +func (_ *Context) Value(_ interface{}) interface{} { + return nil +} + +func (_ *Context) XML(_ int, _ interface{}) {} + +func (_ *Context) YAML(_ int, _ interface{}) {} + +func Default() *Engine { + return nil +} + +type Engine struct { + RouterGroup RouterGroup + RedirectTrailingSlash bool + RedirectFixedPath bool + HandleMethodNotAllowed bool + ForwardedByClientIP bool + RemoteIPHeaders []string + TrustedProxies []string + AppEngine bool + UseRawPath bool + UnescapePathValues bool + MaxMultipartMemory int64 + RemoveExtraSlash bool + HTMLRender interface{} + FuncMap template.FuncMap +} + +func (_ *Engine) Any(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) BasePath() string { + return "" +} + +func (_ *Engine) DELETE(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) Delims(_ string, _ string) *Engine { + return nil +} + +func (_ *Engine) GET(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) Group(_ string, _ ...HandlerFunc) *RouterGroup { + return nil +} + +func (_ *Engine) HEAD(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) Handle(_ string, _ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) HandleContext(_ *Context) {} + +func (_ *Engine) LoadHTMLFiles(_ ...string) {} + +func (_ *Engine) LoadHTMLGlob(_ string) {} + +func (_ *Engine) NoMethod(_ ...HandlerFunc) {} + +func (_ *Engine) NoRoute(_ ...HandlerFunc) {} + +func (_ *Engine) OPTIONS(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) PATCH(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) POST(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) PUT(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *Engine) Routes() RoutesInfo { + return nil +} + +func (_ *Engine) Run(_ ...string) error { + return nil +} + +func (_ *Engine) RunFd(_ int) error { + return nil +} + +func (_ *Engine) RunListener(_ net.Listener) error { + return nil +} + +func (_ *Engine) RunTLS(_ string, _ string, _ string) error { + return nil +} + +func (_ *Engine) RunUnix(_ string) error { + return nil +} + +func (_ *Engine) SecureJsonPrefix(_ string) *Engine { + return nil +} + +func (_ *Engine) ServeHTTP(_ http.ResponseWriter, _ *http.Request) {} + +func (_ *Engine) SetFuncMap(_ template.FuncMap) {} + +func (_ *Engine) SetHTMLTemplate(_ *template.Template) {} + +func (_ *Engine) Static(_ string, _ string) IRoutes { + return nil +} + +func (_ *Engine) StaticFS(_ string, _ http.FileSystem) IRoutes { + return nil +} + +func (_ *Engine) StaticFile(_ string, _ string) IRoutes { + return nil +} + +func (_ *Engine) Use(_ ...HandlerFunc) IRoutes { + return nil +} + +type Error struct { + Err error + Type ErrorType + Meta interface{} +} + +func (_ Error) Error() string { + return "" +} + +func (_ *Error) IsType(_ ErrorType) bool { + return false +} + +func (_ *Error) JSON() interface{} { + return nil +} + +func (_ *Error) MarshalJSON() ([]byte, error) { + return nil, nil +} + +func (_ *Error) SetMeta(_ interface{}) *Error { + return nil +} + +func (_ *Error) SetType(_ ErrorType) *Error { + return nil +} + +func (_ *Error) Unwrap() error { + return nil +} + +type ErrorType uint64 + +type HandlerFunc func(*Context) + +type HandlersChain []HandlerFunc + +func (_ HandlersChain) Last() HandlerFunc { + return nil +} + +type IRoutes interface { + Any(_ string, _ ...HandlerFunc) IRoutes + DELETE(_ string, _ ...HandlerFunc) IRoutes + GET(_ string, _ ...HandlerFunc) IRoutes + HEAD(_ string, _ ...HandlerFunc) IRoutes + Handle(_ string, _ string, _ ...HandlerFunc) IRoutes + OPTIONS(_ string, _ ...HandlerFunc) IRoutes + PATCH(_ string, _ ...HandlerFunc) IRoutes + POST(_ string, _ ...HandlerFunc) IRoutes + PUT(_ string, _ ...HandlerFunc) IRoutes + Static(_ string, _ string) IRoutes + StaticFS(_ string, _ http.FileSystem) IRoutes + StaticFile(_ string, _ string) IRoutes + Use(_ ...HandlerFunc) IRoutes +} + +type Negotiate struct { + Offered []string + HTMLName string + HTMLData interface{} + JSONData interface{} + XMLData interface{} + YAMLData interface{} + Data interface{} +} + +type Param struct { + Key string + Value string +} + +type Params []Param + +func (_ Params) ByName(_ string) string { + return "" +} + +func (_ Params) Get(_ string) (string, bool) { + return "", false +} + +type ResponseWriter interface { + CloseNotify() <-chan bool + Flush() + Header() http.Header + Hijack() (net.Conn, *bufio.ReadWriter, error) + Pusher() http.Pusher + Size() int + Status() int + Write(_ []byte) (int, error) + WriteHeader(_ int) + WriteHeaderNow() + WriteString(_ string) (int, error) + Written() bool +} + +type RouteInfo struct { + Method string + Path string + Handler string + HandlerFunc HandlerFunc +} + +type RouterGroup struct { + Handlers HandlersChain +} + +func (_ *RouterGroup) Any(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) BasePath() string { + return "" +} + +func (_ *RouterGroup) DELETE(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) GET(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) Group(_ string, _ ...HandlerFunc) *RouterGroup { + return nil +} + +func (_ *RouterGroup) HEAD(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) Handle(_ string, _ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) OPTIONS(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) PATCH(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) POST(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) PUT(_ string, _ ...HandlerFunc) IRoutes { + return nil +} + +func (_ *RouterGroup) Static(_ string, _ string) IRoutes { + return nil +} + +func (_ *RouterGroup) StaticFS(_ string, _ http.FileSystem) IRoutes { + return nil +} + +func (_ *RouterGroup) StaticFile(_ string, _ string) IRoutes { + return nil +} + +func (_ *RouterGroup) Use(_ ...HandlerFunc) IRoutes { + return nil +} + +type RoutesInfo []RouteInfo diff --git a/go/ql/test/query-tests/Security/CWE-614/vendor/modules.txt b/go/ql/test/query-tests/Security/CWE-614/vendor/modules.txt new file mode 100644 index 00000000000..e80eedb5cae --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-614/vendor/modules.txt @@ -0,0 +1,3 @@ +# github.com/gin-gonic/gin v1.7.1 +## explicit +github.com/gin-gonic/gin diff --git a/go/ql/test/query-tests/Security/CWE-640/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-640/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..f3510be5f6c --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-640/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,2 @@ +reverseRead +| EmailBad.go:9:10:9:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-643/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-643/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..001bad6c8fc --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-643/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,13 @@ +reverseRead +| XPathInjection.go:13:14:13:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:35:14:35:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:46:14:46:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:57:14:57:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:72:14:72:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:83:14:83:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:92:14:92:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:93:14:93:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:106:14:106:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:115:14:115:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:116:14:116:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:139:14:139:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-770/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-770/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..215578883b2 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-770/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,6 @@ +reverseRead +| UncontrolledAllocationSizeBad.go:11:12:11:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:11:12:11:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:32:12:32:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:52:12:52:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:73:12:73:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-918/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-918/CONSISTENCY/DataFlowConsistency.expected new file mode 100644 index 00000000000..cb71c6569c5 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-918/CONSISTENCY/DataFlowConsistency.expected @@ -0,0 +1,5 @@ +reverseRead +| websocket.go:110:31:110:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| websocket.go:120:32:120:32 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| websocket.go:129:54:129:54 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| websocket.go:139:55:139:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | diff --git a/java/ql/integration-tests/java/maven-add-exports-module-flags/pom.xml b/java/ql/integration-tests/java/maven-add-exports-module-flags/pom.xml new file mode 100644 index 00000000000..94f5f90981e --- /dev/null +++ b/java/ql/integration-tests/java/maven-add-exports-module-flags/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + com.example + maven-add-exports-module-flags + 1.0-SNAPSHOT + + maven-add-exports-module-flags + Test case: Project using --add-exports. Autobuilder should detect this and use --source/--target. + + + UTF-8 + 11 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + ${java.version} + ${java.version} + + --add-exports + jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + --add-exports + jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + --add-exports + jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + --add-exports + jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + + + + + + diff --git a/java/ql/integration-tests/java/maven-add-exports-module-flags/source_archive.expected b/java/ql/integration-tests/java/maven-add-exports-module-flags/source_archive.expected new file mode 100644 index 00000000000..3d84bfa09ab --- /dev/null +++ b/java/ql/integration-tests/java/maven-add-exports-module-flags/source_archive.expected @@ -0,0 +1,3 @@ +pom.xml +src/main/java/com/example/CompilerUser.java +target/maven-archiver/pom.properties diff --git a/java/ql/integration-tests/java/maven-add-exports-module-flags/src/main/java/com/example/CompilerUser.java b/java/ql/integration-tests/java/maven-add-exports-module-flags/src/main/java/com/example/CompilerUser.java new file mode 100644 index 00000000000..13685d097a4 --- /dev/null +++ b/java/ql/integration-tests/java/maven-add-exports-module-flags/src/main/java/com/example/CompilerUser.java @@ -0,0 +1,15 @@ +package com.example; + +import com.sun.tools.javac.api.JavacTool; + +/** + * Simple class that uses JDK compiler internals. + * This requires --add-exports flags to compile. + */ +public class CompilerUser { + public static void main(String[] args) { + // Use JavacTool from jdk.compiler module + JavacTool tool = JavacTool.create(); + System.out.println("Compiler tool: " + tool.getClass().getName()); + } +} diff --git a/java/ql/integration-tests/java/maven-add-exports-module-flags/test.py b/java/ql/integration-tests/java/maven-add-exports-module-flags/test.py new file mode 100644 index 00000000000..73c4b1415a1 --- /dev/null +++ b/java/ql/integration-tests/java/maven-add-exports-module-flags/test.py @@ -0,0 +1,2 @@ +def test(codeql, java, actions_toolchains_file): + codeql.database.create(_env={"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file)}) diff --git a/java/ql/integration-tests/java/maven-execution-specific-java-version/pom.xml b/java/ql/integration-tests/java/maven-execution-specific-java-version/pom.xml new file mode 100644 index 00000000000..fca47a5ba6d --- /dev/null +++ b/java/ql/integration-tests/java/maven-execution-specific-java-version/pom.xml @@ -0,0 +1,51 @@ + + + + 4.0.0 + + com.example + maven-execution-specific-java-version + 1.0-SNAPSHOT + + maven-execution-specific-java-version + Test case: Project with execution-specific Java versions (Java 11 for main, Java 17 for test). Maven.java should detect the highest version (17) and use it for compilation. + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + + default-compile + compile + + compile + + + 11 + + + + + + default-testCompile + test-compile + + testCompile + + + 17 + + + + + + + diff --git a/java/ql/integration-tests/java/maven-execution-specific-java-version/source_archive.expected b/java/ql/integration-tests/java/maven-execution-specific-java-version/source_archive.expected new file mode 100644 index 00000000000..16e83f3a7f6 --- /dev/null +++ b/java/ql/integration-tests/java/maven-execution-specific-java-version/source_archive.expected @@ -0,0 +1,4 @@ +pom.xml +src/main/java/com/example/App.java +src/test/java/com/example/AppTest.java +target/maven-archiver/pom.properties diff --git a/java/ql/integration-tests/java/maven-execution-specific-java-version/src/main/java/com/example/App.java b/java/ql/integration-tests/java/maven-execution-specific-java-version/src/main/java/com/example/App.java new file mode 100644 index 00000000000..74ddfe58348 --- /dev/null +++ b/java/ql/integration-tests/java/maven-execution-specific-java-version/src/main/java/com/example/App.java @@ -0,0 +1,12 @@ +package com.example; + +public class App { + public static void main(String[] args) { + var message = "Hello World! Running on Java " + System.getProperty("java.version"); + System.out.println(message); + } + + public String getMessage() { + return "Hello from App"; + } +} diff --git a/java/ql/integration-tests/java/maven-execution-specific-java-version/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/java/maven-execution-specific-java-version/src/test/java/com/example/AppTest.java new file mode 100644 index 00000000000..4f8e04f7d78 --- /dev/null +++ b/java/ql/integration-tests/java/maven-execution-specific-java-version/src/test/java/com/example/AppTest.java @@ -0,0 +1,11 @@ +package com.example; + +public class AppTest { + public static void main(String[] args) { + var text = """ + Hello + World + """; + System.out.println(text.strip()); + } +} diff --git a/java/ql/integration-tests/java/maven-execution-specific-java-version/test.py b/java/ql/integration-tests/java/maven-execution-specific-java-version/test.py new file mode 100644 index 00000000000..73c4b1415a1 --- /dev/null +++ b/java/ql/integration-tests/java/maven-execution-specific-java-version/test.py @@ -0,0 +1,2 @@ +def test(codeql, java, actions_toolchains_file): + codeql.database.create(_env={"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file)}) diff --git a/java/ql/integration-tests/java/maven-java16-with-higher-jdk/pom.xml b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/pom.xml new file mode 100644 index 00000000000..e6a09518d8f --- /dev/null +++ b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/pom.xml @@ -0,0 +1,30 @@ + + + + 4.0.0 + + com.example + maven-java16-with-higher-jdk + 1.0-SNAPSHOT + + maven-java16-with-higher-jdk + Test case: Java 16 target when only Java 17+ is available. + + + UTF-8 + 16 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + ${java.version} + + + + + diff --git a/java/ql/integration-tests/java/maven-java16-with-higher-jdk/source_archive.expected b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/source_archive.expected new file mode 100644 index 00000000000..eb5dbc368ee --- /dev/null +++ b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/source_archive.expected @@ -0,0 +1,3 @@ +pom.xml +src/main/java/com/example/App.java +target/maven-archiver/pom.properties diff --git a/java/ql/integration-tests/java/maven-java16-with-higher-jdk/src/main/java/com/example/App.java b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/src/main/java/com/example/App.java new file mode 100644 index 00000000000..707e579ad68 --- /dev/null +++ b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/src/main/java/com/example/App.java @@ -0,0 +1,15 @@ +package com.example; + +import java.util.List; + +/** + * Simple class using Java 16 features (e.g.,records). + */ +public class App { + public static void main(String[] args) { + Person person = new Person("Bob", 42); + System.out.println(person); + } +} + +record Person(String name, int age) {} diff --git a/java/ql/integration-tests/java/maven-java16-with-higher-jdk/test.py b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/test.py new file mode 100644 index 00000000000..73c4b1415a1 --- /dev/null +++ b/java/ql/integration-tests/java/maven-java16-with-higher-jdk/test.py @@ -0,0 +1,2 @@ +def test(codeql, java, actions_toolchains_file): + codeql.database.create(_env={"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file)}) diff --git a/java/ql/integration-tests/java/maven-java8-java11-dependency/pom.xml b/java/ql/integration-tests/java/maven-java8-java11-dependency/pom.xml new file mode 100644 index 00000000000..f50a3aadd23 --- /dev/null +++ b/java/ql/integration-tests/java/maven-java8-java11-dependency/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + com.example + maven-java8-java11-dependency + 1.0-SNAPSHOT + + maven-java8-java11-dependency + Test case: Java 8 project with dependency requiring Java 11+ + + + UTF-8 + 1.8 + 1.8 + + + + + + org.testng + testng + 7.7.0 + test + + + + + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + + diff --git a/java/ql/integration-tests/java/maven-java8-java11-dependency/source_archive.expected b/java/ql/integration-tests/java/maven-java8-java11-dependency/source_archive.expected new file mode 100644 index 00000000000..5088f76cc38 --- /dev/null +++ b/java/ql/integration-tests/java/maven-java8-java11-dependency/source_archive.expected @@ -0,0 +1,4 @@ +pom.xml +src/main/java/com/example/Calculator.java +src/test/java/com/example/CalculatorTest.java +target/maven-archiver/pom.properties diff --git a/java/ql/integration-tests/java/maven-java8-java11-dependency/src/main/java/com/example/Calculator.java b/java/ql/integration-tests/java/maven-java8-java11-dependency/src/main/java/com/example/Calculator.java new file mode 100644 index 00000000000..4cc529e4f0f --- /dev/null +++ b/java/ql/integration-tests/java/maven-java8-java11-dependency/src/main/java/com/example/Calculator.java @@ -0,0 +1,11 @@ +package com.example; + +public class Calculator { + public int add(int a, int b) { + return a + b; + } + + public int multiply(int a, int b) { + return a * b; + } +} diff --git a/java/ql/integration-tests/java/maven-java8-java11-dependency/src/test/java/com/example/CalculatorTest.java b/java/ql/integration-tests/java/maven-java8-java11-dependency/src/test/java/com/example/CalculatorTest.java new file mode 100644 index 00000000000..821330a32cc --- /dev/null +++ b/java/ql/integration-tests/java/maven-java8-java11-dependency/src/test/java/com/example/CalculatorTest.java @@ -0,0 +1,21 @@ +package com.example; + +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * Test class using TestNG 7.7.0 which requires Java 11+. + */ +public class CalculatorTest { + @Test + public void testAdd() { + Calculator calc = new Calculator(); + Assert.assertEquals(calc.add(2, 3), 5); + } + + @Test + public void testMultiply() { + Calculator calc = new Calculator(); + Assert.assertEquals(calc.multiply(3, 4), 12); + } +} diff --git a/java/ql/integration-tests/java/maven-java8-java11-dependency/test.py b/java/ql/integration-tests/java/maven-java8-java11-dependency/test.py new file mode 100644 index 00000000000..73c4b1415a1 --- /dev/null +++ b/java/ql/integration-tests/java/maven-java8-java11-dependency/test.py @@ -0,0 +1,2 @@ +def test(codeql, java, actions_toolchains_file): + codeql.database.create(_env={"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file)}) diff --git a/java/ql/integration-tests/java/maven-multimodule-test-java-version/main-module/pom.xml b/java/ql/integration-tests/java/maven-multimodule-test-java-version/main-module/pom.xml new file mode 100644 index 00000000000..39586e4e0ab --- /dev/null +++ b/java/ql/integration-tests/java/maven-multimodule-test-java-version/main-module/pom.xml @@ -0,0 +1,10 @@ + + + 4.0.0 + + com.example + maven-multimodule-test-java-version + 1.0 + + main-module + diff --git a/java/ql/integration-tests/java/maven-multimodule-test-java-version/main-module/src/main/java/com/example/App.java b/java/ql/integration-tests/java/maven-multimodule-test-java-version/main-module/src/main/java/com/example/App.java new file mode 100644 index 00000000000..d2397803d55 --- /dev/null +++ b/java/ql/integration-tests/java/maven-multimodule-test-java-version/main-module/src/main/java/com/example/App.java @@ -0,0 +1,7 @@ +package com.example; + +public class App { + public static void main(String[] args) { + System.out.println("Hello World!"); + } +} \ No newline at end of file diff --git a/java/ql/integration-tests/java/maven-multimodule-test-java-version/pom.xml b/java/ql/integration-tests/java/maven-multimodule-test-java-version/pom.xml new file mode 100644 index 00000000000..ea5f8b5b03b --- /dev/null +++ b/java/ql/integration-tests/java/maven-multimodule-test-java-version/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + com.example + maven-multimodule-test-java-version + 1.0 + pom + + + 17 + + + + main-module + test-module + + diff --git a/java/ql/integration-tests/java/maven-multimodule-test-java-version/source_archive.expected b/java/ql/integration-tests/java/maven-multimodule-test-java-version/source_archive.expected new file mode 100644 index 00000000000..08385ca91a0 --- /dev/null +++ b/java/ql/integration-tests/java/maven-multimodule-test-java-version/source_archive.expected @@ -0,0 +1,7 @@ +main-module/pom.xml +main-module/src/main/java/com/example/App.java +main-module/target/maven-archiver/pom.properties +pom.xml +test-module/pom.xml +test-module/src/main/java/com/example/tests/TestUtils.java +test-module/target/maven-archiver/pom.properties diff --git a/java/ql/integration-tests/java/maven-multimodule-test-java-version/test-module/pom.xml b/java/ql/integration-tests/java/maven-multimodule-test-java-version/test-module/pom.xml new file mode 100644 index 00000000000..5895a91b2c1 --- /dev/null +++ b/java/ql/integration-tests/java/maven-multimodule-test-java-version/test-module/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + + com.example + maven-multimodule-test-java-version + 1.0 + + test-module + + + 21 + + diff --git a/java/ql/integration-tests/java/maven-multimodule-test-java-version/test-module/src/main/java/com/example/tests/TestUtils.java b/java/ql/integration-tests/java/maven-multimodule-test-java-version/test-module/src/main/java/com/example/tests/TestUtils.java new file mode 100644 index 00000000000..30e83856200 --- /dev/null +++ b/java/ql/integration-tests/java/maven-multimodule-test-java-version/test-module/src/main/java/com/example/tests/TestUtils.java @@ -0,0 +1,12 @@ +package com.example.tests; + +// Requires Java 21: switch with pattern matching and guards +public class TestUtils { + public static String analyze(Object obj) { + return switch (obj) { + case String s when s.length() > 5 -> "long"; + case String s -> "short"; + default -> "other"; + }; + } +} \ No newline at end of file diff --git a/java/ql/integration-tests/java/maven-multimodule-test-java-version/test.py b/java/ql/integration-tests/java/maven-multimodule-test-java-version/test.py new file mode 100644 index 00000000000..73c4b1415a1 --- /dev/null +++ b/java/ql/integration-tests/java/maven-multimodule-test-java-version/test.py @@ -0,0 +1,2 @@ +def test(codeql, java, actions_toolchains_file): + codeql.database.create(_env={"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file)}) diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index e261dbee59e..ee076ba77a7 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,21 @@ +## 7.8.2 + +No user-facing changes. + +## 7.8.1 + +No user-facing changes. + +## 7.8.0 + +### Deprecated APIs + +* The SSA interface has been updated and all classes and several predicates have been renamed. See the qldoc for more specific migration information. + +## 7.7.4 + +No user-facing changes. + ## 7.7.3 No user-facing changes. diff --git a/java/ql/lib/change-notes/2025-12-02-improve-regex-sanitizer.md b/java/ql/lib/change-notes/2025-12-02-improve-regex-sanitizer.md new file mode 100644 index 00000000000..77ce0dc583c --- /dev/null +++ b/java/ql/lib/change-notes/2025-12-02-improve-regex-sanitizer.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* A sanitizer has been added to `java/ssrf` to remove alerts when a regular expression check is used to verify that the value is safe. diff --git a/java/ql/lib/change-notes/released/7.7.4.md b/java/ql/lib/change-notes/released/7.7.4.md new file mode 100644 index 00000000000..47cd244f789 --- /dev/null +++ b/java/ql/lib/change-notes/released/7.7.4.md @@ -0,0 +1,3 @@ +## 7.7.4 + +No user-facing changes. diff --git a/java/ql/lib/change-notes/released/7.8.0.md b/java/ql/lib/change-notes/released/7.8.0.md new file mode 100644 index 00000000000..aa7501b1ff1 --- /dev/null +++ b/java/ql/lib/change-notes/released/7.8.0.md @@ -0,0 +1,5 @@ +## 7.8.0 + +### Deprecated APIs + +* The SSA interface has been updated and all classes and several predicates have been renamed. See the qldoc for more specific migration information. diff --git a/java/ql/lib/change-notes/released/7.8.1.md b/java/ql/lib/change-notes/released/7.8.1.md new file mode 100644 index 00000000000..c59551a0409 --- /dev/null +++ b/java/ql/lib/change-notes/released/7.8.1.md @@ -0,0 +1,3 @@ +## 7.8.1 + +No user-facing changes. diff --git a/java/ql/lib/change-notes/released/7.8.2.md b/java/ql/lib/change-notes/released/7.8.2.md new file mode 100644 index 00000000000..8b7244cb0b6 --- /dev/null +++ b/java/ql/lib/change-notes/released/7.8.2.md @@ -0,0 +1,3 @@ +## 7.8.2 + +No user-facing changes. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 6856106e771..40a3d24f296 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.7.3 +lastReleaseVersion: 7.8.2 diff --git a/java/ql/lib/ext/empty.model.yml b/java/ql/lib/ext/empty.model.yml index 43028e7cc14..a0ea3cf753b 100644 --- a/java/ql/lib/ext/empty.model.yml +++ b/java/ql/lib/ext/empty.model.yml @@ -13,6 +13,14 @@ extensions: pack: codeql/java-all extensible: summaryModel data: [] + - addsTo: + pack: codeql/java-all + extensible: barrierModel + data: [] + - addsTo: + pack: codeql/java-all + extensible: barrierGuardModel + data: [] - addsTo: pack: codeql/java-all extensible: neutralModel diff --git a/java/ql/lib/ext/hudson.model.yml b/java/ql/lib/ext/hudson.model.yml index eda30b6a0ff..0dfff091fcd 100644 --- a/java/ql/lib/ext/hudson.model.yml +++ b/java/ql/lib/ext/hudson.model.yml @@ -50,6 +50,12 @@ extensions: - ["hudson", "FilePath", False, "readToString", "", "", "ReturnValue", "file", "manual"] - ["hudson", "Plugin", True, "configure", "", "", "Parameter", "remote", "manual"] - ["hudson", "Plugin", True, "newInstance", "", "", "Parameter", "remote", "manual"] + - addsTo: + pack: codeql/java-all + extensible: barrierModel + data: + - ["hudson", "Util", True, "escape", "(String)", "", "ReturnValue", "html-injection", "manual"] + # Not including xmlEscape because it only accounts for >, <, and &. It does not account for ", or ', which makes it an incomplete XSS sanitizer. - addsTo: pack: codeql/java-all extensible: summaryModel diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index 3582e2b78ac..07e39c9e12f 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -162,3 +162,8 @@ extensions: extensible: sourceModel data: - ["java.io", "FileInputStream", True, "FileInputStream", "", "", "Argument[this]", "file", "manual"] + - addsTo: + pack: codeql/java-all + extensible: barrierModel + data: + - ["java.io", "File", True, "getName", "()", "", "ReturnValue", "path-injection", "manual"] diff --git a/java/ql/lib/ext/java.net.model.yml b/java/ql/lib/ext/java.net.model.yml index 084fce7bbc4..e69db468a4a 100644 --- a/java/ql/lib/ext/java.net.model.yml +++ b/java/ql/lib/ext/java.net.model.yml @@ -34,6 +34,11 @@ extensions: - ["java.net", "URLClassLoader", False, "URLClassLoader", "(URL[],ClassLoader)", "", "Argument[0]", "request-forgery", "manual"] - ["java.net", "URLClassLoader", False, "URLClassLoader", "(URL[])", "", "Argument[0]", "request-forgery", "manual"] - ["java.net", "PasswordAuthentication", False, "PasswordAuthentication", "(String,char[])", "", "Argument[0]", "credentials-username", "hq-generated"] + - addsTo: + pack: codeql/java-all + extensible: barrierGuardModel + data: + - ["java.net", "URI", True, "isAbsolute", "()", "", "Argument[this]", "false", "request-forgery", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel diff --git a/java/ql/lib/ext/java.util.regex.model.yml b/java/ql/lib/ext/java.util.regex.model.yml index 4f0776e59bd..20269a271b5 100644 --- a/java/ql/lib/ext/java.util.regex.model.yml +++ b/java/ql/lib/ext/java.util.regex.model.yml @@ -12,6 +12,11 @@ extensions: - ["java.util.regex", "Pattern", False, "split", "(CharSequence)", "", "Argument[this]", "regex-use[0]", "manual"] - ["java.util.regex", "Pattern", False, "split", "(CharSequence,int)", "", "Argument[this]", "regex-use[0]", "manual"] - ["java.util.regex", "Pattern", False, "splitAsStream", "(CharSequence)", "", "Argument[this]", "regex-use[0]", "manual"] + - addsTo: + pack: codeql/java-all + extensible: barrierModel + data: + - ["java.util.regex", "Pattern", False, "quote", "(String)", "", "ReturnValue", "regex-use", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel diff --git a/java/ql/lib/ext/org.owasp.esapi.model.yml b/java/ql/lib/ext/org.owasp.esapi.model.yml index 30578debe58..70890d7e03b 100644 --- a/java/ql/lib/ext/org.owasp.esapi.model.yml +++ b/java/ql/lib/ext/org.owasp.esapi.model.yml @@ -1,6 +1,42 @@ extensions: + - addsTo: + pack: codeql/java-all + extensible: barrierGuardModel + data: + - ["org.owasp.esapi", "Validator", true, "isValidCreditCard", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidDate", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidDirectoryPath", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidDouble", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidFileContent", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidFileName", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidInput", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidInteger", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidListItem", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidNumber", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidPrintable", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidRedirectLocation", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidSafeHTML", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "isValidURI", "", "", "Argument[1]", "true", "trust-boundary-violation", "manual"] + - addsTo: + pack: codeql/java-all + extensible: barrierModel + data: + - ["org.owasp.esapi", "Validator", true, "getValidCreditCard", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidDate", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidDirectoryPath", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidDouble", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidFileContent", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidFileName", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidInput", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidInteger", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidListItem", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidNumber", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidPrintable", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidRedirectLocation", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidSafeHTML", "", "", "ReturnValue", "trust-boundary-violation", "manual"] + - ["org.owasp.esapi", "Validator", true, "getValidURI", "", "", "ReturnValue", "trust-boundary-violation", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel data: - - ["org.owasp.esapi", "Encoder", true, "encodeForHTML", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] \ No newline at end of file + - ["org.owasp.esapi", "Encoder", true, "encodeForHTML", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index bcfc194a4cb..f0f57e7150d 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 7.7.4-dev +version: 7.8.3-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/Expr.qll b/java/ql/lib/semmle/code/java/Expr.qll index 282d90eaeee..4b03375c69e 100644 --- a/java/ql/lib/semmle/code/java/Expr.qll +++ b/java/ql/lib/semmle/code/java/Expr.qll @@ -1808,6 +1808,52 @@ class VariableAssign extends VariableUpdate { } } +private newtype TVariableWrite = + TParamInit(Parameter p) or + TVarWriteExpr(VariableUpdate u) + +/** + * A write to a variable. This is either a local variable declaration, + * including parameter declarations, or an update to a variable. + */ +class VariableWrite extends TVariableWrite { + /** Gets the expression representing this write, if any. */ + Expr asExpr() { this = TVarWriteExpr(result) } + + /** + * Gets the expression with the value being written, if any. + * + * This can be the same expression as returned by `asExpr()`, which is the + * case for, for example, `++x` and `x += e`. For simple assignments like + * `x = e`, `asExpr()` gets the whole assignment expression while + * `getValue()` gets the right-hand side `e`. Post-crement operations like + * `x++` do not have an expression with the value being written. + */ + Expr getValue() { + this.asExpr().(VariableAssign).getSource() = result or + this.asExpr().(AssignOp) = result or + this.asExpr().(PreIncExpr) = result or + this.asExpr().(PreDecExpr) = result + } + + /** Holds if this write is an initialization of parameter `p`. */ + predicate isParameterInit(Parameter p) { this = TParamInit(p) } + + /** Gets a textual representation of this write. */ + string toString() { + exists(Parameter p | this = TParamInit(p) and result = p.toString()) + or + result = this.asExpr().toString() + } + + /** Gets the location of this write. */ + Location getLocation() { + exists(Parameter p | this = TParamInit(p) and result = p.getLocation()) + or + result = this.asExpr().getLocation() + } +} + /** A type literal. For example, `String.class`. */ class TypeLiteral extends Expr, @typeliteral { /** Gets the access to the type whose class is accessed. */ diff --git a/java/ql/lib/semmle/code/java/JDK.qll b/java/ql/lib/semmle/code/java/JDK.qll index bdc2fb92fa0..f965fbfe6ba 100644 --- a/java/ql/lib/semmle/code/java/JDK.qll +++ b/java/ql/lib/semmle/code/java/JDK.qll @@ -321,12 +321,7 @@ class WriteObjectMethod extends Method { class ReadObjectMethod extends Method { ReadObjectMethod() { this.getDeclaringType() instanceof TypeObjectInputStream and - ( - this.hasName("readObject") or - this.hasName("readObjectOverride") or - this.hasName("readUnshared") or - this.hasName("resolveObject") - ) + this.hasName(["readObject", "readObjectOverride", "readUnshared", "resolveObject"]) } } diff --git a/java/ql/lib/semmle/code/java/NumberFormatException.qll b/java/ql/lib/semmle/code/java/NumberFormatException.qll index 83f66d1a709..96174cd1ddc 100644 --- a/java/ql/lib/semmle/code/java/NumberFormatException.qll +++ b/java/ql/lib/semmle/code/java/NumberFormatException.qll @@ -46,12 +46,7 @@ private class SpecialClassInstanceExpr extends ClassInstanceExpr { } predicate throwsNfe() { - this.isStringConstructor("Byte") or - this.isStringConstructor("Short") or - this.isStringConstructor("Integer") or - this.isStringConstructor("Long") or - this.isStringConstructor("Float") or - this.isStringConstructor("Double") + this.isStringConstructor(["Byte", "Short", "Integer", "Long", "Float", "Double"]) } } diff --git a/java/ql/lib/semmle/code/java/Overlay.qll b/java/ql/lib/semmle/code/java/Overlay.qll index b5f7264eb3d..b73f2283cad 100644 --- a/java/ql/lib/semmle/code/java/Overlay.qll +++ b/java/ql/lib/semmle/code/java/Overlay.qll @@ -5,6 +5,7 @@ overlay[local?] module; import java +private import internal.OverlayXml /** * A local predicate that always holds for the overlay variant and @@ -18,7 +19,7 @@ predicate isOverlay() { databaseMetadata("isOverlay", "true") } overlay[local] string getRawFile(@locatable el) { exists(@location loc, @file file | - (hasLocation(el, loc) or xmllocations(el, loc)) and + hasLocation(el, loc) and locations_default(loc, file, _, _, _, _) and files(file, result) ) @@ -102,31 +103,3 @@ private predicate discardBaseConfigLocatable(@configLocatable el) { // property files than those included in overlayChangedFiles. overlayConfigExtracted(baseConfigLocatable(el)) } - -/** - * An `@xmllocatable` that should be discarded in the base variant if its file is - * extracted in the overlay variant. - */ -overlay[local] -abstract class DiscardableXmlLocatable extends @xmllocatable { - /** Gets the raw file for an xmllocatable in base. */ - string getRawFileInBase() { not isOverlay() and result = getRawFile(this) } - - /** Gets a textual representation of this discardable xmllocatable. */ - string toString() { none() } -} - -overlay[local] -private predicate overlayXmlExtracted(string file) { - isOverlay() and - exists(@xmllocatable el | not files(el, _) and not xmlNs(el, _, _, _) and file = getRawFile(el)) -} - -overlay[discard_entity] -private predicate discardXmlLocatable(@xmllocatable el) { - overlayChangedFiles(el.(DiscardableXmlLocatable).getRawFileInBase()) - or - // The XML extractor is currently not incremental and may extract more - // XML files than those included in overlayChangedFiles. - overlayXmlExtracted(el.(DiscardableXmlLocatable).getRawFileInBase()) -} diff --git a/java/ql/lib/semmle/code/java/controlflow/ControlFlowReachability.qll b/java/ql/lib/semmle/code/java/controlflow/ControlFlowReachability.qll index 9fe6b9b0b1d..2b8353a6b07 100644 --- a/java/ql/lib/semmle/code/java/controlflow/ControlFlowReachability.qll +++ b/java/ql/lib/semmle/code/java/controlflow/ControlFlowReachability.qll @@ -6,11 +6,12 @@ module; import java private import codeql.controlflow.ControlFlowReachability -private import semmle.code.java.dataflow.SSA as SSA +private import semmle.code.java.dataflow.SSA private import semmle.code.java.controlflow.Guards as Guards private module ControlFlowInput implements InputSig { private import java as J + import Ssa AstNode getEnclosingAstNode(ControlFlowNode node) { node.getAstNode() = result } @@ -27,23 +28,6 @@ private module ControlFlowInput implements InputSig { private import java as J - private import semmle.code.java.dataflow.internal.BaseSSA + private import semmle.code.java.dataflow.internal.BaseSSA as Base private import semmle.code.java.dataflow.NullGuards as NullGuards class NormalExitNode = ControlFlow::NormalExitNode; @@ -211,10 +211,10 @@ private module GuardsInput implements SharedGuards::InputSig; + +import MaD /** * A class for activating additional model rows. @@ -146,60 +192,18 @@ abstract private class ActiveExperimentalModelsInternal extends string { deprecated class ActiveExperimentalModels = ActiveExperimentalModelsInternal; -/** Holds if a source model exists for the given parameters. */ -predicate sourceModel( - string package, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind, string provenance, QlBuiltins::ExtensionId madId -) { - ( - Extensions::sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance, - madId) - or - any(ActiveExperimentalModelsInternal q) - .sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance, madId) - ) -} - -/** Holds if a sink model exists for the given parameters. */ -predicate sinkModel( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance, QlBuiltins::ExtensionId madId -) { - ( - Extensions::sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, - madId) - or - any(ActiveExperimentalModelsInternal q) - .sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, madId) - ) -} - -/** Holds if a summary model exists for the given parameters. */ -predicate summaryModel( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId -) { - ( - Extensions::summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) - or - any(ActiveExperimentalModelsInternal q) - .summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, - provenance, madId) - ) -} - /** * Holds if the given extension tuple `madId` should pretty-print as `model`. * * This predicate should only be used in tests. */ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { + MaD::interpretModelForTest(madId, model) + or exists( string package, string type, boolean subtypes, string name, string signature, string ext, string output, string kind, string provenance | - sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance, madId) or Extensions::experimentalSourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance, _, madId) | @@ -212,7 +216,6 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { string package, string type, boolean subtypes, string name, string signature, string ext, string input, string kind, string provenance | - sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, madId) or Extensions::experimentalSinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, _, madId) | @@ -225,8 +228,6 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { string package, string type, boolean subtypes, string name, string signature, string ext, string input, string output, string kind, string provenance | - summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, provenance, - madId) or Extensions::experimentalSummaryModel(package, type, subtypes, name, signature, ext, input, output, kind, provenance, _, madId) | @@ -236,65 +237,6 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { ) } -/** Holds if a neutral model exists for the given parameters. */ -predicate neutralModel = Extensions::neutralModel/6; - -private predicate relevantPackage(string package) { - sourceModel(package, _, _, _, _, _, _, _, _, _) or - sinkModel(package, _, _, _, _, _, _, _, _, _) or - summaryModel(package, _, _, _, _, _, _, _, _, _, _) -} - -private predicate packageLink(string shortpkg, string longpkg) { - relevantPackage(shortpkg) and - relevantPackage(longpkg) and - longpkg.prefix(longpkg.indexOf(".")) = shortpkg -} - -private predicate canonicalPackage(string package) { - relevantPackage(package) and not packageLink(_, package) -} - -private predicate canonicalPkgLink(string package, string subpkg) { - canonicalPackage(package) and - (subpkg = package or packageLink(package, subpkg)) -} - -/** - * Holds if MaD framework coverage of `package` is `n` api endpoints of the - * kind `(kind, part)`, and `pkgs` is the number of subpackages of `package` - * which have MaD framework coverage (including `package` itself). - */ -predicate modelCoverage(string package, int pkgs, string kind, string part, int n) { - pkgs = strictcount(string subpkg | canonicalPkgLink(package, subpkg)) and - ( - part = "source" and - n = - strictcount(string subpkg, string type, boolean subtypes, string name, string signature, - string ext, string output, string provenance | - canonicalPkgLink(package, subpkg) and - sourceModel(subpkg, type, subtypes, name, signature, ext, output, kind, provenance, _) - ) - or - part = "sink" and - n = - strictcount(string subpkg, string type, boolean subtypes, string name, string signature, - string ext, string input, string provenance | - canonicalPkgLink(package, subpkg) and - sinkModel(subpkg, type, subtypes, name, signature, ext, input, kind, provenance, _) - ) - or - part = "summary" and - n = - strictcount(string subpkg, string type, boolean subtypes, string name, string signature, - string ext, string input, string output, string provenance | - canonicalPkgLink(package, subpkg) and - summaryModel(subpkg, type, subtypes, name, signature, ext, input, output, kind, provenance, - _) - ) - ) -} - /** Provides a query predicate to check the MaD models for validation errors. */ module ModelValidation { private import codeql.dataflow.internal.AccessPathSyntax as AccessPathSyntax @@ -303,7 +245,9 @@ module ModelValidation { summaryModel(_, _, _, _, _, _, path, _, _, _, _) or summaryModel(_, _, _, _, _, _, _, path, _, _, _) or sinkModel(_, _, _, _, _, _, path, _, _, _) or - sourceModel(_, _, _, _, _, _, path, _, _, _) + sourceModel(_, _, _, _, _, _, path, _, _, _) or + barrierModel(_, _, _, _, _, _, path, _, _, _) or + barrierGuardModel(_, _, _, _, _, _, path, _, _, _, _) } private module MkAccessPath = AccessPathSyntax::AccessPath; @@ -316,6 +260,8 @@ module ModelValidation { exists(string pred, AccessPath input, AccessPathToken part | sinkModel(_, _, _, _, _, _, input, _, _, _) and pred = "sink" or + barrierGuardModel(_, _, _, _, _, _, input, _, _, _, _) and pred = "barrier guard" + or summaryModel(_, _, _, _, _, _, input, _, _, _, _) and pred = "summary" | ( @@ -338,6 +284,8 @@ module ModelValidation { exists(string pred, AccessPath output, AccessPathToken part | sourceModel(_, _, _, _, _, _, output, _, _, _) and pred = "source" or + barrierModel(_, _, _, _, _, _, output, _, _, _) and pred = "barrier" + or summaryModel(_, _, _, _, _, _, _, output, _, _, _) and pred = "summary" | ( @@ -355,7 +303,13 @@ module ModelValidation { private module KindValConfig implements SharedModelVal::KindValidationConfigSig { predicate summaryKind(string kind) { summaryModel(_, _, _, _, _, _, _, _, kind, _, _) } - predicate sinkKind(string kind) { sinkModel(_, _, _, _, _, _, _, kind, _, _) } + predicate sinkKind(string kind) { + sinkModel(_, _, _, _, _, _, _, kind, _, _) + or + barrierModel(_, _, _, _, _, _, _, kind, _, _) + or + barrierGuardModel(_, _, _, _, _, _, _, _, kind, _, _) + } predicate sourceKind(string kind) { sourceModel(_, _, _, _, _, _, _, kind, _, _) } @@ -373,6 +327,11 @@ module ModelValidation { or sinkModel(package, type, _, name, signature, ext, _, _, provenance, _) and pred = "sink" or + barrierModel(package, type, _, name, signature, ext, _, _, provenance, _) and pred = "barrier" + or + barrierGuardModel(package, type, _, name, signature, ext, _, _, _, provenance, _) and + pred = "barrier guard" + or summaryModel(package, type, _, name, signature, ext, _, _, _, provenance, _) and pred = "summary" or @@ -398,6 +357,14 @@ module ModelValidation { invalidProvenance(provenance) and result = "Unrecognized provenance description \"" + provenance + "\" in " + pred + " model." ) + or + exists(string acceptingvalue | + barrierGuardModel(_, _, _, _, _, _, _, acceptingvalue, _, _, _) and + invalidAcceptingValue(acceptingvalue) and + result = + "Unrecognized accepting value description \"" + acceptingvalue + + "\" in barrier guard model." + ) } /** Holds if some row in a MaD flow model appears to contain typos. */ @@ -418,6 +385,10 @@ private predicate elementSpec( or sinkModel(package, type, subtypes, name, signature, ext, _, _, _, _) or + barrierModel(package, type, subtypes, name, signature, ext, _, _, _, _) + or + barrierGuardModel(package, type, subtypes, name, signature, ext, _, _, _, _, _) + or summaryModel(package, type, subtypes, name, signature, ext, _, _, _, _, _) or neutralModel(package, type, name, signature, _, _) and ext = "" and subtypes = true @@ -578,6 +549,53 @@ private module Cached { isSinkNode(n, kind, model) and n.asNode() = node ) } + + private newtype TKindModelPair = + TMkPair(string kind, string model) { isBarrierGuardNode(_, _, kind, model) } + + private GuardValue convertAcceptingValue(AcceptingValue av) { + av.isTrue() and result.asBooleanValue() = true + or + av.isFalse() and result.asBooleanValue() = false + or + av.isNoException() and result.getDualValue().isThrowsException() + or + av.isZero() and result.asIntValue() = 0 + or + av.isNotZero() and result.getDualValue().asIntValue() = 0 + or + av.isNull() and result.isNullValue() + or + av.isNotNull() and result.isNonNullValue() + } + + private predicate barrierGuardChecks(Guard g, Expr e, GuardValue gv, TKindModelPair kmp) { + exists( + SourceSinkInterpretationInput::InterpretNode n, AcceptingValue acceptingvalue, string kind, + string model + | + isBarrierGuardNode(n, acceptingvalue, kind, model) and + n.asNode().asExpr() = e and + kmp = TMkPair(kind, model) and + gv = convertAcceptingValue(acceptingvalue) + | + g.(Call).getAnArgument() = e or g.(MethodCall).getQualifier() = e + ) + } + + /** + * Holds if `node` is specified as a barrier with the given kind in a MaD flow + * model. + */ + cached + predicate barrierNode(Node node, string kind, string model) { + exists(SourceSinkInterpretationInput::InterpretNode n | + isBarrierNode(n, kind, model) and n.asNode() = node + ) + or + ParameterizedBarrierGuard::getABarrierNode(TMkPair(kind, + model)) = node + } } import Cached @@ -594,6 +612,12 @@ predicate sourceNode(Node node, string kind) { sourceNode(node, kind, _) } */ predicate sinkNode(Node node, string kind) { sinkNode(node, kind, _) } +/** + * Holds if `node` is specified as a barrier with the given kind in a MaD flow + * model. + */ +predicate barrierNode(Node node, string kind) { barrierNode(node, kind, _) } + // adapter class for converting Mad summaries to `SummarizedCallable`s private class SummarizedCallableAdapter extends SummarizedCallable { SummarizedCallableAdapter() { summaryElement(this, _, _, _, _, _, _) } diff --git a/java/ql/lib/semmle/code/java/dataflow/NullGuards.qll b/java/ql/lib/semmle/code/java/dataflow/NullGuards.qll index bf9a166e048..709bb1e3d47 100644 --- a/java/ql/lib/semmle/code/java/dataflow/NullGuards.qll +++ b/java/ql/lib/semmle/code/java/dataflow/NullGuards.qll @@ -26,9 +26,9 @@ Expr enumConstEquality(Expr e, boolean polarity, EnumConstant c) { } /** Gets an instanceof expression of `v` with type `type` */ -InstanceOfExpr instanceofExpr(SsaVariable v, RefType type) { +InstanceOfExpr instanceofExpr(SsaDefinition v, RefType type) { result.getCheckedType() = type and - result.getExpr() = v.getAUse() + result.getExpr() = v.getARead() } /** @@ -37,8 +37,8 @@ InstanceOfExpr instanceofExpr(SsaVariable v, RefType type) { * * Note this includes Kotlin's `==` and `!=` operators, which are value-equality tests. */ -EqualityTest varEqualityTestExpr(SsaVariable v1, SsaVariable v2, boolean isEqualExpr) { - result.hasOperands(v1.getAUse(), v2.getAUse()) and +EqualityTest varEqualityTestExpr(SsaDefinition v1, SsaDefinition v2, boolean isEqualExpr) { + result.hasOperands(v1.getARead(), v2.getARead()) and isEqualExpr = result.polarity() } @@ -91,37 +91,44 @@ Expr clearlyNotNullExpr(Expr reason) { (reason = r1 or reason = r2) ) or - exists(SsaVariable v, boolean branch, VarRead rval, Guard guard | + exists(SsaDefinition v, boolean branch, VarRead rval, Guard guard | guard = directNullGuard(v, branch, false) and guard.controls(rval.getBasicBlock(), branch) and reason = guard and - rval = v.getAUse() and + rval = v.getARead() and result = rval and not result = baseNotNullExpr() ) or - exists(SsaVariable v | + exists(SsaDefinition v | clearlyNotNull(v, reason) and - result = v.getAUse() and + result = v.getARead() and + not result = baseNotNullExpr() + ) + or + exists(Field f | + result = f.getAnAccess() and + f.isFinal() and + f.getInitializer() = clearlyNotNullExpr(reason) and not result = baseNotNullExpr() ) } /** Holds if `v` is an SSA variable that is provably not `null`. */ -predicate clearlyNotNull(SsaVariable v, Expr reason) { +predicate clearlyNotNull(SsaDefinition v, Expr reason) { exists(Expr src | - src = v.(SsaExplicitUpdate).getDefiningExpr().(VariableAssign).getSource() and + src = v.(SsaExplicitWrite).getValue() and src = clearlyNotNullExpr(reason) ) or exists(CatchClause cc, LocalVariableDeclExpr decl | decl = cc.getVariable() and - decl = v.(SsaExplicitUpdate).getDefiningExpr() and + decl = v.(SsaExplicitWrite).getDefiningExpr() and reason = decl ) or - exists(SsaVariable captured | - v.(SsaImplicitInit).captures(captured) and + exists(SsaDefinition captured | + v.(SsaCapturedDefinition).captures(captured) and clearlyNotNull(captured, reason) ) or @@ -136,7 +143,7 @@ predicate clearlyNotNull(SsaVariable v, Expr reason) { Expr clearlyNotNullExpr() { result = clearlyNotNullExpr(_) } /** Holds if `v` is an SSA variable that is provably not `null`. */ -predicate clearlyNotNull(SsaVariable v) { clearlyNotNull(v, _) } +predicate clearlyNotNull(SsaDefinition v) { clearlyNotNull(v, _) } /** * Holds if the evaluation of a call to `m` resulting in the value `branch` @@ -207,7 +214,7 @@ deprecated Expr basicOrCustomNullGuard(Expr e, boolean branch, boolean isnull) { * If `result` evaluates to `branch`, then `v` is guaranteed to be null if `isnull` * is true, and non-null if `isnull` is false. */ -Expr directNullGuard(SsaVariable v, boolean branch, boolean isnull) { +Expr directNullGuard(SsaDefinition v, boolean branch, boolean isnull) { result = basicNullGuard(sameValue(v, _), branch, isnull) } @@ -219,7 +226,7 @@ Expr directNullGuard(SsaVariable v, boolean branch, boolean isnull) { * If `result` evaluates to `branch`, then `v` is guaranteed to be null if `isnull` * is true, and non-null if `isnull` is false. */ -deprecated Guard nullGuard(SsaVariable v, boolean branch, boolean isnull) { +deprecated Guard nullGuard(SsaDefinition v, boolean branch, boolean isnull) { result = directNullGuard(v, branch, isnull) } @@ -228,7 +235,9 @@ deprecated Guard nullGuard(SsaVariable v, boolean branch, boolean isnull) { * from `bb1` to `bb2` implies that `v` is guaranteed to be null if `isnull` is * true, and non-null if `isnull` is false. */ -predicate nullGuardControlsBranchEdge(SsaVariable v, boolean isnull, BasicBlock bb1, BasicBlock bb2) { +predicate nullGuardControlsBranchEdge( + SsaDefinition v, boolean isnull, BasicBlock bb1, BasicBlock bb2 +) { exists(GuardValue gv | Guards_v3::ssaControlsBranchEdge(v, bb1, bb2, gv) and gv.isNullness(isnull) @@ -240,7 +249,7 @@ predicate nullGuardControlsBranchEdge(SsaVariable v, boolean isnull, BasicBlock * `bb` `v` is guaranteed to be null if `isnull` is true, and non-null if * `isnull` is false. */ -predicate nullGuardControls(SsaVariable v, boolean isnull, BasicBlock bb) { +predicate nullGuardControls(SsaDefinition v, boolean isnull, BasicBlock bb) { exists(GuardValue gv | Guards_v3::ssaControls(v, bb, gv) and gv.isNullness(isnull) @@ -263,6 +272,6 @@ predicate guardSuggestsExprMaybeNull(Expr guard, Expr e) { /** * Holds if `guard` is a guard expression that suggests that `v` might be null. */ -predicate guardSuggestsVarMaybeNull(Expr guard, SsaVariable v) { +predicate guardSuggestsVarMaybeNull(Expr guard, SsaDefinition v) { guardSuggestsExprMaybeNull(guard, sameValue(v, _)) } diff --git a/java/ql/lib/semmle/code/java/dataflow/Nullness.qll b/java/ql/lib/semmle/code/java/dataflow/Nullness.qll index c9f5ad4f781..d8b1c19b07f 100644 --- a/java/ql/lib/semmle/code/java/dataflow/Nullness.qll +++ b/java/ql/lib/semmle/code/java/dataflow/Nullness.qll @@ -113,7 +113,7 @@ predicate dereference(Expr e) { * * The `VarAccess` is included for nicer error reporting. */ -private ControlFlowNode varDereference(SsaVariable v, VarAccess va) { +private ControlFlowNode varDereference(SsaDefinition v, VarAccess va) { dereference(result.asExpr()) and result.asExpr() = sameValue(v, va) } @@ -121,7 +121,7 @@ private ControlFlowNode varDereference(SsaVariable v, VarAccess va) { /** * The first dereference of a variable in a given `BasicBlock`. */ -private predicate firstVarDereferenceInBlock(BasicBlock bb, SsaVariable v, VarAccess va) { +private predicate firstVarDereferenceInBlock(BasicBlock bb, SsaDefinition v, VarAccess va) { exists(ControlFlowNode n | varDereference(v, va) = n and n.getBasicBlock() = bb and @@ -135,14 +135,14 @@ private predicate firstVarDereferenceInBlock(BasicBlock bb, SsaVariable v, VarAc } /** A variable suspected of being `null`. */ -private predicate varMaybeNull(SsaVariable v, ControlFlowNode node, string msg, Expr reason) { +private predicate varMaybeNull(SsaDefinition v, ControlFlowNode node, string msg, Expr reason) { // A variable compared to null might be null. exists(Expr e | reason = e and msg = "as suggested by $@ null guard" and guardSuggestsVarMaybeNull(e, v) and - node = v.getCfgNode() and - not v instanceof SsaPhiNode and + node = v.getControlFlowNode() and + not v instanceof SsaPhiDefinition and not clearlyNotNull(v) and // Comparisons in finally blocks are excluded since missing exception edges in the CFG could otherwise yield FPs. not exists(TryStmt try | try.getFinally() = e.getEnclosingStmt().getEnclosingStmt*()) and @@ -151,13 +151,13 @@ private predicate varMaybeNull(SsaVariable v, ControlFlowNode node, string msg, not exists(MethodCall ma | ma.getAnArgument().getAChildExpr*() = e) ) and // Don't use a guard as reason if there is a null assignment. - not v.(SsaExplicitUpdate).getDefiningExpr().(VariableAssign).getSource() = nullExpr() + not v.(SsaExplicitWrite).getDefiningExpr().(VariableAssign).getSource() = nullExpr() ) or // A parameter might be null if there is a null argument somewhere. exists(Parameter p, Expr arg | - v.(SsaImplicitInit).isParameterDefinition(p) and - node = v.getCfgNode() and + v.(SsaParameterInit).getParameter() = p and + node = v.getControlFlowNode() and p.getAnArgument() = arg and reason = arg and msg = "because of $@ null argument" and @@ -167,7 +167,7 @@ private predicate varMaybeNull(SsaVariable v, ControlFlowNode node, string msg, or // If the source of a variable is null then the variable may be null. exists(VariableAssign def | - v.(SsaExplicitUpdate).getDefiningExpr() = def and + v.(SsaExplicitWrite).getDefiningExpr() = def and def.getSource() = nullExpr(node.asExpr()) and reason = def and msg = "because of $@ assignment" @@ -179,26 +179,26 @@ private Expr nonEmptyExpr() { // An array creation with a known positive size is trivially non-empty. result.(ArrayCreationExpr).getFirstDimensionSize() > 0 or - exists(SsaVariable v | + exists(SsaDefinition v | // A use of an array variable is non-empty if... - result = v.getAUse() and + result = v.getARead() and v.getSourceVariable().getType() instanceof Array | // ...its definition is non-empty... - v.(SsaExplicitUpdate).getDefiningExpr().(VariableAssign).getSource() = nonEmptyExpr() + v.(SsaExplicitWrite).getValue() = nonEmptyExpr() or // ...or it is guarded by a condition proving its length to be non-zero. exists(ConditionBlock cond, boolean branch, FieldAccess length | cond.controls(result.getBasicBlock(), branch) and cond.getCondition() = nonZeroGuard(length, branch) and length.getField().hasName("length") and - length.getQualifier() = v.getAUse() + length.getQualifier() = v.getARead() ) ) or - exists(SsaVariable v | + exists(SsaDefinition v | // A use of a Collection variable is non-empty if... - result = v.getAUse() and + result = v.getARead() and v.getSourceVariable().getType() instanceof CollectionType and exists(ConditionBlock cond, boolean branch, Expr c | // ...it is guarded by a condition... @@ -216,13 +216,13 @@ private Expr nonEmptyExpr() { // ...and the condition proves that it is non-empty, either by using the `isEmpty` method... c.(MethodCall).getMethod().hasName("isEmpty") and branch = false and - c.(MethodCall).getQualifier() = v.getAUse() + c.(MethodCall).getQualifier() = v.getARead() or // ...or a check on its `size`. exists(MethodCall size | c = nonZeroGuard(size, branch) and size.getMethod().hasName("size") and - size.getQualifier() = v.getAUse() + size.getQualifier() = v.getARead() ) ) ) @@ -249,9 +249,9 @@ private predicate impossibleEdge(BasicBlock bb1, BasicBlock bb2) { } private module NullnessConfig implements ControlFlowReachability::ConfigSig { - predicate source(ControlFlowNode node, SsaVariable def) { varMaybeNull(def, node, _, _) } + predicate source(ControlFlowNode node, SsaDefinition def) { varMaybeNull(def, node, _, _) } - predicate sink(ControlFlowNode node, SsaVariable def) { varDereference(def, _) = node } + predicate sink(ControlFlowNode node, SsaDefinition def) { varDereference(def, _) = node } predicate barrierValue(GuardValue gv) { gv.isNullness(false) } @@ -266,7 +266,7 @@ private module NullnessFlow = ControlFlowReachability::Flow; * Holds if the dereference of `v` at `va` might be `null`. */ predicate nullDeref(SsaSourceVariable v, VarAccess va, string msg, Expr reason) { - exists(SsaVariable origin, SsaVariable ssa, ControlFlowNode src, ControlFlowNode sink | + exists(SsaDefinition origin, SsaDefinition ssa, ControlFlowNode src, ControlFlowNode sink | varMaybeNull(origin, src, msg, reason) and NullnessFlow::flow(src, origin, sink, ssa) and ssa.getSourceVariable() = v and @@ -278,9 +278,9 @@ predicate nullDeref(SsaSourceVariable v, VarAccess va, string msg, Expr reason) * A dereference of a variable that is always `null`. */ predicate alwaysNullDeref(SsaSourceVariable v, VarAccess va) { - exists(BasicBlock bb, SsaVariable ssa | - forall(SsaVariable def | def = ssa.getAnUltimateDefinition() | - def.(SsaExplicitUpdate).getDefiningExpr().(VariableAssign).getSource() = alwaysNullExpr() + exists(BasicBlock bb, SsaDefinition ssa | + forall(SsaDefinition def | def = ssa.getAnUltimateDefinition() | + def.(SsaExplicitWrite).getValue() = alwaysNullExpr() ) or nullGuardControls(ssa, true, bb) and diff --git a/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll b/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll index f65e15d1c61..ac43590e4dc 100644 --- a/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll +++ b/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll @@ -242,17 +242,17 @@ module Sem implements Semantic { Type getSsaType(SsaVariable var) { result = var.getSourceVariable().getType() } - final private class FinalSsaVariable = SSA::SsaVariable; + final private class FinalSsaVariable = SSA::SsaDefinition; class SsaVariable extends FinalSsaVariable { - Expr getAUse() { result = super.getAUse() } + Expr getAUse() { result = super.getARead() } } - class SsaPhiNode extends SsaVariable instanceof SSA::SsaPhiNode { + class SsaPhiNode extends SsaVariable instanceof SSA::SsaPhiDefinition { predicate hasInputFromBlock(SsaVariable inp, BasicBlock bb) { super.hasInputFromBlock(inp, bb) } } - class SsaExplicitUpdate extends SsaVariable instanceof SSA::SsaExplicitUpdate { + class SsaExplicitUpdate extends SsaVariable instanceof SSA::SsaExplicitWrite { Expr getDefiningExpr() { result = super.getDefiningExpr() } } diff --git a/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll b/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll index efd7bcd8088..6985053735c 100644 --- a/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll +++ b/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll @@ -30,17 +30,17 @@ predicate eqFlowCond = U::eqFlowCond/5; * only other input to `phi` is a `null` value. * * Note that the declared type of `phi` is `SsaVariable` instead of - * `SsaPhiNode` in order for the reflexive case of `nonNullSsaFwdStep*(..)` to - * have non-`SsaPhiNode` results. + * `SsaPhiDefinition` in order for the reflexive case of `nonNullSsaFwdStep*(..)` to + * have non-`SsaPhiDefinition` results. */ -private predicate nonNullSsaFwdStep(SsaVariable v, SsaVariable phi) { - exists(SsaExplicitUpdate vnull, SsaPhiNode phi0 | phi0 = phi | - 2 = strictcount(phi0.getAPhiInput()) and - vnull = phi0.getAPhiInput() and - v = phi0.getAPhiInput() and +private predicate nonNullSsaFwdStep(SsaDefinition v, SsaDefinition phi) { + exists(SsaExplicitWrite vnull, SsaPhiDefinition phi0 | phi0 = phi | + 2 = strictcount(phi0.getAnInput()) and + vnull = phi0.getAnInput() and + v = phi0.getAnInput() and not backEdge(phi0, v, _) and vnull != v and - vnull.getDefiningExpr().(VariableAssign).getSource() instanceof NullLiteral + vnull.getValue() instanceof NullLiteral ) } @@ -56,13 +56,13 @@ private predicate nonNullDefStep(Expr e1, Expr e2) { * explicit `ArrayCreationExpr` definition and that the definition does not go * through a back edge. */ -ArrayCreationExpr getArrayDef(SsaVariable v) { +ArrayCreationExpr getArrayDef(SsaDefinition v) { exists(Expr src | - v.(SsaExplicitUpdate).getDefiningExpr().(VariableAssign).getSource() = src and + v.(SsaExplicitWrite).getValue() = src and nonNullDefStep*(result, src) ) or - exists(SsaVariable mid | + exists(SsaDefinition mid | result = getArrayDef(mid) and nonNullSsaFwdStep(mid, v) ) @@ -74,9 +74,9 @@ ArrayCreationExpr getArrayDef(SsaVariable v) { * `arrlen` without going through a back edge. */ private predicate arrayLengthDef(FieldRead arrlen, ArrayCreationExpr def) { - exists(SsaVariable arr | + exists(SsaDefinition arr | arrlen.getField() instanceof ArrayLengthField and - arrlen.getQualifier() = arr.getAUse() and + arrlen.getQualifier() = arr.getARead() and def = getArrayDef(arr) ) } @@ -86,9 +86,11 @@ pragma[nomagic] private predicate constantIntegerExpr(Expr e, int val) { e.(CompileTimeConstantExpr).getIntValue() = val or - exists(SsaExplicitUpdate v, Expr src | - e = v.getAUse() and - src = v.getDefiningExpr().(VariableAssign).getSource() and + e.(LongLiteral).getValue().toInt() = val + or + exists(SsaExplicitWrite v, Expr src | + e = v.getARead() and + src = v.getValue() and constantIntegerExpr(src, val) ) or @@ -112,9 +114,9 @@ pragma[nomagic] private predicate constantBooleanExpr(Expr e, boolean val) { e.(CompileTimeConstantExpr).getBooleanValue() = val or - exists(SsaExplicitUpdate v, Expr src | - e = v.getAUse() and - src = v.getDefiningExpr().(VariableAssign).getSource() and + exists(SsaExplicitWrite v, Expr src | + e = v.getARead() and + src = v.getValue() and constantBooleanExpr(src, val) ) or @@ -125,9 +127,9 @@ pragma[nomagic] private predicate constantStringExpr(Expr e, string val) { e.(CompileTimeConstantExpr).getStringValue() = val or - exists(SsaExplicitUpdate v, Expr src | - e = v.getAUse() and - src = v.getDefiningExpr().(VariableAssign).getSource() and + exists(SsaExplicitWrite v, Expr src | + e = v.getARead() and + src = v.getValue() and constantStringExpr(src, val) ) } diff --git a/java/ql/lib/semmle/code/java/dataflow/SSA.qll b/java/ql/lib/semmle/code/java/dataflow/SSA.qll index 40da9a4e94d..a627904174b 100644 --- a/java/ql/lib/semmle/code/java/dataflow/SSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/SSA.qll @@ -5,16 +5,16 @@ * `ControlFlowNode` at which it is defined. Each SSA variable is defined * either by a phi node, an implicit initial value (for parameters and fields), * an explicit update, or an implicit update (for fields). - * An implicit update occurs either at a `Call` that might modify a field, at - * another update that can update the qualifier of a field, or at a `FieldRead` - * of the field in case the field is not amenable to a non-trivial SSA - * representation. + * An implicit update occurs either at a `Call` that might modify a field, or + * at another update that can update the qualifier of a field. */ overlay[local?] module; import java private import internal.SsaImpl +import internal.SsaImpl::Ssa as Ssa +import Ssa /** * A fully qualified variable in the context of a `Callable` in which it is @@ -105,7 +105,7 @@ class SsaSourceVariable extends TSsaSourceVariable { SsaSourceVariable getQualifier() { this = TQualifiedField(_, result, _) } /** Gets an SSA variable that has this variable as its underlying source variable. */ - SsaVariable getAnSsaVariable() { result.getSourceVariable() = this } + SsaDefinition getAnSsaVariable() { result.getSourceVariable() = this } } /** @@ -138,22 +138,76 @@ class SsaSourceField extends SsaSourceVariable { } } +/** An SSA definition in a closure that captures a variable. */ +class SsaCapturedDefinition extends SsaImplicitEntryDefinition { + SsaCapturedDefinition() { captures(this, _) } + + override string toString() { result = "SSA capture def(" + this.getSourceVariable() + ")" } + + /** Holds if this definition captures the value of `capturedvar`. */ + predicate captures(SsaDefinition capturedvar) { captures(this, capturedvar) } + + /** + * Gets a definition that ultimately defines the captured variable and is not itself a phi node. + */ + SsaDefinition getAnUltimateCapturedDefinition() { + exists(SsaDefinition capturedvar | + captures(this, capturedvar) and result = capturedvar.getAnUltimateDefinition() + ) + } +} + /** + * An SSA definition representing the potential definition of a variable + * via a call. + */ +class SsaImplicitCallDefinition extends SsaImplicitWrite { + SsaImplicitCallDefinition() { isNonLocal(this) and not hasQualifierUpdate(this) } + + override string toString() { result = "SSA call def(" + this.getSourceVariable() + ")" } + + /** + * Gets a reachable `FieldWrite` that might represent this ssa update, if any. + */ + overlay[global] + FieldWrite getANonLocalUpdate() { result = getANonLocalUpdate(this) } +} + +/** An SSA definition due to an update of the qualifier. */ +class SsaImplicitQualifierDefinition extends SsaImplicitWrite { + SsaImplicitQualifierDefinition() { hasQualifierUpdate(this) } + + override string toString() { result = "SSA qualifier def(" + this.getSourceVariable() + ")" } +} + +/** + * Gets an access of the SSA source variable underlying this SSA variable + * that can be reached from this SSA variable without passing through any + * other uses, but potentially through phi nodes and uncertain implicit + * updates. + */ +VarRead ssaGetAFirstUse(SsaDefinition def) { firstUse(def, result) } + +/** + * DEPRECATED: use `SsaDefinition` instead. + * * An SSA variable. */ -class SsaVariable extends Definition { +deprecated class SsaVariable extends Definition { /** Gets the SSA source variable underlying this SSA variable. */ SsaSourceVariable getSourceVariable() { result = super.getSourceVariable() } - /** Gets the `ControlFlowNode` at which this SSA variable is defined. */ + /** + * DEPRECATED: Use `getControlFlowNode()` instead. + * + * Gets the `ControlFlowNode` at which this SSA variable is defined. + */ pragma[nomagic] - ControlFlowNode getCfgNode() { - exists(BasicBlock bb, int i, int j | + deprecated ControlFlowNode getCfgNode() { + exists(BasicBlock bb, int i | this.definesAt(_, bb, i) and - // untracked definitions are inserted just before reads - (if this instanceof UntrackedDef then j = i + 1 else j = i) and // phi nodes are inserted at position `-1` - result = bb.getNode(0.maximum(j)) + result = bb.getNode(0.maximum(i)) ) } @@ -166,10 +220,16 @@ class SsaVariable extends Definition { /** Gets the `BasicBlock` in which this SSA variable is defined. */ BasicBlock getBasicBlock() { result = super.getBasicBlock() } - /** Gets an access of this SSA variable. */ - VarRead getAUse() { result = getAUse(this) } + /** + * DEPRECATED: Use `getARead()` instead. + * + * Gets an access of this SSA variable. + */ + deprecated VarRead getAUse() { result = getAUse(this) } /** + * DEPRECATED: Use `ssaGetAFirstUse(SsaDefinition)` instead. + * * Gets an access of the SSA source variable underlying this SSA variable * that can be reached from this SSA variable without passing through any * other uses, but potentially through phi nodes and uncertain implicit @@ -178,35 +238,50 @@ class SsaVariable extends Definition { * Subsequent uses can be found by following the steps defined by * `adjacentUseUse`. */ - VarRead getAFirstUse() { firstUse(this, result) } + deprecated VarRead getAFirstUse() { firstUse(this, result) } /** Holds if this SSA variable is live at the end of `b`. */ predicate isLiveAtEndOfBlock(BasicBlock b) { ssaDefReachesEndOfBlock(b, this) } /** + * DEPRECATED. + * * Gets an SSA variable whose value can flow to this one in one step. This * includes inputs to phi nodes, the prior definition of uncertain updates, * and the captured ssa variable for a closure variable. */ - SsaVariable getAPhiInputOrPriorDef() { + deprecated SsaVariable getAPhiInputOrPriorDef() { result = this.(SsaPhiNode).getAPhiInput() or result = this.(SsaUncertainImplicitUpdate).getPriorDef() or this.(SsaImplicitInit).captures(result) } - /** Gets a definition that ultimately defines this variable and is not itself a phi node. */ - SsaVariable getAnUltimateDefinition() { + /** + * DEPRECATED: Use `SsaCapturedDefinition::getAnUltimateCapturedDefinition()` + * and/or `SsaDefinition::getAnUltimateDefinition()` instead. + * + * Gets a definition that ultimately defines this variable and is not itself a phi node. + */ + deprecated SsaVariable getAnUltimateDefinition() { result = this.getAPhiInputOrPriorDef*() and not result instanceof SsaPhiNode } } -/** An SSA variable that either explicitly or implicitly updates the variable. */ -class SsaUpdate extends SsaVariable instanceof WriteDefinition { +/** + * DEPRECATED: use `SsaWriteDefinition` instead. + * + * An SSA variable that either explicitly or implicitly updates the variable. + */ +deprecated class SsaUpdate extends SsaVariable instanceof WriteDefinition { SsaUpdate() { not this instanceof SsaImplicitInit } } -/** An SSA variable that is defined by a `VariableUpdate`. */ -class SsaExplicitUpdate extends SsaUpdate { +/** + * DEPRECATED: Use `SsaExplicitWrite` instead. + * + * An SSA variable that is defined by a `VariableUpdate`. + */ +deprecated class SsaExplicitUpdate extends SsaUpdate { private VariableUpdate upd; SsaExplicitUpdate() { ssaExplicitUpdate(this, upd) } @@ -218,12 +293,14 @@ class SsaExplicitUpdate extends SsaUpdate { } /** + * DEPRECATED: Use `SsaImplicitWrite` instead. + * * An SSA variable that represents any sort of implicit update. This can be a * `Call` that might reach a non-local update of the field, an explicit or * implicit update of the qualifier of the field, or the implicit update that * occurs just prior to a `FieldRead` of an untracked field. */ -class SsaImplicitUpdate extends SsaUpdate { +deprecated class SsaImplicitUpdate extends SsaUpdate { SsaImplicitUpdate() { not this instanceof SsaExplicitUpdate } override string toString() { @@ -246,73 +323,93 @@ class SsaImplicitUpdate extends SsaUpdate { } private string getKind() { - this instanceof UntrackedDef and result = "untracked" - or this.hasExplicitQualifierUpdate() and - result = "explicit qualifier" + result = "explicit qualifier" // -> SSA qualifier def or if this.hasImplicitQualifierUpdate() then if isNonLocal(this) - then result = "nonlocal + nonlocal qualifier" - else result = "nonlocal qualifier" + then result = "nonlocal + nonlocal qualifier" // -> SSA qualifier def + else result = "nonlocal qualifier" // -> SSA qualifier def else ( - isNonLocal(this) and result = "nonlocal" + isNonLocal(this) and result = "nonlocal" // -> SSA call def ) } /** + * DEPRECATED: Use `SsaImplicitCallDefinition.getANonLocalUpdate()` instead. + * * Gets a reachable `FieldWrite` that might represent this ssa update, if any. */ overlay[global] - FieldWrite getANonLocalUpdate() { - exists(SsaSourceField f, Callable setter | - relevantFieldUpdate(setter, f.getField(), result) and - defUpdatesNamedField(this, f, setter) - ) - } + deprecated FieldWrite getANonLocalUpdate() { result = getANonLocalUpdate(this) } /** + * DEPRECATED: Use `SsaImplicitQualifierDefinition` instead. + * * Holds if this ssa variable might change the value to something unknown. * * Examples include updates that might change the value of the qualifier, or * reads from untracked variables, for example those where the field or one * of its qualifiers is volatile. */ - predicate assignsUnknownValue() { - this instanceof UntrackedDef - or + deprecated predicate assignsUnknownValue() { this.hasExplicitQualifierUpdate() or this.hasImplicitQualifierUpdate() } } -overlay[global] -private predicate isNonLocalImpl(SsaImplicitUpdate su) { exists(su.getANonLocalUpdate()) } - -private predicate isNonLocal(SsaImplicitUpdate su) = forceLocal(isNonLocalImpl/1)(su) +private predicate hasQualifierUpdate(SsaImplicitWrite def) { + exists(SsaWriteDefinition qdef, BasicBlock bb, int i | + qdef.definesAt(def.getSourceVariable().getQualifier(), bb, i) and + def.definesAt(_, bb, i) and + not qdef instanceof SsaImplicitEntryDefinition + ) +} /** + * Gets a reachable `FieldWrite` that might represent this ssa update, if any. + */ +overlay[global] +private FieldWrite getANonLocalUpdate(SsaImplicitWrite calldef) { + exists(SsaSourceField f, Callable setter | + relevantFieldUpdate(setter, f.getField(), result) and + defUpdatesNamedField(calldef, f, setter) + ) +} + +overlay[global] +private predicate isNonLocalImpl(SsaImplicitWrite calldef) { exists(getANonLocalUpdate(calldef)) } + +private predicate isNonLocal(SsaImplicitWrite calldef) = forceLocal(isNonLocalImpl/1)(calldef) + +/** + * DEPRECATED: Use `SsaUncertainWrite` instead. + * * An SSA variable that represents an uncertain implicit update of the value. * This is a `Call` that might reach a non-local update of the field or one of * its qualifiers. */ -class SsaUncertainImplicitUpdate extends SsaImplicitUpdate { +deprecated class SsaUncertainImplicitUpdate extends SsaImplicitUpdate { SsaUncertainImplicitUpdate() { ssaUncertainImplicitUpdate(this) } /** + * DEPRECATED: Use `getPriorDefinition()` instead. + * * Gets the immediately preceding definition. Since this update is uncertain * the value from the preceding definition might still be valid. */ - SsaVariable getPriorDef() { ssaDefReachesUncertainDef(result, this) } + deprecated SsaVariable getPriorDef() { ssaDefReachesUncertainDef(result, this) } } /** + * DEPRECATED: Use `SsaParameterInit`, `SsaImplicitEntryDefinition`, or `SsaCapturedDefinition` instead. + * * An SSA variable that is defined by its initial value in the callable. This * includes initial values of parameters, fields, and closure variables. */ -class SsaImplicitInit extends SsaVariable instanceof WriteDefinition { +deprecated class SsaImplicitInit extends SsaVariable instanceof WriteDefinition { SsaImplicitInit() { ssaImplicitInit(this) } override string toString() { result = "SSA init(" + this.getSourceVariable() + ")" } @@ -321,20 +418,30 @@ class SsaImplicitInit extends SsaVariable instanceof WriteDefinition { predicate captures(SsaVariable capturedvar) { captures(this, capturedvar) } /** + * DEPRECATED: Use `SsaParameterInit::getParameter()` instead. + * * Holds if the SSA variable is a parameter defined by its initial value in the callable. */ - predicate isParameterDefinition(Parameter p) { + deprecated predicate isParameterDefinition(Parameter p) { this.getSourceVariable() = TLocalVar(p.getCallable(), p) and p.getCallable().getBody().getControlFlowNode() = this.getCfgNode() } } -/** An SSA phi node. */ -class SsaPhiNode extends SsaVariable instanceof PhiNode { +/** + * DEPRECATED: Use `SsaPhiDefinition` instead. + * + * An SSA phi node. + */ +deprecated class SsaPhiNode extends SsaVariable instanceof PhiNode { override string toString() { result = "SSA phi(" + this.getSourceVariable() + ")" } - /** Gets an input to the phi node defining the SSA variable. */ - SsaVariable getAPhiInput() { this.hasInputFromBlock(result, _) } + /** + * DEPRECATED: Use `getAnInput()` instead. + * + * Gets an input to the phi node defining the SSA variable. + */ + deprecated SsaVariable getAPhiInput() { this.hasInputFromBlock(result, _) } /** Gets an input to the phi node defining the SSA variable. */ SsaVariable getAnInput() { this.hasInputFromBlock(result, _) } @@ -357,10 +464,10 @@ private class RefTypeCastingExpr extends CastingExpr { * * The `VarAccess` represents the access to `v` that `result` has the same value as. */ -Expr sameValue(SsaVariable v, VarAccess va) { - result = v.getAUse() and result = va +Expr sameValue(SsaDefinition v, VarAccess va) { + result = v.getARead() and result = va or - result.(AssignExpr).getDest() = va and result = v.(SsaExplicitUpdate).getDefiningExpr() + result.(AssignExpr).getDest() = va and result = v.(SsaExplicitWrite).getDefiningExpr() or result.(AssignExpr).getSource() = sameValue(v, va) or diff --git a/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll b/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll index 8ce9b1b9120..21cfc54fdf8 100644 --- a/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll @@ -12,7 +12,7 @@ module; import java as J private import semmle.code.java.dispatch.VirtualDispatch -private import semmle.code.java.dataflow.internal.BaseSSA +private import semmle.code.java.dataflow.internal.BaseSSA as Base private import semmle.code.java.controlflow.Guards private import codeql.typeflow.TypeFlow private import codeql.typeflow.UniversalFlow as UniversalFlow @@ -27,7 +27,7 @@ private RefType boxIfNeeded(J::Type t) { module FlowStepsInput implements UniversalFlow::UniversalFlowInput { private newtype TFlowNode = TField(Field f) { not f.getType() instanceof PrimitiveType } or - TSsa(BaseSsaVariable ssa) { not ssa.getSourceVariable().getType() instanceof PrimitiveType } or + TSsa(Base::SsaDefinition ssa) { not ssa.getSourceVariable().getType() instanceof PrimitiveType } or TExpr(Expr e) or TMethod(Method m) { not m.getReturnType() instanceof PrimitiveType } @@ -55,7 +55,7 @@ module FlowStepsInput implements UniversalFlow::UniversalFlowInput { Field asField() { this = TField(result) } /** Gets the SSA variable corresponding to this node, if any. */ - BaseSsaVariable asSsa() { this = TSsa(result) } + Base::SsaDefinition asSsa() { this = TSsa(result) } /** Gets the expression corresponding to this node, if any. */ Expr asExpr() { this = TExpr(result) } @@ -107,7 +107,7 @@ module FlowStepsInput implements UniversalFlow::UniversalFlowInput { not e.(FieldAccess).getField() = f ) or - n2.asSsa().(BaseSsaPhiNode).getAnUltimateLocalDefinition() = n1.asSsa() + n2.asSsa().(Base::SsaPhiDefinition).getAnUltimateDefinition() = n1.asSsa() or exists(ReturnStmt ret | n2.asMethod() = ret.getEnclosingCallable() and ret.getResult() = n1.asExpr() @@ -118,14 +118,14 @@ module FlowStepsInput implements UniversalFlow::UniversalFlowInput { exists(Argument arg, Parameter p | privateParamArg(p, arg) and n1.asExpr() = arg and - n2.asSsa().(BaseSsaImplicitInit).isParameterDefinition(p) and + n2.asSsa().(Base::SsaParameterInit).getParameter() = p and // skip trivial recursion - not arg = n2.asSsa().getAUse() + not arg = n2.asSsa().getARead() ) or n2.asExpr() = n1.asField().getAnAccess() or - n2.asExpr() = n1.asSsa().getAUse() + n2.asExpr() = n1.asSsa().getARead() or n2.asExpr().(CastingExpr).getExpr() = n1.asExpr() and not n2.asExpr().getType() instanceof PrimitiveType @@ -133,9 +133,9 @@ module FlowStepsInput implements UniversalFlow::UniversalFlowInput { n2.asExpr().(AssignExpr).getSource() = n1.asExpr() and not n2.asExpr().getType() instanceof PrimitiveType or - n2.asSsa().(BaseSsaUpdate).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr() + n2.asSsa().(Base::SsaExplicitWrite).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr() or - n2.asSsa().(BaseSsaImplicitInit).captures(n1.asSsa()) + n2.asSsa().(Base::SsaCapturedDefinition).captures(n1.asSsa()) or n2.asExpr().(NotNullExpr).getExpr() = n1.asExpr() } @@ -147,7 +147,7 @@ module FlowStepsInput implements UniversalFlow::UniversalFlowInput { n.asExpr() instanceof NullLiteral or exists(LocalVariableDeclExpr decl | - n.asSsa().(BaseSsaUpdate).getDefiningExpr() = decl and + n.asSsa().(Base::SsaExplicitWrite).getDefiningExpr() = decl and not decl.hasImplicitInit() and not exists(decl.getInitOrPatternSource()) ) @@ -216,7 +216,9 @@ private module Input implements TypeFlowInput { ) } - private predicate upcastEnhancedForStmtAux(BaseSsaUpdate v, RefType t, RefType t1, RefType t2) { + private predicate upcastEnhancedForStmtAux( + Base::SsaExplicitWrite v, RefType t, RefType t1, RefType t2 + ) { exists(EnhancedForStmt for | for.getVariable() = v.getDefiningExpr() and v.getSourceVariable().getType().getErasure() = t2 and @@ -230,7 +232,7 @@ private module Input implements TypeFlowInput { * the type of the elements being iterated over, and this type is more precise * than the type of `v`. */ - private predicate upcastEnhancedForStmt(BaseSsaUpdate v, RefType t) { + private predicate upcastEnhancedForStmt(Base::SsaExplicitWrite v, RefType t) { exists(RefType t1, RefType t2 | upcastEnhancedForStmtAux(v, t, t1, t2) and t1.getASourceSupertype+() = t2 @@ -238,9 +240,9 @@ private module Input implements TypeFlowInput { } private predicate downcastSuccessorAux( - CastingExpr cast, BaseSsaVariable v, RefType t, RefType t1, RefType t2 + CastingExpr cast, Base::SsaDefinition v, RefType t, RefType t1, RefType t2 ) { - cast.getExpr() = v.getAUse() and + cast.getExpr() = v.getARead() and t = cast.getType() and t1 = t.getErasure() and t2 = v.getSourceVariable().getType().getErasure() @@ -250,10 +252,10 @@ private module Input implements TypeFlowInput { * Holds if `va` is an access to a value that has previously been downcast to `t`. */ private predicate downcastSuccessor(VarAccess va, RefType t) { - exists(CastingExpr cast, BaseSsaVariable v, RefType t1, RefType t2 | + exists(CastingExpr cast, Base::SsaDefinition v, RefType t1, RefType t2 | downcastSuccessorAux(pragma[only_bind_into](cast), v, t, t1, t2) and t1.getASourceSupertype+() = t2 and - va = v.getAUse() and + va = v.getARead() and dominates(cast.getControlFlowNode(), va.getControlFlowNode()) and dominates(cast.getControlFlowNode().getANormalSuccessor(), va.getControlFlowNode()) ) @@ -263,9 +265,9 @@ private module Input implements TypeFlowInput { * Holds if `va` is an access to a value that is guarded by `instanceof t` or `case e t`. */ private predicate typeTestGuarded(VarAccess va, RefType t) { - exists(Guard typeTest, BaseSsaVariable v | - typeTest.appliesTypeTest(v.getAUse(), t, _) and - va = v.getAUse() and + exists(Guard typeTest, Base::SsaDefinition v | + typeTest.appliesTypeTest(v.getARead(), t, _) and + va = v.getARead() and guardControls_v1(typeTest, va.getBasicBlock(), true) ) } @@ -274,12 +276,12 @@ private module Input implements TypeFlowInput { * Holds if `aa` is an access to a value that is guarded by `instanceof t` or `case e t`. */ private predicate arrayTypeTestGuarded(ArrayAccess aa, RefType t) { - exists(Guard typeTest, BaseSsaVariable v1, BaseSsaVariable v2, ArrayAccess aa1 | + exists(Guard typeTest, Base::SsaDefinition v1, Base::SsaDefinition v2, ArrayAccess aa1 | typeTest.appliesTypeTest(aa1, t, _) and - aa1.getArray() = v1.getAUse() and - aa1.getIndexExpr() = v2.getAUse() and - aa.getArray() = v1.getAUse() and - aa.getIndexExpr() = v2.getAUse() and + aa1.getArray() = v1.getARead() and + aa1.getIndexExpr() = v2.getARead() and + aa.getArray() = v1.getARead() and + aa.getIndexExpr() = v2.getARead() and guardControls_v1(typeTest, aa.getBasicBlock(), true) ) } @@ -321,14 +323,14 @@ private module Input implements TypeFlowInput { * Holds if `ioe` checks `v`, its true-successor is `bb`, and `bb` has multiple * predecessors. */ - private predicate instanceofDisjunct(InstanceOfExpr ioe, BasicBlock bb, BaseSsaVariable v) { - ioe.getExpr() = v.getAUse() and + private predicate instanceofDisjunct(InstanceOfExpr ioe, BasicBlock bb, Base::SsaDefinition v) { + ioe.getExpr() = v.getARead() and strictcount(bb.getAPredecessor()) > 1 and exists(ConditionBlock cb | cb.getCondition() = ioe and cb.getTestSuccessor(true) = bb) } /** Holds if `bb` is disjunctively guarded by multiple `instanceof` tests on `v`. */ - private predicate instanceofDisjunction(BasicBlock bb, BaseSsaVariable v) { + private predicate instanceofDisjunction(BasicBlock bb, Base::SsaDefinition v) { strictcount(InstanceOfExpr ioe | instanceofDisjunct(ioe, bb, v)) = strictcount(bb.getAPredecessor()) } @@ -338,10 +340,10 @@ private module Input implements TypeFlowInput { * `instanceof t_i` where `t` is one of those `t_i`. */ predicate instanceofDisjunctionGuarded(TypeFlowNode n, RefType t) { - exists(BasicBlock bb, InstanceOfExpr ioe, BaseSsaVariable v, VarAccess va | + exists(BasicBlock bb, InstanceOfExpr ioe, Base::SsaDefinition v, VarAccess va | instanceofDisjunction(bb, v) and bb.dominates(va.getBasicBlock()) and - va = v.getAUse() and + va = v.getARead() and instanceofDisjunct(ioe, bb, v) and t = ioe.getSyntacticCheckedType() and n.asExpr() = va diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll index 5a818d18b85..e373340d7d7 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll @@ -25,7 +25,8 @@ private module BaseSsaStage { predicate backref() { (exists(TLocalVar(_, _)) implies any()) and (exists(any(BaseSsaSourceVariable v).getAnAccess()) implies any()) and - (exists(getAUse(_)) implies any()) + (exists(any(SsaDefinition def).getARead()) implies any()) and + (captures(_, _) implies any()) } } @@ -157,7 +158,7 @@ private module BaseSsaImpl { private import BaseSsaImpl -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaImplInput implements SsaImplCommon::InputSig { class SourceVariable = BaseSsaSourceVariable; /** @@ -169,7 +170,7 @@ private module SsaInput implements SsaImplCommon::InputSig certain = true or hasEntryDef(v, bb) and - i = 0 and + i = -1 and certain = true } @@ -189,67 +190,46 @@ private module SsaInput implements SsaImplCommon::InputSig } } -private module Impl = SsaImplCommon::Make; +private module Impl = SsaImplCommon::Make; +private module SsaInput implements Impl::SsaInputSig { + private import java as J + + class Expr = J::Expr; + + class Parameter = J::Parameter; + + class VariableWrite = J::VariableWrite; + + predicate explicitWrite(VariableWrite w, BasicBlock bb, int i, BaseSsaSourceVariable v) { + variableUpdate(v, w.asExpr().getControlFlowNode(), bb, i) + or + exists(Parameter p, Callable c | + c = p.getCallable() and + v = TLocalVar(c, p) and + w.isParameterInit(p) and + c.getBody().getBasicBlock() = bb and + i = -1 + ) + } +} + +module Ssa = Impl::MakeSsa; + +import Ssa private import Cached cached private module Cached { - cached - VarRead getAUse(Impl::Definition def) { - BaseSsaStage::ref() and - exists(BaseSsaSourceVariable v, BasicBlock bb, int i | - Impl::ssaDefReachesRead(v, def, bb, i) and - result.getControlFlowNode() = bb.getNode(i) and - result = v.getAnAccess() - ) - } - - cached - predicate ssaDefReachesEndOfBlock(BasicBlock bb, Impl::Definition def) { - Impl::ssaDefReachesEndOfBlock(bb, def, _) - } - - cached - predicate firstUse(Impl::Definition def, VarRead use) { - exists(BasicBlock bb, int i | - Impl::firstUse(def, bb, i, _) and - use.getControlFlowNode() = bb.getNode(i) - ) - } - - cached - predicate ssaUpdate(Impl::Definition def, VariableUpdate upd) { - exists(BaseSsaSourceVariable v, BasicBlock bb, int i | - def.definesAt(v, bb, i) and - variableUpdate(v, upd.getControlFlowNode(), bb, i) and - getDestVar(upd) = v - ) - } - - cached - predicate ssaImplicitInit(Impl::WriteDefinition def) { - exists(BaseSsaSourceVariable v, BasicBlock bb, int i | - def.definesAt(v, bb, i) and - hasEntryDef(v, bb) and - i = 0 - ) - } - /** Holds if `init` is a closure variable that captures the value of `capturedvar`. */ cached - predicate captures(BaseSsaImplicitInit init, BaseSsaVariable capturedvar) { + predicate captures(SsaImplicitEntryDefinition init, SsaDefinition capturedvar) { exists(BasicBlock bb, int i | - Impl::ssaDefReachesRead(_, capturedvar, bb, i) and + Ssa::ssaDefReachesUncertainRead(_, capturedvar, bb, i) and variableCapture(capturedvar.getSourceVariable(), init.getSourceVariable(), bb, i) ) } - cached - predicate phiHasInputFromBlock(Impl::PhiNode phi, Impl::Definition inp, BasicBlock bb) { - Impl::phiHasInputFromBlock(phi, inp, bb) - } - cached module SsaPublic { /** @@ -285,36 +265,73 @@ private module Cached { import SsaPublic -/** - * An SSA variable. - */ -class BaseSsaVariable extends Impl::Definition { - /** Gets the `ControlFlowNode` at which this SSA variable is defined. */ - ControlFlowNode getCfgNode() { - exists(BasicBlock bb, int i | this.definesAt(_, bb, i) and result = bb.getNode(0.maximum(i))) - } +/** An SSA definition in a closure that captures a variable. */ +class SsaCapturedDefinition extends SsaImplicitEntryDefinition { + SsaCapturedDefinition() { captures(this, _) } - /** Gets an access of this SSA variable. */ - VarRead getAUse() { result = getAUse(this) } + override string toString() { result = "SSA capture def(" + this.getSourceVariable() + ")" } + + /** Holds if this definition captures the value of `capturedvar`. */ + predicate captures(SsaDefinition capturedvar) { captures(this, capturedvar) } /** - * Gets an access of the SSA source variable underlying this SSA variable - * that can be reached from this SSA variable without passing through any - * other uses, but potentially through phi nodes. - * - * Subsequent uses can be found by following the steps defined by - * `baseSsaAdjacentUseUse`. + * Gets a definition that ultimately defines the captured variable and is not itself a phi node. */ - VarRead getAFirstUse() { firstUse(this, result) } + SsaDefinition getAnUltimateCapturedDefinition() { + exists(SsaDefinition capturedvar | + captures(this, capturedvar) and result = capturedvar.getAnUltimateDefinition() + ) + } +} + +deprecated private predicate ssaUpdate(Impl::Definition def, VariableUpdate upd) { + exists(BaseSsaSourceVariable v, BasicBlock bb, int i | + def.definesAt(v, bb, i) and + variableUpdate(v, upd.getControlFlowNode(), bb, i) and + getDestVar(upd) = v + ) +} + +deprecated private predicate ssaImplicitInit(Impl::WriteDefinition def) { + exists(BaseSsaSourceVariable v, BasicBlock bb, int i | + def.definesAt(v, bb, i) and + hasEntryDef(v, bb) and + i = -1 + ) +} + +/** + * DEPRECATED: Use `SsaDefinition` instead. + * + * An SSA variable. + */ +deprecated class BaseSsaVariable extends Impl::Definition { + /** + * DEPRECATED: Use `getControlFlowNode()` instead. + * + * Gets the `ControlFlowNode` at which this SSA variable is defined. + */ + deprecated ControlFlowNode getCfgNode() { result = this.(SsaDefinition).getControlFlowNode() } + + /** + * DEPRECATED: Use `getARead()` instead. + * + * Gets an access of this SSA variable. + */ + deprecated VarRead getAUse() { result = this.(SsaDefinition).getARead() } /** Holds if this SSA variable is live at the end of `b`. */ - predicate isLiveAtEndOfBlock(BasicBlock b) { ssaDefReachesEndOfBlock(b, this) } + predicate isLiveAtEndOfBlock(BasicBlock b) { this.(SsaDefinition).isLiveAtEndOfBlock(b) } /** Gets an input to the phi node defining the SSA variable. */ - private BaseSsaVariable getAPhiInput() { result = this.(BaseSsaPhiNode).getAPhiInput() } + private BaseSsaVariable getAPhiInput() { result = this.(BaseSsaPhiNode).getAnInput() } - /** Gets a definition in the same callable that ultimately defines this variable and is not itself a phi node. */ - BaseSsaVariable getAnUltimateLocalDefinition() { + /** + * DEPRECATED: Use `SsaDefinition::getAnUltimateDefinition()` instead. + * + * Gets a definition in the same callable that ultimately defines this variable and is not itself a phi node. + */ + deprecated BaseSsaVariable getAnUltimateLocalDefinition() { result = this.getAPhiInput*() and not result instanceof BaseSsaPhiNode } @@ -324,18 +341,27 @@ class BaseSsaVariable extends Impl::Definition { * variable. */ private BaseSsaVariable getAPhiInputOrCapturedVar() { - result = this.(BaseSsaPhiNode).getAPhiInput() or + result = this.(BaseSsaPhiNode).getAnInput() or this.(BaseSsaImplicitInit).captures(result) } - /** Gets a definition that ultimately defines this variable and is not itself a phi node. */ - BaseSsaVariable getAnUltimateDefinition() { + /** + * DEPRECATED: Use `SsaCapturedDefinition::getAnUltimateCapturedDefinition()` + * and/or `SsaDefinition::getAnUltimateDefinition()` instead. + * + * Gets a definition that ultimately defines this variable and is not itself a phi node. + */ + deprecated BaseSsaVariable getAnUltimateDefinition() { result = this.getAPhiInputOrCapturedVar*() and not result instanceof BaseSsaPhiNode } } -/** An SSA variable that is defined by a `VariableUpdate`. */ -class BaseSsaUpdate extends BaseSsaVariable instanceof Impl::WriteDefinition { +/** + * DEPRECATED: Use `SsaExplicitWrite` instead. + * + * An SSA variable that is defined by a `VariableUpdate`. + */ +deprecated class BaseSsaUpdate extends BaseSsaVariable instanceof Impl::WriteDefinition { BaseSsaUpdate() { ssaUpdate(this, _) } /** Gets the `VariableUpdate` defining the SSA variable. */ @@ -343,34 +369,46 @@ class BaseSsaUpdate extends BaseSsaVariable instanceof Impl::WriteDefinition { } /** + * DEPRECATED: Use `SsaParameterInit` or `SsaCapturedDefinition` instead. + * * An SSA variable that is defined by its initial value in the callable. This * includes initial values of parameters, fields, and closure variables. */ -class BaseSsaImplicitInit extends BaseSsaVariable instanceof Impl::WriteDefinition { +deprecated class BaseSsaImplicitInit extends BaseSsaVariable instanceof Impl::WriteDefinition { BaseSsaImplicitInit() { ssaImplicitInit(this) } /** Holds if this is a closure variable that captures the value of `capturedvar`. */ predicate captures(BaseSsaVariable capturedvar) { captures(this, capturedvar) } /** + * DEPRECATED: Use `SsaParameterInit::getParameter()` instead. + * * Holds if the SSA variable is a parameter defined by its initial value in the callable. */ - predicate isParameterDefinition(Parameter p) { + deprecated predicate isParameterDefinition(Parameter p) { this.getSourceVariable() = TLocalVar(p.getCallable(), p) and p.getCallable().getBody().getControlFlowNode() = this.getCfgNode() } } -/** An SSA phi node. */ -class BaseSsaPhiNode extends BaseSsaVariable instanceof Impl::PhiNode { - /** Gets an input to the phi node defining the SSA variable. */ - BaseSsaVariable getAPhiInput() { this.hasInputFromBlock(result, _) } +/** + * DEPRECATED: Use `SsaPhiDefinition` instead. + * + * An SSA phi node. + */ +deprecated class BaseSsaPhiNode extends BaseSsaVariable instanceof Impl::PhiNode { + /** + * DEPRECATED: Use `getAnInput()` instead. + * + * Gets an input to the phi node defining the SSA variable. + */ + deprecated BaseSsaVariable getAPhiInput() { this.hasInputFromBlock(result, _) } /** Gets an input to the phi node defining the SSA variable. */ BaseSsaVariable getAnInput() { this.hasInputFromBlock(result, _) } /** Holds if `inp` is an input to the phi node along the edge originating in `bb`. */ predicate hasInputFromBlock(BaseSsaVariable inp, BasicBlock bb) { - phiHasInputFromBlock(this, inp, bb) + this.(SsaPhiDefinition).hasInputFromBlock(inp, bb) } } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll index 5af24642477..1e6156aaa6f 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll @@ -460,12 +460,12 @@ predicate arrayStoreStep(Node node1, Node node2) { } private predicate enhancedForStmtStep(Node node1, Node node2, Type containerType) { - exists(EnhancedForStmt for, Expr e, SsaExplicitUpdate v | + exists(EnhancedForStmt for, Expr e, SsaExplicitWrite v | for.getExpr() = e and node1.asExpr() = e and containerType = e.getType() and v.getDefiningExpr() = for.getVariable() and - v.getAFirstUse() = node2.asExpr() + ssaGetAFirstUse(v) = node2.asExpr() ) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll index dc58529ed26..a27f14cede0 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll @@ -60,7 +60,7 @@ private module DispatchImpl { not ( // Only use summarized callables with generated summaries in case // the static call target is not in the source code. - // Note that if applyGeneratedModel holds it implies that there doesn't + // Note that if `applyGeneratedModel` holds it implies that there doesn't // exist a manual model. exists(Callable staticTarget | staticTarget = call.getCallee().getSourceDeclaration() | staticTarget.fromSource() and not staticTarget.isStub() diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll index 674c2380a5f..9786286389c 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll @@ -29,7 +29,7 @@ private predicate deadcode(Expr e) { module SsaFlow { module Impl = SsaImpl::DataFlowIntegration; - private predicate ssaDefAssigns(SsaExplicitUpdate def, Expr value) { + private predicate ssaDefAssigns(SsaExplicitWrite def, Expr value) { exists(VariableUpdate upd | upd = def.getDefiningExpr() | value = upd.(VariableAssign).getSource() or value = upd.(AssignOp) or @@ -46,7 +46,7 @@ module SsaFlow { or exists(Parameter p | n = TExplicitParameterNode(p) and - result.(Impl::WriteDefSourceNode).getDefinition().(SsaImplicitInit).isParameterDefinition(p) + result.(Impl::WriteDefSourceNode).getDefinition().(SsaParameterInit).getParameter() = p ) or ssaDefAssigns(result.(Impl::WriteDefSourceNode).getDefinition(), n.asExpr()) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll index 1721569e45a..3dcdc188761 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll @@ -62,10 +62,10 @@ private predicate fieldStep(Node node1, Node node2) { private predicate closureFlowStep(Expr e1, Expr e2) { simpleAstFlowStep(e1, e2) or - exists(SsaVariable v | - v.getAUse() = e2 and - v.getAnUltimateDefinition().(SsaExplicitUpdate).getDefiningExpr().(VariableAssign).getSource() = - e1 + exists(SsaDefinition v, SsaExplicitWrite def | v.getARead() = e2 and def.getValue() = e1 | + v.getAnUltimateDefinition() = def + or + v.(SsaCapturedDefinition).getAnUltimateCapturedDefinition() = def ) } @@ -395,13 +395,13 @@ class CastNode extends ExprNode { CastNode() { this.getExpr() instanceof CastingExpr or - exists(SsaExplicitUpdate upd | + exists(SsaExplicitWrite upd | upd.getDefiningExpr().(VariableAssign).getSource() = [ any(SwitchStmt ss).getExpr(), any(SwitchExpr se).getExpr(), any(InstanceOfExpr ioe).getExpr() ] and - this.asExpr() = upd.getAFirstUse() + this.asExpr() = ssaGetAFirstUse(upd) ) } } @@ -531,9 +531,9 @@ class NodeRegion instanceof BasicBlock { private predicate constantBooleanExpr(Expr e, boolean val) { e.(CompileTimeConstantExpr).getBooleanValue() = val or - exists(SsaExplicitUpdate v, Expr src | - e = v.getAUse() and - src = v.getDefiningExpr().(VariableAssign).getSource() and + exists(SsaExplicitWrite v, Expr src | + e = v.getARead() and + src = v.getValue() and constantBooleanExpr(src, val) ) } @@ -551,15 +551,15 @@ private class ConstantBooleanArgumentNode extends ArgumentNode, ExprNode { */ predicate isUnreachableInCall(NodeRegion nr, DataFlowCall call) { exists( - ExplicitParameterNode paramNode, ConstantBooleanArgumentNode arg, SsaImplicitInit param, + ExplicitParameterNode paramNode, ConstantBooleanArgumentNode arg, SsaParameterInit param, Guard guard | // get constant bool argument and parameter for this call viableParamArg(call, pragma[only_bind_into](paramNode), arg) and // get the ssa variable definition for this parameter - param.isParameterDefinition(paramNode.getParameter()) and + param.getParameter() = paramNode.getParameter() and // which is used in a guard - param.getAUse() = guard and + param.getARead() = guard and // which controls `n` with the opposite value of `arg` guard .controls(nr, diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll index 23e9f680c97..e2e80c293ef 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll @@ -99,11 +99,12 @@ predicate localExprFlow(Expr e1, Expr e2) { localFlow(exprNode(e1), exprNode(e2) * updates. */ predicate hasNonlocalValue(FieldRead fr) { - not exists(SsaVariable v | v.getAUse() = fr) + not exists(SsaDefinition v | v.getARead() = fr) or - exists(SsaVariable v, SsaVariable def | v.getAUse() = fr and def = v.getAnUltimateDefinition() | - def instanceof SsaImplicitInit or - def instanceof SsaImplicitUpdate + exists(SsaDefinition v, SsaDefinition def | + v.getARead() = fr and + def = v.getAnUltimateDefinition() and + def instanceof SsaImplicitWrite ) } @@ -373,6 +374,29 @@ class ContentSet instanceof Content { } } +/** + * Holds if the guard `g` validates the expression `e` upon evaluating to `gv`. + * + * The expression `e` is expected to be a syntactic part of the guard `g`. + * For example, the guard `g` might be a call `isSafe(x)` and the expression `e` + * the argument `x`. + */ +signature predicate valueGuardChecksSig(Guard g, Expr e, GuardValue gv); + +/** + * Provides a set of barrier nodes for a guard that validates an expression. + * + * This is expected to be used in `isBarrier`/`isSanitizer` definitions + * in data flow and taint tracking. + */ +module BarrierGuardValue { + /** Gets a node that is safely guarded by the given guard check. */ + Node getABarrierNode() { + SsaFlow::asNode(result) = + SsaImpl::DataFlowIntegration::BarrierGuard::getABarrierNode() + } +} + /** * Holds if the guard `g` validates the expression `e` upon evaluating to `branch`. * @@ -389,9 +413,38 @@ signature predicate guardChecksSig(Guard g, Expr e, boolean branch); * in data flow and taint tracking. */ module BarrierGuard { + private predicate guardChecks0(Guard g, Expr e, GuardValue gv) { + guardChecks(g, e, gv.asBooleanValue()) + } + /** Gets a node that is safely guarded by the given guard check. */ - Node getABarrierNode() { + Node getABarrierNode() { result = BarrierGuardValue::getABarrierNode() } +} + +bindingset[this] +private signature class ParamSig; + +private module WithParam { + /** + * Holds if the guard `g` validates the expression `e` upon evaluating to `gv`. + * + * The expression `e` is expected to be a syntactic part of the guard `g`. + * For example, the guard `g` might be a call `isSafe(x)` and the expression `e` + * the argument `x`. + */ + signature predicate guardChecksSig(Guard g, Expr e, GuardValue gv, P param); +} + +/** + * Provides a set of barrier nodes for a guard that validates an expression. + * + * This is expected to be used in `isBarrier`/`isSanitizer` definitions + * in data flow and taint tracking. + */ +module ParameterizedBarrierGuard::guardChecksSig/4 guardChecks> { + /** Gets a node that is safely guarded by the given guard check. */ + Node getABarrierNode(P param) { SsaFlow::asNode(result) = - SsaImpl::DataFlowIntegration::BarrierGuard::getABarrierNode() + SsaImpl::DataFlowIntegration::ParameterizedBarrierGuard::getABarrierNode(param) } } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ExternalFlowExtensions.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ExternalFlowExtensions.qll index 32b5d289e28..be474ad4535 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/ExternalFlowExtensions.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ExternalFlowExtensions.qll @@ -4,6 +4,8 @@ overlay[local?] module; +private import codeql.mad.static.ModelsAsData as SharedMaD + /** * Holds if a source model exists for the given parameters. */ @@ -20,6 +22,22 @@ extensible predicate sinkModel( string input, string kind, string provenance, QlBuiltins::ExtensionId madId ); +/** + * Holds if a barrier model exists for the given parameters. + */ +extensible predicate barrierModel( + string package, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, QlBuiltins::ExtensionId madId +); + +/** + * Holds if a barrier guard model exists for the given parameters. + */ +extensible predicate barrierGuardModel( + string package, string type, boolean subtypes, string name, string signature, string ext, + string input, string acceptingvalue, string kind, string provenance, QlBuiltins::ExtensionId madId +); + /** * Holds if a summary model exists for the given parameters. */ @@ -77,3 +95,9 @@ extensible predicate experimentalSummaryModel( string input, string output, string kind, string provenance, string filter, QlBuiltins::ExtensionId madId ); + +module Extensions implements SharedMaD::ExtensionsSig { + import ExternalFlowExtensions + + predicate namespaceGrouping(string group, string namespace) { none() } +} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll index 8dc28ea2f60..b9d8f58cecb 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll @@ -158,7 +158,9 @@ private predicate relatedArgSpec(Callable c, string spec) { summaryModel(namespace, type, subtypes, name, signature, ext, spec, _, _, _, _) or summaryModel(namespace, type, subtypes, name, signature, ext, _, spec, _, _, _) or sourceModel(namespace, type, subtypes, name, signature, ext, spec, _, _, _) or - sinkModel(namespace, type, subtypes, name, signature, ext, spec, _, _, _) + sinkModel(namespace, type, subtypes, name, signature, ext, spec, _, _, _) or + barrierModel(namespace, type, subtypes, name, signature, ext, spec, _, _, _) or + barrierGuardModel(namespace, type, subtypes, name, signature, ext, spec, _, _, _, _) | c = interpretElement(namespace, type, subtypes, name, signature, ext, _) ) @@ -226,11 +228,10 @@ module SourceSinkInterpretationInput implements ) { exists( string namespace, string type, boolean subtypes, string name, string signature, string ext, - SourceOrSinkElement baseSource, string originalOutput, QlBuiltins::ExtensionId madId + SourceOrSinkElement baseSource, string originalOutput | sourceModel(namespace, type, subtypes, name, signature, ext, originalOutput, kind, provenance, - madId) and - model = "MaD:" + madId.toString() and + model) and baseSource = interpretElement(namespace, type, subtypes, name, signature, ext, _) and ( e = baseSource and output = originalOutput @@ -245,11 +246,10 @@ module SourceSinkInterpretationInput implements ) { exists( string namespace, string type, boolean subtypes, string name, string signature, string ext, - SourceOrSinkElement baseSink, string originalInput, QlBuiltins::ExtensionId madId + SourceOrSinkElement baseSink, string originalInput | sinkModel(namespace, type, subtypes, name, signature, ext, originalInput, kind, provenance, - madId) and - model = "MaD:" + madId.toString() and + model) and baseSink = interpretElement(namespace, type, subtypes, name, signature, ext, _) and ( e = baseSink and originalInput = input @@ -259,6 +259,43 @@ module SourceSinkInterpretationInput implements ) } + predicate barrierElement( + Element e, string output, string kind, Public::Provenance provenance, string model + ) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + SourceOrSinkElement baseBarrier, string originalOutput + | + barrierModel(namespace, type, subtypes, name, signature, ext, originalOutput, kind, + provenance, model) and + baseBarrier = interpretElement(namespace, type, subtypes, name, signature, ext, _) and + ( + e = baseBarrier and output = originalOutput + or + correspondingKotlinParameterDefaultsArgSpec(baseBarrier, e, originalOutput, output) + ) + ) + } + + predicate barrierGuardElement( + Element e, string input, Public::AcceptingValue acceptingvalue, string kind, + Public::Provenance provenance, string model + ) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + SourceOrSinkElement baseBarrier, string originalInput + | + barrierGuardModel(namespace, type, subtypes, name, signature, ext, originalInput, + acceptingvalue, kind, provenance, model) and + baseBarrier = interpretElement(namespace, type, subtypes, name, signature, ext, _) and + ( + e = baseBarrier and input = originalInput + or + correspondingKotlinParameterDefaultsArgSpec(baseBarrier, e, originalInput, input) + ) + ) + } + class SourceOrSinkElement = Element; private newtype TInterpretNode = @@ -343,12 +380,10 @@ module Private { ) { exists( string namespace, string type, boolean subtypes, string name, string signature, string ext, - string originalInput, string originalOutput, Callable baseCallable, - QlBuiltins::ExtensionId madId + string originalInput, string originalOutput, Callable baseCallable | summaryModel(namespace, type, subtypes, name, signature, ext, originalInput, originalOutput, - kind, provenance, madId) and - model = "MaD:" + madId.toString() and + kind, provenance, model) and baseCallable = interpretElement(namespace, type, subtypes, name, signature, ext, isExact) and ( c.asCallable() = baseCallable and input = originalInput and output = originalOutput diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll index 275a0afafc0..bafb16d6ab5 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll @@ -82,13 +82,6 @@ private module TrackedVariablesImpl { private import TrackedVariablesImpl -private predicate untrackedFieldWrite(BasicBlock bb, int i, SsaSourceVariable v) { - v = - any(SsaSourceField nf | - bb.getNode(i + 1) = nf.getAnAccess().(FieldRead).getControlFlowNode() and not trackField(nf) - ) -} - /** Gets the definition point of a nested class in the parent scope. */ private ControlFlowNode parentDef(NestedClass nc) { nc.(AnonymousClass).getClassInstanceExpr().getControlFlowNode() = result or @@ -171,7 +164,7 @@ private predicate uncertainVariableUpdateImpl(TrackedVar v, ControlFlowNode n, B predicate uncertainVariableUpdate(TrackedVar v, ControlFlowNode n, BasicBlock b, int i) = forceLocal(uncertainVariableUpdateImpl/4)(v, n, b, i) -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaImplInput implements SsaImplCommon::InputSig { class SourceVariable = SsaSourceVariable; /** @@ -184,11 +177,8 @@ private module SsaInput implements SsaImplCommon::InputSig certainVariableUpdate(v, _, bb, i) and certain = true or - untrackedFieldWrite(bb, i, v) and - certain = true - or hasEntryDef(v, bb) and - i = 0 and + i = -1 and certain = true or uncertainVariableUpdate(v, _, bb, i) and @@ -204,7 +194,10 @@ private module SsaInput implements SsaImplCommon::InputSig hasDominanceInformation(bb) and ( exists(VarRead use | - v.getAnAccess() = use and bb.getNode(i) = use.getControlFlowNode() and certain = true + v instanceof TrackedVar and + v.getAnAccess() = use and + bb.getNode(i) = use.getControlFlowNode() and + certain = true ) or variableCapture(v, _, bb, i) and @@ -213,7 +206,35 @@ private module SsaInput implements SsaImplCommon::InputSig } } -import SsaImplCommon::Make as Impl +import SsaImplCommon::Make as Impl + +private module SsaInput implements Impl::SsaInputSig { + private import java as J + + class Expr = J::Expr; + + class Parameter = J::Parameter; + + class VariableWrite = J::VariableWrite; + + predicate explicitWrite(VariableWrite w, BasicBlock bb, int i, SsaSourceVariable v) { + exists(VariableUpdate upd | + upd = w.asExpr() and + certainVariableUpdate(v, upd.getControlFlowNode(), bb, i) and + getDestVar(upd) = v + ) + or + exists(Parameter p, Callable c | + c = p.getCallable() and + v = TLocalVar(c, p) and + w.isParameterInit(p) and + c.getBody().getBasicBlock() = bb and + i = -1 + ) + } +} + +module Ssa = Impl::MakeSsa; final class Definition = Impl::Definition; @@ -223,14 +244,51 @@ final class UncertainWriteDefinition = Impl::UncertainWriteDefinition; final class PhiNode = Impl::PhiNode; -class UntrackedDef extends Definition { - private VarRead read; +deprecated predicate ssaExplicitUpdate(SsaUpdate def, VariableUpdate upd) { + exists(SsaSourceVariable v, BasicBlock bb, int i | + def.definesAt(v, bb, i) and + certainVariableUpdate(v, upd.getControlFlowNode(), bb, i) and + getDestVar(upd) = def.getSourceVariable() + ) +} - UntrackedDef() { ssaUntrackedDef(this, read) } +deprecated predicate ssaUncertainImplicitUpdate(SsaImplicitUpdate def) { + exists(SsaSourceVariable v, BasicBlock bb, int i | + def.definesAt(v, bb, i) and + uncertainVariableUpdate(v, _, bb, i) + ) +} - string toString() { result = read.toString() } +deprecated predicate ssaImplicitInit(WriteDefinition def) { + exists(SsaSourceVariable v, BasicBlock bb, int i | + def.definesAt(v, bb, i) and + hasEntryDef(v, bb) and + i = -1 + ) +} - Location getLocation() { result = read.getLocation() } +/** + * Holds if the SSA definition of `v` at `def` reaches `redef` without crossing another + * SSA definition of `v`. + */ +deprecated predicate ssaDefReachesUncertainDef(TrackedSsaDef def, SsaUncertainImplicitUpdate redef) { + Impl::uncertainWriteDefinitionInput(redef, def) +} + +deprecated VarRead getAUse(Definition def) { + exists(SsaSourceVariable v, BasicBlock bb, int i | + Impl::ssaDefReachesRead(v, def, bb, i) and + result.getControlFlowNode() = bb.getNode(i) and + result = v.getAnAccess() + ) +} + +deprecated predicate ssaDefReachesEndOfBlock(BasicBlock bb, Definition def) { + Impl::ssaDefReachesEndOfBlock(bb, def, _) +} + +deprecated predicate phiHasInputFromBlock(PhiNode phi, Definition inp, BasicBlock bb) { + Impl::phiHasInputFromBlock(phi, inp, bb) } cached @@ -247,24 +305,6 @@ private module Cached { result.getAnAccess() = upd.(UnaryAssignExpr).getExpr() } - cached - predicate ssaExplicitUpdate(SsaUpdate def, VariableUpdate upd) { - exists(SsaSourceVariable v, BasicBlock bb, int i | - def.definesAt(v, bb, i) and - certainVariableUpdate(v, upd.getControlFlowNode(), bb, i) and - getDestVar(upd) = def.getSourceVariable() - ) - } - - cached - predicate ssaUntrackedDef(Definition def, VarRead read) { - exists(SsaSourceVariable v, BasicBlock bb, int i | - def.definesAt(v, bb, i) and - untrackedFieldWrite(bb, i, v) and - read.getControlFlowNode() = bb.getNode(i + 1) - ) - } - /* * The SSA construction for a field `f` relies on implicit update nodes at * every call site that conceivably could reach an update of the field. @@ -484,46 +524,20 @@ private module Cached { overlay[global] cached - predicate defUpdatesNamedField(SsaImplicitUpdate def, TrackedField f, Callable setter) { - f = def.getSourceVariable() and - updatesNamedField0(def.getCfgNode().asCall(), f, setter) - } - - cached - predicate ssaUncertainImplicitUpdate(SsaImplicitUpdate def) { - exists(SsaSourceVariable v, BasicBlock bb, int i | - def.definesAt(v, bb, i) and - uncertainVariableUpdate(v, _, bb, i) - ) - } - - cached - predicate ssaImplicitInit(WriteDefinition def) { - exists(SsaSourceVariable v, BasicBlock bb, int i | - def.definesAt(v, bb, i) and - hasEntryDef(v, bb) and - i = 0 - ) + predicate defUpdatesNamedField(SsaImplicitWrite calldef, TrackedField f, Callable setter) { + f = calldef.getSourceVariable() and + updatesNamedField0(calldef.getControlFlowNode().asCall(), f, setter) } /** Holds if `init` is a closure variable that captures the value of `capturedvar`. */ cached - predicate captures(SsaImplicitInit init, SsaVariable capturedvar) { + predicate captures(SsaImplicitEntryDefinition init, SsaDefinition capturedvar) { exists(BasicBlock bb, int i | - Impl::ssaDefReachesRead(_, capturedvar, bb, i) and + Ssa::ssaDefReachesUncertainRead(_, capturedvar, bb, i) and variableCapture(capturedvar.getSourceVariable(), init.getSourceVariable(), bb, i) ) } - /** - * Holds if the SSA definition of `v` at `def` reaches `redef` without crossing another - * SSA definition of `v`. - */ - cached - predicate ssaDefReachesUncertainDef(TrackedSsaDef def, SsaUncertainImplicitUpdate redef) { - Impl::uncertainWriteDefinitionInput(redef, def) - } - /** * Holds if the value defined at `def` can reach `use` without passing through * any other uses, but possibly through phi nodes and uncertain implicit updates. @@ -536,25 +550,6 @@ private module Cached { ) } - cached - VarRead getAUse(Definition def) { - exists(SsaSourceVariable v, BasicBlock bb, int i | - Impl::ssaDefReachesRead(v, def, bb, i) and - result.getControlFlowNode() = bb.getNode(i) and - result = v.getAnAccess() - ) - } - - cached - predicate ssaDefReachesEndOfBlock(BasicBlock bb, Definition def) { - Impl::ssaDefReachesEndOfBlock(bb, def, _) - } - - cached - predicate phiHasInputFromBlock(PhiNode phi, Definition inp, BasicBlock bb) { - Impl::phiHasInputFromBlock(phi, inp, bb) - } - cached module DataFlowIntegration { import DataFlowIntegrationImpl @@ -569,12 +564,14 @@ private module Cached { DataFlowIntegrationImpl::localMustFlowStep(v, nodeFrom, nodeTo) } - signature predicate guardChecksSig(Guards::Guard g, Expr e, boolean branch); + signature predicate guardChecksSig(Guards::Guard g, Expr e, Guards::GuardValue gv); cached // nothing is actually cached module BarrierGuard { - private predicate guardChecksAdjTypes(Guards::Guards_v3::Guard g, Expr e, boolean branch) { - guardChecks(g, e, branch) + private predicate guardChecksAdjTypes( + Guards::Guards_v3::Guard g, Expr e, Guards::GuardValue gv + ) { + guardChecks(g, e, gv) } private predicate guardChecksWithWrappers( @@ -591,6 +588,36 @@ private module Cached { predicate getABarrierNode = getABarrierNodeImpl/0; } + + bindingset[this] + private signature class ParamSig; + + private module WithParam { + signature predicate guardChecksSig(Guards::Guard g, Expr e, Guards::GuardValue gv, P param); + } + + cached // nothing is actually cached + module ParameterizedBarrierGuard::guardChecksSig/4 guardChecks> { + private predicate guardChecksAdjTypes( + Guards::Guards_v3::Guard g, Expr e, Guards::GuardValue gv, P param + ) { + guardChecks(g, e, gv, param) + } + + private predicate guardChecksWithWrappers( + DataFlowIntegrationInput::Guard g, Definition def, Guards::GuardValue val, P param + ) { + Guards::Guards_v3::ParameterizedValidationWrapper::guardChecksDef(g, + def, val, param) + } + + private Node getABarrierNodeImpl(P param) { + result = + DataFlowIntegrationImpl::BarrierGuardDefWithState::getABarrierNode(param) + } + + predicate getABarrierNode = getABarrierNodeImpl/1; + } } cached @@ -664,14 +691,12 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu } } - Expr getARead(Definition def) { result = getAUse(def) } + Expr getARead(Definition def) { result = def.(SsaDefinition).getARead() } - predicate ssaDefHasSource(WriteDefinition def) { - def instanceof SsaExplicitUpdate or def.(SsaImplicitInit).isParameterDefinition(_) - } + predicate ssaDefHasSource(WriteDefinition def) { def instanceof SsaExplicitWrite } predicate allowFlowIntoUncertainDef(UncertainWriteDefinition def) { - def instanceof SsaUncertainImplicitUpdate + def instanceof SsaUncertainWrite } class GuardValue = Guards::GuardValue; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll index a1c690b7df4..cd85883f7bc 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll @@ -8,7 +8,10 @@ private import java as J private import semmle.code.java.dataflow.SSA as Ssa private import semmle.code.java.dataflow.RangeUtils as RU -class SsaVariable = Ssa::SsaVariable; +class SsaVariable extends Ssa::SsaDefinition { + /** Gets a use of this variable. */ + Expr getAUse() { result = super.getARead() } +} class Expr = J::Expr; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll index e124b8f7137..e0968c9cf17 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll @@ -11,9 +11,11 @@ module Private { class BasicBlock = BB::BasicBlock; - class SsaVariable = Ssa::SsaVariable; + class SsaVariable extends Ssa::SsaDefinition { + Expr getAUse() { result = super.getARead() } + } - class SsaPhiNode = Ssa::SsaPhiNode; + class SsaPhiNode = Ssa::SsaPhiDefinition; class Expr = J::Expr; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll index 6363b8f7ed3..4a418160477 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll @@ -17,9 +17,9 @@ module Private { class Guard = G::Guards_v2::Guard; - class SsaVariable = Ssa::SsaVariable; + class SsaVariable = Ssa::SsaDefinition; - class SsaPhiNode = Ssa::SsaPhiNode; + class SsaPhiNode = Ssa::SsaPhiDefinition; class VarAccess = J::VarAccess; @@ -240,8 +240,8 @@ private module Impl { } /** Returns the underlying variable update of the explicit SSA variable `v`. */ - VariableUpdate getExplicitSsaAssignment(SsaVariable v) { - result = v.(SsaExplicitUpdate).getDefiningExpr() + VariableUpdate getExplicitSsaAssignment(SsaDefinition v) { + result = v.(SsaExplicitWrite).getDefiningExpr() } /** Returns the assignment of the variable update `def`. */ @@ -267,13 +267,12 @@ private module Impl { } /** Gets the variable underlying the implicit SSA variable `v`. */ - Variable getImplicitSsaDeclaration(SsaVariable v) { - result = v.(SsaImplicitUpdate).getSourceVariable().getVariable() or - result = v.(SsaImplicitInit).getSourceVariable().getVariable() + Variable getImplicitSsaDeclaration(SsaDefinition v) { + result = v.(SsaImplicitWrite).getSourceVariable().getVariable() } /** Holds if the variable underlying the implicit SSA variable `v` is not a field. */ - predicate nonFieldImplicitSsaDefinition(SsaImplicitInit v) { v.isParameterDefinition(_) } + predicate nonFieldImplicitSsaDefinition(SsaParameterInit v) { any() } /** Returned an expression that is assigned to `f`. */ Expr getAssignedValueToField(Field f) { @@ -324,7 +323,7 @@ private module Impl { result = e.(CastingExpr).getExpr() } - Expr getARead(SsaVariable v) { result = v.getAUse() } + Expr getARead(SsaDefinition v) { result = v.getARead() } Field getField(FieldAccess fa) { result = fa.getField() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll index dbd7736acde..f826f192dca 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll @@ -8,14 +8,14 @@ private import semmle.code.java.dataflow.SSA as Ssa private import semmle.code.java.controlflow.BasicBlocks as BB private import SsaReadPositionCommon -class SsaVariable = Ssa::SsaVariable; +class SsaVariable = Ssa::SsaDefinition; -class SsaPhiNode = Ssa::SsaPhiNode; +class SsaPhiNode = Ssa::SsaPhiDefinition; class BasicBlock = BB::BasicBlock; /** Gets a basic block in which SSA variable `v` is read. */ -BasicBlock getAReadBasicBlock(SsaVariable v) { result = v.getAUse().getBasicBlock() } +BasicBlock getAReadBasicBlock(SsaVariable v) { result = v.getARead().getBasicBlock() } private predicate id(BB::ExprParent x, BB::ExprParent y) { x = y } diff --git a/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll b/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll index bd293eed6b3..2af5df28107 100644 --- a/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll +++ b/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll @@ -8,7 +8,7 @@ import java private import VirtualDispatch -private import semmle.code.java.dataflow.internal.BaseSSA +private import semmle.code.java.dataflow.internal.BaseSSA as Base private import semmle.code.java.dataflow.internal.DataFlowUtil as DataFlow private import semmle.code.java.dataflow.internal.DataFlowPrivate as DataFlowPrivate private import semmle.code.java.dataflow.InstanceAccess @@ -162,14 +162,28 @@ private module TypeTrackingSteps { storeContents = loadContents } - predicate simpleLocalSmallStep(Node n1, Node n2) { - exists(BaseSsaVariable v, BaseSsaVariable def | - def.(BaseSsaUpdate).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr() - or - def.(BaseSsaImplicitInit).isParameterDefinition(n1.asParameter()) + /** + * Holds if `n` is a read of an SSA variable that is ultimately defined by `def`. + * + * This includes reads of captured variables even though they are not technically + * local steps, but treating them as local is useful for type tracking purposes. + */ + private predicate readsSsa(Node n, Base::SsaDefinition def) { + exists(Base::SsaDefinition v | + v.getAnUltimateDefinition() = def or + v.(Base::SsaCapturedDefinition).getAnUltimateCapturedDefinition() = def | - v.getAnUltimateDefinition() = def and - v.getAUse() = n2.asExpr() + v.getARead() = n.asExpr() + ) + } + + predicate simpleLocalSmallStep(Node n1, Node n2) { + exists(Base::SsaDefinition def | + def.(Base::SsaExplicitWrite).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr() + or + def.(Base::SsaParameterInit).getParameter() = n1.asParameter() + | + readsSsa(n2, def) ) or exists(Callable c | n1.(DataFlow::InstanceParameterNode).getCallable() = c | @@ -220,11 +234,10 @@ private module TypeTrackingSteps { n2.asExpr() = get ) or - exists(EnhancedForStmt for, BaseSsaVariable ssa, BaseSsaVariable def | - for.getVariable() = def.(BaseSsaUpdate).getDefiningExpr() and + exists(EnhancedForStmt for, Base::SsaDefinition def | + for.getVariable() = def.(Base::SsaExplicitWrite).getDefiningExpr() and for.getExpr() = v.getAnAccess() and - ssa.getAnUltimateDefinition() = def and - ssa.getAUse() = n2.asExpr() + readsSsa(n2, def) ) ) } @@ -259,16 +272,15 @@ private module TypeTrackingSteps { } predicate loadStep(Node n1, LocalSourceNode n2, Content f) { - exists(BaseSsaVariable v, BaseSsaVariable def | + exists(Base::SsaDefinition def | exists(EnhancedForStmt for | - for.getVariable() = def.(BaseSsaUpdate).getDefiningExpr() and + for.getVariable() = def.(Base::SsaExplicitWrite).getDefiningExpr() and for.getExpr() = n1.asExpr() and n1.getType() instanceof Array and f = ContentArray() ) | - v.getAnUltimateDefinition() = def and - v.getAUse() = n2.asExpr() + readsSsa(n2, def) ) or n2.asExpr().(ArrayAccess).getArray() = n1.asExpr() diff --git a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll index a3da9118acc..239f4dd0fbc 100644 --- a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll +++ b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll @@ -10,7 +10,7 @@ import java private import VirtualDispatch private import semmle.code.java.controlflow.Guards -private import semmle.code.java.dataflow.internal.BaseSSA +private import semmle.code.java.dataflow.internal.BaseSSA as Base private import semmle.code.java.dataflow.internal.DataFlowUtil private import semmle.code.java.dataflow.internal.DataFlowPrivate private import semmle.code.java.dataflow.internal.ContainerFlow @@ -71,21 +71,24 @@ private predicate callFlowStep(Node n1, Node n2) { * flow, calls, returns, fields, array reads or writes, or container taint steps. */ private predicate step(Node n1, Node n2) { - exists(BaseSsaVariable v, BaseSsaVariable def | - def.(BaseSsaUpdate).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr() + exists(Base::SsaDefinition v, Base::SsaDefinition def | + def.(Base::SsaExplicitWrite).getDefiningExpr().(VariableAssign).getSource() = n1.asExpr() or - def.(BaseSsaImplicitInit).isParameterDefinition(n1.asParameter()) + def.(Base::SsaParameterInit).getParameter() = n1.asParameter() or exists(EnhancedForStmt for | - for.getVariable() = def.(BaseSsaUpdate).getDefiningExpr() and + for.getVariable() = def.(Base::SsaExplicitWrite).getDefiningExpr() and for.getExpr() = n1.asExpr() ) | - v.getAnUltimateDefinition() = def and - v.getAUse() = n2.asExpr() + ( + v.(Base::SsaCapturedDefinition).getAnUltimateCapturedDefinition() = def or + v.getAnUltimateDefinition() = def + ) and + v.getARead() = n2.asExpr() ) or - baseSsaAdjacentUseUse(n1.asExpr(), n2.asExpr()) + Base::baseSsaAdjacentUseUse(n1.asExpr(), n2.asExpr()) or exists(Callable c | n1.(InstanceParameterNode).getCallable() = c | exists(InstanceAccess ia | diff --git a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll index 78bf1ad0bdc..0119930caf4 100644 --- a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll +++ b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll @@ -7,7 +7,7 @@ import java import semmle.code.java.dataflow.TypeFlow private import DispatchFlow as DispatchFlow private import ObjFlow as ObjFlow -private import semmle.code.java.dataflow.internal.BaseSSA +private import semmle.code.java.dataflow.internal.BaseSSA as Base private import semmle.code.java.controlflow.Guards private import semmle.code.java.dispatch.internal.Unification @@ -194,10 +194,10 @@ private module Dispatch { */ private predicate impossibleDispatchTarget(MethodCall source, Method tgt) { tgt = viableImpl_v1_cand(source) and - exists(Guard typeTest, BaseSsaVariable v, Expr q, RefType t | + exists(Guard typeTest, Base::SsaDefinition v, Expr q, RefType t | source.getQualifier() = q and - v.getAUse() = q and - typeTest.appliesTypeTest(v.getAUse(), t, false) and + v.getARead() = q and + typeTest.appliesTypeTest(v.getARead(), t, false) and guardControls_v1(typeTest, q.getBasicBlock(), false) and tgt.getDeclaringType().getSourceDeclaration().getASourceSupertype*() = t.getErasure() ) diff --git a/java/ql/lib/semmle/code/java/frameworks/InputStream.qll b/java/ql/lib/semmle/code/java/frameworks/InputStream.qll index f6097e8c449..782d46df89d 100644 --- a/java/ql/lib/semmle/code/java/frameworks/InputStream.qll +++ b/java/ql/lib/semmle/code/java/frameworks/InputStream.qll @@ -41,11 +41,13 @@ private class InputStreamWrapperCapturedJumpStep extends AdditionalTaintStep { */ private class InputStreamWrapperCapturedLocalStep extends AdditionalTaintStep { override predicate step(DataFlow::Node n1, DataFlow::Node n2) { - exists(InputStreamRead m, NestedClass wrapper, SsaVariable captured, SsaImplicitInit capturer | + exists( + InputStreamRead m, NestedClass wrapper, SsaDefinition captured, SsaCapturedDefinition capturer + | wrapper.getASourceSupertype+() instanceof TypeInputStream and m.getDeclaringType() = wrapper and capturer.captures(captured) and - TaintTracking::localTaint(DataFlow::exprNode(capturer.getAFirstUse()), + TaintTracking::localTaint(DataFlow::exprNode(ssaGetAFirstUse(capturer)), any(DataFlow::PostUpdateNode pun | pun.getPreUpdateNode().asExpr() = m.getParameter(0).getAnAccess() )) and @@ -55,9 +57,9 @@ private class InputStreamWrapperCapturedLocalStep extends AdditionalTaintStep { .getASourceSupertype*() .getSourceDeclaration() = wrapper | - n1.asExpr() = captured.(SsaExplicitUpdate).getDefiningExpr().(VariableAssign).getSource() + n1.asExpr() = captured.(SsaExplicitWrite).getDefiningExpr().(VariableAssign).getSource() or - captured.(SsaImplicitInit).isParameterDefinition(n1.asParameter()) + captured.(SsaParameterInit).getParameter() = n1.asParameter() ) } } diff --git a/java/ql/lib/semmle/code/java/frameworks/JAXB.qll b/java/ql/lib/semmle/code/java/frameworks/JAXB.qll index 96075bbccf3..1283aa3d21e 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JAXB.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JAXB.qll @@ -107,10 +107,7 @@ class XmlAccessType extends EnumConstant { */ class JaxbMemberAnnotation extends JaxbAnnotationType { JaxbMemberAnnotation() { - this.hasName("XmlElement") or - this.hasName("XmlAttribute") or - this.hasName("XmlElementRefs") or - this.hasName("XmlElements") + this.hasName(["XmlElement", "XmlAttribute", "XmlElementRefs", "XmlElements"]) } } diff --git a/java/ql/lib/semmle/code/java/frameworks/Regex.qll b/java/ql/lib/semmle/code/java/frameworks/Regex.qll index f63f46c3878..56be77eae82 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Regex.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Regex.qll @@ -4,11 +4,46 @@ module; import java +/** The class `java.util.regex.Matcher`. */ +class TypeRegexMatcher extends Class { + TypeRegexMatcher() { this.hasQualifiedName("java.util.regex", "Matcher") } +} + +/** + * The `matches` method of `java.util.regex.Matcher`. + */ +class MatcherMatchesMethod extends Method { + MatcherMatchesMethod() { + this.getDeclaringType() instanceof TypeRegexMatcher and + this.hasName("matches") + } +} + /** The class `java.util.regex.Pattern`. */ class TypeRegexPattern extends Class { TypeRegexPattern() { this.hasQualifiedName("java.util.regex", "Pattern") } } +/** + * The `matches` method of `java.util.regex.Pattern`. + */ +class PatternMatchesMethod extends Method { + PatternMatchesMethod() { + this.getDeclaringType() instanceof TypeRegexPattern and + this.hasName("matches") + } +} + +/** + * The `matcher` method of `java.util.regex.Pattern`. + */ +class PatternMatcherMethod extends Method { + PatternMatcherMethod() { + this.getDeclaringType() instanceof TypeRegexPattern and + this.hasName("matcher") + } +} + /** The `quote` method of the `java.util.regex.Pattern` class. */ class PatternQuoteMethod extends Method { PatternQuoteMethod() { diff --git a/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll b/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll index c3b58873d1f..3df890c95f4 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll @@ -262,10 +262,10 @@ private predicate reaches(Expr src, Argument arg) { any(StartComponentMethodCall ma).getIntentArg() = arg and src = arg or - exists(Expr mid, BaseSsa::BaseSsaVariable ssa, BaseSsa::BaseSsaUpdate upd | + exists(Expr mid, BaseSsa::SsaDefinition ssa, BaseSsa::SsaExplicitWrite upd | reaches(mid, arg) and - mid = ssa.getAUse() and - upd = ssa.getAnUltimateLocalDefinition() and + mid = ssa.getARead() and + upd = ssa.getAnUltimateDefinition() and src = upd.getDefiningExpr().(VariableAssign).getSource() ) or diff --git a/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll b/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll index 5e0304ca7b2..62da79a2e40 100644 --- a/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll +++ b/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll @@ -26,9 +26,7 @@ private module TypeLiteralToParseAsFlowConfig implements DataFlow::ConfigSig { private module TypeLiteralToParseAsFlow = DataFlow::Global; -private TypeLiteral getSourceWithFlowToParseAs() { - TypeLiteralToParseAsFlow::flow(DataFlow::exprNode(result), _) -} +private TypeLiteral getSourceWithFlowToParseAs() { TypeLiteralToParseAsFlow::flowFromExpr(result) } /** A field that is deserialized by `HttpResponse.parseAs`. */ class HttpResponseParseAsDeserializableField extends DeserializableField { diff --git a/java/ql/lib/semmle/code/java/frameworks/hudson/Hudson.qll b/java/ql/lib/semmle/code/java/frameworks/hudson/Hudson.qll index 44752f94576..86b65928917 100644 --- a/java/ql/lib/semmle/code/java/frameworks/hudson/Hudson.qll +++ b/java/ql/lib/semmle/code/java/frameworks/hudson/Hudson.qll @@ -14,14 +14,3 @@ class HudsonWebMethod extends Method { this.getDeclaringType().getASourceSupertype*().hasQualifiedName("hudson.model", "Descriptor") } } - -private class HudsonUtilXssSanitizer extends XssSanitizer { - HudsonUtilXssSanitizer() { - this.asExpr() - .(MethodCall) - .getMethod() - // Not including xmlEscape because it only accounts for >, <, and &. - // It does not account for ", or ', which makes it an incomplete XSS sanitizer. - .hasQualifiedName("hudson", "Util", "escape") - } -} diff --git a/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll index aa7da753f43..b9fdbe58f77 100644 --- a/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll +++ b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll @@ -110,7 +110,7 @@ private module TypeLiteralToJacksonDatabindFlow = DataFlow::Global; private TypeLiteral getSourceWithFlowToJacksonDatabind() { - TypeLiteralToJacksonDatabindFlow::flow(DataFlow::exprNode(result), _) + TypeLiteralToJacksonDatabindFlow::flowFromExpr(result) } /** A type whose values are explicitly deserialized in a call to a Jackson method. */ diff --git a/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll index d59976c0c6c..a866d84df21 100644 --- a/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll +++ b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll @@ -677,7 +677,7 @@ Type inheritsMatchingMethodExceptThrows(SessionEjb ejb, Method m) { } /** - * Holds if `ejb` inherits an `ejbCreate` or `@Init` method matching `create` method `m`. + * Holds if `ejb` inherits an `ejbCreate` or `@Init` method matching `create` method `icm`. * (Ignores `throws` clauses.) */ predicate inheritsMatchingCreateMethodIgnoreThrows( @@ -704,7 +704,7 @@ predicate inheritsMatchingCreateMethodIgnoreThrows( } /** - * If `ejb` inherits an `ejbCreate` or `@Init` method matching `create` method `m` except for the `throws` clause, + * If `ejb` inherits an `ejbCreate` or `@Init` method matching `create` method `icm` except for the `throws` clause, * then return any type in the `throws` clause that does not match. */ Type inheritsMatchingCreateMethodExceptThrows(StatefulSessionEjb ejb, EjbInterfaceCreateMethod icm) { diff --git a/java/ql/lib/semmle/code/java/frameworks/owasp/Esapi.qll b/java/ql/lib/semmle/code/java/frameworks/owasp/Esapi.qll deleted file mode 100644 index fe95cd0d39d..00000000000 --- a/java/ql/lib/semmle/code/java/frameworks/owasp/Esapi.qll +++ /dev/null @@ -1,42 +0,0 @@ -/** Classes and predicates for reasoning about the `owasp.easpi` package. */ -overlay[local?] -module; - -import java - -/** - * The `org.owasp.esapi.Validator` interface. - */ -class EsapiValidator extends RefType { - EsapiValidator() { this.hasQualifiedName("org.owasp.esapi", "Validator") } -} - -/** - * The methods of `org.owasp.esapi.Validator` which validate data. - */ -class EsapiIsValidMethod extends Method { - EsapiIsValidMethod() { - this.getDeclaringType() instanceof EsapiValidator and - this.hasName([ - "isValidCreditCard", "isValidDate", "isValidDirectoryPath", "isValidDouble", - "isValidFileContent", "isValidFileName", "isValidInput", "isValidInteger", - "isValidListItem", "isValidNumber", "isValidPrintable", "isValidRedirectLocation", - "isValidSafeHTML", "isValidURI" - ]) - } -} - -/** - * The methods of `org.owasp.esapi.Validator` which return validated data. - */ -class EsapiGetValidMethod extends Method { - EsapiGetValidMethod() { - this.getDeclaringType() instanceof EsapiValidator and - this.hasName([ - "getValidCreditCard", "getValidDate", "getValidDirectoryPath", "getValidDouble", - "getValidFileContent", "getValidFileName", "getValidInput", "getValidInteger", - "getValidListItem", "getValidNumber", "getValidPrintable", "getValidRedirectLocation", - "getValidSafeHTML", "getValidURI" - ]) - } -} diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringController.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringController.qll index ee00433da12..a444dc96d5a 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringController.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringController.qll @@ -187,13 +187,10 @@ class SpringServletInputAnnotation extends Annotation { a = this.getType() and a.getPackage().getName() = "org.springframework.web.bind.annotation" | - a.hasName("MatrixVariable") or - a.hasName("RequestParam") or - a.hasName("RequestHeader") or - a.hasName("CookieValue") or - a.hasName("RequestPart") or - a.hasName("PathVariable") or - a.hasName("RequestBody") + a.hasName([ + "MatrixVariable", "RequestParam", "RequestHeader", "CookieValue", "RequestPart", + "PathVariable", "RequestBody" + ]) ) } } diff --git a/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll index 641fb0c6e6f..729268d4008 100644 --- a/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll +++ b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll @@ -40,12 +40,7 @@ class Struts2ActionClass extends Class { getStrutsMapperClass(this) = "org.apache.struts2.dispatcher.mapper.RestfulActionMapper" then // The "Restful" action mapper maps rest APIs to specific methods - result.hasName("index") or - result.hasName("create") or - result.hasName("editNew") or - result.hasName("view") or - result.hasName("remove") or - result.hasName("update") + result.hasName(["index", "create", "editNew", "view", "remove", "update"]) else if getStrutsMapperClass(this) = "org.apache.struts2.rest.RestActionMapper" or @@ -53,13 +48,7 @@ class Struts2ActionClass extends Class { then // The "Rest" action mapper is provided with the rest plugin, and maps rest APIs to specific // methods based on a "ruby-on-rails" style. - result.hasName("index") or - result.hasName("show") or - result.hasName("edit") or - result.hasName("editNew") or - result.hasName("create") or - result.hasName("update") or - result.hasName("destroy") + result.hasName(["index", "show", "edit", "editNew", "create", "update", "destroy"]) else if exists(getStrutsMapperClass(this)) then diff --git a/java/ql/lib/semmle/code/java/internal/OverlayXml.qll b/java/ql/lib/semmle/code/java/internal/OverlayXml.qll new file mode 100644 index 00000000000..95d49f2d611 --- /dev/null +++ b/java/ql/lib/semmle/code/java/internal/OverlayXml.qll @@ -0,0 +1,46 @@ +overlay[local] +module; + +/** + * A local predicate that always holds for the overlay variant and never holds for the base variant. + * This is used to define local predicates that behave differently for the base and overlay variant. + */ +private predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +private string getXmlFile(@xmllocatable locatable) { + exists(@location_default location, @file file | xmllocations(locatable, location) | + locations_default(location, file, _, _, _, _) and + files(file, result) + ) +} + +private string getXmlFileInBase(@xmllocatable locatable) { + not isOverlay() and + result = getXmlFile(locatable) +} + +/** + * Holds if the given `file` was extracted as part of the overlay and was extracted by the HTML/XML + * extractor. + */ +private predicate overlayXmlExtracted(string file) { + isOverlay() and + exists(@xmllocatable locatable | + not files(locatable, _) and not xmlNs(locatable, _, _, _) and file = getXmlFile(locatable) + ) +} + +/** + * Holds if the given XML `locatable` should be discarded, because it is part of the overlay base + * and is in a file that was also extracted as part of the overlay database. + */ +overlay[discard_entity] +private predicate discardXmlLocatable(@xmllocatable locatable) { + exists(string file | file = getXmlFileInBase(locatable) | + overlayChangedFiles(file) + or + // The HTML/XML extractor is currently not incremental and may extract more files than those + // included in overlayChangedFiles. + overlayXmlExtracted(file) + ) +} diff --git a/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll b/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll index 929fa2d6c91..4deb2bc812b 100644 --- a/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll +++ b/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll @@ -164,7 +164,7 @@ private module RegexFlowConfig implements DataFlow::ConfigSig { private module RegexFlow = DataFlow::Global; private predicate usedAsRegexImpl(StringLiteral regex, string mode, boolean match_full_string) { - RegexFlow::flow(DataFlow::exprNode(regex), _) and + RegexFlow::flowFromExpr(regex) and mode = "None" and // TODO: proper mode detection (if matchesFullString(regex) then match_full_string = true else match_full_string = false) } diff --git a/java/ql/lib/semmle/code/java/security/CommandArguments.qll b/java/ql/lib/semmle/code/java/security/CommandArguments.qll index f161a83d17b..1ac42192e04 100644 --- a/java/ql/lib/semmle/code/java/security/CommandArguments.qll +++ b/java/ql/lib/semmle/code/java/security/CommandArguments.qll @@ -38,9 +38,13 @@ private predicate isShell(Expr ex) { cmd.regexpMatch(".*(sh|javac?|python[23]?|osascript|cmd)(\\.exe)?$") ) or - exists(SsaVariable ssa | - ex = ssa.getAUse() and - isShell(ssa.getAnUltimateDefinition().(SsaExplicitUpdate).getDefiningExpr()) + exists(SsaDefinition ssa, SsaExplicitWrite def | + ex = ssa.getARead() and + isShell(def.getDefiningExpr()) + | + ssa.getAnUltimateDefinition() = def + or + ssa.(SsaCapturedDefinition).getAnUltimateCapturedDefinition() = def ) or isShell(ex.(Assignment).getRhs()) @@ -61,17 +65,17 @@ private class ListOfStringType extends CollectionType { /** * A variable that could be used as a list of arguments to a command. */ -private class CommandArgumentList extends SsaExplicitUpdate { +private class CommandArgumentList extends SsaExplicitWrite { CommandArgumentList() { this.getSourceVariable().getType() instanceof ListOfStringType and - forex(CollectionMutation ma | ma.getQualifier() = this.getAUse() | + forex(CollectionMutation ma | ma.getQualifier() = this.getARead() | ma.getMethod().getName().matches("add%") ) } /** Gets a use of the variable for which the list could be empty. */ private VarRead getAUseBeforeFirstAdd() { - result = this.getAFirstUse() + result = ssaGetAFirstUse(this) or exists(VarRead mid | mid = this.getAUseBeforeFirstAdd() and @@ -87,7 +91,7 @@ private class CommandArgumentList extends SsaExplicitUpdate { * Gets an addition to this list, i.e. a call to an `add` or `addAll` method. */ MethodCall getAnAdd() { - result.getQualifier() = this.getAUse() and + result.getQualifier() = this.getARead() and result.getMethod().getName().matches("add%") } @@ -121,10 +125,10 @@ private predicate arrayVarWrite(ArrayAccess acc) { exists(Assignment a | a.getDe /** * A variable that could be an array of arguments to a command. */ -private class CommandArgumentArray extends SsaExplicitUpdate { +private class CommandArgumentArray extends SsaExplicitWrite { CommandArgumentArray() { this.getSourceVariable().getType() instanceof ArrayOfStringType and - forall(ArrayAccess a | a.getArray() = this.getAUse() and arrayVarWrite(a) | + forall(ArrayAccess a | a.getArray() = this.getARead() and arrayVarWrite(a) | a.getIndexExpr() instanceof CompileTimeConstantExpr ) } @@ -133,7 +137,7 @@ private class CommandArgumentArray extends SsaExplicitUpdate { Expr getAWrite(int index, VarRead use) { exists(Assignment a, ArrayAccess acc | acc.getArray() = use and - use = this.getAUse() and + use = this.getARead() and index = acc.getIndexExpr().(CompileTimeConstantExpr).getIntValue() and acc = a.getDest() and result = a.getRhs() @@ -150,7 +154,7 @@ private class CommandArgumentArray extends SsaExplicitUpdate { private class CommandArgArrayImmutableFirst extends CommandArgumentArray { CommandArgArrayImmutableFirst() { (exists(this.getAWrite(0)) or exists(firstElementOf(this.getDefiningExpr()))) and - forall(VarRead use | exists(this.getAWrite(0, use)) | use = this.getAFirstUse()) + forall(VarRead use | exists(this.getAWrite(0, use)) | use = ssaGetAFirstUse(this)) } /** Gets the first element of this array. */ @@ -173,7 +177,9 @@ private Expr firstElementOf(Expr arr) { or result = firstElementOf(arr.(LocalVariableDeclExpr).getInit()) or - exists(CommandArgArrayImmutableFirst caa | arr = caa.getAUse() | result = caa.getFirstElement()) + exists(CommandArgArrayImmutableFirst caa | arr = caa.getARead() | + result = caa.getFirstElement() + ) or exists(MethodCall ma, Method m | arr = ma and diff --git a/java/ql/lib/semmle/code/java/security/ImproperIntentVerificationQuery.qll b/java/ql/lib/semmle/code/java/security/ImproperIntentVerificationQuery.qll index ff5ebe86217..61f88f39578 100644 --- a/java/ql/lib/semmle/code/java/security/ImproperIntentVerificationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ImproperIntentVerificationQuery.qll @@ -51,7 +51,7 @@ private module VerifiedIntentFlow = DataFlow::Global; /** An `onReceive` method that doesn't verify the action of the intent it receives. */ private class UnverifiedOnReceiveMethod extends OnReceiveMethod { UnverifiedOnReceiveMethod() { - not VerifiedIntentFlow::flow(DataFlow::parameterNode(this.getIntentParameter()), _) and + not VerifiedIntentFlow::flowFrom(DataFlow::parameterNode(this.getIntentParameter())) and // Empty methods do not need to be verified since they do not perform any actions. this.getBody().getNumStmt() > 0 } diff --git a/java/ql/lib/semmle/code/java/security/ListOfConstantsSanitizer.qll b/java/ql/lib/semmle/code/java/security/ListOfConstantsSanitizer.qll index 4294ac84f68..c8d52f4191c 100644 --- a/java/ql/lib/semmle/code/java/security/ListOfConstantsSanitizer.qll +++ b/java/ql/lib/semmle/code/java/security/ListOfConstantsSanitizer.qll @@ -9,7 +9,7 @@ import java private import codeql.typeflow.UniversalFlow as UniversalFlow private import semmle.code.java.Collections private import semmle.code.java.controlflow.Guards -private import semmle.code.java.dataflow.internal.BaseSSA +private import semmle.code.java.dataflow.internal.BaseSSA as Base private import semmle.code.java.dataflow.TaintTracking private import semmle.code.java.dataflow.TypeFlow private import semmle.code.java.dispatch.VirtualDispatch @@ -115,7 +115,7 @@ private predicate nodeWithAddition(FlowNode n, Variable v) { n.asField() = v or n.asSsa().getSourceVariable().getVariable() = v and - (n.asSsa() instanceof BaseSsaUpdate or n.asSsa().(BaseSsaImplicitInit).isParameterDefinition(_)) + n.asSsa() instanceof Base::SsaExplicitWrite ) } diff --git a/java/ql/lib/semmle/code/java/security/NumericCastTaintedQuery.qll b/java/ql/lib/semmle/code/java/security/NumericCastTaintedQuery.qll index 841ff4f8515..4b2d7709fbd 100644 --- a/java/ql/lib/semmle/code/java/security/NumericCastTaintedQuery.qll +++ b/java/ql/lib/semmle/code/java/security/NumericCastTaintedQuery.qll @@ -46,14 +46,14 @@ class RightShiftOp extends Expr { } private predicate boundedRead(VarRead read) { - exists(SsaVariable v, ConditionBlock cb, ComparisonExpr comp, boolean testIsTrue | - read = v.getAUse() and + exists(SsaDefinition v, ConditionBlock cb, ComparisonExpr comp, boolean testIsTrue | + read = v.getARead() and cb.controls(read.getBasicBlock(), testIsTrue) and cb.getCondition() = comp | - comp.getLesserOperand() = v.getAUse() and testIsTrue = true + comp.getLesserOperand() = v.getARead() and testIsTrue = true or - comp.getGreaterOperand() = v.getAUse() and testIsTrue = false + comp.getGreaterOperand() = v.getARead() and testIsTrue = false ) } diff --git a/java/ql/lib/semmle/code/java/security/PathSanitizer.qll b/java/ql/lib/semmle/code/java/security/PathSanitizer.qll index da6f242bde5..2018004a3fb 100644 --- a/java/ql/lib/semmle/code/java/security/PathSanitizer.qll +++ b/java/ql/lib/semmle/code/java/security/PathSanitizer.qll @@ -4,6 +4,7 @@ module; import java private import semmle.code.java.controlflow.Guards +private import semmle.code.java.dataflow.ExternalFlow private import semmle.code.java.dataflow.FlowSources private import semmle.code.java.dataflow.SSA private import semmle.code.java.frameworks.kotlin.IO @@ -288,19 +289,8 @@ private Method getSourceMethod(Method m) { result = m } -/** - * A sanitizer that protects against path injection vulnerabilities - * by extracting the final component of the user provided path. - * - * TODO: convert this class to models-as-data if sanitizer support is added - */ -private class FileGetNameSanitizer extends PathInjectionSanitizer { - FileGetNameSanitizer() { - exists(MethodCall mc | - mc.getMethod().hasQualifiedName("java.io", "File", "getName") and - this.asExpr() = mc - ) - } +private class DefaultPathInjectionSanitizer extends PathInjectionSanitizer { + DefaultPathInjectionSanitizer() { barrierNode(this, "path-injection") } } /** Holds if `g` is a guard that checks for `..` components. */ diff --git a/java/ql/lib/semmle/code/java/security/RequestForgery.qll b/java/ql/lib/semmle/code/java/security/RequestForgery.qll index dc15ad943bc..690e4f9315b 100644 --- a/java/ql/lib/semmle/code/java/security/RequestForgery.qll +++ b/java/ql/lib/semmle/code/java/security/RequestForgery.qll @@ -118,25 +118,8 @@ private class ContainsUrlSanitizer extends RequestForgerySanitizer { } } -/** - * A check that the URL is relative, and therefore safe for URL redirects. - */ -private predicate isRelativeUrlSanitizer(Guard guard, Expr e, boolean branch) { - guard = - any(MethodCall call | - call.getMethod().hasQualifiedName("java.net", "URI", "isAbsolute") and - e = call.getQualifier() and - branch = false - ) -} - -/** - * A check that the URL is relative, and therefore safe for URL redirects. - */ -private class RelativeUrlSanitizer extends RequestForgerySanitizer { - RelativeUrlSanitizer() { - this = DataFlow::BarrierGuard::getABarrierNode() - } +private class DefaultRequestForgerySanitizer extends RequestForgerySanitizer { + DefaultRequestForgerySanitizer() { barrierNode(this, "request-forgery") } } /** @@ -166,22 +149,7 @@ private class HostComparisonSanitizer extends RequestForgerySanitizer { } /** - * A qualifier in a call to a `.matches()` method that is a sanitizer for URL redirects. - * - * Matches any method call where the method is named `matches`. + * A comparison with a regular expression that is a sanitizer for URL redirects. */ -private predicate isMatchesSanitizer(Guard guard, Expr e, boolean branch) { - guard = - any(MethodCall method | - method.getMethod().getName() = "matches" and - e = method.getQualifier() and - branch = true - ) -} - -/** - * A qualifier in a call to `.matches()` that is a sanitizer for URL redirects. - */ -private class MatchesSanitizer extends RequestForgerySanitizer { - MatchesSanitizer() { this = DataFlow::BarrierGuard::getABarrierNode() } -} +private class RegexpCheckRequestForgerySanitizer extends RequestForgerySanitizer instanceof RegexpCheckBarrier +{ } diff --git a/java/ql/lib/semmle/code/java/security/Sanitizers.qll b/java/ql/lib/semmle/code/java/security/Sanitizers.qll index 21e7ccf264f..3f909864d2c 100644 --- a/java/ql/lib/semmle/code/java/security/Sanitizers.qll +++ b/java/ql/lib/semmle/code/java/security/Sanitizers.qll @@ -3,7 +3,9 @@ overlay[local?] module; import java +private import semmle.code.java.controlflow.Guards private import semmle.code.java.dataflow.DataFlow +private import semmle.code.java.frameworks.Regex /** * A node whose type is a simple type unlikely to carry taint, such as primitives and their boxed counterparts, @@ -29,3 +31,44 @@ class SimpleTypeSanitizer extends DataFlow::Node { this.getType() instanceof EnumType } } + +/** + * Holds if `guard` holds with branch `branch` if `e` matches a regular expression. + * + * This is overapproximate: we do not attempt to reason about the correctness of the regexp. + * + * Use this if you want to define a derived `DataFlow::BarrierGuard` without + * make the type recursive. Otherwise use `RegexpCheckBarrier`. + */ +predicate regexpMatchGuardChecks(Guard guard, Expr e, boolean branch) { + exists(Method method, MethodCall mc | + method = mc.getMethod() and + guard = mc and + branch = true + | + // `String.matches` and other `matches` methods. + method.getName() = "matches" and + e = mc.getQualifier() + or + method instanceof PatternMatchesMethod and + e = mc.getArgument(1) + or + method instanceof MatcherMatchesMethod and + exists(MethodCall matcherCall | + matcherCall.getMethod() instanceof PatternMatcherMethod and + e = matcherCall.getArgument(0) and + DataFlow::localExprFlow(matcherCall, mc.getQualifier()) + ) + ) +} + +/** + * A check against a regular expression, considered as a barrier guard. + * + * This is overapproximate: we do not attempt to reason about the correctness of the regexp. + */ +class RegexpCheckBarrier extends DataFlow::Node { + RegexpCheckBarrier() { + this = DataFlow::BarrierGuard::getABarrierNode() + } +} diff --git a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll index 25454d80c71..7058b844cbd 100644 --- a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll +++ b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll @@ -6,10 +6,14 @@ import semmle.code.java.dataflow.TaintTracking import semmle.code.java.security.SensitiveActions import semmle.code.java.frameworks.android.Compose private import semmle.code.java.security.Sanitizers +private import semmle.code.java.dataflow.RangeAnalysis /** A data flow source node for sensitive logging sources. */ abstract class SensitiveLoggerSource extends DataFlow::Node { } +/** A data flow barrier node for sensitive logging sanitizers. */ +abstract class SensitiveLoggerBarrier extends DataFlow::Node { } + /** A variable that may hold sensitive information, judging by its name. */ class VariableWithSensitiveName extends Variable { VariableWithSensitiveName() { @@ -40,17 +44,89 @@ private class TypeType extends RefType { } } +/** + * A sanitizer that may remove sensitive information from a string before logging. + * + * It allows for substring operations taking the first N (or last N, for Kotlin) characters, limited to 7 or fewer. + */ +private class PrefixSuffixBarrier extends SensitiveLoggerBarrier { + PrefixSuffixBarrier() { + exists(MethodCall mc, Method m, int limit | + limit = 7 and + mc.getMethod() = m + | + // substring in Java + ( + m.hasQualifiedName("java.lang", "String", "substring") or + m.hasQualifiedName("java.lang", "StringBuffer", "substring") or + m.hasQualifiedName("java.lang", "StringBuilder", "substring") + ) and + ( + twoArgLimit(mc, limit, false) or + singleArgLimit(mc, limit, false) + ) and + this.asExpr() = mc.getQualifier() + or + // Kotlin string operations, which use extension methods (so the string is the first argument) + ( + m.hasQualifiedName("kotlin.text", "StringsKt", "substring") and + ( + twoArgLimit(mc, limit, true) or + singleArgLimit(mc, limit, true) + ) + or + m.hasQualifiedName("kotlin.text", "StringsKt", ["take", "takeLast"]) and + singleArgLimit(mc, limit, true) + ) and + this.asExpr() = mc.getArgument(0) + ) + } +} + +/** A predicate to check single-argument method calls for a constant integer below a set limit. */ +bindingset[limit, isKotlin] +private predicate singleArgLimit(MethodCall mc, int limit, boolean isKotlin) { + mc.getNumArgument() = 1 and + exists(int firstArgIndex, int delta | + if isKotlin = true then firstArgIndex = 1 else firstArgIndex = 0 + | + bounded(mc.getArgument(firstArgIndex), any(ZeroBound z), delta, true, _) and + delta <= limit + ) +} + +/** A predicate to check two-argument method calls for zero and a constant integer below a set limit. */ +bindingset[limit, isKotlin] +private predicate twoArgLimit(MethodCall mc, int limit, boolean isKotlin) { + mc.getNumArgument() = 2 and + exists(int firstArgIndex, int secondArgIndex, int delta | + isKotlin = true and firstArgIndex = 1 and secondArgIndex = 2 + or + isKotlin = false and firstArgIndex = 0 and secondArgIndex = 1 + | + // mc.getArgument(firstArgIndex).(CompileTimeConstantExpr).getIntValue() = 0 and + bounded(mc.getArgument(firstArgIndex), any(ZeroBound z), 0, true, _) and + bounded(mc.getArgument(firstArgIndex), any(ZeroBound z), 0, false, _) and + bounded(mc.getArgument(secondArgIndex), any(ZeroBound z), delta, true, _) and + delta <= limit + ) +} + +private class DefaultSensitiveLoggerBarrier extends SensitiveLoggerBarrier { + DefaultSensitiveLoggerBarrier() { + this.asExpr() instanceof LiveLiteral or + this instanceof SimpleTypeSanitizer or + this.getType() instanceof TypeType + } +} + /** A data-flow configuration for identifying potentially-sensitive data flowing to a log output. */ module SensitiveLoggerConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof SensitiveLoggerSource } predicate isSink(DataFlow::Node sink) { sinkNode(sink, "log-injection") } - predicate isBarrier(DataFlow::Node sanitizer) { - sanitizer.asExpr() instanceof LiveLiteral or - sanitizer instanceof SimpleTypeSanitizer or - sanitizer.getType() instanceof TypeType - } + predicate isBarrier(DataFlow::Node sanitizer) { sanitizer instanceof SensitiveLoggerBarrier } predicate isBarrierIn(DataFlow::Node node) { isSource(node) } diff --git a/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll b/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll index b2f49834b5a..477aeb48b64 100644 --- a/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll @@ -5,7 +5,6 @@ private import semmle.code.java.dataflow.DataFlow private import semmle.code.java.controlflow.Guards private import semmle.code.java.dataflow.ExternalFlow private import semmle.code.java.dataflow.FlowSources -private import semmle.code.java.frameworks.owasp.Esapi private import semmle.code.java.security.Sanitizers /** @@ -28,25 +27,8 @@ class TrustBoundaryViolationSink extends DataFlow::Node { */ abstract class TrustBoundaryValidationSanitizer extends DataFlow::Node { } -/** - * A node validated by an OWASP ESAPI validation method. - */ -private class EsapiValidatedInputSanitizer extends TrustBoundaryValidationSanitizer { - EsapiValidatedInputSanitizer() { - this = DataFlow::BarrierGuard::getABarrierNode() or - this.asExpr().(MethodCall).getMethod() instanceof EsapiGetValidMethod - } -} - -/** - * Holds if `g` is a guard that checks that `e` is valid data according to an OWASP ESAPI validation method. - */ -private predicate esapiIsValidData(Guard g, Expr e, boolean branch) { - branch = true and - exists(MethodCall ma | ma.getMethod() instanceof EsapiIsValidMethod | - g = ma and - e = ma.getArgument(1) - ) +private class DefaultTrustBoundaryValidationSanitizer extends TrustBoundaryValidationSanitizer { + DefaultTrustBoundaryValidationSanitizer() { barrierNode(this, "trust-boundary-violation") } } /** diff --git a/java/ql/lib/semmle/code/java/security/Validation.qll b/java/ql/lib/semmle/code/java/security/Validation.qll index 69f57474317..51b8defb5ec 100644 --- a/java/ql/lib/semmle/code/java/security/Validation.qll +++ b/java/ql/lib/semmle/code/java/security/Validation.qll @@ -32,9 +32,9 @@ private predicate validationCall(MethodCall ma, VarAccess va) { } private predicate validatedAccess(VarAccess va) { - exists(SsaVariable v, MethodCall guardcall | - va = v.getAUse() and - validationCall(guardcall, v.getAUse()) + exists(SsaDefinition v, MethodCall guardcall | + va = v.getARead() and + validationCall(guardcall, v.getARead()) | guardcall.(Guard).controls(va.getBasicBlock(), _) or diff --git a/java/ql/lib/semmle/code/java/security/XSS.qll b/java/ql/lib/semmle/code/java/security/XSS.qll index 990371cc8cf..c131f868f36 100644 --- a/java/ql/lib/semmle/code/java/security/XSS.qll +++ b/java/ql/lib/semmle/code/java/security/XSS.qll @@ -54,12 +54,24 @@ private class DefaultXssSink extends XssSink { } } -/** A default sanitizer that considers numeric and boolean typed data safe for writing to output. */ private class DefaultXssSanitizer extends XssSanitizer { - DefaultXssSanitizer() { + DefaultXssSanitizer() { barrierNode(this, ["html-injection", "js-injection"]) } +} + +/** A sanitizer that considers numeric and boolean typed data safe for writing to output. */ +private class PrimitiveSanitizer extends XssSanitizer { + PrimitiveSanitizer() { this.getType() instanceof NumericType or - this.getType() instanceof BooleanType or - // Match `org.springframework.web.util.HtmlUtils.htmlEscape` and possibly other methods like it. + this.getType() instanceof BooleanType + } +} + +/** + * A call to `org.springframework.web.util.HtmlUtils.htmlEscape`, or possibly + * other methods like it, considered as a sanitizer for XSS. + */ +private class HtmlEscapeXssSanitizer extends XssSanitizer { + HtmlEscapeXssSanitizer() { this.asExpr().(MethodCall).getMethod().getName().regexpMatch("(?i)html_?escape.*") } } diff --git a/java/ql/lib/semmle/code/java/security/regexp/RegexInjection.qll b/java/ql/lib/semmle/code/java/security/regexp/RegexInjection.qll index eb27ec87375..d91b411b797 100644 --- a/java/ql/lib/semmle/code/java/security/regexp/RegexInjection.qll +++ b/java/ql/lib/semmle/code/java/security/regexp/RegexInjection.qll @@ -21,17 +21,8 @@ private class DefaultRegexInjectionSink extends RegexInjectionSink { } } -/** - * A call to the `Pattern.quote` method, which gives metacharacters or escape sequences - * no special meaning. - */ -private class PatternQuoteCall extends RegexInjectionSanitizer { - PatternQuoteCall() { - exists(MethodCall ma, Method m | m = ma.getMethod() | - ma.getArgument(0) = this.asExpr() and - m instanceof PatternQuoteMethod - ) - } +private class DefaultRegexInjectionSanitizer extends RegexInjectionSanitizer { + DefaultRegexInjectionSanitizer() { barrierNode(this, "regex-use") } } /** diff --git a/java/ql/lib/semmle/code/xml/XML.qll b/java/ql/lib/semmle/code/xml/XML.qll index d13a83e7798..e4073362fc6 100644 --- a/java/ql/lib/semmle/code/xml/XML.qll +++ b/java/ql/lib/semmle/code/xml/XML.qll @@ -6,7 +6,6 @@ module; import semmle.files.FileSystem private import codeql.xml.Xml -private import semmle.code.java.Overlay private module Input implements InputSig { class XmlLocatableBase = @xmllocatable or @xmlnamespaceable; @@ -70,13 +69,3 @@ private module Input implements InputSig { } import Make - -private class DiscardableXmlAttribute extends DiscardableXmlLocatable, @xmlattribute { } - -private class DiscardableXmlElement extends DiscardableXmlLocatable, @xmlelement { } - -private class DiscardableXmlComment extends DiscardableXmlLocatable, @xmlcomment { } - -private class DiscardableXmlCharacters extends DiscardableXmlLocatable, @xmlcharacters { } - -private class DiscardableXmlDtd extends DiscardableXmlLocatable, @xmldtd { } diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index ed02fdc5bb2..a30e72bfaef 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,26 @@ +## 1.10.3 + +### Minor Analysis Improvements + +* Java analysis no longer forces `--source` and `--target` compiler flags for Maven builds. This allows Maven to use the project's own compiler configuration, improving build compatibility. + +## 1.10.2 + +No user-facing changes. + +## 1.10.1 + +### Minor Analysis Improvements + +* Operations that extract only a fixed-length prefix or suffix of a string (for example, `substring` in Java or `take` in Kotlin), when limited to a length of at most 7 characters, are now treated as sanitizers for the `java/sensitive-log` query. + +## 1.10.0 + +### Query Metadata Changes + +* Reduced the `security-severity` score of the `java/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. +* Reduced the `security-severity` score of the `java/insecure-cookie` query from 5.0 to 4.0 to better reflect its impact. + ## 1.9.0 ### New Queries diff --git a/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql b/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql index 845aae01a3e..701084ac794 100644 --- a/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql +++ b/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql @@ -19,10 +19,10 @@ import semmle.code.java.dataflow.RangeUtils import semmle.code.java.dataflow.RangeAnalysis pragma[nomagic] -predicate ssaArrayLengthBound(SsaVariable arr, Bound b) { +predicate ssaArrayLengthBound(SsaDefinition arr, Bound b) { exists(FieldAccess len | len.getField() instanceof ArrayLengthField and - len.getQualifier() = arr.getAUse() and + len.getQualifier() = arr.getARead() and b.getExpr() = len ) } @@ -31,9 +31,9 @@ predicate ssaArrayLengthBound(SsaVariable arr, Bound b) { * Holds if the index expression of `aa` is less than or equal to the array length plus `k`. */ predicate boundedArrayAccess(ArrayAccess aa, int k) { - exists(SsaVariable arr, Expr index, Bound b, int delta | + exists(SsaDefinition arr, Expr index, Bound b, int delta | aa.getIndexExpr() = index and - aa.getArray() = arr.getAUse() and + aa.getArray() = arr.getARead() and bounded(index, b, delta, true, _) | ssaArrayLengthBound(arr, b) and diff --git a/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql b/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql index e60c65953d1..5c2fd94a917 100644 --- a/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql +++ b/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.ql @@ -127,7 +127,7 @@ Expr overFlowCand() { c.getIntValue() >= 0 ) or - exists(SsaExplicitUpdate x | result = x.getAUse() and x.getDefiningExpr() = overFlowCand()) + exists(SsaExplicitWrite x | result = x.getARead() and x.getDefiningExpr() = overFlowCand()) or result.(AssignExpr).getRhs() = overFlowCand() or @@ -142,27 +142,27 @@ Expr overFlowCand() { predicate positiveOrNegative(Expr e) { positive(e) or negative(e) } /** Gets an expression that equals `v` plus a positive or negative value. */ -Expr increaseOrDecreaseOfVar(SsaVariable v) { +Expr increaseOrDecreaseOfVar(SsaDefinition v) { exists(AssignAddExpr add | result = add and positiveOrNegative(add.getDest()) and - add.getRhs() = v.getAUse() + add.getRhs() = v.getARead() ) or exists(AddExpr add, Expr e | result = add and - add.hasOperands(v.getAUse(), e) and + add.hasOperands(v.getARead(), e) and positiveOrNegative(e) ) or exists(SubExpr sub | result = sub and - sub.getLeftOperand() = v.getAUse() and + sub.getLeftOperand() = v.getARead() and positiveOrNegative(sub.getRightOperand()) ) or - exists(SsaExplicitUpdate x | - result = x.getAUse() and x.getDefiningExpr() = increaseOrDecreaseOfVar(v) + exists(SsaExplicitWrite x | + result = x.getARead() and x.getDefiningExpr() = increaseOrDecreaseOfVar(v) ) or result.(AssignExpr).getRhs() = increaseOrDecreaseOfVar(v) @@ -172,7 +172,7 @@ Expr increaseOrDecreaseOfVar(SsaVariable v) { predicate overFlowTest(ComparisonExpr comp) { ( - exists(SsaVariable v | comp.hasOperands(increaseOrDecreaseOfVar(v), v.getAUse())) + exists(SsaDefinition v | comp.hasOperands(increaseOrDecreaseOfVar(v), v.getARead())) or comp.getLesserOperand() = overFlowCand() and comp.getGreaterOperand().(IntegerLiteral).getIntValue() = 0 @@ -195,9 +195,9 @@ predicate concurrentModificationTest(BinaryExpr test) { */ pragma[nomagic] predicate guardedTest(EqualityTest test, Guard guard, boolean isEq, int i1, int i2) { - exists(SsaVariable v, CompileTimeConstantExpr c1, CompileTimeConstantExpr c2 | - guard.isEquality(v.getAUse(), c1, isEq) and - test.hasOperands(v.getAUse(), c2) and + exists(SsaDefinition v, CompileTimeConstantExpr c1, CompileTimeConstantExpr c2 | + guard.isEquality(v.getARead(), c1, isEq) and + test.hasOperands(v.getARead(), c2) and i1 = c1.getIntValue() and i2 = c2.getIntValue() and v.getSourceVariable().getType() instanceof IntegralType diff --git a/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.qll b/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.qll index 2933ae5305e..787cda44807 100644 --- a/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.qll +++ b/java/ql/src/Likely Bugs/Comparison/UselessComparisonTest.qll @@ -27,14 +27,14 @@ class BoundKind extends string { */ predicate uselessTest(ConditionNode s1, BinaryExpr test, boolean testIsTrue) { exists( - ConditionBlock cb, SsaVariable v, BinaryExpr cond, boolean condIsTrue, int k1, int k2, + ConditionBlock cb, SsaDefinition v, BinaryExpr cond, boolean condIsTrue, int k1, int k2, CompileTimeConstantExpr c1, CompileTimeConstantExpr c2 | s1.getCondition() = cond and cb.getCondition() = cond and - cond.hasOperands(v.getAUse(), c1) and + cond.hasOperands(v.getARead(), c1) and c1.getIntValue() = k1 and - test.hasOperands(v.getAUse(), c2) and + test.hasOperands(v.getARead(), c2) and c2.getIntValue() = k2 and v.getSourceVariable().getVariable() instanceof LocalScopeVariable and cb.controls(test.getBasicBlock(), condIsTrue) and @@ -49,7 +49,7 @@ predicate uselessTest(ConditionNode s1, BinaryExpr test, boolean testIsTrue) { ) or exists(ComparisonExpr comp | comp = cond | - comp.getLesserOperand() = v.getAUse() and + comp.getLesserOperand() = v.getARead() and ( condIsTrue = true and boundKind.isUpper() and @@ -60,7 +60,7 @@ predicate uselessTest(ConditionNode s1, BinaryExpr test, boolean testIsTrue) { (if comp.isStrict() then bound = k1 else bound = k1 + 1) ) or - comp.getGreaterOperand() = v.getAUse() and + comp.getGreaterOperand() = v.getARead() and ( condIsTrue = true and boundKind.isLower() and @@ -88,7 +88,7 @@ predicate uselessTest(ConditionNode s1, BinaryExpr test, boolean testIsTrue) { ) or exists(ComparisonExpr comp | comp = test | - comp.getLesserOperand() = v.getAUse() and + comp.getLesserOperand() = v.getARead() and ( boundKind.providesLowerBound() and testIsTrue = false and @@ -107,7 +107,7 @@ predicate uselessTest(ConditionNode s1, BinaryExpr test, boolean testIsTrue) { ) ) or - comp.getGreaterOperand() = v.getAUse() and + comp.getGreaterOperand() = v.getARead() and ( boundKind.providesLowerBound() and testIsTrue = true and diff --git a/java/ql/src/Likely Bugs/Concurrency/DoubleCheckedLocking.qll b/java/ql/src/Likely Bugs/Concurrency/DoubleCheckedLocking.qll index ac279049ed1..19c2dbc783e 100644 --- a/java/ql/src/Likely Bugs/Concurrency/DoubleCheckedLocking.qll +++ b/java/ql/src/Likely Bugs/Concurrency/DoubleCheckedLocking.qll @@ -8,9 +8,9 @@ import semmle.code.java.dataflow.SSA private Expr getAFieldRead(Field f) { result = f.getAnAccess() or - exists(SsaExplicitUpdate v | v.getSourceVariable().getVariable() instanceof LocalScopeVariable | - result = v.getAUse() and - v.getDefiningExpr().(VariableAssign).getSource() = getAFieldRead(f) + exists(SsaExplicitWrite v | v.getSourceVariable().getVariable() instanceof LocalScopeVariable | + result = v.getARead() and + v.getValue() = getAFieldRead(f) ) or result.(AssignExpr).getSource() = getAFieldRead(f) diff --git a/java/ql/src/Likely Bugs/Concurrency/UnreleasedLock.ql b/java/ql/src/Likely Bugs/Concurrency/UnreleasedLock.ql index c7d33eff4a9..4a4be748a28 100644 --- a/java/ql/src/Likely Bugs/Concurrency/UnreleasedLock.ql +++ b/java/ql/src/Likely Bugs/Concurrency/UnreleasedLock.ql @@ -52,10 +52,10 @@ predicate failedLock(LockType t, BasicBlock lockblock, BasicBlock exblock) { ( lock.asExpr() = t.getLockAccess() or - exists(SsaExplicitUpdate lockbool | + exists(SsaExplicitWrite lockbool | // Using the value of `t.getLockAccess()` ensures that it is a `tryLock` call. - lock.asExpr() = lockbool.getAUse() and - lockbool.getDefiningExpr().(VariableAssign).getSource() = t.getLockAccess() + lock.asExpr() = lockbool.getARead() and + lockbool.getValue() = t.getLockAccess() ) ) and ( diff --git a/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql b/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql index e48eb1f5ce6..8f8d04e6eb2 100644 --- a/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql +++ b/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql @@ -37,11 +37,11 @@ predicate requiresInstanceOf(Expr e, VarAccess va, RefType t) { * `v` is not of type `sup`, which is a supertype of `t`. */ predicate contradictoryTypeCheck(Expr e, Variable v, RefType t, RefType sup, Expr cond) { - exists(SsaVariable ssa | + exists(SsaDefinition ssa | ssa.getSourceVariable().getVariable() = v and - requiresInstanceOf(e, ssa.getAUse(), t) and + requiresInstanceOf(e, ssa.getARead(), t) and sup = t.getAnAncestor() and - instanceOfCheck(cond, ssa.getAUse(), sup) and + instanceOfCheck(cond, ssa.getARead(), sup) and cond.(Guard).controls(e.getBasicBlock(), false) and not t instanceof ErrorType and not sup instanceof ErrorType diff --git a/java/ql/src/Likely Bugs/Termination/ConstantLoopCondition.ql b/java/ql/src/Likely Bugs/Termination/ConstantLoopCondition.ql index d4fbc480e1b..bf03191bdac 100644 --- a/java/ql/src/Likely Bugs/Termination/ConstantLoopCondition.ql +++ b/java/ql/src/Likely Bugs/Termination/ConstantLoopCondition.ql @@ -75,9 +75,9 @@ where loopWhileTrue(loop) and loopExitGuard(loop, cond) ) and // None of the ssa variables in `cond` are updated inside the loop. - forex(SsaVariable ssa, VarRead use | ssa.getAUse() = use and use.getParent*() = cond | - not ssa.getCfgNode().getEnclosingStmt().getEnclosingStmt*() = loop or - ssa.getCfgNode().asExpr().getParent*() = loop.(ForStmt).getAnInit() + forex(SsaDefinition ssa, VarRead use | ssa.getARead() = use and use.getParent*() = cond | + not ssa.getControlFlowNode().getEnclosingStmt().getEnclosingStmt*() = loop or + ssa.getControlFlowNode().asExpr().getParent*() = loop.(ForStmt).getAnInit() ) and // And `cond` does not use method calls, field reads, or array reads. not exists(MethodCall ma | ma.getParent*() = cond) and diff --git a/java/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql b/java/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql index a75672445fb..ec1024fde02 100644 --- a/java/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql +++ b/java/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql @@ -6,7 +6,8 @@ * @precision low * @problem.severity error * @security-severity 7.8 - * @tags security external/cwe/cwe-020 + * @tags security + * external/cwe/cwe-020 */ import java diff --git a/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql b/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql index 45767185dfd..cc076039940 100644 --- a/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql +++ b/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql @@ -118,7 +118,7 @@ where // implicit: no setAllowContentAccess(false) exists(WebViewSource source | source.asExpr() = e and - not WebViewDisallowContentAccessFlow::flow(source, _) + not WebViewDisallowContentAccessFlow::flowFrom(source) ) select e, "Sensitive information may be exposed via a malicious link due to access to content:// links being allowed in this WebView." diff --git a/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll b/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll index 5afab52c37e..f0b1ab85c60 100644 --- a/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll +++ b/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll @@ -14,7 +14,7 @@ private predicate emptyDecl(LocalVariableDeclExpr decl) { /** A dead variable update. */ predicate deadLocal(VariableUpdate upd) { upd.getDestVar() instanceof LocalScopeVariable and - not exists(SsaExplicitUpdate ssa | upd = ssa.getDefiningExpr()) and + not exists(SsaExplicitWrite ssa | upd = ssa.getDefiningExpr()) and not emptyDecl(upd) and not readImplicitly(upd, _) } diff --git a/java/ql/src/change-notes/2025-11-13-maven-default-java-17 b/java/ql/src/change-notes/2025-11-13-maven-default-java-17 new file mode 100644 index 00000000000..26425b103ab --- /dev/null +++ b/java/ql/src/change-notes/2025-11-13-maven-default-java-17 @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Java analysis now selects the Java version to use informed by Maven POM files across all project modules. It also tries to use Java 17 or higher for all Maven projects if possible, for improved build compatibility. \ No newline at end of file diff --git a/java/ql/src/change-notes/2025-10-22-adjust-query-severity.md b/java/ql/src/change-notes/released/1.10.0.md similarity index 66% rename from java/ql/src/change-notes/2025-10-22-adjust-query-severity.md rename to java/ql/src/change-notes/released/1.10.0.md index 61cc9402a78..6cfa49bc2c4 100644 --- a/java/ql/src/change-notes/2025-10-22-adjust-query-severity.md +++ b/java/ql/src/change-notes/released/1.10.0.md @@ -1,5 +1,6 @@ ---- -category: queryMetadata ---- +## 1.10.0 + +### Query Metadata Changes + * Reduced the `security-severity` score of the `java/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. -* Reduced the `security-severity` score of the `java/insecure-cookie` query from 5.0 to 4.0 to better reflect its impact. \ No newline at end of file +* Reduced the `security-severity` score of the `java/insecure-cookie` query from 5.0 to 4.0 to better reflect its impact. diff --git a/java/ql/src/change-notes/released/1.10.1.md b/java/ql/src/change-notes/released/1.10.1.md new file mode 100644 index 00000000000..1eb6ace7d45 --- /dev/null +++ b/java/ql/src/change-notes/released/1.10.1.md @@ -0,0 +1,5 @@ +## 1.10.1 + +### Minor Analysis Improvements + +* Operations that extract only a fixed-length prefix or suffix of a string (for example, `substring` in Java or `take` in Kotlin), when limited to a length of at most 7 characters, are now treated as sanitizers for the `java/sensitive-log` query. diff --git a/java/ql/src/change-notes/released/1.10.2.md b/java/ql/src/change-notes/released/1.10.2.md new file mode 100644 index 00000000000..fdf84c874fb --- /dev/null +++ b/java/ql/src/change-notes/released/1.10.2.md @@ -0,0 +1,3 @@ +## 1.10.2 + +No user-facing changes. diff --git a/java/ql/src/change-notes/released/1.10.3.md b/java/ql/src/change-notes/released/1.10.3.md new file mode 100644 index 00000000000..758236f0cc0 --- /dev/null +++ b/java/ql/src/change-notes/released/1.10.3.md @@ -0,0 +1,5 @@ +## 1.10.3 + +### Minor Analysis Improvements + +* Java analysis no longer forces `--source` and `--target` compiler flags for Maven builds. This allows Maven to use the project's own compiler configuration, improving build compatibility. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index df17dc3a366..d3e15295550 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.9.0 +lastReleaseVersion: 1.10.3 diff --git a/java/ql/src/experimental/Security/CWE/CWE-295/JxBrowserWithoutCertValidation.ql b/java/ql/src/experimental/Security/CWE/CWE-295/JxBrowserWithoutCertValidation.ql index 48c49d5c071..c53c2cacdae 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-295/JxBrowserWithoutCertValidation.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-295/JxBrowserWithoutCertValidation.ql @@ -85,7 +85,7 @@ private module JxBrowserFlow = DataFlow::Global; deprecated query predicate problems(DataFlow::Node src, string message) { JxBrowserFlowConfig::isSource(src) and - not JxBrowserFlow::flow(src, _) and + not JxBrowserFlow::flowFrom(src) and not isSafeJxBrowserVersion() and message = "This JxBrowser instance may not check HTTPS certificates." } diff --git a/java/ql/src/experimental/Security/CWE/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql b/java/ql/src/experimental/Security/CWE/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql index a5d17250491..180b816fc9f 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql @@ -1,5 +1,5 @@ /** - * @name Unsafe usage of v1 version of Azure Storage client-side encryption (CVE-2022-30187). + * @name Unsafe usage of v1 version of Azure Storage client-side encryption (CVE-2022-30187) * @description Unsafe usage of v1 version of Azure Storage client-side encryption, please refer to http://aka.ms/azstorageclientencryptionblog * @kind problem * @tags security diff --git a/java/ql/src/experimental/Security/CWE/CWE-346/UnvalidatedCors.ql b/java/ql/src/experimental/Security/CWE/CWE-346/UnvalidatedCors.ql index ef95db6f6c5..fc0cc59244c 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-346/UnvalidatedCors.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-346/UnvalidatedCors.ql @@ -50,7 +50,7 @@ private Expr getAccessControlAllowOriginHeaderName() { * A taint-tracking configuration for flow from a source node to CorsProbableCheckAccess methods. */ module CorsSourceReachesCheckConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { CorsOriginFlow::flow(source, _) } + predicate isSource(DataFlow::Node source) { CorsOriginFlow::flowFrom(source) } predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(CorsProbableCheckAccess check).getAnArgument() @@ -86,7 +86,7 @@ deprecated query predicate problems( string message1, DataFlow::Node sourceNode, string message2 ) { CorsOriginFlow::flowPath(source, sink) and - not CorsSourceReachesCheckFlow::flow(sourceNode, _) and + not CorsSourceReachesCheckFlow::flowFrom(sourceNode) and sinkNode = sink.getNode() and message1 = "CORS header is being set using user controlled value $@." and sourceNode = source.getNode() and diff --git a/java/ql/src/experimental/Security/CWE/CWE-347/Auth0NoVerifier.ql b/java/ql/src/experimental/Security/CWE/CWE-347/Auth0NoVerifier.ql index 778939887f0..16b0f024329 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-347/Auth0NoVerifier.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-347/Auth0NoVerifier.ql @@ -17,7 +17,7 @@ deprecated import JwtAuth0 as JwtAuth0 deprecated module JwtDecodeConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource and - not FlowToJwtVerify::flow(source, _) + not FlowToJwtVerify::flowFrom(source) } predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(JwtAuth0::GetPayload a) } diff --git a/java/ql/src/experimental/Security/CWE/CWE-470/LoadClassNoSignatureCheck.ql b/java/ql/src/experimental/Security/CWE/CWE-470/LoadClassNoSignatureCheck.ql index d328b79f5b1..ddf00714f40 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-470/LoadClassNoSignatureCheck.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-470/LoadClassNoSignatureCheck.ql @@ -42,9 +42,9 @@ class CheckSignaturesGuard extends Guard instanceof EqualityTest { } predicate signatureChecked(Expr safe) { - exists(CheckSignaturesGuard g, SsaVariable v | - v.getAUse() = g.getCheckedExpr() and - safe = v.getAUse() and + exists(CheckSignaturesGuard g, SsaDefinition v | + v.getARead() = g.getCheckedExpr() and + safe = v.getARead() and g.controls(safe.getBasicBlock(), g.(EqualityTest).polarity()) ) } diff --git a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql index 5573c9e0e1d..5803915dd03 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql @@ -1,5 +1,5 @@ /** - * @name Unsafe deserialization in a remotely callable method. + * @name Unsafe deserialization in a remotely callable method * @description If a registered remote object has a method that accepts a complex object, * an attacker can take advantage of the unsafe deserialization mechanism * which is used to pass parameters in RMI. diff --git a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInConfigurationClass.ql b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInConfigurationClass.ql index 949ffee66e6..2db3bfa750b 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInConfigurationClass.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInConfigurationClass.ql @@ -1,5 +1,5 @@ /** - * @name Unsafe deserialization with Spring's remote service exporters. + * @name Unsafe deserialization with Spring's remote service exporters * @description A Spring bean, which is based on RemoteInvocationSerializingExporter, * initializes an endpoint that uses ObjectInputStream to deserialize * incoming data. In the worst case, that may lead to remote code execution. diff --git a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInXMLConfiguration.ql b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInXMLConfiguration.ql index 1b570465f23..d74fa98afc1 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInXMLConfiguration.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterInXMLConfiguration.ql @@ -1,5 +1,5 @@ /** - * @name Unsafe deserialization with Spring's remote service exporters. + * @name Unsafe deserialization with Spring's remote service exporters * @description A Spring bean, which is based on RemoteInvocationSerializingExporter, * initializes an endpoint that uses ObjectInputStream to deserialize * incoming data. In the worst case, that may lead to remote code execution. diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 98f0bdd5710..d5ab0a6cc4a 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.9.1-dev +version: 1.10.4-dev groups: - java - queries diff --git a/java/ql/src/utils/modelconverter/ExtractNeutrals.ql b/java/ql/src/utils/modelconverter/ExtractNeutrals.ql index 47fb80af437..108aa454232 100644 --- a/java/ql/src/utils/modelconverter/ExtractNeutrals.ql +++ b/java/ql/src/utils/modelconverter/ExtractNeutrals.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD neutral model rows. + * @name Extract MaD neutral model rows * @description This extracts the Models as data neutral model rows. * @id java/utils/modelconverter/generate-data-extensions-neutral */ diff --git a/java/ql/src/utils/modelconverter/ExtractSinks.ql b/java/ql/src/utils/modelconverter/ExtractSinks.ql index 4439f3ef008..ae79cf3a49d 100644 --- a/java/ql/src/utils/modelconverter/ExtractSinks.ql +++ b/java/ql/src/utils/modelconverter/ExtractSinks.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD sink model rows. + * @name Extract MaD sink model rows * @description This extracts the Models as data sink model rows. * @id java/utils/modelconverter/generate-data-extensions-sink */ diff --git a/java/ql/src/utils/modelconverter/ExtractSources.ql b/java/ql/src/utils/modelconverter/ExtractSources.ql index cc0faca73d6..8aeb4542a00 100644 --- a/java/ql/src/utils/modelconverter/ExtractSources.ql +++ b/java/ql/src/utils/modelconverter/ExtractSources.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD source model rows. + * @name Extract MaD source model rows * @description This extracts the Models as data source model rows. * @id java/utils/modelconverter/generate-data-extensions-source */ diff --git a/java/ql/src/utils/modelconverter/ExtractSummaries.ql b/java/ql/src/utils/modelconverter/ExtractSummaries.ql index 6fbed049fd6..4976c4a1329 100644 --- a/java/ql/src/utils/modelconverter/ExtractSummaries.ql +++ b/java/ql/src/utils/modelconverter/ExtractSummaries.ql @@ -1,5 +1,5 @@ /** - * @name Extract MaD summary model rows. + * @name Extract MaD summary model rows * @description This extracts the Models as data summary model rows. * @id java/utils/modelconverter/generate-data-extensions-summary */ diff --git a/java/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql b/java/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql index 39e8cd9a0a4..e53daa73531 100644 --- a/java/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture content based summary models. + * @name Capture content based summary models * @description Finds applicable content based summary models to be used by other queries. * @kind diagnostic * @id java/utils/modelgenerator/contentbased-summary-models diff --git a/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql b/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql index 6008c3bfb8c..c5ba30945f7 100644 --- a/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture neutral models. + * @name Capture neutral models * @description Finds neutral models to be used by other queries. * @kind diagnostic * @id java/utils/modelgenerator/neutral-models diff --git a/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql b/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql index 7fcba8850d6..327bcd0da9e 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture sink models. + * @name Capture sink models * @description Finds public methods that act as sinks as they flow into a known sink. * @kind diagnostic * @id java/utils/modelgenerator/sink-models diff --git a/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql b/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql index c623645820b..2132932981c 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture source models. + * @name Capture source models * @description Finds APIs that act as sources as they expose already known sources. * @kind diagnostic * @id java/utils/modelgenerator/source-models diff --git a/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql b/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql index 3bc49c31df2..b33a7a3a4b2 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture summary models. + * @name Capture summary models * @description Finds applicable summary models to be used by other queries. * @kind diagnostic * @id java/utils/modelgenerator/summary-models diff --git a/java/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql b/java/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql index f0a33731a87..d356cc16a06 100644 --- a/java/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureTypeBasedSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture typed based summary models. + * @name Capture typed based summary models * @description Finds applicable summary models to be used by other queries. * @kind diagnostic * @id java/utils/modelgenerator/summary-models-typed-based diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll index aa68a433291..6978ca7e308 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -218,6 +218,8 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig { ) } + int contentAccessPathLimitInternal() { result = 2 } + predicate isField(DataFlow::ContentSet c) { c instanceof DataFlowUtil::FieldContent or c instanceof DataFlowUtil::SyntheticFieldContent @@ -277,10 +279,7 @@ private module SinkModelGeneratorInput implements SinkModelGeneratorInputSig { predicate sinkModelSanitizer(DataFlow::Node node) { // exclude variable capture jump steps - exists(Ssa::SsaImplicitInit closure | - closure.captures(_) and - node.asExpr() = closure.getAFirstUse() - ) + exists(Ssa::SsaCapturedDefinition closure | node.asExpr() = Ssa::ssaGetAFirstUse(closure)) } predicate apiSource(DataFlow::Node source) { diff --git a/java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.ql b/java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.ql index da0fc33464b..0bf36d842e1 100644 --- a/java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.ql +++ b/java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.ql @@ -25,9 +25,7 @@ module Config implements DataFlow::ConfigSig { module Flow = DataFlow::Global; -predicate isSunk(StringLiteral sl) { - exists(DataFlow::Node source | Flow::flow(source, _) and sl = source.asExpr()) -} +predicate isSunk(StringLiteral sl) { Flow::flowFromExpr(sl) } query predicate shouldBeSunkButIsnt(ShouldBeSunk src) { not isSunk(src) } diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql b/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql index da0fc33464b..0bf36d842e1 100644 --- a/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql @@ -25,9 +25,7 @@ module Config implements DataFlow::ConfigSig { module Flow = DataFlow::Global; -predicate isSunk(StringLiteral sl) { - exists(DataFlow::Node source | Flow::flow(source, _) and sl = source.asExpr()) -} +predicate isSunk(StringLiteral sl) { Flow::flowFromExpr(sl) } query predicate shouldBeSunkButIsnt(ShouldBeSunk src) { not isSunk(src) } diff --git a/java/ql/test/library-tests/dataflow/modulus-analysis/ModulusAnalysis.expected b/java/ql/test/library-tests/dataflow/modulus-analysis/ModulusAnalysis.expected index 953283d79db..7750e18b747 100644 --- a/java/ql/test/library-tests/dataflow/modulus-analysis/ModulusAnalysis.expected +++ b/java/ql/test/library-tests/dataflow/modulus-analysis/ModulusAnalysis.expected @@ -4,24 +4,23 @@ | ModulusAnalysis.java:4:5:4:22 | ...=... | 0 | 43 | 0 | | ModulusAnalysis.java:4:5:4:22 | c2 | 0 | 43 | 0 | | ModulusAnalysis.java:4:20:4:21 | 43 | 0 | 43 | 0 | -| ModulusAnalysis.java:7:13:7:22 | eq | SSA init(i) | 3 | 0 | -| ModulusAnalysis.java:7:18:7:18 | i | SSA init(i) | 0 | 0 | -| ModulusAnalysis.java:7:18:7:22 | ... + ... | SSA init(i) | 3 | 0 | +| ModulusAnalysis.java:7:13:7:22 | eq | SSA param(i) | 3 | 0 | +| ModulusAnalysis.java:7:18:7:18 | i | SSA param(i) | 0 | 0 | +| ModulusAnalysis.java:7:18:7:22 | ... + ... | SSA param(i) | 3 | 0 | | ModulusAnalysis.java:7:22:7:22 | 3 | 0 | 3 | 0 | | ModulusAnalysis.java:9:13:9:29 | mul | 0 | 3 | 42 | | ModulusAnalysis.java:9:19:9:20 | eq | SSA def(eq) | 0 | 0 | -| ModulusAnalysis.java:9:19:9:20 | eq | SSA init(i) | 3 | 0 | +| ModulusAnalysis.java:9:19:9:20 | eq | SSA param(i) | 3 | 0 | | ModulusAnalysis.java:9:19:9:25 | ... * ... | 0 | 0 | 42 | | ModulusAnalysis.java:9:19:9:29 | ... + ... | 0 | 3 | 42 | | ModulusAnalysis.java:9:24:9:25 | c1 | 0 | 42 | 0 | -| ModulusAnalysis.java:9:24:9:25 | c1 | SSA init(this.c1) | 0 | 0 | +| ModulusAnalysis.java:9:24:9:25 | c1 | SSA entry def(this.c1) | 0 | 0 | | ModulusAnalysis.java:9:29:9:29 | 3 | 0 | 3 | 0 | | ModulusAnalysis.java:11:13:11:21 | seven | 0 | 7 | 0 | | ModulusAnalysis.java:11:21:11:21 | 7 | 0 | 7 | 0 | | ModulusAnalysis.java:12:13:12:15 | mul | 0 | 3 | 42 | | ModulusAnalysis.java:12:13:12:15 | mul | SSA def(mul) | 0 | 0 | | ModulusAnalysis.java:12:19:12:20 | c2 | 0 | 43 | 0 | -| ModulusAnalysis.java:12:19:12:20 | c2 | SSA impl upd[untracked](this.c2) | 0 | 0 | | ModulusAnalysis.java:12:25:12:29 | seven | 0 | 7 | 0 | | ModulusAnalysis.java:12:25:12:29 | seven | SSA def(seven) | 0 | 0 | | ModulusAnalysis.java:13:32:13:34 | mul | 0 | 3 | 42 | @@ -29,49 +28,49 @@ | ModulusAnalysis.java:13:32:13:34 | mul | SSA def(mul) | 0 | 0 | | ModulusAnalysis.java:16:13:18:23 | j | 0 | 3 | 4 | | ModulusAnalysis.java:16:17:18:23 | ...?...:... | 0 | 3 | 4 | -| ModulusAnalysis.java:17:15:17:15 | i | SSA init(i) | 0 | 0 | +| ModulusAnalysis.java:17:15:17:15 | i | SSA param(i) | 0 | 0 | | ModulusAnalysis.java:17:15:17:19 | ... * ... | 0 | 0 | 4 | | ModulusAnalysis.java:17:15:17:23 | ... + ... | 0 | 3 | 4 | | ModulusAnalysis.java:17:19:17:19 | 4 | 0 | 4 | 0 | | ModulusAnalysis.java:17:23:17:23 | 3 | 0 | 3 | 0 | -| ModulusAnalysis.java:18:15:18:15 | i | SSA init(i) | 0 | 0 | +| ModulusAnalysis.java:18:15:18:15 | i | SSA param(i) | 0 | 0 | | ModulusAnalysis.java:18:15:18:19 | ... * ... | 0 | 0 | 8 | | ModulusAnalysis.java:18:15:18:23 | ... + ... | 0 | 7 | 8 | | ModulusAnalysis.java:18:19:18:19 | 8 | 0 | 8 | 0 | | ModulusAnalysis.java:18:23:18:23 | 7 | 0 | 7 | 0 | | ModulusAnalysis.java:19:28:19:28 | j | 0 | 3 | 4 | | ModulusAnalysis.java:19:28:19:28 | j | SSA def(j) | 0 | 0 | -| ModulusAnalysis.java:21:13:21:13 | x | SSA init(x) | 0 | 0 | +| ModulusAnalysis.java:21:13:21:13 | x | SSA param(x) | 0 | 0 | | ModulusAnalysis.java:21:17:21:18 | c1 | 0 | 42 | 0 | -| ModulusAnalysis.java:21:17:21:18 | c1 | SSA init(this.c1) | 0 | 0 | +| ModulusAnalysis.java:21:17:21:18 | c1 | SSA entry def(this.c1) | 0 | 0 | | ModulusAnalysis.java:21:23:21:23 | 3 | 0 | 3 | 0 | -| ModulusAnalysis.java:21:28:21:28 | y | SSA init(y) | 0 | 0 | +| ModulusAnalysis.java:21:28:21:28 | y | SSA param(y) | 0 | 0 | | ModulusAnalysis.java:21:32:21:33 | c1 | 0 | 42 | 0 | -| ModulusAnalysis.java:21:32:21:33 | c1 | SSA init(this.c1) | 0 | 0 | +| ModulusAnalysis.java:21:32:21:33 | c1 | SSA entry def(this.c1) | 0 | 0 | | ModulusAnalysis.java:21:38:21:38 | 7 | 0 | 7 | 0 | | ModulusAnalysis.java:22:32:22:32 | x | 0 | 3 | 42 | -| ModulusAnalysis.java:22:32:22:32 | x | SSA init(x) | 0 | 0 | +| ModulusAnalysis.java:22:32:22:32 | x | SSA param(x) | 0 | 0 | | ModulusAnalysis.java:22:32:22:36 | ... + ... | 0 | 10 | 42 | -| ModulusAnalysis.java:22:32:22:36 | ... + ... | SSA init(x) | 7 | 42 | -| ModulusAnalysis.java:22:32:22:36 | ... + ... | SSA init(y) | 3 | 42 | +| ModulusAnalysis.java:22:32:22:36 | ... + ... | SSA param(x) | 7 | 42 | +| ModulusAnalysis.java:22:32:22:36 | ... + ... | SSA param(y) | 3 | 42 | | ModulusAnalysis.java:22:36:22:36 | y | 0 | 7 | 42 | -| ModulusAnalysis.java:22:36:22:36 | y | SSA init(y) | 0 | 0 | -| ModulusAnalysis.java:25:13:25:13 | x | SSA init(x) | 0 | 0 | +| ModulusAnalysis.java:22:36:22:36 | y | SSA param(y) | 0 | 0 | +| ModulusAnalysis.java:25:13:25:13 | x | SSA param(x) | 0 | 0 | | ModulusAnalysis.java:25:17:25:18 | c1 | 0 | 42 | 0 | -| ModulusAnalysis.java:25:17:25:18 | c1 | SSA init(this.c1) | 0 | 0 | +| ModulusAnalysis.java:25:17:25:18 | c1 | SSA entry def(this.c1) | 0 | 0 | | ModulusAnalysis.java:25:23:25:23 | 3 | 0 | 3 | 0 | -| ModulusAnalysis.java:25:28:25:28 | y | SSA init(y) | 0 | 0 | +| ModulusAnalysis.java:25:28:25:28 | y | SSA param(y) | 0 | 0 | | ModulusAnalysis.java:25:32:25:33 | c1 | 0 | 42 | 0 | -| ModulusAnalysis.java:25:32:25:33 | c1 | SSA init(this.c1) | 0 | 0 | +| ModulusAnalysis.java:25:32:25:33 | c1 | SSA entry def(this.c1) | 0 | 0 | | ModulusAnalysis.java:25:38:25:38 | 7 | 0 | 7 | 0 | | ModulusAnalysis.java:26:32:26:32 | x | 0 | 3 | 42 | -| ModulusAnalysis.java:26:32:26:32 | x | SSA init(x) | 0 | 0 | +| ModulusAnalysis.java:26:32:26:32 | x | SSA param(x) | 0 | 0 | | ModulusAnalysis.java:26:32:26:36 | ... - ... | 0 | 38 | 42 | -| ModulusAnalysis.java:26:32:26:36 | ... - ... | SSA init(x) | 35 | 42 | +| ModulusAnalysis.java:26:32:26:36 | ... - ... | SSA param(x) | 35 | 42 | | ModulusAnalysis.java:26:36:26:36 | y | 0 | 7 | 42 | -| ModulusAnalysis.java:26:36:26:36 | y | SSA init(y) | 0 | 0 | +| ModulusAnalysis.java:26:36:26:36 | y | SSA param(y) | 0 | 0 | | ModulusAnalysis.java:29:13:29:35 | l | 0 | 1 | 4 | -| ModulusAnalysis.java:29:17:29:26 | arr.length | SSA impl upd[untracked](arr.length) | 0 | 0 | +| ModulusAnalysis.java:29:17:29:26 | arr.length | arr.length | 0 | 0 | | ModulusAnalysis.java:29:17:29:30 | ... * ... | 0 | 0 | 4 | | ModulusAnalysis.java:29:17:29:35 | ... - ... | 0 | 1 | 4 | | ModulusAnalysis.java:29:30:29:30 | 4 | 0 | 4 | 0 | @@ -87,13 +86,13 @@ | ModulusAnalysis.java:33:28:33:28 | l | 0 | 1 | 4 | | ModulusAnalysis.java:33:28:33:28 | l | SSA def(l) | 0 | 0 | | ModulusAnalysis.java:36:13:36:25 | ...=... | 0 | 3 | 4 | -| ModulusAnalysis.java:36:17:36:17 | i | SSA init(i) | 0 | 0 | +| ModulusAnalysis.java:36:17:36:17 | i | SSA param(i) | 0 | 0 | | ModulusAnalysis.java:36:17:36:21 | ... * ... | 0 | 0 | 4 | | ModulusAnalysis.java:36:17:36:25 | ... + ... | 0 | 3 | 4 | | ModulusAnalysis.java:36:21:36:21 | 4 | 0 | 4 | 0 | | ModulusAnalysis.java:36:25:36:25 | 3 | 0 | 3 | 0 | | ModulusAnalysis.java:39:13:39:25 | ...=... | 0 | 7 | 8 | -| ModulusAnalysis.java:39:17:39:17 | i | SSA init(i) | 0 | 0 | +| ModulusAnalysis.java:39:17:39:17 | i | SSA param(i) | 0 | 0 | | ModulusAnalysis.java:39:17:39:21 | ... * ... | 0 | 0 | 8 | | ModulusAnalysis.java:39:17:39:25 | ... + ... | 0 | 7 | 8 | | ModulusAnalysis.java:39:21:39:21 | 8 | 0 | 8 | 0 | @@ -104,22 +103,22 @@ | ModulusAnalysis.java:44:32:44:32 | j | SSA phi(j) | 0 | 0 | | ModulusAnalysis.java:46:32:46:32 | j | 0 | 3 | 4 | | ModulusAnalysis.java:46:32:46:32 | j | SSA phi(j) | 0 | 0 | -| ModulusAnalysis.java:49:14:49:14 | x | SSA init(x) | 0 | 0 | +| ModulusAnalysis.java:49:14:49:14 | x | SSA param(x) | 0 | 0 | | ModulusAnalysis.java:49:18:49:19 | 15 | 0 | 15 | 0 | | ModulusAnalysis.java:49:25:49:25 | 3 | 0 | 3 | 0 | | ModulusAnalysis.java:50:32:50:32 | x | 0 | 3 | 16 | -| ModulusAnalysis.java:50:32:50:32 | x | SSA init(x) | 0 | 0 | +| ModulusAnalysis.java:50:32:50:32 | x | SSA param(x) | 0 | 0 | | ModulusAnalysis.java:56:18:56:22 | i | 0 | 0 | 0 | | ModulusAnalysis.java:56:22:56:22 | 0 | 0 | 0 | 0 | | ModulusAnalysis.java:56:25:56:25 | i | SSA phi(i) | 0 | 0 | -| ModulusAnalysis.java:56:29:56:31 | cap | SSA init(cap) | 0 | 0 | +| ModulusAnalysis.java:56:29:56:31 | cap | SSA param(cap) | 0 | 0 | | ModulusAnalysis.java:56:34:56:34 | i | SSA phi(i) | 0 | 0 | | ModulusAnalysis.java:56:34:56:36 | ...++ | SSA phi(i) | 0 | 0 | | ModulusAnalysis.java:57:32:57:32 | i | SSA phi(i) | 0 | 0 | | ModulusAnalysis.java:59:18:59:22 | j | 0 | 0 | 0 | | ModulusAnalysis.java:59:22:59:22 | 0 | 0 | 0 | 0 | | ModulusAnalysis.java:59:25:59:25 | j | SSA phi(j) | 0 | 0 | -| ModulusAnalysis.java:59:29:59:31 | cap | SSA init(cap) | 0 | 0 | +| ModulusAnalysis.java:59:29:59:31 | cap | SSA param(cap) | 0 | 0 | | ModulusAnalysis.java:59:34:59:34 | j | SSA phi(j) | 0 | 0 | | ModulusAnalysis.java:59:34:59:39 | ...+=... | SSA phi(j) | 1 | 0 | | ModulusAnalysis.java:59:39:59:39 | 1 | 0 | 1 | 0 | @@ -129,7 +128,7 @@ | ModulusAnalysis.java:62:25:62:25 | k | 0 | 0 | 3 | | ModulusAnalysis.java:62:25:62:25 | k | SSA def(k) | 0 | 3 | | ModulusAnalysis.java:62:25:62:25 | k | SSA phi(k) | 0 | 0 | -| ModulusAnalysis.java:62:29:62:31 | cap | SSA init(cap) | 0 | 0 | +| ModulusAnalysis.java:62:29:62:31 | cap | SSA param(cap) | 0 | 0 | | ModulusAnalysis.java:62:34:62:34 | k | 0 | 0 | 3 | | ModulusAnalysis.java:62:34:62:34 | k | SSA def(k) | 0 | 3 | | ModulusAnalysis.java:62:34:62:34 | k | SSA phi(k) | 0 | 0 | diff --git a/java/ql/test/library-tests/dataflow/range-analysis/RangeAnalysis.expected b/java/ql/test/library-tests/dataflow/range-analysis/RangeAnalysis.expected index 6b9d75a8bc7..2648fd92686 100644 --- a/java/ql/test/library-tests/dataflow/range-analysis/RangeAnalysis.expected +++ b/java/ql/test/library-tests/dataflow/range-analysis/RangeAnalysis.expected @@ -1,232 +1,232 @@ -| A.java:3:9:3:9 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:3:9:3:9 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:3:9:3:9 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:3:9:3:9 | x | SSA param(x) | 0 | upper | NoReason | | A.java:3:13:3:15 | 500 | 0 | 500 | lower | NoReason | | A.java:3:13:3:15 | 500 | 0 | 500 | upper | NoReason | | A.java:4:11:4:11 | x | 0 | 499 | upper | ... < ... | -| A.java:4:11:4:11 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:4:11:4:11 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:4:11:4:11 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:4:11:4:11 | x | SSA param(x) | 0 | upper | NoReason | | A.java:4:15:4:17 | 400 | 0 | 400 | lower | NoReason | | A.java:4:15:4:17 | 400 | 0 | 400 | upper | NoReason | | A.java:5:16:5:16 | x | 0 | 401 | lower | ... > ... | | A.java:5:16:5:16 | x | 0 | 499 | upper | ... < ... | -| A.java:5:16:5:16 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:5:16:5:16 | x | SSA init(x) | 0 | upper | NoReason | -| A.java:8:11:8:11 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:8:11:8:11 | y | SSA init(y) | 0 | upper | NoReason | -| A.java:8:11:8:15 | ... - ... | SSA init(y) | -2 | lower | NoReason | -| A.java:8:11:8:15 | ... - ... | SSA init(y) | -2 | upper | NoReason | +| A.java:5:16:5:16 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:5:16:5:16 | x | SSA param(x) | 0 | upper | NoReason | +| A.java:8:11:8:11 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:8:11:8:11 | y | SSA param(y) | 0 | upper | NoReason | +| A.java:8:11:8:15 | ... - ... | SSA param(y) | -2 | lower | NoReason | +| A.java:8:11:8:15 | ... - ... | SSA param(y) | -2 | upper | NoReason | | A.java:8:15:8:15 | 2 | 0 | 2 | lower | NoReason | | A.java:8:15:8:15 | 2 | 0 | 2 | upper | NoReason | | A.java:8:20:8:20 | x | 0 | 400 | upper | ... > ... | -| A.java:8:20:8:20 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:8:20:8:20 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:8:20:8:20 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:8:20:8:20 | x | SSA param(x) | 0 | upper | NoReason | | A.java:8:25:8:25 | y | 0 | 402 | upper | ... == ... | -| A.java:8:25:8:25 | y | SSA init(x) | 2 | lower | ... == ... | -| A.java:8:25:8:25 | y | SSA init(x) | 2 | upper | ... == ... | -| A.java:8:25:8:25 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:8:25:8:25 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:8:25:8:25 | y | SSA param(x) | 2 | lower | ... == ... | +| A.java:8:25:8:25 | y | SSA param(x) | 2 | upper | ... == ... | +| A.java:8:25:8:25 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:8:25:8:25 | y | SSA param(y) | 0 | upper | NoReason | | A.java:8:29:8:31 | 300 | 0 | 300 | lower | NoReason | | A.java:8:29:8:31 | 300 | 0 | 300 | upper | NoReason | | A.java:9:16:9:16 | x | 0 | 299 | lower | ... > ... | | A.java:9:16:9:16 | x | 0 | 400 | upper | ... > ... | -| A.java:9:16:9:16 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:9:16:9:16 | x | SSA init(x) | 0 | upper | NoReason | -| A.java:9:16:9:16 | x | SSA init(y) | -2 | lower | ... == ... | -| A.java:9:16:9:16 | x | SSA init(y) | -2 | upper | ... == ... | +| A.java:9:16:9:16 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:9:16:9:16 | x | SSA param(x) | 0 | upper | NoReason | +| A.java:9:16:9:16 | x | SSA param(y) | -2 | lower | ... == ... | +| A.java:9:16:9:16 | x | SSA param(y) | -2 | upper | ... == ... | | A.java:9:16:9:20 | ... + ... | 0 | 600 | lower | ... > ... | | A.java:9:16:9:20 | ... + ... | 0 | 802 | upper | ... == ... | | A.java:9:16:9:20 | ... + ... | 0 | 802 | upper | ... > ... | -| A.java:9:16:9:20 | ... + ... | SSA init(x) | 301 | lower | ... == ... | -| A.java:9:16:9:20 | ... + ... | SSA init(x) | 301 | lower | NoReason | -| A.java:9:16:9:20 | ... + ... | SSA init(x) | 402 | upper | ... == ... | -| A.java:9:16:9:20 | ... + ... | SSA init(x) | 402 | upper | NoReason | -| A.java:9:16:9:20 | ... + ... | SSA init(y) | 299 | lower | ... == ... | -| A.java:9:16:9:20 | ... + ... | SSA init(y) | 299 | lower | NoReason | -| A.java:9:16:9:20 | ... + ... | SSA init(y) | 400 | upper | ... == ... | -| A.java:9:16:9:20 | ... + ... | SSA init(y) | 400 | upper | NoReason | +| A.java:9:16:9:20 | ... + ... | SSA param(x) | 301 | lower | ... == ... | +| A.java:9:16:9:20 | ... + ... | SSA param(x) | 301 | lower | NoReason | +| A.java:9:16:9:20 | ... + ... | SSA param(x) | 402 | upper | ... == ... | +| A.java:9:16:9:20 | ... + ... | SSA param(x) | 402 | upper | NoReason | +| A.java:9:16:9:20 | ... + ... | SSA param(y) | 299 | lower | ... == ... | +| A.java:9:16:9:20 | ... + ... | SSA param(y) | 299 | lower | NoReason | +| A.java:9:16:9:20 | ... + ... | SSA param(y) | 400 | upper | ... == ... | +| A.java:9:16:9:20 | ... + ... | SSA param(y) | 400 | upper | NoReason | | A.java:9:20:9:20 | y | 0 | 301 | lower | ... > ... | | A.java:9:20:9:20 | y | 0 | 402 | upper | ... == ... | -| A.java:9:20:9:20 | y | SSA init(x) | 2 | lower | ... == ... | -| A.java:9:20:9:20 | y | SSA init(x) | 2 | upper | ... == ... | -| A.java:9:20:9:20 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:9:20:9:20 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:9:20:9:20 | y | SSA param(x) | 2 | lower | ... == ... | +| A.java:9:20:9:20 | y | SSA param(x) | 2 | upper | ... == ... | +| A.java:9:20:9:20 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:9:20:9:20 | y | SSA param(y) | 0 | upper | NoReason | | A.java:12:11:12:11 | x | 0 | 400 | upper | ... > ... | -| A.java:12:11:12:11 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:12:11:12:11 | x | SSA init(x) | 0 | upper | NoReason | -| A.java:12:16:12:16 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:12:16:12:16 | y | SSA init(y) | 0 | upper | NoReason | -| A.java:12:16:12:20 | ... + ... | SSA init(y) | 1 | lower | NoReason | -| A.java:12:16:12:20 | ... + ... | SSA init(y) | 1 | upper | NoReason | +| A.java:12:11:12:11 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:12:11:12:11 | x | SSA param(x) | 0 | upper | NoReason | +| A.java:12:16:12:16 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:12:16:12:16 | y | SSA param(y) | 0 | upper | NoReason | +| A.java:12:16:12:20 | ... + ... | SSA param(y) | 1 | lower | NoReason | +| A.java:12:16:12:20 | ... + ... | SSA param(y) | 1 | upper | NoReason | | A.java:12:20:12:20 | 1 | 0 | 1 | lower | NoReason | | A.java:12:20:12:20 | 1 | 0 | 1 | upper | NoReason | -| A.java:13:13:13:23 | sum | SSA init(y) | 400 | upper | NoReason | +| A.java:13:13:13:23 | sum | SSA param(y) | 400 | upper | NoReason | | A.java:13:19:13:19 | x | 0 | 400 | upper | ... > ... | -| A.java:13:19:13:19 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:13:19:13:19 | x | SSA init(x) | 0 | upper | NoReason | -| A.java:13:19:13:23 | ... + ... | SSA init(y) | 400 | upper | NoReason | -| A.java:13:23:13:23 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:13:23:13:23 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:13:19:13:19 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:13:19:13:19 | x | SSA param(x) | 0 | upper | NoReason | +| A.java:13:19:13:23 | ... + ... | SSA param(y) | 400 | upper | NoReason | +| A.java:13:23:13:23 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:13:23:13:23 | y | SSA param(y) | 0 | upper | NoReason | | A.java:15:13:15:13 | y | 0 | 399 | upper | ... != ... | -| A.java:15:13:15:13 | y | SSA init(x) | -1 | lower | ... != ... | -| A.java:15:13:15:13 | y | SSA init(x) | -1 | upper | ... != ... | -| A.java:15:13:15:13 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:15:13:15:13 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:15:13:15:13 | y | SSA param(x) | -1 | lower | ... != ... | +| A.java:15:13:15:13 | y | SSA param(x) | -1 | upper | ... != ... | +| A.java:15:13:15:13 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:15:13:15:13 | y | SSA param(y) | 0 | upper | NoReason | | A.java:15:17:15:19 | 300 | 0 | 300 | lower | NoReason | | A.java:15:17:15:19 | 300 | 0 | 300 | upper | NoReason | | A.java:16:15:16:25 | sum | 0 | 603 | lower | ... > ... | | A.java:16:15:16:25 | sum | 0 | 799 | upper | ... != ... | | A.java:16:15:16:25 | sum | 0 | 799 | upper | ... > ... | -| A.java:16:15:16:25 | sum | SSA init(x) | 301 | lower | ... != ... | -| A.java:16:15:16:25 | sum | SSA init(x) | 301 | lower | NoReason | -| A.java:16:15:16:25 | sum | SSA init(x) | 399 | upper | ... != ... | -| A.java:16:15:16:25 | sum | SSA init(x) | 399 | upper | NoReason | -| A.java:16:15:16:25 | sum | SSA init(y) | 302 | lower | ... != ... | -| A.java:16:15:16:25 | sum | SSA init(y) | 302 | lower | NoReason | -| A.java:16:15:16:25 | sum | SSA init(y) | 400 | upper | ... != ... | -| A.java:16:15:16:25 | sum | SSA init(y) | 400 | upper | NoReason | +| A.java:16:15:16:25 | sum | SSA param(x) | 301 | lower | ... != ... | +| A.java:16:15:16:25 | sum | SSA param(x) | 301 | lower | NoReason | +| A.java:16:15:16:25 | sum | SSA param(x) | 399 | upper | ... != ... | +| A.java:16:15:16:25 | sum | SSA param(x) | 399 | upper | NoReason | +| A.java:16:15:16:25 | sum | SSA param(y) | 302 | lower | ... != ... | +| A.java:16:15:16:25 | sum | SSA param(y) | 302 | lower | NoReason | +| A.java:16:15:16:25 | sum | SSA param(y) | 400 | upper | ... != ... | +| A.java:16:15:16:25 | sum | SSA param(y) | 400 | upper | NoReason | | A.java:16:21:16:21 | x | 0 | 302 | lower | ... > ... | | A.java:16:21:16:21 | x | 0 | 400 | upper | ... > ... | -| A.java:16:21:16:21 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:16:21:16:21 | x | SSA init(x) | 0 | upper | NoReason | -| A.java:16:21:16:21 | x | SSA init(y) | 1 | lower | ... != ... | -| A.java:16:21:16:21 | x | SSA init(y) | 1 | upper | ... != ... | +| A.java:16:21:16:21 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:16:21:16:21 | x | SSA param(x) | 0 | upper | NoReason | +| A.java:16:21:16:21 | x | SSA param(y) | 1 | lower | ... != ... | +| A.java:16:21:16:21 | x | SSA param(y) | 1 | upper | ... != ... | | A.java:16:21:16:25 | ... + ... | 0 | 603 | lower | ... > ... | | A.java:16:21:16:25 | ... + ... | 0 | 799 | upper | ... != ... | | A.java:16:21:16:25 | ... + ... | 0 | 799 | upper | ... > ... | -| A.java:16:21:16:25 | ... + ... | SSA init(x) | 301 | lower | ... != ... | -| A.java:16:21:16:25 | ... + ... | SSA init(x) | 301 | lower | NoReason | -| A.java:16:21:16:25 | ... + ... | SSA init(x) | 399 | upper | ... != ... | -| A.java:16:21:16:25 | ... + ... | SSA init(x) | 399 | upper | NoReason | -| A.java:16:21:16:25 | ... + ... | SSA init(y) | 302 | lower | ... != ... | -| A.java:16:21:16:25 | ... + ... | SSA init(y) | 302 | lower | NoReason | -| A.java:16:21:16:25 | ... + ... | SSA init(y) | 400 | upper | ... != ... | -| A.java:16:21:16:25 | ... + ... | SSA init(y) | 400 | upper | NoReason | +| A.java:16:21:16:25 | ... + ... | SSA param(x) | 301 | lower | ... != ... | +| A.java:16:21:16:25 | ... + ... | SSA param(x) | 301 | lower | NoReason | +| A.java:16:21:16:25 | ... + ... | SSA param(x) | 399 | upper | ... != ... | +| A.java:16:21:16:25 | ... + ... | SSA param(x) | 399 | upper | NoReason | +| A.java:16:21:16:25 | ... + ... | SSA param(y) | 302 | lower | ... != ... | +| A.java:16:21:16:25 | ... + ... | SSA param(y) | 302 | lower | NoReason | +| A.java:16:21:16:25 | ... + ... | SSA param(y) | 400 | upper | ... != ... | +| A.java:16:21:16:25 | ... + ... | SSA param(y) | 400 | upper | NoReason | | A.java:16:25:16:25 | y | 0 | 301 | lower | ... > ... | | A.java:16:25:16:25 | y | 0 | 399 | upper | ... != ... | -| A.java:16:25:16:25 | y | SSA init(x) | -1 | lower | ... != ... | -| A.java:16:25:16:25 | y | SSA init(x) | -1 | upper | ... != ... | -| A.java:16:25:16:25 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:16:25:16:25 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:16:25:16:25 | y | SSA param(x) | -1 | lower | ... != ... | +| A.java:16:25:16:25 | y | SSA param(x) | -1 | upper | ... != ... | +| A.java:16:25:16:25 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:16:25:16:25 | y | SSA param(y) | 0 | upper | NoReason | | A.java:20:11:20:11 | x | 0 | 400 | upper | ... > ... | -| A.java:20:11:20:11 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:20:11:20:11 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:20:11:20:11 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:20:11:20:11 | x | SSA param(x) | 0 | upper | NoReason | | A.java:20:15:20:17 | 500 | 0 | 500 | lower | NoReason | | A.java:20:15:20:17 | 500 | 0 | 500 | upper | NoReason | | A.java:21:16:21:16 | x | 0 | 400 | upper | ... > ... | | A.java:21:16:21:16 | x | 0 | 501 | lower | ... > ... | -| A.java:21:16:21:16 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:21:16:21:16 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:21:16:21:16 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:21:16:21:16 | x | SSA param(x) | 0 | upper | NoReason | | A.java:25:12:25:12 | 0 | 0 | 0 | lower | NoReason | | A.java:25:12:25:12 | 0 | 0 | 0 | upper | NoReason | -| A.java:29:9:29:9 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:29:9:29:9 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:29:9:29:9 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:29:9:29:9 | x | SSA param(x) | 0 | upper | NoReason | | A.java:29:13:29:15 | 500 | 0 | 500 | lower | NoReason | | A.java:29:13:29:15 | 500 | 0 | 500 | upper | NoReason | | A.java:30:11:30:11 | x | 0 | 499 | upper | ... < ... | -| A.java:30:11:30:11 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:30:11:30:11 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:30:11:30:11 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:30:11:30:11 | x | SSA param(x) | 0 | upper | NoReason | | A.java:30:15:30:17 | 400 | 0 | 400 | lower | NoReason | | A.java:30:15:30:17 | 400 | 0 | 400 | upper | NoReason | | A.java:31:16:31:16 | x | 0 | 401 | lower | ... > ... | | A.java:31:16:31:16 | x | 0 | 499 | upper | ... < ... | -| A.java:31:16:31:16 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:31:16:31:16 | x | SSA init(x) | 0 | upper | NoReason | -| A.java:34:11:34:11 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:34:11:34:11 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:31:16:31:16 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:31:16:31:16 | x | SSA param(x) | 0 | upper | NoReason | +| A.java:34:11:34:11 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:34:11:34:11 | y | SSA param(y) | 0 | upper | NoReason | | A.java:34:16:34:16 | x | 0 | 400 | upper | ... > ... | -| A.java:34:16:34:16 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:34:16:34:16 | x | SSA init(x) | 0 | upper | NoReason | +| A.java:34:16:34:16 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:34:16:34:16 | x | SSA param(x) | 0 | upper | NoReason | | A.java:34:16:34:20 | ... - ... | 0 | 399 | upper | ... > ... | -| A.java:34:16:34:20 | ... - ... | SSA init(x) | -1 | lower | NoReason | -| A.java:34:16:34:20 | ... - ... | SSA init(x) | -1 | upper | NoReason | +| A.java:34:16:34:20 | ... - ... | SSA param(x) | -1 | lower | NoReason | +| A.java:34:16:34:20 | ... - ... | SSA param(x) | -1 | upper | NoReason | | A.java:34:20:34:20 | 1 | 0 | 1 | lower | NoReason | | A.java:34:20:34:20 | 1 | 0 | 1 | upper | NoReason | | A.java:34:25:34:25 | y | 0 | 399 | upper | ... == ... | -| A.java:34:25:34:25 | y | SSA init(x) | -1 | lower | ... == ... | -| A.java:34:25:34:25 | y | SSA init(x) | -1 | upper | ... == ... | -| A.java:34:25:34:25 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:34:25:34:25 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:34:25:34:25 | y | SSA param(x) | -1 | lower | ... == ... | +| A.java:34:25:34:25 | y | SSA param(x) | -1 | upper | ... == ... | +| A.java:34:25:34:25 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:34:25:34:25 | y | SSA param(y) | 0 | upper | NoReason | | A.java:34:29:34:31 | 300 | 0 | 300 | lower | NoReason | | A.java:34:29:34:31 | 300 | 0 | 300 | upper | NoReason | | A.java:34:36:34:36 | y | 0 | 301 | lower | ... > ... | | A.java:34:36:34:36 | y | 0 | 399 | upper | ... == ... | -| A.java:34:36:34:36 | y | SSA init(x) | -1 | lower | ... == ... | -| A.java:34:36:34:36 | y | SSA init(x) | -1 | upper | ... == ... | -| A.java:34:36:34:36 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:34:36:34:36 | y | SSA init(y) | 0 | upper | NoReason | +| A.java:34:36:34:36 | y | SSA param(x) | -1 | lower | ... == ... | +| A.java:34:36:34:36 | y | SSA param(x) | -1 | upper | ... == ... | +| A.java:34:36:34:36 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:34:36:34:36 | y | SSA param(y) | 0 | upper | NoReason | | A.java:34:36:34:40 | ... + ... | 0 | 303 | lower | ... > ... | | A.java:34:36:34:40 | ... + ... | 0 | 401 | upper | ... == ... | -| A.java:34:36:34:40 | ... + ... | SSA init(x) | 1 | lower | ... == ... | -| A.java:34:36:34:40 | ... + ... | SSA init(x) | 1 | upper | ... == ... | -| A.java:34:36:34:40 | ... + ... | SSA init(y) | 2 | lower | NoReason | -| A.java:34:36:34:40 | ... + ... | SSA init(y) | 2 | upper | NoReason | +| A.java:34:36:34:40 | ... + ... | SSA param(x) | 1 | lower | ... == ... | +| A.java:34:36:34:40 | ... + ... | SSA param(x) | 1 | upper | ... == ... | +| A.java:34:36:34:40 | ... + ... | SSA param(y) | 2 | lower | NoReason | +| A.java:34:36:34:40 | ... + ... | SSA param(y) | 2 | upper | NoReason | | A.java:34:40:34:40 | 2 | 0 | 2 | lower | NoReason | | A.java:34:40:34:40 | 2 | 0 | 2 | upper | NoReason | -| A.java:34:45:34:45 | z | SSA init(z) | 0 | lower | NoReason | -| A.java:34:45:34:45 | z | SSA init(z) | 0 | upper | NoReason | +| A.java:34:45:34:45 | z | SSA param(z) | 0 | lower | NoReason | +| A.java:34:45:34:45 | z | SSA param(z) | 0 | upper | NoReason | | A.java:34:50:34:50 | z | 0 | 303 | lower | ... == ... | | A.java:34:50:34:50 | z | 0 | 401 | upper | ... == ... | -| A.java:34:50:34:50 | z | SSA init(x) | 1 | lower | ... == ... | -| A.java:34:50:34:50 | z | SSA init(x) | 1 | upper | ... == ... | -| A.java:34:50:34:50 | z | SSA init(y) | 2 | lower | ... == ... | -| A.java:34:50:34:50 | z | SSA init(y) | 2 | upper | ... == ... | -| A.java:34:50:34:50 | z | SSA init(z) | 0 | lower | NoReason | -| A.java:34:50:34:50 | z | SSA init(z) | 0 | upper | NoReason | +| A.java:34:50:34:50 | z | SSA param(x) | 1 | lower | ... == ... | +| A.java:34:50:34:50 | z | SSA param(x) | 1 | upper | ... == ... | +| A.java:34:50:34:50 | z | SSA param(y) | 2 | lower | ... == ... | +| A.java:34:50:34:50 | z | SSA param(y) | 2 | upper | ... == ... | +| A.java:34:50:34:50 | z | SSA param(z) | 0 | lower | NoReason | +| A.java:34:50:34:50 | z | SSA param(z) | 0 | upper | NoReason | | A.java:34:55:34:57 | 350 | 0 | 350 | lower | NoReason | | A.java:34:55:34:57 | 350 | 0 | 350 | upper | NoReason | | A.java:35:16:35:16 | x | 0 | 349 | lower | ... == ... | | A.java:35:16:35:16 | x | 0 | 349 | upper | ... == ... | -| A.java:35:16:35:16 | x | SSA init(x) | 0 | lower | NoReason | -| A.java:35:16:35:16 | x | SSA init(x) | 0 | upper | NoReason | -| A.java:35:16:35:16 | x | SSA init(y) | 1 | lower | ... == ... | -| A.java:35:16:35:16 | x | SSA init(y) | 1 | upper | ... == ... | -| A.java:35:16:35:16 | x | SSA init(z) | -1 | lower | ... == ... | -| A.java:35:16:35:16 | x | SSA init(z) | -1 | upper | ... == ... | +| A.java:35:16:35:16 | x | SSA param(x) | 0 | lower | NoReason | +| A.java:35:16:35:16 | x | SSA param(x) | 0 | upper | NoReason | +| A.java:35:16:35:16 | x | SSA param(y) | 1 | lower | ... == ... | +| A.java:35:16:35:16 | x | SSA param(y) | 1 | upper | ... == ... | +| A.java:35:16:35:16 | x | SSA param(z) | -1 | lower | ... == ... | +| A.java:35:16:35:16 | x | SSA param(z) | -1 | upper | ... == ... | | A.java:35:16:35:20 | ... + ... | 0 | 697 | lower | ... == ... | | A.java:35:16:35:20 | ... + ... | 0 | 697 | upper | ... == ... | -| A.java:35:16:35:20 | ... + ... | SSA init(x) | 348 | lower | ... == ... | -| A.java:35:16:35:20 | ... + ... | SSA init(x) | 348 | lower | NoReason | -| A.java:35:16:35:20 | ... + ... | SSA init(x) | 348 | upper | ... == ... | -| A.java:35:16:35:20 | ... + ... | SSA init(x) | 348 | upper | NoReason | -| A.java:35:16:35:20 | ... + ... | SSA init(y) | 349 | lower | ... == ... | -| A.java:35:16:35:20 | ... + ... | SSA init(y) | 349 | lower | NoReason | -| A.java:35:16:35:20 | ... + ... | SSA init(y) | 349 | upper | ... == ... | -| A.java:35:16:35:20 | ... + ... | SSA init(y) | 349 | upper | NoReason | -| A.java:35:16:35:20 | ... + ... | SSA init(z) | 347 | lower | ... == ... | -| A.java:35:16:35:20 | ... + ... | SSA init(z) | 347 | upper | ... == ... | +| A.java:35:16:35:20 | ... + ... | SSA param(x) | 348 | lower | ... == ... | +| A.java:35:16:35:20 | ... + ... | SSA param(x) | 348 | lower | NoReason | +| A.java:35:16:35:20 | ... + ... | SSA param(x) | 348 | upper | ... == ... | +| A.java:35:16:35:20 | ... + ... | SSA param(x) | 348 | upper | NoReason | +| A.java:35:16:35:20 | ... + ... | SSA param(y) | 349 | lower | ... == ... | +| A.java:35:16:35:20 | ... + ... | SSA param(y) | 349 | lower | NoReason | +| A.java:35:16:35:20 | ... + ... | SSA param(y) | 349 | upper | ... == ... | +| A.java:35:16:35:20 | ... + ... | SSA param(y) | 349 | upper | NoReason | +| A.java:35:16:35:20 | ... + ... | SSA param(z) | 347 | lower | ... == ... | +| A.java:35:16:35:20 | ... + ... | SSA param(z) | 347 | upper | ... == ... | | A.java:35:16:35:24 | ... + ... | 0 | 1047 | lower | ... == ... | | A.java:35:16:35:24 | ... + ... | 0 | 1047 | upper | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(x) | 698 | lower | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(x) | 698 | lower | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(x) | 698 | lower | NoReason | -| A.java:35:16:35:24 | ... + ... | SSA init(x) | 698 | upper | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(x) | 698 | upper | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(x) | 698 | upper | NoReason | -| A.java:35:16:35:24 | ... + ... | SSA init(y) | 699 | lower | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(y) | 699 | lower | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(y) | 699 | lower | NoReason | -| A.java:35:16:35:24 | ... + ... | SSA init(y) | 699 | upper | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(y) | 699 | upper | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(y) | 699 | upper | NoReason | -| A.java:35:16:35:24 | ... + ... | SSA init(z) | 697 | lower | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(z) | 697 | lower | NoReason | -| A.java:35:16:35:24 | ... + ... | SSA init(z) | 697 | upper | ... == ... | -| A.java:35:16:35:24 | ... + ... | SSA init(z) | 697 | upper | NoReason | +| A.java:35:16:35:24 | ... + ... | SSA param(x) | 698 | lower | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(x) | 698 | lower | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(x) | 698 | lower | NoReason | +| A.java:35:16:35:24 | ... + ... | SSA param(x) | 698 | upper | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(x) | 698 | upper | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(x) | 698 | upper | NoReason | +| A.java:35:16:35:24 | ... + ... | SSA param(y) | 699 | lower | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(y) | 699 | lower | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(y) | 699 | lower | NoReason | +| A.java:35:16:35:24 | ... + ... | SSA param(y) | 699 | upper | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(y) | 699 | upper | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(y) | 699 | upper | NoReason | +| A.java:35:16:35:24 | ... + ... | SSA param(z) | 697 | lower | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(z) | 697 | lower | NoReason | +| A.java:35:16:35:24 | ... + ... | SSA param(z) | 697 | upper | ... == ... | +| A.java:35:16:35:24 | ... + ... | SSA param(z) | 697 | upper | NoReason | | A.java:35:20:35:20 | y | 0 | 348 | lower | ... == ... | | A.java:35:20:35:20 | y | 0 | 348 | upper | ... == ... | -| A.java:35:20:35:20 | y | SSA init(x) | -1 | lower | ... == ... | -| A.java:35:20:35:20 | y | SSA init(x) | -1 | upper | ... == ... | -| A.java:35:20:35:20 | y | SSA init(y) | 0 | lower | NoReason | -| A.java:35:20:35:20 | y | SSA init(y) | 0 | upper | NoReason | -| A.java:35:20:35:20 | y | SSA init(z) | -2 | lower | ... == ... | -| A.java:35:20:35:20 | y | SSA init(z) | -2 | upper | ... == ... | +| A.java:35:20:35:20 | y | SSA param(x) | -1 | lower | ... == ... | +| A.java:35:20:35:20 | y | SSA param(x) | -1 | upper | ... == ... | +| A.java:35:20:35:20 | y | SSA param(y) | 0 | lower | NoReason | +| A.java:35:20:35:20 | y | SSA param(y) | 0 | upper | NoReason | +| A.java:35:20:35:20 | y | SSA param(z) | -2 | lower | ... == ... | +| A.java:35:20:35:20 | y | SSA param(z) | -2 | upper | ... == ... | | A.java:35:24:35:24 | z | 0 | 350 | lower | ... == ... | | A.java:35:24:35:24 | z | 0 | 350 | upper | ... == ... | -| A.java:35:24:35:24 | z | SSA init(x) | 1 | lower | ... == ... | -| A.java:35:24:35:24 | z | SSA init(x) | 1 | upper | ... == ... | -| A.java:35:24:35:24 | z | SSA init(y) | 2 | lower | ... == ... | -| A.java:35:24:35:24 | z | SSA init(y) | 2 | upper | ... == ... | -| A.java:35:24:35:24 | z | SSA init(z) | 0 | lower | NoReason | -| A.java:35:24:35:24 | z | SSA init(z) | 0 | upper | NoReason | +| A.java:35:24:35:24 | z | SSA param(x) | 1 | lower | ... == ... | +| A.java:35:24:35:24 | z | SSA param(x) | 1 | upper | ... == ... | +| A.java:35:24:35:24 | z | SSA param(y) | 2 | lower | ... == ... | +| A.java:35:24:35:24 | z | SSA param(y) | 2 | upper | ... == ... | +| A.java:35:24:35:24 | z | SSA param(z) | 0 | lower | NoReason | +| A.java:35:24:35:24 | z | SSA param(z) | 0 | upper | NoReason | | A.java:39:12:39:12 | 0 | 0 | 0 | lower | NoReason | | A.java:39:12:39:12 | 0 | 0 | 0 | upper | NoReason | diff --git a/java/ql/test/library-tests/dataflow/ssa/A.java b/java/ql/test/library-tests/dataflow/ssa/A.java index 79303697d64..d7047bec276 100644 --- a/java/ql/test/library-tests/dataflow/ssa/A.java +++ b/java/ql/test/library-tests/dataflow/ssa/A.java @@ -4,7 +4,13 @@ public class A { boolean isSafe(Object o) { return o == null; } - void foo() { + void assertSafe(Object o) { if (o != null) throw new RuntimeException(); } + + private boolean wrapIsSafe(Object o) { return isSafe(o); } + + private void wrapAssertSafe(Object o) { assertSafe(o); } + + void test1() { Object x = source(); if (!isSafe(x)) { x = null; @@ -21,4 +27,23 @@ public class A { } sink(x); } + + void test2() { + Object x = source(); + assertSafe(x); + sink(x); + } + + void test3() { + Object x = source(); + if (wrapIsSafe(x)) { + sink(x); + } + } + + void test4() { + Object x = source(); + wrapAssertSafe(x); + sink(x); + } } diff --git a/java/ql/test/library-tests/dataflow/ssa/test.ql b/java/ql/test/library-tests/dataflow/ssa/test.ql index cb601dab5eb..0bea0aa71a1 100644 --- a/java/ql/test/library-tests/dataflow/ssa/test.ql +++ b/java/ql/test/library-tests/dataflow/ssa/test.ql @@ -10,6 +10,14 @@ private predicate isSafe(Guard g, Expr checked, boolean branch) { ) } +private predicate assertSafe(Guard g, Expr checked, GuardValue gv) { + exists(MethodCall mc | g = mc | + mc.getMethod().hasName("assertSafe") and + checked = mc.getAnArgument() and + gv.getDualValue().isThrowsException() + ) +} + module TestConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr().(MethodCall).getMethod().hasName("source") @@ -21,6 +29,8 @@ module TestConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { node = DataFlow::BarrierGuard::getABarrierNode() + or + node = DataFlow::BarrierGuardValue::getABarrierNode() } } diff --git a/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql b/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql index 5ca38c7e29b..ae4f8ca0da0 100644 --- a/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql +++ b/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.ql @@ -20,7 +20,7 @@ module FlowStepTest implements TestSig { predicate hasActualResult(Location l, string element, string tag, string value) { tag = "taintReachesReturn" and value = "" and - exists(DataFlow::Node source | Flow::flow(source, _) | + exists(DataFlow::Node source | Flow::flowFrom(source) | l = source.getLocation() and element = source.toString() ) diff --git a/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql b/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql index ccdb9698009..58b749364d2 100644 --- a/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql +++ b/java/ql/test/library-tests/frameworks/android/taint-database/sinks.ql @@ -20,7 +20,7 @@ module SinkTest implements TestSig { predicate hasActualResult(Location l, string element, string tag, string value) { tag = "taintReachesSink" and value = "" and - exists(DataFlow::Node source | Flow::flow(source, _) | + exists(DataFlow::Node source | Flow::flowFrom(source) | l = source.getLocation() and element = source.toString() ) diff --git a/java/ql/test/library-tests/ssa-large/countssa.ql b/java/ql/test/library-tests/ssa-large/countssa.ql index 8d7b5939c5c..3d07a8dad29 100644 --- a/java/ql/test/library-tests/ssa-large/countssa.ql +++ b/java/ql/test/library-tests/ssa-large/countssa.ql @@ -3,6 +3,6 @@ import semmle.code.java.dataflow.SSA from int uses, int live where - uses = strictcount(SsaVariable ssa, VarRead use | use = ssa.getAUse()) and - live = strictcount(SsaVariable ssa, BasicBlock b | ssa.isLiveAtEndOfBlock(b)) + uses = strictcount(SsaDefinition ssa, VarRead use | use = ssa.getARead()) and + live = strictcount(SsaDefinition ssa, BasicBlock b | ssa.isLiveAtEndOfBlock(b)) select uses, live diff --git a/java/ql/test/library-tests/ssa/captures.expected b/java/ql/test/library-tests/ssa/captures.expected index 2ec18f4880d..3d8b8e13602 100644 --- a/java/ql/test/library-tests/ssa/captures.expected +++ b/java/ql/test/library-tests/ssa/captures.expected @@ -1,9 +1,9 @@ -| Nested.java:8:29:8:57 | SSA init(next(..).p1) | Nested.java:4:34:10:3 | SSA init(p1) | -| Nested.java:8:29:8:57 | SSA init(next(..).x1) | Nested.java:5:9:5:14 | SSA def(x1) | -| Nested.java:16:22:16:34 | SSA init(getInt(..).obj) | Nested.java:15:12:15:29 | SSA def(obj) | -| Nested.java:19:27:22:7 | SSA init(getInt(..).hash) | Nested.java:16:15:16:34 | SSA def(hash) | -| Nested.java:19:27:22:7 | SSA init(getInt(..).x2) | Nested.java:17:9:17:15 | SSA def(x2) | -| Nested.java:20:27:20:39 | SSA init(getInt(..).obj) | Nested.java:15:12:15:29 | SSA def(obj) | -| Nested.java:30:23:30:36 | SSA init(getInt(..).obj2) | Nested.java:30:5:30:37 | SSA phi(obj2) | -| Nested.java:37:20:37:25 | SSA init(getInt(..).x3) | Nested.java:36:7:36:12 | SSA def(x3) | -| Nested.java:40:20:40:25 | SSA init(getInt(..).x3) | Nested.java:39:7:39:12 | SSA def(x3) | +| Nested.java:8:29:8:57 | SSA capture def(next(..).p1) | Nested.java:4:34:10:3 | SSA param(p1) | +| Nested.java:8:29:8:57 | SSA capture def(next(..).x1) | Nested.java:5:9:5:14 | SSA def(x1) | +| Nested.java:16:22:16:34 | SSA capture def(getInt(..).obj) | Nested.java:15:12:15:29 | SSA def(obj) | +| Nested.java:19:27:22:7 | SSA capture def(getInt(..).hash) | Nested.java:16:15:16:34 | SSA def(hash) | +| Nested.java:19:27:22:7 | SSA capture def(getInt(..).x2) | Nested.java:17:9:17:15 | SSA def(x2) | +| Nested.java:20:27:20:39 | SSA capture def(getInt(..).obj) | Nested.java:15:12:15:29 | SSA def(obj) | +| Nested.java:30:23:30:36 | SSA capture def(getInt(..).obj2) | Nested.java:30:5:30:37 | SSA phi(obj2) | +| Nested.java:37:20:37:25 | SSA capture def(getInt(..).x3) | Nested.java:36:7:36:12 | SSA def(x3) | +| Nested.java:40:20:40:25 | SSA capture def(getInt(..).x3) | Nested.java:39:7:39:12 | SSA def(x3) | diff --git a/java/ql/test/library-tests/ssa/captures.ql b/java/ql/test/library-tests/ssa/captures.ql index ae89b91c43a..1b621759866 100644 --- a/java/ql/test/library-tests/ssa/captures.ql +++ b/java/ql/test/library-tests/ssa/captures.ql @@ -1,6 +1,6 @@ import java import semmle.code.java.dataflow.SSA -from SsaImplicitInit closure, SsaVariable captured +from SsaCapturedDefinition closure, SsaDefinition captured where closure.captures(captured) select closure, captured diff --git a/java/ql/test/library-tests/ssa/firstUse.expected b/java/ql/test/library-tests/ssa/firstUse.expected index 2d86e6ed117..6494791be34 100644 --- a/java/ql/test/library-tests/ssa/firstUse.expected +++ b/java/ql/test/library-tests/ssa/firstUse.expected @@ -1,43 +1,43 @@ -| Fields.java:12:19:21:3 | SSA init(this.xs) | Fields.java:13:15:13:16 | xs | -| Fields.java:14:5:14:9 | SSA impl upd[nonlocal](this.xs) | Fields.java:15:9:15:10 | xs | +| Fields.java:12:19:21:3 | SSA entry def(this.xs) | Fields.java:13:15:13:16 | xs | +| Fields.java:14:5:14:9 | SSA call def(this.xs) | Fields.java:15:9:15:10 | xs | | Fields.java:15:5:15:10 | SSA def(x) | Fields.java:16:9:16:9 | x | -| Fields.java:17:7:17:11 | SSA impl upd[nonlocal](this.xs) | Fields.java:18:9:18:15 | this.xs | +| Fields.java:17:7:17:11 | SSA call def(this.xs) | Fields.java:18:9:18:15 | this.xs | | Fields.java:18:5:18:16 | SSA phi(this.xs) | Fields.java:18:9:18:15 | this.xs | | Fields.java:19:5:19:19 | SSA def(this.xs) | Fields.java:20:9:20:10 | xs | -| Fields.java:23:19:49:3 | SSA init(Fields.stat) | Fields.java:27:15:27:18 | stat | -| Fields.java:23:19:49:3 | SSA init(this.xs) | Fields.java:26:15:26:16 | xs | +| Fields.java:23:19:49:3 | SSA entry def(Fields.stat) | Fields.java:27:15:27:18 | stat | +| Fields.java:23:19:49:3 | SSA entry def(this.xs) | Fields.java:26:15:26:16 | xs | | Fields.java:24:12:24:27 | SSA def(f) | Fields.java:25:15:25:15 | f | -| Fields.java:24:12:24:27 | SSA impl upd[explicit qualifier](f.xs) | Fields.java:25:15:25:18 | f.xs | -| Fields.java:24:16:24:27 | SSA impl upd[nonlocal](Fields.stat) | Fields.java:27:15:27:18 | stat | -| Fields.java:28:5:28:12 | SSA impl upd[nonlocal](Fields.stat) | Fields.java:31:9:31:12 | stat | -| Fields.java:28:5:28:12 | SSA impl upd[nonlocal](f.xs) | Fields.java:29:9:29:12 | f.xs | -| Fields.java:28:5:28:12 | SSA impl upd[nonlocal](this.xs) | Fields.java:30:9:30:10 | xs | -| Fields.java:32:5:32:9 | SSA impl upd[nonlocal](Fields.stat) | Fields.java:35:9:35:12 | stat | -| Fields.java:32:5:32:9 | SSA impl upd[nonlocal](f.xs) | Fields.java:33:9:33:12 | f.xs | -| Fields.java:32:5:32:9 | SSA impl upd[nonlocal](this.xs) | Fields.java:34:9:34:10 | xs | +| Fields.java:24:12:24:27 | SSA qualifier def(f.xs) | Fields.java:25:15:25:18 | f.xs | +| Fields.java:24:16:24:27 | SSA call def(Fields.stat) | Fields.java:27:15:27:18 | stat | +| Fields.java:28:5:28:12 | SSA call def(Fields.stat) | Fields.java:31:9:31:12 | stat | +| Fields.java:28:5:28:12 | SSA call def(f.xs) | Fields.java:29:9:29:12 | f.xs | +| Fields.java:28:5:28:12 | SSA call def(this.xs) | Fields.java:30:9:30:10 | xs | +| Fields.java:32:5:32:9 | SSA call def(Fields.stat) | Fields.java:35:9:35:12 | stat | +| Fields.java:32:5:32:9 | SSA call def(f.xs) | Fields.java:33:9:33:12 | f.xs | +| Fields.java:32:5:32:9 | SSA call def(this.xs) | Fields.java:34:9:34:10 | xs | | Fields.java:36:5:36:19 | SSA def(this.xs) | Fields.java:38:9:38:10 | xs | | Fields.java:39:5:39:21 | SSA def(f.xs) | Fields.java:40:9:40:12 | f.xs | | Fields.java:41:5:41:10 | SSA def(z) | Fields.java:42:9:42:9 | z | | Fields.java:43:7:43:22 | SSA def(f) | Fields.java:44:9:44:9 | f | -| Fields.java:43:7:43:22 | SSA impl upd[explicit qualifier](f.xs) | Fields.java:44:9:44:12 | f.xs | -| Fields.java:43:11:43:22 | SSA impl upd[nonlocal](Fields.stat) | Fields.java:48:9:48:12 | stat | +| Fields.java:43:7:43:22 | SSA qualifier def(f.xs) | Fields.java:44:9:44:12 | f.xs | +| Fields.java:43:11:43:22 | SSA call def(Fields.stat) | Fields.java:48:9:48:12 | stat | | Fields.java:44:5:44:13 | SSA phi(Fields.stat) | Fields.java:48:9:48:12 | stat | | Fields.java:44:5:44:13 | SSA phi(f) | Fields.java:44:9:44:9 | f | | Fields.java:44:5:44:13 | SSA phi(f.xs) | Fields.java:44:9:44:12 | f.xs | -| Fields.java:45:5:45:16 | SSA impl upd[nonlocal](Fields.stat) | Fields.java:48:9:48:12 | stat | -| Nested.java:8:29:8:57 | SSA init(next(..).p1) | Nested.java:8:38:8:39 | p1 | -| Nested.java:8:29:8:57 | SSA init(next(..).x1) | Nested.java:8:43:8:44 | x1 | -| Nested.java:16:22:16:34 | SSA init(getInt(..).obj) | Nested.java:16:22:16:24 | obj | +| Fields.java:45:5:45:16 | SSA call def(Fields.stat) | Fields.java:48:9:48:12 | stat | +| Nested.java:8:29:8:57 | SSA capture def(next(..).p1) | Nested.java:8:38:8:39 | p1 | +| Nested.java:8:29:8:57 | SSA capture def(next(..).x1) | Nested.java:8:43:8:44 | x1 | +| Nested.java:16:22:16:34 | SSA capture def(getInt(..).obj) | Nested.java:16:22:16:24 | obj | | Nested.java:18:15:23:5 | SSA def(h2) | Nested.java:25:9:25:10 | h2 | -| Nested.java:19:27:22:7 | SSA init(getInt(..).hash) | Nested.java:21:21:21:24 | hash | -| Nested.java:19:27:22:7 | SSA init(getInt(..).x2) | Nested.java:21:16:21:17 | x2 | +| Nested.java:19:27:22:7 | SSA capture def(getInt(..).hash) | Nested.java:21:21:21:24 | hash | +| Nested.java:19:27:22:7 | SSA capture def(getInt(..).x2) | Nested.java:21:16:21:17 | x2 | | Nested.java:20:19:20:39 | SSA def(hnest) | Nested.java:21:37:21:41 | hnest | -| Nested.java:20:27:20:39 | SSA init(getInt(..).obj) | Nested.java:20:27:20:29 | obj | -| Nested.java:30:23:30:36 | SSA init(getInt(..).obj2) | Nested.java:30:23:30:26 | obj2 | -| Nested.java:33:29:42:3 | SSA init(p3) | Nested.java:35:9:35:10 | p3 | -| Nested.java:37:20:37:25 | SSA init(getInt(..).x3) | Nested.java:37:20:37:21 | x3 | -| Nested.java:40:20:40:25 | SSA init(getInt(..).x3) | Nested.java:40:20:40:21 | x3 | -| Test.java:4:19:32:2 | SSA init(param) | Test.java:9:7:9:11 | param | +| Nested.java:20:27:20:39 | SSA capture def(getInt(..).obj) | Nested.java:20:27:20:29 | obj | +| Nested.java:30:23:30:36 | SSA capture def(getInt(..).obj2) | Nested.java:30:23:30:26 | obj2 | +| Nested.java:33:29:42:3 | SSA param(p3) | Nested.java:35:9:35:10 | p3 | +| Nested.java:37:20:37:25 | SSA capture def(getInt(..).x3) | Nested.java:37:20:37:21 | x3 | +| Nested.java:40:20:40:25 | SSA capture def(getInt(..).x3) | Nested.java:40:20:40:21 | x3 | +| Test.java:4:19:32:2 | SSA param(param) | Test.java:9:7:9:11 | param | | Test.java:6:7:6:11 | SSA def(x) | Test.java:10:4:10:4 | x | | Test.java:6:7:6:11 | SSA def(x) | Test.java:20:10:20:10 | x | | Test.java:10:4:10:6 | SSA def(x) | Test.java:11:10:11:10 | x | @@ -58,15 +58,12 @@ | Test.java:27:25:27:27 | SSA def(i) | Test.java:27:19:27:19 | i | | Test.java:28:4:28:9 | SSA def(x) | Test.java:28:4:28:4 | x | | Test.java:28:4:28:9 | SSA def(x) | Test.java:31:10:31:10 | x | -| TestInstanceOfPattern.java:3:24:9:2 | SSA init(obj) | TestInstanceOfPattern.java:4:7:4:9 | obj | +| TestInstanceOfPattern.java:3:24:9:2 | SSA param(obj) | TestInstanceOfPattern.java:4:7:4:9 | obj | | TestInstanceOfPattern.java:4:29:4:29 | SSA def(s) | TestInstanceOfPattern.java:5:8:5:8 | s | -| TestInstanceOfPattern.java:7:8:7:8 | SSA impl upd[untracked](this.s) | TestInstanceOfPattern.java:7:8:7:8 | s | -| TestInstanceOfPattern.java:10:25:16:2 | SSA init(obj) | TestInstanceOfPattern.java:11:9:11:11 | obj | +| TestInstanceOfPattern.java:10:25:16:2 | SSA param(obj) | TestInstanceOfPattern.java:11:9:11:11 | obj | | TestInstanceOfPattern.java:11:31:11:31 | SSA def(s) | TestInstanceOfPattern.java:14:8:14:8 | s | -| TestInstanceOfPattern.java:12:8:12:8 | SSA impl upd[untracked](this.s) | TestInstanceOfPattern.java:12:8:12:8 | s | -| TestInstanceOfPattern.java:17:25:23:2 | SSA init(obj) | TestInstanceOfPattern.java:18:7:18:9 | obj | +| TestInstanceOfPattern.java:17:25:23:2 | SSA param(obj) | TestInstanceOfPattern.java:18:7:18:9 | obj | | TestInstanceOfPattern.java:18:29:18:29 | SSA def(s) | TestInstanceOfPattern.java:18:34:18:34 | s | -| TestInstanceOfPattern.java:21:8:21:8 | SSA impl upd[untracked](this.s) | TestInstanceOfPattern.java:21:8:21:8 | s | -| TestInstanceOfPattern.java:24:25:30:2 | SSA init(obj) | TestInstanceOfPattern.java:25:7:25:9 | obj | -| TestInstanceOfPattern.java:24:25:30:2 | SSA init(this.s) | TestInstanceOfPattern.java:25:34:25:34 | s | -| TestInstanceOfPattern.java:24:25:30:2 | SSA init(this.s) | TestInstanceOfPattern.java:26:8:26:8 | s | +| TestInstanceOfPattern.java:24:25:30:2 | SSA entry def(this.s) | TestInstanceOfPattern.java:25:34:25:34 | s | +| TestInstanceOfPattern.java:24:25:30:2 | SSA entry def(this.s) | TestInstanceOfPattern.java:26:8:26:8 | s | +| TestInstanceOfPattern.java:24:25:30:2 | SSA param(obj) | TestInstanceOfPattern.java:25:7:25:9 | obj | diff --git a/java/ql/test/library-tests/ssa/firstUse.ql b/java/ql/test/library-tests/ssa/firstUse.ql index bbb5c2d3e38..d3857074435 100644 --- a/java/ql/test/library-tests/ssa/firstUse.ql +++ b/java/ql/test/library-tests/ssa/firstUse.ql @@ -1,6 +1,6 @@ import java import semmle.code.java.dataflow.SSA -from SsaVariable ssa, VarRead use -where use = ssa.getAFirstUse() +from SsaDefinition ssa, VarRead use +where use = ssaGetAFirstUse(ssa) select ssa, use diff --git a/java/ql/test/library-tests/ssa/ssaDef.expected b/java/ql/test/library-tests/ssa/ssaDef.expected index cac2ada3c51..a10b9d327b2 100644 --- a/java/ql/test/library-tests/ssa/ssaDef.expected +++ b/java/ql/test/library-tests/ssa/ssaDef.expected @@ -1,53 +1,53 @@ | Fields.java:13:5:13:17 | x | Fields.java:15:5:15:10 | ...=... | SSA def(x) | -| Fields.java:13:15:13:16 | this.xs | Fields.java:12:19:21:3 | { ... } | SSA init(this.xs) | -| Fields.java:13:15:13:16 | this.xs | Fields.java:14:5:14:9 | upd(...) | SSA impl upd[nonlocal](this.xs) | -| Fields.java:13:15:13:16 | this.xs | Fields.java:17:7:17:11 | upd(...) | SSA impl upd[nonlocal](this.xs) | +| Fields.java:13:15:13:16 | this.xs | Fields.java:12:19:21:3 | { ... } | SSA entry def(this.xs) | +| Fields.java:13:15:13:16 | this.xs | Fields.java:14:5:14:9 | upd(...) | SSA call def(this.xs) | +| Fields.java:13:15:13:16 | this.xs | Fields.java:17:7:17:11 | upd(...) | SSA call def(this.xs) | | Fields.java:13:15:13:16 | this.xs | Fields.java:18:5:18:16 | ; | SSA phi(this.xs) | | Fields.java:13:15:13:16 | this.xs | Fields.java:19:5:19:19 | ...=... | SSA def(this.xs) | | Fields.java:24:5:24:28 | f | Fields.java:24:12:24:27 | f | SSA def(f) | | Fields.java:24:5:24:28 | f | Fields.java:43:7:43:22 | ...=... | SSA def(f) | | Fields.java:24:5:24:28 | f | Fields.java:44:5:44:13 | ; | SSA phi(f) | -| Fields.java:25:15:25:18 | f.xs | Fields.java:24:12:24:27 | f | SSA impl upd[explicit qualifier](f.xs) | -| Fields.java:25:15:25:18 | f.xs | Fields.java:28:5:28:12 | f(...) | SSA impl upd[nonlocal](f.xs) | -| Fields.java:25:15:25:18 | f.xs | Fields.java:32:5:32:9 | f(...) | SSA impl upd[nonlocal](f.xs) | +| Fields.java:25:15:25:18 | f.xs | Fields.java:24:12:24:27 | f | SSA qualifier def(f.xs) | +| Fields.java:25:15:25:18 | f.xs | Fields.java:28:5:28:12 | f(...) | SSA call def(f.xs) | +| Fields.java:25:15:25:18 | f.xs | Fields.java:32:5:32:9 | f(...) | SSA call def(f.xs) | | Fields.java:25:15:25:18 | f.xs | Fields.java:39:5:39:21 | ...=... | SSA def(f.xs) | -| Fields.java:25:15:25:18 | f.xs | Fields.java:43:7:43:22 | ...=... | SSA impl upd[explicit qualifier](f.xs) | +| Fields.java:25:15:25:18 | f.xs | Fields.java:43:7:43:22 | ...=... | SSA qualifier def(f.xs) | | Fields.java:25:15:25:18 | f.xs | Fields.java:44:5:44:13 | ; | SSA phi(f.xs) | | Fields.java:26:5:26:17 | z | Fields.java:41:5:41:10 | ...=... | SSA def(z) | -| Fields.java:26:15:26:16 | this.xs | Fields.java:23:19:49:3 | { ... } | SSA init(this.xs) | -| Fields.java:26:15:26:16 | this.xs | Fields.java:28:5:28:12 | f(...) | SSA impl upd[nonlocal](this.xs) | -| Fields.java:26:15:26:16 | this.xs | Fields.java:32:5:32:9 | f(...) | SSA impl upd[nonlocal](this.xs) | +| Fields.java:26:15:26:16 | this.xs | Fields.java:23:19:49:3 | { ... } | SSA entry def(this.xs) | +| Fields.java:26:15:26:16 | this.xs | Fields.java:28:5:28:12 | f(...) | SSA call def(this.xs) | +| Fields.java:26:15:26:16 | this.xs | Fields.java:32:5:32:9 | f(...) | SSA call def(this.xs) | | Fields.java:26:15:26:16 | this.xs | Fields.java:36:5:36:19 | ...=... | SSA def(this.xs) | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:23:19:49:3 | { ... } | SSA init(Fields.stat) | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:24:16:24:27 | new Fields(...) | SSA impl upd[nonlocal](Fields.stat) | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:28:5:28:12 | f(...) | SSA impl upd[nonlocal](Fields.stat) | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:32:5:32:9 | f(...) | SSA impl upd[nonlocal](Fields.stat) | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:43:11:43:22 | new Fields(...) | SSA impl upd[nonlocal](Fields.stat) | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:23:19:49:3 | { ... } | SSA entry def(Fields.stat) | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:24:16:24:27 | new Fields(...) | SSA call def(Fields.stat) | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:28:5:28:12 | f(...) | SSA call def(Fields.stat) | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:32:5:32:9 | f(...) | SSA call def(Fields.stat) | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:43:11:43:22 | new Fields(...) | SSA call def(Fields.stat) | | Fields.java:27:15:27:18 | Fields.stat | Fields.java:44:5:44:13 | ; | SSA phi(Fields.stat) | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:45:5:45:16 | new Fields(...) | SSA impl upd[nonlocal](Fields.stat) | -| Nested.java:4:26:4:31 | next(..).p1 | Nested.java:8:29:8:57 | { ... } | SSA init(next(..).p1) | -| Nested.java:4:26:4:31 | p1 | Nested.java:4:34:10:3 | { ... } | SSA init(p1) | -| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA init(next(..).x1) | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:45:5:45:16 | new Fields(...) | SSA call def(Fields.stat) | +| Nested.java:4:26:4:31 | next(..).p1 | Nested.java:8:29:8:57 | { ... } | SSA capture def(next(..).p1) | +| Nested.java:4:26:4:31 | p1 | Nested.java:4:34:10:3 | { ... } | SSA param(p1) | +| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA capture def(next(..).x1) | | Nested.java:5:5:5:15 | x1 | Nested.java:5:9:5:14 | x1 | SSA def(x1) | -| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:16:22:16:34 | { ... } | SSA init(getInt(..).obj) | -| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:20:27:20:39 | { ... } | SSA init(getInt(..).obj) | +| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:16:22:16:34 | { ... } | SSA capture def(getInt(..).obj) | +| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:20:27:20:39 | { ... } | SSA capture def(getInt(..).obj) | | Nested.java:15:5:15:30 | obj | Nested.java:15:12:15:29 | obj | SSA def(obj) | -| Nested.java:16:5:16:35 | getInt(..).hash | Nested.java:19:27:22:7 | { ... } | SSA init(getInt(..).hash) | +| Nested.java:16:5:16:35 | getInt(..).hash | Nested.java:19:27:22:7 | { ... } | SSA capture def(getInt(..).hash) | | Nested.java:16:5:16:35 | hash | Nested.java:16:15:16:34 | hash | SSA def(hash) | -| Nested.java:17:5:17:16 | getInt(..).x2 | Nested.java:19:27:22:7 | { ... } | SSA init(getInt(..).x2) | +| Nested.java:17:5:17:16 | getInt(..).x2 | Nested.java:19:27:22:7 | { ... } | SSA capture def(getInt(..).x2) | | Nested.java:17:5:17:16 | x2 | Nested.java:17:9:17:15 | x2 | SSA def(x2) | | Nested.java:18:5:23:6 | h2 | Nested.java:18:15:23:5 | h2 | SSA def(h2) | | Nested.java:20:9:20:40 | hnest | Nested.java:20:19:20:39 | hnest | SSA def(hnest) | -| Nested.java:24:5:24:31 | getInt(..).obj2 | Nested.java:30:23:30:36 | { ... } | SSA init(getInt(..).obj2) | +| Nested.java:24:5:24:31 | getInt(..).obj2 | Nested.java:30:23:30:36 | { ... } | SSA capture def(getInt(..).obj2) | | Nested.java:24:5:24:31 | obj2 | Nested.java:26:7:26:25 | ...=... | SSA def(obj2) | | Nested.java:24:5:24:31 | obj2 | Nested.java:28:7:28:25 | ...=... | SSA def(obj2) | | Nested.java:24:5:24:31 | obj2 | Nested.java:30:5:30:37 | var ...; | SSA phi(obj2) | -| Nested.java:33:21:33:26 | p3 | Nested.java:33:29:42:3 | { ... } | SSA init(p3) | -| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:37:20:37:25 | { ... } | SSA init(getInt(..).x3) | -| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:40:20:40:25 | { ... } | SSA init(getInt(..).x3) | +| Nested.java:33:21:33:26 | p3 | Nested.java:33:29:42:3 | { ... } | SSA param(p3) | +| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:37:20:37:25 | { ... } | SSA capture def(getInt(..).x3) | +| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:40:20:40:25 | { ... } | SSA capture def(getInt(..).x3) | | Nested.java:34:5:34:11 | x3 | Nested.java:36:7:36:12 | ...=... | SSA def(x3) | | Nested.java:34:5:34:11 | x3 | Nested.java:39:7:39:12 | ...=... | SSA def(x3) | -| Test.java:4:8:4:16 | param | Test.java:4:19:32:2 | { ... } | SSA init(param) | +| Test.java:4:8:4:16 | param | Test.java:4:19:32:2 | { ... } | SSA param(param) | | Test.java:4:8:4:16 | param | Test.java:20:10:20:10 | x | SSA phi(param) | | Test.java:4:8:4:16 | param | Test.java:21:8:21:14 | ...++ | SSA def(param) | | Test.java:6:3:6:12 | x | Test.java:6:7:6:11 | x | SSA def(x) | @@ -65,14 +65,11 @@ | Test.java:27:8:27:16 | i | Test.java:27:12:27:16 | i | SSA def(i) | | Test.java:27:8:27:16 | i | Test.java:27:19:27:19 | i | SSA phi(i) | | Test.java:27:8:27:16 | i | Test.java:27:25:27:27 | ...++ | SSA def(i) | -| TestInstanceOfPattern.java:3:12:3:21 | obj | TestInstanceOfPattern.java:3:24:9:2 | { ... } | SSA init(obj) | +| TestInstanceOfPattern.java:3:12:3:21 | obj | TestInstanceOfPattern.java:3:24:9:2 | { ... } | SSA param(obj) | | TestInstanceOfPattern.java:4:22:4:29 | s | TestInstanceOfPattern.java:4:29:4:29 | s | SSA def(s) | -| TestInstanceOfPattern.java:7:8:7:8 | this.s | TestInstanceOfPattern.java:7:8:7:8 | s | SSA impl upd[untracked](this.s) | -| TestInstanceOfPattern.java:10:13:10:22 | obj | TestInstanceOfPattern.java:10:25:16:2 | { ... } | SSA init(obj) | +| TestInstanceOfPattern.java:10:13:10:22 | obj | TestInstanceOfPattern.java:10:25:16:2 | { ... } | SSA param(obj) | | TestInstanceOfPattern.java:11:24:11:31 | s | TestInstanceOfPattern.java:11:31:11:31 | s | SSA def(s) | -| TestInstanceOfPattern.java:12:8:12:8 | this.s | TestInstanceOfPattern.java:12:8:12:8 | s | SSA impl upd[untracked](this.s) | -| TestInstanceOfPattern.java:17:13:17:22 | obj | TestInstanceOfPattern.java:17:25:23:2 | { ... } | SSA init(obj) | +| TestInstanceOfPattern.java:17:13:17:22 | obj | TestInstanceOfPattern.java:17:25:23:2 | { ... } | SSA param(obj) | | TestInstanceOfPattern.java:18:22:18:29 | s | TestInstanceOfPattern.java:18:29:18:29 | s | SSA def(s) | -| TestInstanceOfPattern.java:21:8:21:8 | this.s | TestInstanceOfPattern.java:21:8:21:8 | s | SSA impl upd[untracked](this.s) | -| TestInstanceOfPattern.java:24:13:24:22 | obj | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA init(obj) | -| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA init(this.s) | +| TestInstanceOfPattern.java:24:13:24:22 | obj | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA param(obj) | +| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA entry def(this.s) | diff --git a/java/ql/test/library-tests/ssa/ssaDef.ql b/java/ql/test/library-tests/ssa/ssaDef.ql index c487c539e78..a0702d58e0b 100644 --- a/java/ql/test/library-tests/ssa/ssaDef.ql +++ b/java/ql/test/library-tests/ssa/ssaDef.ql @@ -1,7 +1,7 @@ import java import semmle.code.java.dataflow.SSA -from SsaVariable ssa, SsaSourceVariable v, string s +from SsaDefinition ssa, SsaSourceVariable v, string s where ssa.getSourceVariable() = v and ( @@ -9,4 +9,4 @@ where or not exists(ssa.toString()) and s = "error" ) -select v, ssa.getCfgNode(), s +select v, ssa.getControlFlowNode(), s diff --git a/java/ql/test/library-tests/ssa/ssaPhi.ql b/java/ql/test/library-tests/ssa/ssaPhi.ql index 8aa0942e90a..c896c26b015 100644 --- a/java/ql/test/library-tests/ssa/ssaPhi.ql +++ b/java/ql/test/library-tests/ssa/ssaPhi.ql @@ -1,6 +1,6 @@ import java import semmle.code.java.dataflow.SSA -from SsaPhiNode ssa, SsaSourceVariable v, SsaVariable phiInput -where ssa.getAPhiInput() = phiInput and ssa.getSourceVariable() = v -select v, ssa.getCfgNode(), phiInput.getCfgNode() +from SsaPhiDefinition ssa, SsaSourceVariable v, SsaDefinition phiInput +where ssa.getAnInput() = phiInput and ssa.getSourceVariable() = v +select v, ssa.getControlFlowNode(), phiInput.getControlFlowNode() diff --git a/java/ql/test/library-tests/ssa/ssaUse.expected b/java/ql/test/library-tests/ssa/ssaUse.expected index f55797b309b..8525f62a883 100644 --- a/java/ql/test/library-tests/ssa/ssaUse.expected +++ b/java/ql/test/library-tests/ssa/ssaUse.expected @@ -1,6 +1,6 @@ | Fields.java:13:5:13:17 | x | Fields.java:15:5:15:10 | ...=... | SSA def(x) | Fields.java:16:9:16:9 | x | -| Fields.java:13:15:13:16 | this.xs | Fields.java:12:19:21:3 | { ... } | SSA init(this.xs) | Fields.java:13:15:13:16 | xs | -| Fields.java:13:15:13:16 | this.xs | Fields.java:14:5:14:9 | upd(...) | SSA impl upd[nonlocal](this.xs) | Fields.java:15:9:15:10 | xs | +| Fields.java:13:15:13:16 | this.xs | Fields.java:12:19:21:3 | { ... } | SSA entry def(this.xs) | Fields.java:13:15:13:16 | xs | +| Fields.java:13:15:13:16 | this.xs | Fields.java:14:5:14:9 | upd(...) | SSA call def(this.xs) | Fields.java:15:9:15:10 | xs | | Fields.java:13:15:13:16 | this.xs | Fields.java:18:5:18:16 | ; | SSA phi(this.xs) | Fields.java:18:9:18:15 | this.xs | | Fields.java:13:15:13:16 | this.xs | Fields.java:19:5:19:19 | ...=... | SSA def(this.xs) | Fields.java:20:9:20:10 | xs | | Fields.java:24:5:24:28 | f | Fields.java:24:12:24:27 | f | SSA def(f) | Fields.java:25:15:25:15 | f | @@ -12,39 +12,39 @@ | Fields.java:24:5:24:28 | f | Fields.java:24:12:24:27 | f | SSA def(f) | Fields.java:40:9:40:9 | f | | Fields.java:24:5:24:28 | f | Fields.java:44:5:44:13 | ; | SSA phi(f) | Fields.java:44:9:44:9 | f | | Fields.java:24:5:24:28 | f | Fields.java:44:5:44:13 | ; | SSA phi(f) | Fields.java:46:9:46:9 | f | -| Fields.java:25:15:25:18 | f.xs | Fields.java:24:12:24:27 | f | SSA impl upd[explicit qualifier](f.xs) | Fields.java:25:15:25:18 | f.xs | -| Fields.java:25:15:25:18 | f.xs | Fields.java:28:5:28:12 | f(...) | SSA impl upd[nonlocal](f.xs) | Fields.java:29:9:29:12 | f.xs | -| Fields.java:25:15:25:18 | f.xs | Fields.java:32:5:32:9 | f(...) | SSA impl upd[nonlocal](f.xs) | Fields.java:33:9:33:12 | f.xs | -| Fields.java:25:15:25:18 | f.xs | Fields.java:32:5:32:9 | f(...) | SSA impl upd[nonlocal](f.xs) | Fields.java:37:9:37:12 | f.xs | +| Fields.java:25:15:25:18 | f.xs | Fields.java:24:12:24:27 | f | SSA qualifier def(f.xs) | Fields.java:25:15:25:18 | f.xs | +| Fields.java:25:15:25:18 | f.xs | Fields.java:28:5:28:12 | f(...) | SSA call def(f.xs) | Fields.java:29:9:29:12 | f.xs | +| Fields.java:25:15:25:18 | f.xs | Fields.java:32:5:32:9 | f(...) | SSA call def(f.xs) | Fields.java:33:9:33:12 | f.xs | +| Fields.java:25:15:25:18 | f.xs | Fields.java:32:5:32:9 | f(...) | SSA call def(f.xs) | Fields.java:37:9:37:12 | f.xs | | Fields.java:25:15:25:18 | f.xs | Fields.java:39:5:39:21 | ...=... | SSA def(f.xs) | Fields.java:40:9:40:12 | f.xs | | Fields.java:25:15:25:18 | f.xs | Fields.java:44:5:44:13 | ; | SSA phi(f.xs) | Fields.java:44:9:44:12 | f.xs | | Fields.java:25:15:25:18 | f.xs | Fields.java:44:5:44:13 | ; | SSA phi(f.xs) | Fields.java:46:9:46:12 | f.xs | | Fields.java:26:5:26:17 | z | Fields.java:41:5:41:10 | ...=... | SSA def(z) | Fields.java:42:9:42:9 | z | -| Fields.java:26:15:26:16 | this.xs | Fields.java:23:19:49:3 | { ... } | SSA init(this.xs) | Fields.java:26:15:26:16 | xs | -| Fields.java:26:15:26:16 | this.xs | Fields.java:28:5:28:12 | f(...) | SSA impl upd[nonlocal](this.xs) | Fields.java:30:9:30:10 | xs | -| Fields.java:26:15:26:16 | this.xs | Fields.java:32:5:32:9 | f(...) | SSA impl upd[nonlocal](this.xs) | Fields.java:34:9:34:10 | xs | +| Fields.java:26:15:26:16 | this.xs | Fields.java:23:19:49:3 | { ... } | SSA entry def(this.xs) | Fields.java:26:15:26:16 | xs | +| Fields.java:26:15:26:16 | this.xs | Fields.java:28:5:28:12 | f(...) | SSA call def(this.xs) | Fields.java:30:9:30:10 | xs | +| Fields.java:26:15:26:16 | this.xs | Fields.java:32:5:32:9 | f(...) | SSA call def(this.xs) | Fields.java:34:9:34:10 | xs | | Fields.java:26:15:26:16 | this.xs | Fields.java:36:5:36:19 | ...=... | SSA def(this.xs) | Fields.java:38:9:38:10 | xs | | Fields.java:26:15:26:16 | this.xs | Fields.java:36:5:36:19 | ...=... | SSA def(this.xs) | Fields.java:41:9:41:10 | xs | | Fields.java:26:15:26:16 | this.xs | Fields.java:36:5:36:19 | ...=... | SSA def(this.xs) | Fields.java:47:9:47:10 | xs | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:24:16:24:27 | new Fields(...) | SSA impl upd[nonlocal](Fields.stat) | Fields.java:27:15:27:18 | stat | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:28:5:28:12 | f(...) | SSA impl upd[nonlocal](Fields.stat) | Fields.java:31:9:31:12 | stat | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:32:5:32:9 | f(...) | SSA impl upd[nonlocal](Fields.stat) | Fields.java:35:9:35:12 | stat | -| Fields.java:27:15:27:18 | Fields.stat | Fields.java:45:5:45:16 | new Fields(...) | SSA impl upd[nonlocal](Fields.stat) | Fields.java:48:9:48:12 | stat | -| Nested.java:4:26:4:31 | next(..).p1 | Nested.java:8:29:8:57 | { ... } | SSA init(next(..).p1) | Nested.java:8:38:8:39 | p1 | -| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA init(next(..).x1) | Nested.java:8:43:8:44 | x1 | -| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA init(next(..).x1) | Nested.java:8:48:8:49 | x1 | -| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA init(next(..).x1) | Nested.java:8:53:8:54 | x1 | -| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:16:22:16:34 | { ... } | SSA init(getInt(..).obj) | Nested.java:16:22:16:24 | obj | -| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:20:27:20:39 | { ... } | SSA init(getInt(..).obj) | Nested.java:20:27:20:29 | obj | -| Nested.java:16:5:16:35 | getInt(..).hash | Nested.java:19:27:22:7 | { ... } | SSA init(getInt(..).hash) | Nested.java:21:21:21:24 | hash | -| Nested.java:17:5:17:16 | getInt(..).x2 | Nested.java:19:27:22:7 | { ... } | SSA init(getInt(..).x2) | Nested.java:21:16:21:17 | x2 | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:24:16:24:27 | new Fields(...) | SSA call def(Fields.stat) | Fields.java:27:15:27:18 | stat | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:28:5:28:12 | f(...) | SSA call def(Fields.stat) | Fields.java:31:9:31:12 | stat | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:32:5:32:9 | f(...) | SSA call def(Fields.stat) | Fields.java:35:9:35:12 | stat | +| Fields.java:27:15:27:18 | Fields.stat | Fields.java:45:5:45:16 | new Fields(...) | SSA call def(Fields.stat) | Fields.java:48:9:48:12 | stat | +| Nested.java:4:26:4:31 | next(..).p1 | Nested.java:8:29:8:57 | { ... } | SSA capture def(next(..).p1) | Nested.java:8:38:8:39 | p1 | +| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA capture def(next(..).x1) | Nested.java:8:43:8:44 | x1 | +| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA capture def(next(..).x1) | Nested.java:8:48:8:49 | x1 | +| Nested.java:5:5:5:15 | next(..).x1 | Nested.java:8:29:8:57 | { ... } | SSA capture def(next(..).x1) | Nested.java:8:53:8:54 | x1 | +| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:16:22:16:34 | { ... } | SSA capture def(getInt(..).obj) | Nested.java:16:22:16:24 | obj | +| Nested.java:15:5:15:30 | getInt(..).obj | Nested.java:20:27:20:39 | { ... } | SSA capture def(getInt(..).obj) | Nested.java:20:27:20:29 | obj | +| Nested.java:16:5:16:35 | getInt(..).hash | Nested.java:19:27:22:7 | { ... } | SSA capture def(getInt(..).hash) | Nested.java:21:21:21:24 | hash | +| Nested.java:17:5:17:16 | getInt(..).x2 | Nested.java:19:27:22:7 | { ... } | SSA capture def(getInt(..).x2) | Nested.java:21:16:21:17 | x2 | | Nested.java:18:5:23:6 | h2 | Nested.java:18:15:23:5 | h2 | SSA def(h2) | Nested.java:25:9:25:10 | h2 | | Nested.java:20:9:20:40 | hnest | Nested.java:20:19:20:39 | hnest | SSA def(hnest) | Nested.java:21:37:21:41 | hnest | -| Nested.java:24:5:24:31 | getInt(..).obj2 | Nested.java:30:23:30:36 | { ... } | SSA init(getInt(..).obj2) | Nested.java:30:23:30:26 | obj2 | -| Nested.java:33:21:33:26 | p3 | Nested.java:33:29:42:3 | { ... } | SSA init(p3) | Nested.java:35:9:35:10 | p3 | -| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:37:20:37:25 | { ... } | SSA init(getInt(..).x3) | Nested.java:37:20:37:21 | x3 | -| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:40:20:40:25 | { ... } | SSA init(getInt(..).x3) | Nested.java:40:20:40:21 | x3 | -| Test.java:4:8:4:16 | param | Test.java:4:19:32:2 | { ... } | SSA init(param) | Test.java:9:7:9:11 | param | +| Nested.java:24:5:24:31 | getInt(..).obj2 | Nested.java:30:23:30:36 | { ... } | SSA capture def(getInt(..).obj2) | Nested.java:30:23:30:26 | obj2 | +| Nested.java:33:21:33:26 | p3 | Nested.java:33:29:42:3 | { ... } | SSA param(p3) | Nested.java:35:9:35:10 | p3 | +| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:37:20:37:25 | { ... } | SSA capture def(getInt(..).x3) | Nested.java:37:20:37:21 | x3 | +| Nested.java:34:5:34:11 | getInt(..).x3 | Nested.java:40:20:40:25 | { ... } | SSA capture def(getInt(..).x3) | Nested.java:40:20:40:21 | x3 | +| Test.java:4:8:4:16 | param | Test.java:4:19:32:2 | { ... } | SSA param(param) | Test.java:9:7:9:11 | param | | Test.java:4:8:4:16 | param | Test.java:20:10:20:10 | x | SSA phi(param) | Test.java:21:8:21:12 | param | | Test.java:6:3:6:12 | x | Test.java:6:7:6:11 | x | SSA def(x) | Test.java:10:4:10:4 | x | | Test.java:6:3:6:12 | x | Test.java:10:4:10:6 | ...++ | SSA def(x) | Test.java:11:10:11:10 | x | @@ -58,17 +58,14 @@ | Test.java:27:8:27:16 | i | Test.java:27:19:27:19 | i | SSA phi(i) | Test.java:27:19:27:19 | i | | Test.java:27:8:27:16 | i | Test.java:27:19:27:19 | i | SSA phi(i) | Test.java:27:25:27:25 | i | | Test.java:27:8:27:16 | i | Test.java:27:19:27:19 | i | SSA phi(i) | Test.java:28:9:28:9 | i | -| TestInstanceOfPattern.java:3:12:3:21 | obj | TestInstanceOfPattern.java:3:24:9:2 | { ... } | SSA init(obj) | TestInstanceOfPattern.java:4:7:4:9 | obj | +| TestInstanceOfPattern.java:3:12:3:21 | obj | TestInstanceOfPattern.java:3:24:9:2 | { ... } | SSA param(obj) | TestInstanceOfPattern.java:4:7:4:9 | obj | | TestInstanceOfPattern.java:4:22:4:29 | s | TestInstanceOfPattern.java:4:29:4:29 | s | SSA def(s) | TestInstanceOfPattern.java:5:8:5:8 | s | -| TestInstanceOfPattern.java:7:8:7:8 | this.s | TestInstanceOfPattern.java:7:8:7:8 | s | SSA impl upd[untracked](this.s) | TestInstanceOfPattern.java:7:8:7:8 | s | -| TestInstanceOfPattern.java:10:13:10:22 | obj | TestInstanceOfPattern.java:10:25:16:2 | { ... } | SSA init(obj) | TestInstanceOfPattern.java:11:9:11:11 | obj | +| TestInstanceOfPattern.java:10:13:10:22 | obj | TestInstanceOfPattern.java:10:25:16:2 | { ... } | SSA param(obj) | TestInstanceOfPattern.java:11:9:11:11 | obj | | TestInstanceOfPattern.java:11:24:11:31 | s | TestInstanceOfPattern.java:11:31:11:31 | s | SSA def(s) | TestInstanceOfPattern.java:14:8:14:8 | s | -| TestInstanceOfPattern.java:12:8:12:8 | this.s | TestInstanceOfPattern.java:12:8:12:8 | s | SSA impl upd[untracked](this.s) | TestInstanceOfPattern.java:12:8:12:8 | s | -| TestInstanceOfPattern.java:17:13:17:22 | obj | TestInstanceOfPattern.java:17:25:23:2 | { ... } | SSA init(obj) | TestInstanceOfPattern.java:18:7:18:9 | obj | +| TestInstanceOfPattern.java:17:13:17:22 | obj | TestInstanceOfPattern.java:17:25:23:2 | { ... } | SSA param(obj) | TestInstanceOfPattern.java:18:7:18:9 | obj | | TestInstanceOfPattern.java:18:22:18:29 | s | TestInstanceOfPattern.java:18:29:18:29 | s | SSA def(s) | TestInstanceOfPattern.java:18:34:18:34 | s | | TestInstanceOfPattern.java:18:22:18:29 | s | TestInstanceOfPattern.java:18:29:18:29 | s | SSA def(s) | TestInstanceOfPattern.java:19:8:19:8 | s | -| TestInstanceOfPattern.java:21:8:21:8 | this.s | TestInstanceOfPattern.java:21:8:21:8 | s | SSA impl upd[untracked](this.s) | TestInstanceOfPattern.java:21:8:21:8 | s | -| TestInstanceOfPattern.java:24:13:24:22 | obj | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA init(obj) | TestInstanceOfPattern.java:25:7:25:9 | obj | -| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA init(this.s) | TestInstanceOfPattern.java:25:34:25:34 | s | -| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA init(this.s) | TestInstanceOfPattern.java:26:8:26:8 | s | -| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA init(this.s) | TestInstanceOfPattern.java:28:8:28:8 | s | +| TestInstanceOfPattern.java:24:13:24:22 | obj | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA param(obj) | TestInstanceOfPattern.java:25:7:25:9 | obj | +| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA entry def(this.s) | TestInstanceOfPattern.java:25:34:25:34 | s | +| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA entry def(this.s) | TestInstanceOfPattern.java:26:8:26:8 | s | +| TestInstanceOfPattern.java:25:34:25:34 | this.s | TestInstanceOfPattern.java:24:25:30:2 | { ... } | SSA entry def(this.s) | TestInstanceOfPattern.java:28:8:28:8 | s | diff --git a/java/ql/test/library-tests/ssa/ssaUse.ql b/java/ql/test/library-tests/ssa/ssaUse.ql index cab6f47c955..7bcec95cab8 100644 --- a/java/ql/test/library-tests/ssa/ssaUse.ql +++ b/java/ql/test/library-tests/ssa/ssaUse.ql @@ -1,6 +1,6 @@ import java import semmle.code.java.dataflow.SSA -from SsaVariable ssa, SsaSourceVariable v, Expr use -where use = ssa.getAUse() and ssa.getSourceVariable() = v -select v, ssa.getCfgNode(), ssa.toString(), use +from SsaDefinition ssa, SsaSourceVariable v, Expr use +where use = ssa.getARead() and ssa.getSourceVariable() = v +select v, ssa.getControlFlowNode(), ssa.toString(), use diff --git a/java/ql/test/query-tests/Nullness/C.java b/java/ql/test/query-tests/Nullness/C.java index 881185abd23..edd64cfa79b 100644 --- a/java/ql/test/query-tests/Nullness/C.java +++ b/java/ql/test/query-tests/Nullness/C.java @@ -254,4 +254,15 @@ public class C { xs[0] = 42; // OK } } + + public void ex19(Object t, Object x) { + boolean b = t != null || x != null; + if (b) { + if (t != null) { + t.hashCode(); // OK + } else { + x.hashCode(); // OK + } + } + } } diff --git a/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.expected b/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.expected index e32ff5654e2..54f1e9f8a5a 100644 --- a/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.expected +++ b/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.expected @@ -1,15 +1,28 @@ #select -| Test.java:7:21:7:53 | ... + ... | Test.java:7:46:7:53 | password : String | Test.java:7:21:7:53 | ... + ... | This $@ is written to a log file. | Test.java:7:46:7:53 | password | potentially sensitive information | -| Test.java:8:22:8:52 | ... + ... | Test.java:8:44:8:52 | authToken : String | Test.java:8:22:8:52 | ... + ... | This $@ is written to a log file. | Test.java:8:44:8:52 | authToken | potentially sensitive information | +| Test.java:11:21:11:53 | ... + ... | Test.java:11:46:11:53 | password : String | Test.java:11:21:11:53 | ... + ... | This $@ is written to a log file. | Test.java:11:46:11:53 | password | potentially sensitive information | +| Test.java:12:22:12:52 | ... + ... | Test.java:12:44:12:52 | authToken : String | Test.java:12:22:12:52 | ... + ... | This $@ is written to a log file. | Test.java:12:44:12:52 | authToken | potentially sensitive information | +| Test.java:21:22:21:75 | ... + ... | Test.java:21:44:21:52 | authToken : String | Test.java:21:22:21:75 | ... + ... | This $@ is written to a log file. | Test.java:21:44:21:52 | authToken | potentially sensitive information | +| Test.java:22:22:22:75 | ... + ... | Test.java:22:44:22:52 | authToken : String | Test.java:22:22:22:75 | ... + ... | This $@ is written to a log file. | Test.java:22:44:22:52 | authToken | potentially sensitive information | edges -| Test.java:7:46:7:53 | password : String | Test.java:7:21:7:53 | ... + ... | provenance | Sink:MaD:2 | -| Test.java:8:44:8:52 | authToken : String | Test.java:8:22:8:52 | ... + ... | provenance | Sink:MaD:1 | +| Test.java:11:46:11:53 | password : String | Test.java:11:21:11:53 | ... + ... | provenance | Sink:MaD:2 | +| Test.java:12:44:12:52 | authToken : String | Test.java:12:22:12:52 | ... + ... | provenance | Sink:MaD:1 | +| Test.java:21:44:21:52 | authToken : String | Test.java:21:44:21:67 | substring(...) : String | provenance | MaD:3 | +| Test.java:21:44:21:67 | substring(...) : String | Test.java:21:22:21:75 | ... + ... | provenance | Sink:MaD:1 | +| Test.java:22:44:22:52 | authToken : String | Test.java:22:44:22:67 | substring(...) : String | provenance | MaD:3 | +| Test.java:22:44:22:67 | substring(...) : String | Test.java:22:22:22:75 | ... + ... | provenance | Sink:MaD:1 | models | 1 | Sink: org.apache.logging.log4j; Logger; true; error; (String); ; Argument[0]; log-injection; manual | | 2 | Sink: org.apache.logging.log4j; Logger; true; info; (String); ; Argument[0]; log-injection; manual | +| 3 | Summary: java.lang; String; false; substring; ; ; Argument[this]; ReturnValue; taint; manual | nodes -| Test.java:7:21:7:53 | ... + ... | semmle.label | ... + ... | -| Test.java:7:46:7:53 | password : String | semmle.label | password : String | -| Test.java:8:22:8:52 | ... + ... | semmle.label | ... + ... | -| Test.java:8:44:8:52 | authToken : String | semmle.label | authToken : String | +| Test.java:11:21:11:53 | ... + ... | semmle.label | ... + ... | +| Test.java:11:46:11:53 | password : String | semmle.label | password : String | +| Test.java:12:22:12:52 | ... + ... | semmle.label | ... + ... | +| Test.java:12:44:12:52 | authToken : String | semmle.label | authToken : String | +| Test.java:21:22:21:75 | ... + ... | semmle.label | ... + ... | +| Test.java:21:44:21:52 | authToken : String | semmle.label | authToken : String | +| Test.java:21:44:21:67 | substring(...) : String | semmle.label | substring(...) : String | +| Test.java:22:22:22:75 | ... + ... | semmle.label | ... + ... | +| Test.java:22:44:22:52 | authToken : String | semmle.label | authToken : String | +| Test.java:22:44:22:67 | substring(...) : String | semmle.label | substring(...) : String | subpaths diff --git a/java/ql/test/query-tests/security/CWE-532/Test.java b/java/ql/test/query-tests/security/CWE-532/Test.java index cf983afc287..6521f7e2df7 100644 --- a/java/ql/test/query-tests/security/CWE-532/Test.java +++ b/java/ql/test/query-tests/security/CWE-532/Test.java @@ -3,11 +3,22 @@ import org.apache.logging.log4j.Logger; class Test { void test(String password, String authToken, String username, String nullToken, String stringTokenizer) { Logger logger = null; + int zero = 0; + int four = 4; + short zeroS = 0; + long fourL = 4L; logger.info("User's password is: " + password); // $ Alert logger.error("Auth failed for: " + authToken); // $ Alert logger.error("Auth failed for: " + username); // Safe logger.error("Auth failed for: " + nullToken); // Safe logger.error("Auth failed for: " + stringTokenizer); // Safe + logger.error("Auth failed for: " + authToken.substring(4) + "..."); // Safe + logger.error("Auth failed for: " + authToken.substring(four) + "..."); // Safe + logger.error("Auth failed for: " + authToken.substring(0,4) + "..."); // Safe + logger.error("Auth failed for: " + authToken.substring(zero,four) + "..."); // Safe + logger.error("Auth failed for: " + authToken.substring((int)zeroS,(int)fourL) + "..."); // Safe + logger.error("Auth failed for: " + authToken.substring(1,5) + "..."); // $ Alert + logger.error("Auth failed for: " + authToken.substring(0,8) + "..."); // $ Alert } } diff --git a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected index b08273da0ca..66dc968cb23 100644 --- a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -228,30 +228,30 @@ | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | Potential server-side request forgery due to a $@. | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) | user-provided value | | ReactiveWebClientSSRF.java:16:52:16:54 | url | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | Potential server-side request forgery due to a $@. | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) | user-provided value | | ReactiveWebClientSSRF.java:35:30:35:32 | url | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | Potential server-side request forgery due to a $@. | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) | user-provided value | -| SanitizationTests.java:22:52:22:54 | uri | SanitizationTests.java:19:31:19:57 | getParameter(...) : String | SanitizationTests.java:22:52:22:54 | uri | Potential server-side request forgery due to a $@. | SanitizationTests.java:19:31:19:57 | getParameter(...) | user-provided value | -| SanitizationTests.java:23:25:23:25 | r | SanitizationTests.java:19:31:19:57 | getParameter(...) : String | SanitizationTests.java:23:25:23:25 | r | Potential server-side request forgery due to a $@. | SanitizationTests.java:19:31:19:57 | getParameter(...) | user-provided value | -| SanitizationTests.java:76:59:76:77 | new URI(...) | SanitizationTests.java:75:33:75:63 | getParameter(...) : String | SanitizationTests.java:76:59:76:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:75:33:75:63 | getParameter(...) | user-provided value | -| SanitizationTests.java:77:25:77:32 | unsafer3 | SanitizationTests.java:75:33:75:63 | getParameter(...) : String | SanitizationTests.java:77:25:77:32 | unsafer3 | Potential server-side request forgery due to a $@. | SanitizationTests.java:75:33:75:63 | getParameter(...) | user-provided value | -| SanitizationTests.java:80:59:80:77 | new URI(...) | SanitizationTests.java:79:49:79:79 | getParameter(...) : String | SanitizationTests.java:80:59:80:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:79:49:79:79 | getParameter(...) | user-provided value | -| SanitizationTests.java:81:25:81:32 | unsafer4 | SanitizationTests.java:79:49:79:79 | getParameter(...) : String | SanitizationTests.java:81:25:81:32 | unsafer4 | Potential server-side request forgery due to a $@. | SanitizationTests.java:79:49:79:79 | getParameter(...) | user-provided value | -| SanitizationTests.java:85:59:85:88 | new URI(...) | SanitizationTests.java:84:31:84:61 | getParameter(...) : String | SanitizationTests.java:85:59:85:88 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:84:31:84:61 | getParameter(...) | user-provided value | -| SanitizationTests.java:86:25:86:32 | unsafer5 | SanitizationTests.java:84:31:84:61 | getParameter(...) : String | SanitizationTests.java:86:25:86:32 | unsafer5 | Potential server-side request forgery due to a $@. | SanitizationTests.java:84:31:84:61 | getParameter(...) | user-provided value | -| SanitizationTests.java:90:60:90:89 | new URI(...) | SanitizationTests.java:88:58:88:86 | getParameter(...) : String | SanitizationTests.java:90:60:90:89 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:88:58:88:86 | getParameter(...) | user-provided value | -| SanitizationTests.java:91:25:91:33 | unsafer5a | SanitizationTests.java:88:58:88:86 | getParameter(...) : String | SanitizationTests.java:91:25:91:33 | unsafer5a | Potential server-side request forgery due to a $@. | SanitizationTests.java:88:58:88:86 | getParameter(...) | user-provided value | -| SanitizationTests.java:95:60:95:90 | new URI(...) | SanitizationTests.java:93:60:93:88 | getParameter(...) : String | SanitizationTests.java:95:60:95:90 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:93:60:93:88 | getParameter(...) | user-provided value | -| SanitizationTests.java:96:25:96:33 | unsafer5b | SanitizationTests.java:93:60:93:88 | getParameter(...) : String | SanitizationTests.java:96:25:96:33 | unsafer5b | Potential server-side request forgery due to a $@. | SanitizationTests.java:93:60:93:88 | getParameter(...) | user-provided value | -| SanitizationTests.java:100:60:100:90 | new URI(...) | SanitizationTests.java:98:77:98:105 | getParameter(...) : String | SanitizationTests.java:100:60:100:90 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:98:77:98:105 | getParameter(...) | user-provided value | -| SanitizationTests.java:101:25:101:33 | unsafer5c | SanitizationTests.java:98:77:98:105 | getParameter(...) : String | SanitizationTests.java:101:25:101:33 | unsafer5c | Potential server-side request forgery due to a $@. | SanitizationTests.java:98:77:98:105 | getParameter(...) | user-provided value | -| SanitizationTests.java:104:59:104:77 | new URI(...) | SanitizationTests.java:103:73:103:103 | getParameter(...) : String | SanitizationTests.java:104:59:104:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:103:73:103:103 | getParameter(...) | user-provided value | -| SanitizationTests.java:105:25:105:32 | unsafer6 | SanitizationTests.java:103:73:103:103 | getParameter(...) : String | SanitizationTests.java:105:25:105:32 | unsafer6 | Potential server-side request forgery due to a $@. | SanitizationTests.java:103:73:103:103 | getParameter(...) | user-provided value | -| SanitizationTests.java:108:59:108:77 | new URI(...) | SanitizationTests.java:107:56:107:86 | getParameter(...) : String | SanitizationTests.java:108:59:108:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:107:56:107:86 | getParameter(...) | user-provided value | -| SanitizationTests.java:109:25:109:32 | unsafer7 | SanitizationTests.java:107:56:107:86 | getParameter(...) : String | SanitizationTests.java:109:25:109:32 | unsafer7 | Potential server-side request forgery due to a $@. | SanitizationTests.java:107:56:107:86 | getParameter(...) | user-provided value | -| SanitizationTests.java:112:59:112:77 | new URI(...) | SanitizationTests.java:111:55:111:85 | getParameter(...) : String | SanitizationTests.java:112:59:112:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:111:55:111:85 | getParameter(...) | user-provided value | -| SanitizationTests.java:113:25:113:32 | unsafer8 | SanitizationTests.java:111:55:111:85 | getParameter(...) : String | SanitizationTests.java:113:25:113:32 | unsafer8 | Potential server-side request forgery due to a $@. | SanitizationTests.java:111:55:111:85 | getParameter(...) | user-provided value | -| SanitizationTests.java:116:59:116:77 | new URI(...) | SanitizationTests.java:115:33:115:63 | getParameter(...) : String | SanitizationTests.java:116:59:116:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:115:33:115:63 | getParameter(...) | user-provided value | -| SanitizationTests.java:117:25:117:32 | unsafer9 | SanitizationTests.java:115:33:115:63 | getParameter(...) : String | SanitizationTests.java:117:25:117:32 | unsafer9 | Potential server-side request forgery due to a $@. | SanitizationTests.java:115:33:115:63 | getParameter(...) | user-provided value | -| SanitizationTests.java:120:60:120:79 | new URI(...) | SanitizationTests.java:119:94:119:125 | getParameter(...) : String | SanitizationTests.java:120:60:120:79 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:119:94:119:125 | getParameter(...) | user-provided value | -| SanitizationTests.java:121:25:121:33 | unsafer10 | SanitizationTests.java:119:94:119:125 | getParameter(...) : String | SanitizationTests.java:121:25:121:33 | unsafer10 | Potential server-side request forgery due to a $@. | SanitizationTests.java:119:94:119:125 | getParameter(...) | user-provided value | +| SanitizationTests.java:24:52:24:54 | uri | SanitizationTests.java:21:31:21:57 | getParameter(...) : String | SanitizationTests.java:24:52:24:54 | uri | Potential server-side request forgery due to a $@. | SanitizationTests.java:21:31:21:57 | getParameter(...) | user-provided value | +| SanitizationTests.java:25:25:25:25 | r | SanitizationTests.java:21:31:21:57 | getParameter(...) : String | SanitizationTests.java:25:25:25:25 | r | Potential server-side request forgery due to a $@. | SanitizationTests.java:21:31:21:57 | getParameter(...) | user-provided value | +| SanitizationTests.java:78:59:78:77 | new URI(...) | SanitizationTests.java:77:33:77:63 | getParameter(...) : String | SanitizationTests.java:78:59:78:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:77:33:77:63 | getParameter(...) | user-provided value | +| SanitizationTests.java:79:25:79:32 | unsafer3 | SanitizationTests.java:77:33:77:63 | getParameter(...) : String | SanitizationTests.java:79:25:79:32 | unsafer3 | Potential server-side request forgery due to a $@. | SanitizationTests.java:77:33:77:63 | getParameter(...) | user-provided value | +| SanitizationTests.java:82:59:82:77 | new URI(...) | SanitizationTests.java:81:49:81:79 | getParameter(...) : String | SanitizationTests.java:82:59:82:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:81:49:81:79 | getParameter(...) | user-provided value | +| SanitizationTests.java:83:25:83:32 | unsafer4 | SanitizationTests.java:81:49:81:79 | getParameter(...) : String | SanitizationTests.java:83:25:83:32 | unsafer4 | Potential server-side request forgery due to a $@. | SanitizationTests.java:81:49:81:79 | getParameter(...) | user-provided value | +| SanitizationTests.java:87:59:87:88 | new URI(...) | SanitizationTests.java:86:31:86:61 | getParameter(...) : String | SanitizationTests.java:87:59:87:88 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:86:31:86:61 | getParameter(...) | user-provided value | +| SanitizationTests.java:88:25:88:32 | unsafer5 | SanitizationTests.java:86:31:86:61 | getParameter(...) : String | SanitizationTests.java:88:25:88:32 | unsafer5 | Potential server-side request forgery due to a $@. | SanitizationTests.java:86:31:86:61 | getParameter(...) | user-provided value | +| SanitizationTests.java:92:60:92:89 | new URI(...) | SanitizationTests.java:90:58:90:86 | getParameter(...) : String | SanitizationTests.java:92:60:92:89 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:90:58:90:86 | getParameter(...) | user-provided value | +| SanitizationTests.java:93:25:93:33 | unsafer5a | SanitizationTests.java:90:58:90:86 | getParameter(...) : String | SanitizationTests.java:93:25:93:33 | unsafer5a | Potential server-side request forgery due to a $@. | SanitizationTests.java:90:58:90:86 | getParameter(...) | user-provided value | +| SanitizationTests.java:97:60:97:90 | new URI(...) | SanitizationTests.java:95:60:95:88 | getParameter(...) : String | SanitizationTests.java:97:60:97:90 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:95:60:95:88 | getParameter(...) | user-provided value | +| SanitizationTests.java:98:25:98:33 | unsafer5b | SanitizationTests.java:95:60:95:88 | getParameter(...) : String | SanitizationTests.java:98:25:98:33 | unsafer5b | Potential server-side request forgery due to a $@. | SanitizationTests.java:95:60:95:88 | getParameter(...) | user-provided value | +| SanitizationTests.java:102:60:102:90 | new URI(...) | SanitizationTests.java:100:77:100:105 | getParameter(...) : String | SanitizationTests.java:102:60:102:90 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:100:77:100:105 | getParameter(...) | user-provided value | +| SanitizationTests.java:103:25:103:33 | unsafer5c | SanitizationTests.java:100:77:100:105 | getParameter(...) : String | SanitizationTests.java:103:25:103:33 | unsafer5c | Potential server-side request forgery due to a $@. | SanitizationTests.java:100:77:100:105 | getParameter(...) | user-provided value | +| SanitizationTests.java:106:59:106:77 | new URI(...) | SanitizationTests.java:105:73:105:103 | getParameter(...) : String | SanitizationTests.java:106:59:106:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:105:73:105:103 | getParameter(...) | user-provided value | +| SanitizationTests.java:107:25:107:32 | unsafer6 | SanitizationTests.java:105:73:105:103 | getParameter(...) : String | SanitizationTests.java:107:25:107:32 | unsafer6 | Potential server-side request forgery due to a $@. | SanitizationTests.java:105:73:105:103 | getParameter(...) | user-provided value | +| SanitizationTests.java:110:59:110:77 | new URI(...) | SanitizationTests.java:109:56:109:86 | getParameter(...) : String | SanitizationTests.java:110:59:110:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:109:56:109:86 | getParameter(...) | user-provided value | +| SanitizationTests.java:111:25:111:32 | unsafer7 | SanitizationTests.java:109:56:109:86 | getParameter(...) : String | SanitizationTests.java:111:25:111:32 | unsafer7 | Potential server-side request forgery due to a $@. | SanitizationTests.java:109:56:109:86 | getParameter(...) | user-provided value | +| SanitizationTests.java:114:59:114:77 | new URI(...) | SanitizationTests.java:113:55:113:85 | getParameter(...) : String | SanitizationTests.java:114:59:114:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:113:55:113:85 | getParameter(...) | user-provided value | +| SanitizationTests.java:115:25:115:32 | unsafer8 | SanitizationTests.java:113:55:113:85 | getParameter(...) : String | SanitizationTests.java:115:25:115:32 | unsafer8 | Potential server-side request forgery due to a $@. | SanitizationTests.java:113:55:113:85 | getParameter(...) | user-provided value | +| SanitizationTests.java:118:59:118:77 | new URI(...) | SanitizationTests.java:117:33:117:63 | getParameter(...) : String | SanitizationTests.java:118:59:118:77 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:117:33:117:63 | getParameter(...) | user-provided value | +| SanitizationTests.java:119:25:119:32 | unsafer9 | SanitizationTests.java:117:33:117:63 | getParameter(...) : String | SanitizationTests.java:119:25:119:32 | unsafer9 | Potential server-side request forgery due to a $@. | SanitizationTests.java:117:33:117:63 | getParameter(...) | user-provided value | +| SanitizationTests.java:122:60:122:79 | new URI(...) | SanitizationTests.java:121:94:121:125 | getParameter(...) : String | SanitizationTests.java:122:60:122:79 | new URI(...) | Potential server-side request forgery due to a $@. | SanitizationTests.java:121:94:121:125 | getParameter(...) | user-provided value | +| SanitizationTests.java:123:25:123:33 | unsafer10 | SanitizationTests.java:121:94:121:125 | getParameter(...) : String | SanitizationTests.java:123:25:123:33 | unsafer10 | Potential server-side request forgery due to a $@. | SanitizationTests.java:121:94:121:125 | getParameter(...) | user-provided value | | SpringSSRF.java:32:39:32:59 | ... + ... | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | Potential server-side request forgery due to a $@. | SpringSSRF.java:28:33:28:60 | getParameter(...) | user-provided value | | SpringSSRF.java:33:35:33:48 | fooResourceUrl | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:35:33:48 | fooResourceUrl | Potential server-side request forgery due to a $@. | SpringSSRF.java:28:33:28:60 | getParameter(...) | user-provided value | | SpringSSRF.java:34:34:34:47 | fooResourceUrl | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:34:34:47 | fooResourceUrl | Potential server-side request forgery due to a $@. | SpringSSRF.java:28:33:28:60 | getParameter(...) | user-provided value | @@ -665,118 +665,118 @@ edges | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:240 | | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | provenance | Src:MaD:277 Sink:MaD:274 | | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | provenance | Src:MaD:277 Sink:MaD:273 | -| SanitizationTests.java:19:23:19:58 | new URI(...) : URI | SanitizationTests.java:22:52:22:54 | uri | provenance | Sink:MaD:6 | -| SanitizationTests.java:19:23:19:58 | new URI(...) : URI | SanitizationTests.java:22:52:22:54 | uri : URI | provenance | | -| SanitizationTests.java:19:31:19:57 | getParameter(...) : String | SanitizationTests.java:19:23:19:58 | new URI(...) : URI | provenance | Src:MaD:277 Config | -| SanitizationTests.java:19:31:19:57 | getParameter(...) : String | SanitizationTests.java:19:23:19:58 | new URI(...) : URI | provenance | Src:MaD:277 MaD:285 | -| SanitizationTests.java:22:29:22:55 | newBuilder(...) : Builder | SanitizationTests.java:22:29:22:63 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:22:29:22:63 | build(...) : HttpRequest | SanitizationTests.java:23:25:23:25 | r | provenance | Sink:MaD:4 | -| SanitizationTests.java:22:52:22:54 | uri : URI | SanitizationTests.java:22:29:22:55 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:75:33:75:63 | getParameter(...) : String | SanitizationTests.java:76:67:76:76 | unsafeUri3 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:76:36:76:78 | newBuilder(...) : Builder | SanitizationTests.java:76:36:76:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:76:36:76:86 | build(...) : HttpRequest | SanitizationTests.java:77:25:77:32 | unsafer3 | provenance | Sink:MaD:4 | -| SanitizationTests.java:76:59:76:77 | new URI(...) : URI | SanitizationTests.java:76:36:76:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:76:67:76:76 | unsafeUri3 : String | SanitizationTests.java:76:59:76:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:76:67:76:76 | unsafeUri3 : String | SanitizationTests.java:76:59:76:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:76:67:76:76 | unsafeUri3 : String | SanitizationTests.java:76:59:76:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:76:67:76:76 | unsafeUri3 : String | SanitizationTests.java:76:59:76:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:79:49:79:79 | getParameter(...) : String | SanitizationTests.java:80:67:80:76 | unsafeUri4 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:80:36:80:78 | newBuilder(...) : Builder | SanitizationTests.java:80:36:80:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:80:36:80:86 | build(...) : HttpRequest | SanitizationTests.java:81:25:81:32 | unsafer4 | provenance | Sink:MaD:4 | -| SanitizationTests.java:80:59:80:77 | new URI(...) : URI | SanitizationTests.java:80:36:80:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:80:67:80:76 | unsafeUri4 : String | SanitizationTests.java:80:59:80:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:80:67:80:76 | unsafeUri4 : String | SanitizationTests.java:80:59:80:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:80:67:80:76 | unsafeUri4 : String | SanitizationTests.java:80:59:80:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:80:67:80:76 | unsafeUri4 : String | SanitizationTests.java:80:59:80:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:84:13:84:22 | unsafeUri5 [post update] : StringBuilder | SanitizationTests.java:85:67:85:76 | unsafeUri5 : StringBuilder | provenance | | -| SanitizationTests.java:84:31:84:61 | getParameter(...) : String | SanitizationTests.java:84:13:84:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:277 MaD:278 | -| SanitizationTests.java:85:36:85:89 | newBuilder(...) : Builder | SanitizationTests.java:85:36:85:97 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:85:36:85:97 | build(...) : HttpRequest | SanitizationTests.java:86:25:86:32 | unsafer5 | provenance | Sink:MaD:4 | -| SanitizationTests.java:85:59:85:88 | new URI(...) : URI | SanitizationTests.java:85:36:85:89 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:85:67:85:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:85:67:85:87 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:85:67:85:87 | toString(...) : String | SanitizationTests.java:85:59:85:88 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:85:67:85:87 | toString(...) : String | SanitizationTests.java:85:59:85:88 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:85:67:85:87 | toString(...) : String | SanitizationTests.java:85:59:85:88 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:85:67:85:87 | toString(...) : String | SanitizationTests.java:85:59:85:88 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:88:40:88:87 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:90:68:90:77 | unafeUri5a : StringBuilder | provenance | | -| SanitizationTests.java:88:58:88:86 | getParameter(...) : String | SanitizationTests.java:88:40:88:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | -| SanitizationTests.java:90:37:90:90 | newBuilder(...) : Builder | SanitizationTests.java:90:37:90:98 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:90:37:90:98 | build(...) : HttpRequest | SanitizationTests.java:91:25:91:33 | unsafer5a | provenance | Sink:MaD:4 | -| SanitizationTests.java:90:60:90:89 | new URI(...) : URI | SanitizationTests.java:90:37:90:90 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:90:68:90:77 | unafeUri5a : StringBuilder | SanitizationTests.java:90:68:90:88 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:90:68:90:88 | toString(...) : String | SanitizationTests.java:90:60:90:89 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:90:68:90:88 | toString(...) : String | SanitizationTests.java:90:60:90:89 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:90:68:90:88 | toString(...) : String | SanitizationTests.java:90:60:90:89 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:90:68:90:88 | toString(...) : String | SanitizationTests.java:90:60:90:89 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:93:41:93:105 | append(...) : StringBuilder | SanitizationTests.java:95:68:95:78 | unsafeUri5b : StringBuilder | provenance | | -| SanitizationTests.java:93:42:93:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:93:41:93:105 | append(...) : StringBuilder | provenance | MaD:279 | -| SanitizationTests.java:93:60:93:88 | getParameter(...) : String | SanitizationTests.java:93:42:93:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | -| SanitizationTests.java:95:37:95:91 | newBuilder(...) : Builder | SanitizationTests.java:95:37:95:99 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:95:37:95:99 | build(...) : HttpRequest | SanitizationTests.java:96:25:96:33 | unsafer5b | provenance | Sink:MaD:4 | -| SanitizationTests.java:95:60:95:90 | new URI(...) : URI | SanitizationTests.java:95:37:95:91 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:95:68:95:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:95:68:95:89 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:95:68:95:89 | toString(...) : String | SanitizationTests.java:95:60:95:90 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:95:68:95:89 | toString(...) : String | SanitizationTests.java:95:60:95:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:95:68:95:89 | toString(...) : String | SanitizationTests.java:95:60:95:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:95:68:95:89 | toString(...) : String | SanitizationTests.java:95:60:95:90 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:98:41:98:106 | append(...) : StringBuilder | SanitizationTests.java:100:68:100:78 | unsafeUri5c : StringBuilder | provenance | | -| SanitizationTests.java:98:77:98:105 | getParameter(...) : String | SanitizationTests.java:98:41:98:106 | append(...) : StringBuilder | provenance | Src:MaD:277 MaD:278+MaD:279 | -| SanitizationTests.java:100:37:100:91 | newBuilder(...) : Builder | SanitizationTests.java:100:37:100:99 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:100:37:100:99 | build(...) : HttpRequest | SanitizationTests.java:101:25:101:33 | unsafer5c | provenance | Sink:MaD:4 | -| SanitizationTests.java:100:60:100:90 | new URI(...) : URI | SanitizationTests.java:100:37:100:91 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:100:68:100:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:100:68:100:89 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:100:68:100:89 | toString(...) : String | SanitizationTests.java:100:60:100:90 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:100:68:100:89 | toString(...) : String | SanitizationTests.java:100:60:100:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:100:68:100:89 | toString(...) : String | SanitizationTests.java:100:60:100:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:100:68:100:89 | toString(...) : String | SanitizationTests.java:100:60:100:90 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:103:33:103:104 | format(...) : String | SanitizationTests.java:104:67:104:76 | unsafeUri6 : String | provenance | | -| SanitizationTests.java:103:33:103:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:103:33:103:104 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:103:73:103:103 | getParameter(...) : String | SanitizationTests.java:103:33:103:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:104:36:104:78 | newBuilder(...) : Builder | SanitizationTests.java:104:36:104:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:104:36:104:86 | build(...) : HttpRequest | SanitizationTests.java:105:25:105:32 | unsafer6 | provenance | Sink:MaD:4 | -| SanitizationTests.java:104:59:104:77 | new URI(...) : URI | SanitizationTests.java:104:36:104:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:104:67:104:76 | unsafeUri6 : String | SanitizationTests.java:104:59:104:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:104:67:104:76 | unsafeUri6 : String | SanitizationTests.java:104:59:104:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:104:67:104:76 | unsafeUri6 : String | SanitizationTests.java:104:59:104:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:104:67:104:76 | unsafeUri6 : String | SanitizationTests.java:104:59:104:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:107:33:107:110 | format(...) : String | SanitizationTests.java:108:67:108:76 | unsafeUri7 : String | provenance | | -| SanitizationTests.java:107:33:107:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:107:33:107:110 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:107:56:107:86 | getParameter(...) : String | SanitizationTests.java:107:33:107:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:108:36:108:78 | newBuilder(...) : Builder | SanitizationTests.java:108:36:108:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:108:36:108:86 | build(...) : HttpRequest | SanitizationTests.java:109:25:109:32 | unsafer7 | provenance | Sink:MaD:4 | -| SanitizationTests.java:108:59:108:77 | new URI(...) : URI | SanitizationTests.java:108:36:108:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:108:67:108:76 | unsafeUri7 : String | SanitizationTests.java:108:59:108:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:108:67:108:76 | unsafeUri7 : String | SanitizationTests.java:108:59:108:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:108:67:108:76 | unsafeUri7 : String | SanitizationTests.java:108:59:108:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:108:67:108:76 | unsafeUri7 : String | SanitizationTests.java:108:59:108:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:111:33:111:110 | format(...) : String | SanitizationTests.java:112:67:112:76 | unsafeUri8 : String | provenance | | -| SanitizationTests.java:111:33:111:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:111:33:111:110 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:111:55:111:85 | getParameter(...) : String | SanitizationTests.java:111:33:111:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:112:36:112:78 | newBuilder(...) : Builder | SanitizationTests.java:112:36:112:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:112:36:112:86 | build(...) : HttpRequest | SanitizationTests.java:113:25:113:32 | unsafer8 | provenance | Sink:MaD:4 | -| SanitizationTests.java:112:59:112:77 | new URI(...) : URI | SanitizationTests.java:112:36:112:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:112:67:112:76 | unsafeUri8 : String | SanitizationTests.java:112:59:112:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:112:67:112:76 | unsafeUri8 : String | SanitizationTests.java:112:59:112:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:112:67:112:76 | unsafeUri8 : String | SanitizationTests.java:112:59:112:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:112:67:112:76 | unsafeUri8 : String | SanitizationTests.java:112:59:112:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:115:33:115:63 | getParameter(...) : String | SanitizationTests.java:116:67:116:76 | unsafeUri9 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:116:36:116:78 | newBuilder(...) : Builder | SanitizationTests.java:116:36:116:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:116:36:116:86 | build(...) : HttpRequest | SanitizationTests.java:117:25:117:32 | unsafer9 | provenance | Sink:MaD:4 | -| SanitizationTests.java:116:59:116:77 | new URI(...) : URI | SanitizationTests.java:116:36:116:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:116:67:116:76 | unsafeUri9 : String | SanitizationTests.java:116:59:116:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:116:67:116:76 | unsafeUri9 : String | SanitizationTests.java:116:59:116:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:116:67:116:76 | unsafeUri9 : String | SanitizationTests.java:116:59:116:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:116:67:116:76 | unsafeUri9 : String | SanitizationTests.java:116:59:116:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:119:34:119:126 | format(...) : String | SanitizationTests.java:120:68:120:78 | unsafeUri10 : String | provenance | | -| SanitizationTests.java:119:34:119:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:119:34:119:126 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:119:94:119:125 | getParameter(...) : String | SanitizationTests.java:119:34:119:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:120:37:120:80 | newBuilder(...) : Builder | SanitizationTests.java:120:37:120:88 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:120:37:120:88 | build(...) : HttpRequest | SanitizationTests.java:121:25:121:33 | unsafer10 | provenance | Sink:MaD:4 | -| SanitizationTests.java:120:60:120:79 | new URI(...) : URI | SanitizationTests.java:120:37:120:80 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:120:68:120:78 | unsafeUri10 : String | SanitizationTests.java:120:60:120:79 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:120:68:120:78 | unsafeUri10 : String | SanitizationTests.java:120:60:120:79 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | -| SanitizationTests.java:120:68:120:78 | unsafeUri10 : String | SanitizationTests.java:120:60:120:79 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:120:68:120:78 | unsafeUri10 : String | SanitizationTests.java:120:60:120:79 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:21:23:21:58 | new URI(...) : URI | SanitizationTests.java:24:52:24:54 | uri | provenance | Sink:MaD:6 | +| SanitizationTests.java:21:23:21:58 | new URI(...) : URI | SanitizationTests.java:24:52:24:54 | uri : URI | provenance | | +| SanitizationTests.java:21:31:21:57 | getParameter(...) : String | SanitizationTests.java:21:23:21:58 | new URI(...) : URI | provenance | Src:MaD:277 Config | +| SanitizationTests.java:21:31:21:57 | getParameter(...) : String | SanitizationTests.java:21:23:21:58 | new URI(...) : URI | provenance | Src:MaD:277 MaD:285 | +| SanitizationTests.java:24:29:24:55 | newBuilder(...) : Builder | SanitizationTests.java:24:29:24:63 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:24:29:24:63 | build(...) : HttpRequest | SanitizationTests.java:25:25:25:25 | r | provenance | Sink:MaD:4 | +| SanitizationTests.java:24:52:24:54 | uri : URI | SanitizationTests.java:24:29:24:55 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:77:33:77:63 | getParameter(...) : String | SanitizationTests.java:78:67:78:76 | unsafeUri3 : String | provenance | Src:MaD:277 | +| SanitizationTests.java:78:36:78:78 | newBuilder(...) : Builder | SanitizationTests.java:78:36:78:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:78:36:78:86 | build(...) : HttpRequest | SanitizationTests.java:79:25:79:32 | unsafer3 | provenance | Sink:MaD:4 | +| SanitizationTests.java:78:59:78:77 | new URI(...) : URI | SanitizationTests.java:78:36:78:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:78:67:78:76 | unsafeUri3 : String | SanitizationTests.java:78:59:78:77 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:78:67:78:76 | unsafeUri3 : String | SanitizationTests.java:78:59:78:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:78:67:78:76 | unsafeUri3 : String | SanitizationTests.java:78:59:78:77 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:78:67:78:76 | unsafeUri3 : String | SanitizationTests.java:78:59:78:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:81:49:81:79 | getParameter(...) : String | SanitizationTests.java:82:67:82:76 | unsafeUri4 : String | provenance | Src:MaD:277 | +| SanitizationTests.java:82:36:82:78 | newBuilder(...) : Builder | SanitizationTests.java:82:36:82:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:82:36:82:86 | build(...) : HttpRequest | SanitizationTests.java:83:25:83:32 | unsafer4 | provenance | Sink:MaD:4 | +| SanitizationTests.java:82:59:82:77 | new URI(...) : URI | SanitizationTests.java:82:36:82:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:82:67:82:76 | unsafeUri4 : String | SanitizationTests.java:82:59:82:77 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:82:67:82:76 | unsafeUri4 : String | SanitizationTests.java:82:59:82:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:82:67:82:76 | unsafeUri4 : String | SanitizationTests.java:82:59:82:77 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:82:67:82:76 | unsafeUri4 : String | SanitizationTests.java:82:59:82:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:86:13:86:22 | unsafeUri5 [post update] : StringBuilder | SanitizationTests.java:87:67:87:76 | unsafeUri5 : StringBuilder | provenance | | +| SanitizationTests.java:86:31:86:61 | getParameter(...) : String | SanitizationTests.java:86:13:86:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:277 MaD:278 | +| SanitizationTests.java:87:36:87:89 | newBuilder(...) : Builder | SanitizationTests.java:87:36:87:97 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:87:36:87:97 | build(...) : HttpRequest | SanitizationTests.java:88:25:88:32 | unsafer5 | provenance | Sink:MaD:4 | +| SanitizationTests.java:87:59:87:88 | new URI(...) : URI | SanitizationTests.java:87:36:87:89 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:87:67:87:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:87:67:87:87 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:87:67:87:87 | toString(...) : String | SanitizationTests.java:87:59:87:88 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:87:67:87:87 | toString(...) : String | SanitizationTests.java:87:59:87:88 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:87:67:87:87 | toString(...) : String | SanitizationTests.java:87:59:87:88 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:87:67:87:87 | toString(...) : String | SanitizationTests.java:87:59:87:88 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:90:40:90:87 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:92:68:92:77 | unafeUri5a : StringBuilder | provenance | | +| SanitizationTests.java:90:58:90:86 | getParameter(...) : String | SanitizationTests.java:90:40:90:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | +| SanitizationTests.java:92:37:92:90 | newBuilder(...) : Builder | SanitizationTests.java:92:37:92:98 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:92:37:92:98 | build(...) : HttpRequest | SanitizationTests.java:93:25:93:33 | unsafer5a | provenance | Sink:MaD:4 | +| SanitizationTests.java:92:60:92:89 | new URI(...) : URI | SanitizationTests.java:92:37:92:90 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:92:68:92:77 | unafeUri5a : StringBuilder | SanitizationTests.java:92:68:92:88 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:92:68:92:88 | toString(...) : String | SanitizationTests.java:92:60:92:89 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:92:68:92:88 | toString(...) : String | SanitizationTests.java:92:60:92:89 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:92:68:92:88 | toString(...) : String | SanitizationTests.java:92:60:92:89 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:92:68:92:88 | toString(...) : String | SanitizationTests.java:92:60:92:89 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:95:41:95:105 | append(...) : StringBuilder | SanitizationTests.java:97:68:97:78 | unsafeUri5b : StringBuilder | provenance | | +| SanitizationTests.java:95:42:95:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:95:41:95:105 | append(...) : StringBuilder | provenance | MaD:279 | +| SanitizationTests.java:95:60:95:88 | getParameter(...) : String | SanitizationTests.java:95:42:95:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | +| SanitizationTests.java:97:37:97:91 | newBuilder(...) : Builder | SanitizationTests.java:97:37:97:99 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:97:37:97:99 | build(...) : HttpRequest | SanitizationTests.java:98:25:98:33 | unsafer5b | provenance | Sink:MaD:4 | +| SanitizationTests.java:97:60:97:90 | new URI(...) : URI | SanitizationTests.java:97:37:97:91 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:97:68:97:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:97:68:97:89 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:97:68:97:89 | toString(...) : String | SanitizationTests.java:97:60:97:90 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:97:68:97:89 | toString(...) : String | SanitizationTests.java:97:60:97:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:97:68:97:89 | toString(...) : String | SanitizationTests.java:97:60:97:90 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:97:68:97:89 | toString(...) : String | SanitizationTests.java:97:60:97:90 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:100:41:100:106 | append(...) : StringBuilder | SanitizationTests.java:102:68:102:78 | unsafeUri5c : StringBuilder | provenance | | +| SanitizationTests.java:100:77:100:105 | getParameter(...) : String | SanitizationTests.java:100:41:100:106 | append(...) : StringBuilder | provenance | Src:MaD:277 MaD:278+MaD:279 | +| SanitizationTests.java:102:37:102:91 | newBuilder(...) : Builder | SanitizationTests.java:102:37:102:99 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:102:37:102:99 | build(...) : HttpRequest | SanitizationTests.java:103:25:103:33 | unsafer5c | provenance | Sink:MaD:4 | +| SanitizationTests.java:102:60:102:90 | new URI(...) : URI | SanitizationTests.java:102:37:102:91 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:102:68:102:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:102:68:102:89 | toString(...) : String | provenance | MaD:280 | +| SanitizationTests.java:102:68:102:89 | toString(...) : String | SanitizationTests.java:102:60:102:90 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:102:68:102:89 | toString(...) : String | SanitizationTests.java:102:60:102:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:102:68:102:89 | toString(...) : String | SanitizationTests.java:102:60:102:90 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:102:68:102:89 | toString(...) : String | SanitizationTests.java:102:60:102:90 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:105:33:105:104 | format(...) : String | SanitizationTests.java:106:67:106:76 | unsafeUri6 : String | provenance | | +| SanitizationTests.java:105:33:105:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:105:33:105:104 | format(...) : String | provenance | MaD:281 | +| SanitizationTests.java:105:73:105:103 | getParameter(...) : String | SanitizationTests.java:105:33:105:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | +| SanitizationTests.java:106:36:106:78 | newBuilder(...) : Builder | SanitizationTests.java:106:36:106:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:106:36:106:86 | build(...) : HttpRequest | SanitizationTests.java:107:25:107:32 | unsafer6 | provenance | Sink:MaD:4 | +| SanitizationTests.java:106:59:106:77 | new URI(...) : URI | SanitizationTests.java:106:36:106:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:106:67:106:76 | unsafeUri6 : String | SanitizationTests.java:106:59:106:77 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:106:67:106:76 | unsafeUri6 : String | SanitizationTests.java:106:59:106:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:106:67:106:76 | unsafeUri6 : String | SanitizationTests.java:106:59:106:77 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:106:67:106:76 | unsafeUri6 : String | SanitizationTests.java:106:59:106:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:109:33:109:110 | format(...) : String | SanitizationTests.java:110:67:110:76 | unsafeUri7 : String | provenance | | +| SanitizationTests.java:109:33:109:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:109:33:109:110 | format(...) : String | provenance | MaD:281 | +| SanitizationTests.java:109:56:109:86 | getParameter(...) : String | SanitizationTests.java:109:33:109:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | +| SanitizationTests.java:110:36:110:78 | newBuilder(...) : Builder | SanitizationTests.java:110:36:110:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:110:36:110:86 | build(...) : HttpRequest | SanitizationTests.java:111:25:111:32 | unsafer7 | provenance | Sink:MaD:4 | +| SanitizationTests.java:110:59:110:77 | new URI(...) : URI | SanitizationTests.java:110:36:110:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:110:67:110:76 | unsafeUri7 : String | SanitizationTests.java:110:59:110:77 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:110:67:110:76 | unsafeUri7 : String | SanitizationTests.java:110:59:110:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:110:67:110:76 | unsafeUri7 : String | SanitizationTests.java:110:59:110:77 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:110:67:110:76 | unsafeUri7 : String | SanitizationTests.java:110:59:110:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:113:33:113:110 | format(...) : String | SanitizationTests.java:114:67:114:76 | unsafeUri8 : String | provenance | | +| SanitizationTests.java:113:33:113:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:113:33:113:110 | format(...) : String | provenance | MaD:281 | +| SanitizationTests.java:113:55:113:85 | getParameter(...) : String | SanitizationTests.java:113:33:113:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | +| SanitizationTests.java:114:36:114:78 | newBuilder(...) : Builder | SanitizationTests.java:114:36:114:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:114:36:114:86 | build(...) : HttpRequest | SanitizationTests.java:115:25:115:32 | unsafer8 | provenance | Sink:MaD:4 | +| SanitizationTests.java:114:59:114:77 | new URI(...) : URI | SanitizationTests.java:114:36:114:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:114:67:114:76 | unsafeUri8 : String | SanitizationTests.java:114:59:114:77 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:114:67:114:76 | unsafeUri8 : String | SanitizationTests.java:114:59:114:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:114:67:114:76 | unsafeUri8 : String | SanitizationTests.java:114:59:114:77 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:114:67:114:76 | unsafeUri8 : String | SanitizationTests.java:114:59:114:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:117:33:117:63 | getParameter(...) : String | SanitizationTests.java:118:67:118:76 | unsafeUri9 : String | provenance | Src:MaD:277 | +| SanitizationTests.java:118:36:118:78 | newBuilder(...) : Builder | SanitizationTests.java:118:36:118:86 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:118:36:118:86 | build(...) : HttpRequest | SanitizationTests.java:119:25:119:32 | unsafer9 | provenance | Sink:MaD:4 | +| SanitizationTests.java:118:59:118:77 | new URI(...) : URI | SanitizationTests.java:118:36:118:78 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:118:67:118:76 | unsafeUri9 : String | SanitizationTests.java:118:59:118:77 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:118:67:118:76 | unsafeUri9 : String | SanitizationTests.java:118:59:118:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:118:67:118:76 | unsafeUri9 : String | SanitizationTests.java:118:59:118:77 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:118:67:118:76 | unsafeUri9 : String | SanitizationTests.java:118:59:118:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:121:34:121:126 | format(...) : String | SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | provenance | | +| SanitizationTests.java:121:34:121:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:121:34:121:126 | format(...) : String | provenance | MaD:281 | +| SanitizationTests.java:121:94:121:125 | getParameter(...) : String | SanitizationTests.java:121:34:121:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | +| SanitizationTests.java:122:37:122:80 | newBuilder(...) : Builder | SanitizationTests.java:122:37:122:88 | build(...) : HttpRequest | provenance | MaD:283 | +| SanitizationTests.java:122:37:122:88 | build(...) : HttpRequest | SanitizationTests.java:123:25:123:33 | unsafer10 | provenance | Sink:MaD:4 | +| SanitizationTests.java:122:60:122:79 | new URI(...) : URI | SanitizationTests.java:122:37:122:80 | newBuilder(...) : Builder | provenance | MaD:284 | +| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | SanitizationTests.java:122:60:122:79 | new URI(...) | provenance | Config Sink:MaD:6 | +| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | SanitizationTests.java:122:60:122:79 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | SanitizationTests.java:122:60:122:79 | new URI(...) : URI | provenance | Config | +| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | SanitizationTests.java:122:60:122:79 | new URI(...) : URI | provenance | MaD:285 | | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:277 Sink:MaD:264 | | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:35:33:48 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:262 | | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:34:34:47 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:263 | @@ -1580,107 +1580,107 @@ nodes | ReactiveWebClientSSRF.java:16:52:16:54 | url | semmle.label | url | | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ReactiveWebClientSSRF.java:35:30:35:32 | url | semmle.label | url | -| SanitizationTests.java:19:23:19:58 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:19:31:19:57 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:22:29:22:55 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:22:29:22:63 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:22:52:22:54 | uri | semmle.label | uri | -| SanitizationTests.java:22:52:22:54 | uri : URI | semmle.label | uri : URI | -| SanitizationTests.java:23:25:23:25 | r | semmle.label | r | -| SanitizationTests.java:75:33:75:63 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:76:36:76:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:76:36:76:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:76:59:76:77 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:76:59:76:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:76:67:76:76 | unsafeUri3 : String | semmle.label | unsafeUri3 : String | -| SanitizationTests.java:77:25:77:32 | unsafer3 | semmle.label | unsafer3 | -| SanitizationTests.java:79:49:79:79 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:80:36:80:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:80:36:80:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:80:59:80:77 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:80:59:80:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:80:67:80:76 | unsafeUri4 : String | semmle.label | unsafeUri4 : String | -| SanitizationTests.java:81:25:81:32 | unsafer4 | semmle.label | unsafer4 | -| SanitizationTests.java:84:13:84:22 | unsafeUri5 [post update] : StringBuilder | semmle.label | unsafeUri5 [post update] : StringBuilder | -| SanitizationTests.java:84:31:84:61 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:85:36:85:89 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:85:36:85:97 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:85:59:85:88 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:85:59:85:88 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:85:67:85:76 | unsafeUri5 : StringBuilder | semmle.label | unsafeUri5 : StringBuilder | -| SanitizationTests.java:85:67:85:87 | toString(...) : String | semmle.label | toString(...) : String | -| SanitizationTests.java:86:25:86:32 | unsafer5 | semmle.label | unsafer5 | -| SanitizationTests.java:88:40:88:87 | new StringBuilder(...) : StringBuilder | semmle.label | new StringBuilder(...) : StringBuilder | -| SanitizationTests.java:88:58:88:86 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:90:37:90:90 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:90:37:90:98 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:90:60:90:89 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:90:60:90:89 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:90:68:90:77 | unafeUri5a : StringBuilder | semmle.label | unafeUri5a : StringBuilder | -| SanitizationTests.java:90:68:90:88 | toString(...) : String | semmle.label | toString(...) : String | -| SanitizationTests.java:91:25:91:33 | unsafer5a | semmle.label | unsafer5a | -| SanitizationTests.java:93:41:93:105 | append(...) : StringBuilder | semmle.label | append(...) : StringBuilder | -| SanitizationTests.java:93:42:93:89 | new StringBuilder(...) : StringBuilder | semmle.label | new StringBuilder(...) : StringBuilder | -| SanitizationTests.java:93:60:93:88 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:95:37:95:91 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:95:37:95:99 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:95:60:95:90 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:95:60:95:90 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:95:68:95:78 | unsafeUri5b : StringBuilder | semmle.label | unsafeUri5b : StringBuilder | -| SanitizationTests.java:95:68:95:89 | toString(...) : String | semmle.label | toString(...) : String | -| SanitizationTests.java:96:25:96:33 | unsafer5b | semmle.label | unsafer5b | -| SanitizationTests.java:98:41:98:106 | append(...) : StringBuilder | semmle.label | append(...) : StringBuilder | -| SanitizationTests.java:98:77:98:105 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:100:37:100:91 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:100:37:100:99 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:100:60:100:90 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:100:60:100:90 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:100:68:100:78 | unsafeUri5c : StringBuilder | semmle.label | unsafeUri5c : StringBuilder | -| SanitizationTests.java:100:68:100:89 | toString(...) : String | semmle.label | toString(...) : String | -| SanitizationTests.java:101:25:101:33 | unsafer5c | semmle.label | unsafer5c | -| SanitizationTests.java:103:33:103:104 | format(...) : String | semmle.label | format(...) : String | -| SanitizationTests.java:103:33:103:104 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | -| SanitizationTests.java:103:73:103:103 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:104:36:104:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:104:36:104:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:104:59:104:77 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:104:59:104:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:104:67:104:76 | unsafeUri6 : String | semmle.label | unsafeUri6 : String | -| SanitizationTests.java:105:25:105:32 | unsafer6 | semmle.label | unsafer6 | -| SanitizationTests.java:107:33:107:110 | format(...) : String | semmle.label | format(...) : String | -| SanitizationTests.java:107:33:107:110 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | -| SanitizationTests.java:107:56:107:86 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:108:36:108:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:108:36:108:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:108:59:108:77 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:108:59:108:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:108:67:108:76 | unsafeUri7 : String | semmle.label | unsafeUri7 : String | -| SanitizationTests.java:109:25:109:32 | unsafer7 | semmle.label | unsafer7 | -| SanitizationTests.java:111:33:111:110 | format(...) : String | semmle.label | format(...) : String | -| SanitizationTests.java:111:33:111:110 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | -| SanitizationTests.java:111:55:111:85 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:112:36:112:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:112:36:112:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:112:59:112:77 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:112:59:112:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:112:67:112:76 | unsafeUri8 : String | semmle.label | unsafeUri8 : String | -| SanitizationTests.java:113:25:113:32 | unsafer8 | semmle.label | unsafer8 | -| SanitizationTests.java:115:33:115:63 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:116:36:116:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:116:36:116:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:116:59:116:77 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:116:59:116:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:116:67:116:76 | unsafeUri9 : String | semmle.label | unsafeUri9 : String | -| SanitizationTests.java:117:25:117:32 | unsafer9 | semmle.label | unsafer9 | -| SanitizationTests.java:119:34:119:126 | format(...) : String | semmle.label | format(...) : String | -| SanitizationTests.java:119:34:119:126 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | -| SanitizationTests.java:119:94:119:125 | getParameter(...) : String | semmle.label | getParameter(...) : String | -| SanitizationTests.java:120:37:120:80 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | -| SanitizationTests.java:120:37:120:88 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | -| SanitizationTests.java:120:60:120:79 | new URI(...) | semmle.label | new URI(...) | -| SanitizationTests.java:120:60:120:79 | new URI(...) : URI | semmle.label | new URI(...) : URI | -| SanitizationTests.java:120:68:120:78 | unsafeUri10 : String | semmle.label | unsafeUri10 : String | -| SanitizationTests.java:121:25:121:33 | unsafer10 | semmle.label | unsafer10 | +| SanitizationTests.java:21:23:21:58 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:21:31:21:57 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:24:29:24:55 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:24:29:24:63 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:24:52:24:54 | uri | semmle.label | uri | +| SanitizationTests.java:24:52:24:54 | uri : URI | semmle.label | uri : URI | +| SanitizationTests.java:25:25:25:25 | r | semmle.label | r | +| SanitizationTests.java:77:33:77:63 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:78:36:78:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:78:36:78:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:78:59:78:77 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:78:59:78:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:78:67:78:76 | unsafeUri3 : String | semmle.label | unsafeUri3 : String | +| SanitizationTests.java:79:25:79:32 | unsafer3 | semmle.label | unsafer3 | +| SanitizationTests.java:81:49:81:79 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:82:36:82:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:82:36:82:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:82:59:82:77 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:82:59:82:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:82:67:82:76 | unsafeUri4 : String | semmle.label | unsafeUri4 : String | +| SanitizationTests.java:83:25:83:32 | unsafer4 | semmle.label | unsafer4 | +| SanitizationTests.java:86:13:86:22 | unsafeUri5 [post update] : StringBuilder | semmle.label | unsafeUri5 [post update] : StringBuilder | +| SanitizationTests.java:86:31:86:61 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:87:36:87:89 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:87:36:87:97 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:87:59:87:88 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:87:59:87:88 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:87:67:87:76 | unsafeUri5 : StringBuilder | semmle.label | unsafeUri5 : StringBuilder | +| SanitizationTests.java:87:67:87:87 | toString(...) : String | semmle.label | toString(...) : String | +| SanitizationTests.java:88:25:88:32 | unsafer5 | semmle.label | unsafer5 | +| SanitizationTests.java:90:40:90:87 | new StringBuilder(...) : StringBuilder | semmle.label | new StringBuilder(...) : StringBuilder | +| SanitizationTests.java:90:58:90:86 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:92:37:92:90 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:92:37:92:98 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:92:60:92:89 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:92:60:92:89 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:92:68:92:77 | unafeUri5a : StringBuilder | semmle.label | unafeUri5a : StringBuilder | +| SanitizationTests.java:92:68:92:88 | toString(...) : String | semmle.label | toString(...) : String | +| SanitizationTests.java:93:25:93:33 | unsafer5a | semmle.label | unsafer5a | +| SanitizationTests.java:95:41:95:105 | append(...) : StringBuilder | semmle.label | append(...) : StringBuilder | +| SanitizationTests.java:95:42:95:89 | new StringBuilder(...) : StringBuilder | semmle.label | new StringBuilder(...) : StringBuilder | +| SanitizationTests.java:95:60:95:88 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:97:37:97:91 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:97:37:97:99 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:97:60:97:90 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:97:60:97:90 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:97:68:97:78 | unsafeUri5b : StringBuilder | semmle.label | unsafeUri5b : StringBuilder | +| SanitizationTests.java:97:68:97:89 | toString(...) : String | semmle.label | toString(...) : String | +| SanitizationTests.java:98:25:98:33 | unsafer5b | semmle.label | unsafer5b | +| SanitizationTests.java:100:41:100:106 | append(...) : StringBuilder | semmle.label | append(...) : StringBuilder | +| SanitizationTests.java:100:77:100:105 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:102:37:102:91 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:102:37:102:99 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:102:60:102:90 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:102:60:102:90 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:102:68:102:78 | unsafeUri5c : StringBuilder | semmle.label | unsafeUri5c : StringBuilder | +| SanitizationTests.java:102:68:102:89 | toString(...) : String | semmle.label | toString(...) : String | +| SanitizationTests.java:103:25:103:33 | unsafer5c | semmle.label | unsafer5c | +| SanitizationTests.java:105:33:105:104 | format(...) : String | semmle.label | format(...) : String | +| SanitizationTests.java:105:33:105:104 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | +| SanitizationTests.java:105:73:105:103 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:106:36:106:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:106:36:106:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:106:59:106:77 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:106:59:106:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:106:67:106:76 | unsafeUri6 : String | semmle.label | unsafeUri6 : String | +| SanitizationTests.java:107:25:107:32 | unsafer6 | semmle.label | unsafer6 | +| SanitizationTests.java:109:33:109:110 | format(...) : String | semmle.label | format(...) : String | +| SanitizationTests.java:109:33:109:110 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | +| SanitizationTests.java:109:56:109:86 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:110:36:110:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:110:36:110:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:110:59:110:77 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:110:59:110:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:110:67:110:76 | unsafeUri7 : String | semmle.label | unsafeUri7 : String | +| SanitizationTests.java:111:25:111:32 | unsafer7 | semmle.label | unsafer7 | +| SanitizationTests.java:113:33:113:110 | format(...) : String | semmle.label | format(...) : String | +| SanitizationTests.java:113:33:113:110 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | +| SanitizationTests.java:113:55:113:85 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:114:36:114:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:114:36:114:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:114:59:114:77 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:114:59:114:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:114:67:114:76 | unsafeUri8 : String | semmle.label | unsafeUri8 : String | +| SanitizationTests.java:115:25:115:32 | unsafer8 | semmle.label | unsafer8 | +| SanitizationTests.java:117:33:117:63 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:118:36:118:78 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:118:36:118:86 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:118:59:118:77 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:118:59:118:77 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:118:67:118:76 | unsafeUri9 : String | semmle.label | unsafeUri9 : String | +| SanitizationTests.java:119:25:119:32 | unsafer9 | semmle.label | unsafer9 | +| SanitizationTests.java:121:34:121:126 | format(...) : String | semmle.label | format(...) : String | +| SanitizationTests.java:121:34:121:126 | new ..[] { .. } : Object[] [[]] : String | semmle.label | new ..[] { .. } : Object[] [[]] : String | +| SanitizationTests.java:121:94:121:125 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| SanitizationTests.java:122:37:122:80 | newBuilder(...) : Builder | semmle.label | newBuilder(...) : Builder | +| SanitizationTests.java:122:37:122:88 | build(...) : HttpRequest | semmle.label | build(...) : HttpRequest | +| SanitizationTests.java:122:60:122:79 | new URI(...) | semmle.label | new URI(...) | +| SanitizationTests.java:122:60:122:79 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| SanitizationTests.java:122:68:122:78 | unsafeUri10 : String | semmle.label | unsafeUri10 : String | +| SanitizationTests.java:123:25:123:33 | unsafer10 | semmle.label | unsafer10 | | SpringSSRF.java:28:33:28:60 | getParameter(...) : String | semmle.label | getParameter(...) : String | | SpringSSRF.java:32:39:32:59 | ... + ... | semmle.label | ... + ... | | SpringSSRF.java:33:35:33:48 | fooResourceUrl | semmle.label | fooResourceUrl | diff --git a/java/ql/test/query-tests/security/CWE-918/SanitizationTests.java b/java/ql/test/query-tests/security/CWE-918/SanitizationTests.java index f32de324a1d..4da70e8dd75 100644 --- a/java/ql/test/query-tests/security/CWE-918/SanitizationTests.java +++ b/java/ql/test/query-tests/security/CWE-918/SanitizationTests.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; +import java.util.regex.Pattern; +import java.util.regex.Matcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -126,11 +128,25 @@ public class SanitizationTests extends HttpServlet { HttpRequest r10 = HttpRequest.newBuilder(new URI(param10)).build(); client.send(r10, null); } - + String param11 = request.getParameter("uri11"); validate(param11); HttpRequest r11 = HttpRequest.newBuilder(new URI(param11)).build(); client.send(r11, null); + + String param12 = request.getParameter("uri12"); + if (Pattern.matches("[a-zA-Z0-9_-]+", param12)) { + HttpRequest r12 = HttpRequest.newBuilder(new URI(param12)).build(); + client.send(r12, null); + } + + Pattern pattern = Pattern.compile("[a-zA-Z0-9_-]+"); + String param13 = request.getParameter("uri13"); + Matcher matcher = pattern.matcher(param13); + if (matcher.matches()) { + HttpRequest r13 = HttpRequest.newBuilder(new URI(param13)).build(); + client.send(r13, null); + } } catch (Exception e) { // TODO: handle exception } diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 63f49e14891..b0bc8964559 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -286,6 +286,7 @@ public class Parser { raise(pos, msg, false); } + @SuppressWarnings("ReturnValueIgnored") protected void raise(Position loc, String msg, boolean recoverable) { msg += " (" + loc.getLine() + ":" + loc.getColumn() + ")"; SyntaxError err = new SyntaxError(msg, loc, this.pos); @@ -3114,7 +3115,7 @@ public class Parser { } first = false; } - if (oldStrict == Boolean.FALSE) this.setStrict(false); + if (Boolean.FALSE.equals(oldStrict)) this.setStrict(false); return this.finishNode(new BlockStatement(new SourceLocation(startLoc), body)); } diff --git a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java index cb2dad0f978..7475994c27e 100644 --- a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java @@ -141,6 +141,7 @@ public class FlowParser extends ESNextParser { options.onRecoverableError(this.onRecoverableError); } + @SuppressWarnings("ReturnValueIgnored") private void commit() { // commit buffered tokens options.onToken(this.onToken); diff --git a/javascript/extractor/src/com/semmle/js/ast/AFunctionExpression.java b/javascript/extractor/src/com/semmle/js/ast/AFunctionExpression.java index e097be125cf..1546d6f3b1f 100644 --- a/javascript/extractor/src/com/semmle/js/ast/AFunctionExpression.java +++ b/javascript/extractor/src/com/semmle/js/ast/AFunctionExpression.java @@ -35,8 +35,8 @@ public abstract class AFunctionExpression extends Expression implements IFunctio id, params, body, - generator == Boolean.TRUE, - async == Boolean.TRUE, + Boolean.TRUE.equals(generator), + Boolean.TRUE.equals(async), typeParameters, parameterTypes, parameterDecorators, diff --git a/javascript/extractor/src/com/semmle/js/ast/ComprehensionBlock.java b/javascript/extractor/src/com/semmle/js/ast/ComprehensionBlock.java index 4c767c5fbed..4fcf9421a74 100644 --- a/javascript/extractor/src/com/semmle/js/ast/ComprehensionBlock.java +++ b/javascript/extractor/src/com/semmle/js/ast/ComprehensionBlock.java @@ -10,7 +10,7 @@ public class ComprehensionBlock extends Expression { super("ComprehensionBlock", loc); this.left = left; this.right = right; - this.of = of != Boolean.FALSE; + this.of = !Boolean.FALSE.equals(of); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/ComprehensionExpression.java b/javascript/extractor/src/com/semmle/js/ast/ComprehensionExpression.java index b95d9ead5ff..3aa9feb1b31 100644 --- a/javascript/extractor/src/com/semmle/js/ast/ComprehensionExpression.java +++ b/javascript/extractor/src/com/semmle/js/ast/ComprehensionExpression.java @@ -19,7 +19,7 @@ public class ComprehensionExpression extends Expression { this.body = body; this.blocks = blocks; this.filter = filter; - this.generator = generator == Boolean.TRUE; + this.generator = Boolean.TRUE.equals(generator); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/ForInStatement.java b/javascript/extractor/src/com/semmle/js/ast/ForInStatement.java index 579a6198fe1..cffba4781a9 100644 --- a/javascript/extractor/src/com/semmle/js/ast/ForInStatement.java +++ b/javascript/extractor/src/com/semmle/js/ast/ForInStatement.java @@ -16,7 +16,7 @@ public class ForInStatement extends EnhancedForStatement { public ForInStatement( SourceLocation loc, Node left, Expression right, Statement body, Boolean each) { super("ForInStatement", loc, left, right, body); - this.each = each == Boolean.TRUE; + this.each = Boolean.TRUE.equals(each); } public boolean isEach() { diff --git a/javascript/extractor/src/com/semmle/js/ast/InvokeExpression.java b/javascript/extractor/src/com/semmle/js/ast/InvokeExpression.java index 534f9ffb212..5d59be92f1b 100644 --- a/javascript/extractor/src/com/semmle/js/ast/InvokeExpression.java +++ b/javascript/extractor/src/com/semmle/js/ast/InvokeExpression.java @@ -27,8 +27,8 @@ public abstract class InvokeExpression extends Expression implements INodeWithSy this.callee = callee; this.typeArguments = typeArguments; this.arguments = arguments; - this.optional = optional == Boolean.TRUE; - this.onOptionalChain = onOptionalChain == Boolean.TRUE; + this.optional = Boolean.TRUE.equals(optional); + this.onOptionalChain = Boolean.TRUE.equals(onOptionalChain); } /** The callee expression of this invocation. */ diff --git a/javascript/extractor/src/com/semmle/js/ast/Literal.java b/javascript/extractor/src/com/semmle/js/ast/Literal.java index 3c53798b851..f513adc14b5 100644 --- a/javascript/extractor/src/com/semmle/js/ast/Literal.java +++ b/javascript/extractor/src/com/semmle/js/ast/Literal.java @@ -76,7 +76,7 @@ public class Literal extends Expression implements ITypeExpression { if (isRegExp()) return false; return value == null || value instanceof Number && ((Number) value).intValue() == 0 - || value == Boolean.FALSE + || Boolean.FALSE.equals(value) || value instanceof String && ((String) value).isEmpty(); } diff --git a/javascript/extractor/src/com/semmle/js/ast/MemberExpression.java b/javascript/extractor/src/com/semmle/js/ast/MemberExpression.java index b540decd48e..342fe4c1fd2 100644 --- a/javascript/extractor/src/com/semmle/js/ast/MemberExpression.java +++ b/javascript/extractor/src/com/semmle/js/ast/MemberExpression.java @@ -22,9 +22,9 @@ public class MemberExpression extends Expression super("MemberExpression", loc); this.object = object; this.property = property; - this.computed = computed == Boolean.TRUE; - this.optional = optional == Boolean.TRUE; - this.onOptionalChain = onOptionalChain == Boolean.TRUE; + this.computed = Boolean.TRUE.equals(computed); + this.optional = Boolean.TRUE.equals(optional); + this.onOptionalChain = Boolean.TRUE.equals(onOptionalChain); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/Property.java b/javascript/extractor/src/com/semmle/js/ast/Property.java index b4da797e76d..7f986161fde 100644 --- a/javascript/extractor/src/com/semmle/js/ast/Property.java +++ b/javascript/extractor/src/com/semmle/js/ast/Property.java @@ -59,8 +59,8 @@ public class Property extends Node { } this.rawValue = rawValue; this.kind = Kind.valueOf(StringUtil.uc(kind)); - this.computed = computed == Boolean.TRUE; - this.method = method == Boolean.TRUE; + this.computed = Boolean.TRUE.equals(computed); + this.method = Boolean.TRUE.equals(method); this.decorators = new ArrayList(); } diff --git a/javascript/extractor/src/com/semmle/js/ast/TemplateElement.java b/javascript/extractor/src/com/semmle/js/ast/TemplateElement.java index afebf51e7ee..3fb8556e273 100644 --- a/javascript/extractor/src/com/semmle/js/ast/TemplateElement.java +++ b/javascript/extractor/src/com/semmle/js/ast/TemplateElement.java @@ -10,7 +10,7 @@ public class TemplateElement extends Expression { super("TemplateElement", loc); this.cooked = cooked; this.raw = raw; - this.tail = tail == Boolean.TRUE; + this.tail = Boolean.TRUE.equals(tail); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/UnaryExpression.java b/javascript/extractor/src/com/semmle/js/ast/UnaryExpression.java index c0a77e3bc77..32f43bad123 100644 --- a/javascript/extractor/src/com/semmle/js/ast/UnaryExpression.java +++ b/javascript/extractor/src/com/semmle/js/ast/UnaryExpression.java @@ -14,7 +14,7 @@ public class UnaryExpression extends Expression { super("UnaryExpression", loc); this.operator = operator; this.argument = argument; - this.prefix = prefix == Boolean.TRUE; + this.prefix = Boolean.TRUE.equals(prefix); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/UpdateExpression.java b/javascript/extractor/src/com/semmle/js/ast/UpdateExpression.java index 59a3880a3ee..1c69a1dd150 100644 --- a/javascript/extractor/src/com/semmle/js/ast/UpdateExpression.java +++ b/javascript/extractor/src/com/semmle/js/ast/UpdateExpression.java @@ -11,7 +11,7 @@ public class UpdateExpression extends Expression { super("UpdateExpression", loc); this.operator = operator; this.argument = argument; - this.prefix = prefix == Boolean.TRUE; + this.prefix = Boolean.TRUE.equals(prefix); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/YieldExpression.java b/javascript/extractor/src/com/semmle/js/ast/YieldExpression.java index c8c681d2493..abd5fd13d11 100644 --- a/javascript/extractor/src/com/semmle/js/ast/YieldExpression.java +++ b/javascript/extractor/src/com/semmle/js/ast/YieldExpression.java @@ -8,7 +8,7 @@ public class YieldExpression extends Expression { public YieldExpression(SourceLocation loc, Expression argument, Boolean delegating) { super("YieldExpression", loc); this.argument = argument; - this.delegating = delegating == Boolean.TRUE; + this.delegating = Boolean.TRUE.equals(delegating); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/jsdoc/FunctionType.java b/javascript/extractor/src/com/semmle/js/ast/jsdoc/FunctionType.java index d9298243be0..c344f943720 100644 --- a/javascript/extractor/src/com/semmle/js/ast/jsdoc/FunctionType.java +++ b/javascript/extractor/src/com/semmle/js/ast/jsdoc/FunctionType.java @@ -18,7 +18,7 @@ public class FunctionType extends JSDocTypeExpression { JSDocTypeExpression result) { super(loc, "FunctionType"); this._this = _this; - this._new = _new == Boolean.TRUE; + this._new = Boolean.TRUE.equals(_new); this.params = params; this.result = result; } diff --git a/javascript/extractor/src/com/semmle/js/ast/jsdoc/UnaryTypeConstructor.java b/javascript/extractor/src/com/semmle/js/ast/jsdoc/UnaryTypeConstructor.java index dcded09e66d..1489f924251 100644 --- a/javascript/extractor/src/com/semmle/js/ast/jsdoc/UnaryTypeConstructor.java +++ b/javascript/extractor/src/com/semmle/js/ast/jsdoc/UnaryTypeConstructor.java @@ -19,7 +19,7 @@ public abstract class UnaryTypeConstructor extends JSDocTypeExpression { String operator) { super(loc, type); this.expression = expression; - this.prefix = prefix == Boolean.TRUE; + this.prefix = Boolean.TRUE.equals(prefix); this.operator = operator; } diff --git a/javascript/extractor/src/com/semmle/js/ast/regexp/CharacterClass.java b/javascript/extractor/src/com/semmle/js/ast/regexp/CharacterClass.java index 6a46830d851..a0d5812efe6 100644 --- a/javascript/extractor/src/com/semmle/js/ast/regexp/CharacterClass.java +++ b/javascript/extractor/src/com/semmle/js/ast/regexp/CharacterClass.java @@ -11,7 +11,7 @@ public class CharacterClass extends RegExpTerm { public CharacterClass(SourceLocation loc, List elements, Boolean inverted) { super(loc, "CharacterClass"); this.elements = elements; - this.inverted = inverted == Boolean.TRUE; + this.inverted = Boolean.TRUE.equals(inverted); } @Override diff --git a/javascript/extractor/src/com/semmle/js/ast/regexp/Quantifier.java b/javascript/extractor/src/com/semmle/js/ast/regexp/Quantifier.java index 54fd40168d2..18058c73fb1 100644 --- a/javascript/extractor/src/com/semmle/js/ast/regexp/Quantifier.java +++ b/javascript/extractor/src/com/semmle/js/ast/regexp/Quantifier.java @@ -10,7 +10,7 @@ public abstract class Quantifier extends RegExpTerm { public Quantifier(SourceLocation loc, String type, RegExpTerm operand, Boolean greedy) { super(loc, type); this.operand = operand; - this.greedy = greedy == Boolean.TRUE; + this.greedy = Boolean.TRUE.equals(greedy); } /** The quantified term. */ diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 9f27fdae99c..b36b8f521a0 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,21 @@ +## 2.6.18 + +No user-facing changes. + +## 2.6.17 + +No user-facing changes. + +## 2.6.16 + +### Minor Analysis Improvements + +- JavaScript `DataFlow::globalVarRef` now recognizes `document.defaultView` as an alias of `window`, allowing flows such as `document.defaultView.history.pushState(...)` to be modeled and found by queries relying on `globalVarRef("history")`. + +## 2.6.15 + +No user-facing changes. + ## 2.6.14 No user-facing changes. diff --git a/javascript/ql/lib/Expressions/ExprHasNoEffect.qll b/javascript/ql/lib/Expressions/ExprHasNoEffect.qll index 9813d9b32ed..86f9d4133d8 100644 --- a/javascript/ql/lib/Expressions/ExprHasNoEffect.qll +++ b/javascript/ql/lib/Expressions/ExprHasNoEffect.qll @@ -1,6 +1,8 @@ /** * Provides classes and predicates for the 'js/useless-expression' query. */ +overlay[local?] +module; import javascript import DOMProperties @@ -60,6 +62,7 @@ predicate isDeclaration(Expr e) { /** * Holds if there exists a getter for a property called `name` anywhere in the program. */ +overlay[global] predicate isGetterProperty(string name) { // there is a call of the form `Object.defineProperty(..., name, descriptor)` ... exists(CallToObjectDefineProperty defProp | name = defProp.getPropertyName() | @@ -85,6 +88,7 @@ predicate isGetterProperty(string name) { /** * A property access that may invoke a getter. */ +overlay[global] class GetterPropertyAccess extends PropAccess { override predicate isImpure() { isGetterProperty(this.getPropertyName()) } } @@ -123,6 +127,7 @@ predicate isReceiverSuppressingCall(CallExpr c, Expr dummy, PropAccess callee) { * even if they do, the call itself is useless and should be flagged by this * query. */ +overlay[global] predicate noSideEffects(Expr e) { e.isPure() or @@ -148,6 +153,7 @@ predicate isCompoundExpression(Expr e) { /** * Holds if the expression `e` should be reported as having no effect. */ +overlay[global] predicate hasNoEffect(Expr e) { noSideEffects(e) and inVoidContext(e) and diff --git a/javascript/ql/lib/LanguageFeatures/UnusedIndexVariable.qll b/javascript/ql/lib/LanguageFeatures/UnusedIndexVariable.qll index ed53158d51c..c9905d98fcc 100644 --- a/javascript/ql/lib/LanguageFeatures/UnusedIndexVariable.qll +++ b/javascript/ql/lib/LanguageFeatures/UnusedIndexVariable.qll @@ -1,6 +1,8 @@ /** * Provides a predicate for identifying unused index variables in loops. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/change-notes/2025-10-21-react-precallgraph-step.md b/javascript/ql/lib/change-notes/2025-10-21-react-precallgraph-step.md new file mode 100644 index 00000000000..e28a900e8d9 --- /dev/null +++ b/javascript/ql/lib/change-notes/2025-10-21-react-precallgraph-step.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Added `PreCallGraphStep` flow model for React's `useRef` hook. +* Added a `DomValueSource` that uses the `current` property off the object returned by React's `useRef` hook. \ No newline at end of file diff --git a/javascript/ql/lib/change-notes/released/2.6.15.md b/javascript/ql/lib/change-notes/released/2.6.15.md new file mode 100644 index 00000000000..f69028c6891 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.6.15.md @@ -0,0 +1,3 @@ +## 2.6.15 + +No user-facing changes. diff --git a/javascript/ql/lib/change-notes/released/2.6.16.md b/javascript/ql/lib/change-notes/released/2.6.16.md new file mode 100644 index 00000000000..61f372759bf --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.6.16.md @@ -0,0 +1,5 @@ +## 2.6.16 + +### Minor Analysis Improvements + +- JavaScript `DataFlow::globalVarRef` now recognizes `document.defaultView` as an alias of `window`, allowing flows such as `document.defaultView.history.pushState(...)` to be modeled and found by queries relying on `globalVarRef("history")`. diff --git a/javascript/ql/lib/change-notes/released/2.6.17.md b/javascript/ql/lib/change-notes/released/2.6.17.md new file mode 100644 index 00000000000..b421ccb0379 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.6.17.md @@ -0,0 +1,3 @@ +## 2.6.17 + +No user-facing changes. diff --git a/javascript/ql/lib/change-notes/released/2.6.18.md b/javascript/ql/lib/change-notes/released/2.6.18.md new file mode 100644 index 00000000000..d04860dce6b --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.6.18.md @@ -0,0 +1,3 @@ +## 2.6.18 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 022aeff4e02..ce85aee60d1 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.6.14 +lastReleaseVersion: 2.6.18 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index bd19febdfaa..88072819279 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.6.15-dev +version: 2.6.19-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/lib/semmle/javascript/AMD.qll b/javascript/ql/lib/semmle/javascript/AMD.qll index 4828aff27cc..479be828f92 100644 --- a/javascript/ql/lib/semmle/javascript/AMD.qll +++ b/javascript/ql/lib/semmle/javascript/AMD.qll @@ -2,6 +2,8 @@ * Provides classes for working with * [Asynchronous Module Definitions](https://github.com/amdjs/amdjs-api/wiki/AMD). */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.CachedStages @@ -62,9 +64,11 @@ class AmdModuleDefinition extends CallExpr instanceof AmdModuleDefinition::Range } /** DEPRECATED. Use `getDependencyExpr` instead. */ + overlay[global] deprecated PathExpr getDependency(int i) { result = this.getDependencyExpr(i) } /** DEPRECATED. Use `getADependencyExpr` instead. */ + overlay[global] deprecated PathExpr getADependency() { result = this.getADependencyExpr() } /** Gets the `i`th dependency of this module definition. */ @@ -194,16 +198,19 @@ class AmdModuleDefinition extends CallExpr instanceof AmdModuleDefinition::Range * Gets an abstract value representing one or more values that may flow * into this module's `module.exports` property. */ + overlay[global] DefiniteAbstractValue getAModuleExportsValue() { result = [this.getAnImplicitExportsValue(), this.getAnExplicitExportsValue()] } + overlay[global] pragma[noinline, nomagic] private AbstractValue getAnImplicitExportsValue() { // implicit exports: anything that is returned from the factory function result = this.getModuleExpr().analyze().getAValue() } + overlay[global] pragma[noinline] private AbstractValue getAnExplicitExportsValue() { // explicit exports: anything assigned to `module.exports` @@ -227,6 +234,7 @@ class AmdModuleDefinition extends CallExpr instanceof AmdModuleDefinition::Range private predicate isPseudoDependency(string s) { s = ["exports", "require", "module"] } /** An AMD dependency, considered as a path expression. */ +overlay[global] private class AmdDependencyPath extends PathExprCandidate { AmdDependencyPath() { exists(AmdModuleDefinition amd | @@ -239,6 +247,7 @@ private class AmdDependencyPath extends PathExprCandidate { } /** A constant path element appearing in an AMD dependency expression. */ +overlay[global] deprecated private class ConstantAmdDependencyPathElement extends PathExpr, ConstantString { ConstantAmdDependencyPathElement() { this = any(AmdDependencyPath amd).getAPart() } @@ -281,6 +290,7 @@ private class AmdDependencyImport extends Import { * Specifically, we look for files whose absolute path ends with the imported path, possibly * adding well-known JavaScript file extensions like `.js`. */ + overlay[global] private File guessTarget() { exists(FilePath imported, string abspath, string dirname, string basename | this.targetCandidate(result, abspath, imported, dirname, basename) @@ -303,6 +313,7 @@ private class AmdDependencyImport extends Import { * Additionally, `abspath` is bound to the absolute path of `f`, `imported` to the imported path, and * `dirname` and `basename` to the dirname and basename (respectively) of `imported`. */ + overlay[global] private predicate targetCandidate( File f, string abspath, FilePath imported, string dirname, string basename ) { @@ -316,10 +327,12 @@ private class AmdDependencyImport extends Import { /** * Gets the module whose absolute path matches this import, if there is only a single such module. */ + overlay[global] private Module resolveByAbsolutePath() { result.getFile() = unique(File file | file = this.guessTarget()) } + overlay[global] override Module getImportedModule() { result = super.getImportedModule() or @@ -348,14 +361,12 @@ private class AmdDependencyImport extends Import { */ class AmdModule extends Module { cached - AmdModule() { - Stages::DataFlowStage::ref() and - exists(unique(AmdModuleDefinition def | amdModuleTopLevel(def, this))) - } + AmdModule() { exists(unique(AmdModuleDefinition def | amdModuleTopLevel(def, this))) } /** Gets the definition of this module. */ AmdModuleDefinition getDefine() { amdModuleTopLevel(result, this) } + overlay[global] override DataFlow::Node getAnExportedValue(string name) { exists(DataFlow::PropWrite pwn | result = pwn.getRhs() | pwn.getBase().analyze().getAValue() = this.getDefine().getAModuleExportsValue() and @@ -363,6 +374,7 @@ class AmdModule extends Module { ) } + overlay[global] override DataFlow::Node getABulkExportedNode() { // Assigned to `module.exports` via the factory's `module` parameter exists(AbstractModuleObject m, DataFlow::PropWrite write | diff --git a/javascript/ql/lib/semmle/javascript/AST.qll b/javascript/ql/lib/semmle/javascript/AST.qll index db0a2e153d5..c37a4e938a2 100644 --- a/javascript/ql/lib/semmle/javascript/AST.qll +++ b/javascript/ql/lib/semmle/javascript/AST.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with the AST-based representation of JavaScript programs. */ +overlay[local?] +module; import javascript private import internal.StmtContainers @@ -172,6 +174,7 @@ class AstNode extends @ast_node, NodeInStmtContainer { * The TypeScript compiler emits no code for ambient declarations, but they * can affect name resolution and type checking at compile-time. */ + overlay[caller?] pragma[inline] predicate isAmbient() { this.isAmbientInternal() @@ -470,9 +473,12 @@ module AST { */ class ValueNode extends AstNode, @dataflownode { /** Gets type inference results for this element. */ + overlay[global] DataFlow::AnalyzedNode analyze() { result = DataFlow::valueNode(this).analyze() } /** Gets the data flow node associated with this program element. */ + overlay[caller?] + pragma[inline] DataFlow::ValueNode flow() { result = DataFlow::valueNode(this) } /** @@ -481,6 +487,7 @@ module AST { * This can be used to map an expression to the class it refers to, or * associate it with a named value coming from an dependency. */ + overlay[global] ExprNameBindingNode getNameBinding() { result = this } /** @@ -490,6 +497,7 @@ module AST { * (according to the type system), or to associate it with a named type coming * from a dependency. */ + overlay[global] TypeNameBindingNode getTypeBinding() { TypeResolution::valueHasType(this, result) } } } diff --git a/javascript/ql/lib/semmle/javascript/CFG.qll b/javascript/ql/lib/semmle/javascript/CFG.qll index 95e1e9aef72..f7943647d77 100644 --- a/javascript/ql/lib/semmle/javascript/CFG.qll +++ b/javascript/ql/lib/semmle/javascript/CFG.qll @@ -272,6 +272,8 @@ * Note that the `import` statement as a whole is part of the CFG of the body, while its single * import specifier `x as y` forms part of the preamble. */ +overlay[local?] +module; import javascript private import internal.StmtContainers diff --git a/javascript/ql/lib/semmle/javascript/Classes.qll b/javascript/ql/lib/semmle/javascript/Classes.qll index 394ab791027..7f6ea5ba492 100644 --- a/javascript/ql/lib/semmle/javascript/Classes.qll +++ b/javascript/ql/lib/semmle/javascript/Classes.qll @@ -4,6 +4,8 @@ * Class declarations and class expressions are modeled by (QL) classes `ClassDeclaration` * and `ClassExpression`, respectively, which are both subclasses of `ClassDefinition`. */ +overlay[local?] +module; import javascript @@ -119,6 +121,7 @@ class ClassOrInterface extends @class_or_interface, TypeParameterized { * * Anonymous classes and interfaces do not have a canonical name. */ + overlay[global] deprecated TypeName getTypeName() { result.getADefinition() = this } /** @@ -253,6 +256,7 @@ class ClassDefinition extends @class_definition, ClassOrInterface, AST::ValueNod /** * Gets the definition of the super class of this class, if it can be determined. */ + overlay[global] ClassDefinition getSuperClassDefinition() { result = this.getSuperClass().analyze().getAValue().(AbstractClass).getClass() } @@ -580,6 +584,7 @@ class MemberDeclaration extends @property, Documentable { int getMemberIndex() { properties(this, _, result, _, _) } /** Holds if the name of this member is computed by an impure expression. */ + overlay[global] predicate hasImpureNameExpr() { this.isComputed() and this.getNameExpr().isImpure() } /** diff --git a/javascript/ql/lib/semmle/javascript/Closure.qll b/javascript/ql/lib/semmle/javascript/Closure.qll index c3169833339..930e94a77d7 100644 --- a/javascript/ql/lib/semmle/javascript/Closure.qll +++ b/javascript/ql/lib/semmle/javascript/Closure.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with the Closure-Library module system. */ +overlay[local?] +module; import javascript @@ -40,6 +42,7 @@ module Closure { /** * A reference to a Closure namespace. */ + overlay[global] deprecated class ClosureNamespaceRef extends DataFlow::Node instanceof ClosureNamespaceRef::Range { /** * Gets the namespace being referenced. @@ -47,6 +50,7 @@ module Closure { string getClosureNamespace() { result = super.getClosureNamespace() } } + overlay[global] deprecated module ClosureNamespaceRef { /** * A reference to a Closure namespace. @@ -64,9 +68,11 @@ module Closure { /** * A data flow node that returns the value of a closure namespace. */ + overlay[global] deprecated class ClosureNamespaceAccess extends ClosureNamespaceRef instanceof ClosureNamespaceAccess::Range { } + overlay[global] deprecated module ClosureNamespaceAccess { /** * A data flow node that returns the value of a closure namespace. @@ -79,6 +85,7 @@ module Closure { /** * A call to a method on the `goog.` namespace, as a closure reference. */ + overlay[global] abstract deprecated private class DefaultNamespaceRef extends DataFlow::MethodCallNode, ClosureNamespaceRef::Range { @@ -91,6 +98,7 @@ module Closure { * Holds if `node` is the data flow node corresponding to the expression in * a top-level expression statement. */ + overlay[global] deprecated private predicate isTopLevelExpr(DataFlow::Node node) { any(TopLevel tl).getAChildStmt().(ExprStmt).getExpr().flow() = node } @@ -98,6 +106,7 @@ module Closure { /** * A top-level call to `goog.provide`. */ + overlay[global] deprecated private class DefaultClosureProvideCall extends DefaultNamespaceRef { DefaultClosureProvideCall() { this.getMethodName() = "provide" and @@ -108,12 +117,14 @@ module Closure { /** * A top-level call to `goog.provide`. */ + overlay[global] deprecated class ClosureProvideCall extends ClosureNamespaceRef, DataFlow::MethodCallNode instanceof DefaultClosureProvideCall { } /** * A call to `goog.require`. */ + overlay[global] deprecated private class DefaultClosureRequireCall extends DefaultNamespaceRef, ClosureNamespaceAccess::Range { @@ -123,12 +134,14 @@ module Closure { /** * A call to `goog.require`. */ + overlay[global] deprecated class ClosureRequireCall extends ClosureNamespaceAccess, DataFlow::MethodCallNode instanceof DefaultClosureRequireCall { } /** * A top-level call to `goog.module` or `goog.declareModuleId`. */ + overlay[global] deprecated private class DefaultClosureModuleDeclaration extends DefaultNamespaceRef { DefaultClosureModuleDeclaration() { (this.getMethodName() = "module" or this.getMethodName() = "declareModuleId") and @@ -139,6 +152,7 @@ module Closure { /** * A top-level call to `goog.module` or `goog.declareModuleId`. */ + overlay[global] deprecated class ClosureModuleDeclaration extends ClosureNamespaceRef, DataFlow::MethodCallNode instanceof DefaultClosureModuleDeclaration { } @@ -156,6 +170,7 @@ module Closure { /** * Gets the call to `goog.module` or `goog.declareModuleId` in this module. */ + overlay[global] deprecated ClosureModuleDeclaration getModuleDeclaration() { result.getTopLevel() = this } /** @@ -181,6 +196,7 @@ module Closure { result = this.getScope().getVariable("exports") } + overlay[global] override DataFlow::Node getAnExportedValue(string name) { exists(DataFlow::PropWrite write, Expr base | result = write.getRhs() and @@ -193,6 +209,7 @@ module Closure { ) } + overlay[global] override DataFlow::Node getABulkExportedNode() { result = this.getExportsVariable().getAnAssignedExpr().flow() } @@ -232,6 +249,7 @@ module Closure { /** * Holds if `name` is a closure namespace, including proper namespace prefixes. */ + overlay[global] pragma[noinline] predicate isClosureNamespace(string name) { exists(string namespace | @@ -253,6 +271,7 @@ module Closure { * Holds if a prefix of `name` is a closure namespace. */ bindingset[name] + overlay[global] private predicate hasClosureNamespacePrefix(string name) { isClosureNamespace(name.substring(0, name.indexOf("."))) or @@ -262,6 +281,7 @@ module Closure { /** * Gets the closure namespace path addressed by the given data flow node, if any. */ + overlay[global] string getClosureNamespaceFromSourceNode(DataFlow::SourceNode node) { node = AccessPath::getAReferenceOrAssignmentTo(result) and hasClosureNamespacePrefix(result) @@ -270,6 +290,7 @@ module Closure { /** * Gets the closure namespace path written to by the given property write, if any. */ + overlay[global] string getWrittenClosureNamespace(DataFlow::PropWrite node) { node.getRhs() = AccessPath::getAnAssignmentTo(result) and hasClosureNamespacePrefix(result) @@ -278,6 +299,7 @@ module Closure { /** * Gets a data flow node that refers to the given value exported from a Closure module. */ + overlay[global] DataFlow::SourceNode moduleImport(string moduleName) { getClosureNamespaceFromSourceNode(result) = moduleName } @@ -285,6 +307,7 @@ module Closure { /** * A call to `goog.bind`, as a partial function invocation. */ + overlay[global] private class BindCall extends DataFlow::PartialInvokeNode::Range, DataFlow::CallNode { BindCall() { this = moduleImport("goog.bind").getACall() } diff --git a/javascript/ql/lib/semmle/javascript/Comments.qll b/javascript/ql/lib/semmle/javascript/Comments.qll index 889843728a2..6365127cad0 100644 --- a/javascript/ql/lib/semmle/javascript/Comments.qll +++ b/javascript/ql/lib/semmle/javascript/Comments.qll @@ -1,4 +1,6 @@ /** Provides classes for working with JavaScript comments. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/Constants.qll b/javascript/ql/lib/semmle/javascript/Constants.qll index 21e70869c67..acf154346cb 100644 --- a/javascript/ql/lib/semmle/javascript/Constants.qll +++ b/javascript/ql/lib/semmle/javascript/Constants.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with expressions that evaluate to constant values. */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.CachedStages diff --git a/javascript/ql/lib/semmle/javascript/DefUse.qll b/javascript/ql/lib/semmle/javascript/DefUse.qll index a9d021f939e..60e0a728691 100644 --- a/javascript/ql/lib/semmle/javascript/DefUse.qll +++ b/javascript/ql/lib/semmle/javascript/DefUse.qll @@ -1,4 +1,6 @@ /** Provides classes and predicates for working with variable definitions and uses. */ +overlay[local?] +module; import javascript @@ -231,6 +233,7 @@ class VarUse extends ControlFlowNode, @varref instanceof RValue { * * For global variables, each definition is considered to reach each use. */ + overlay[global] VarDef getADef() { result = this.getSsaVariable().getDefinition().getAContributingVarDef() or result.getAVariable() = this.getVariable().(GlobalVariable) @@ -241,5 +244,6 @@ class VarUse extends ControlFlowNode, @varref instanceof RValue { * * This predicate is only defined for variables that can be SSA-converted. */ + overlay[global] SsaVariable getSsaVariable() { result.getAUse() = this } } diff --git a/javascript/ql/lib/semmle/javascript/E4X.qll b/javascript/ql/lib/semmle/javascript/E4X.qll index cd112d60664..4fef3ba2389 100644 --- a/javascript/ql/lib/semmle/javascript/E4X.qll +++ b/javascript/ql/lib/semmle/javascript/E4X.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with E4X. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/ES2015Modules.qll b/javascript/ql/lib/semmle/javascript/ES2015Modules.qll index e584697c1e4..3710942e9e4 100644 --- a/javascript/ql/lib/semmle/javascript/ES2015Modules.qll +++ b/javascript/ql/lib/semmle/javascript/ES2015Modules.qll @@ -1,4 +1,6 @@ /** Provides classes for working with ECMAScript 2015 modules. */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.CachedStages @@ -29,11 +31,13 @@ class ES2015Module extends Module { /** Gets an export declaration in this module. */ ExportDeclaration getAnExport() { result.getTopLevel() = this } + overlay[global] override DataFlow::Node getAnExportedValue(string name) { exists(ExportDeclaration ed | ed = this.getAnExport() and result = ed.getSourceNode(name)) } /** Holds if this module exports variable `v` under the name `name`. */ + overlay[global] predicate exportsAs(LexicalName v, string name) { this.getAnExport().exportsAs(v, name) } override predicate isStrict() { @@ -50,6 +54,7 @@ class ES2015Module extends Module { * When a module has both named and `default` exports, the non-standard interpretation can lead to * ambiguities, so we only allow the standard interpretation in that case. */ + overlay[global] predicate hasBothNamedAndDefaultExports() { hasNamedExports(this) and hasDefaultExport(this) @@ -59,6 +64,7 @@ class ES2015Module extends Module { /** * Holds if `mod` contains one or more named export declarations other than `default`. */ +overlay[global] private predicate hasNamedExports(ES2015Module mod) { mod.getAnExport().(ExportNamedDeclaration).getASpecifier().getExportedName() != "default" or @@ -71,6 +77,7 @@ private predicate hasNamedExports(ES2015Module mod) { /** * Holds if this module contains a default export. */ +overlay[global] private predicate hasDefaultExport(ES2015Module mod) { // export default foo; mod.getAnExport() instanceof ExportDefaultDeclaration @@ -172,6 +179,7 @@ class ImportDeclaration extends Stmt, Import, @import_declaration { } /** A literal path expression appearing in an `import` declaration. */ +overlay[global] deprecated private class LiteralImportPath extends PathExpr, ConstantString { LiteralImportPath() { exists(ImportDeclaration req | this = req.getChildExpr(-1)) } @@ -198,6 +206,7 @@ deprecated private class LiteralImportPath extends PathExpr, ConstantString { */ class ImportSpecifier extends Expr, @import_specifier { /** Gets the import declaration in which this specifier appears. */ + overlay[global] ImportDeclaration getImportDeclaration() { result.getASpecifier() = this } /** Gets the imported symbol; undefined for default and namespace import specifiers. */ @@ -297,6 +306,7 @@ class BulkImportDeclaration extends ImportDeclaration { * import console, { log } from 'console'; * ``` */ +overlay[global] class SelectiveImportDeclaration extends ImportDeclaration { SelectiveImportDeclaration() { not this instanceof BulkImportDeclaration } @@ -330,10 +340,22 @@ class SelectiveImportDeclaration extends ImportDeclaration { */ abstract class ExportDeclaration extends Stmt, @export_declaration { /** Gets the module to which this export declaration belongs. */ + overlay[global] ES2015Module getEnclosingModule() { this = result.getAnExport() } /** Holds if this export declaration exports variable `v` under the name `name`. */ - abstract predicate exportsAs(LexicalName v, string name); + overlay[global] + final predicate exportsAs(LexicalName v, string name) { + this.exportsDirectlyAs(v, name) + or + this.(ReExportDeclaration).reExportsAs(v, name) + } + + /** + * Holds if this export declaration exports variable `v` under the name `name`, + * not counting re-exports. + */ + predicate exportsDirectlyAs(LexicalName v, string name) { none() } /** * Gets the data flow node corresponding to the value this declaration exports @@ -356,7 +378,18 @@ abstract class ExportDeclaration extends Stmt, @export_declaration { * exports under the same name. In particular, its source node belongs * to module `a` or possibly to some other module from which `a` re-exports. */ - abstract DataFlow::Node getSourceNode(string name); + overlay[global] + final DataFlow::Node getSourceNode(string name) { + result = this.getDirectSourceNode(name) + or + result = this.(ReExportDeclaration).getReExportedSourceNode(name) + } + + /** + * Gets the data flow node corresponding to the value this declaration exports + * under the name `name`, not including sources that come from a re-export. + */ + DataFlow::Node getDirectSourceNode(string name) { none() } /** Holds if is declared with the `type` keyword, so only types are exported. */ predicate isTypeOnly() { has_type_keyword(this) } @@ -407,19 +440,21 @@ class BulkReExportDeclaration extends ReExportDeclaration, @export_all_declarati /** Gets the name of the module from which this declaration re-exports. */ override ConstantString getImportedPath() { result = this.getChildExpr(0) } - override predicate exportsAs(LexicalName v, string name) { + overlay[global] + override predicate reExportsAs(LexicalName v, string name) { this.getReExportedES2015Module().exportsAs(v, name) and - not isShadowedFromBulkExport(this, name) + not isShadowedFromBulkExport(this.getEnclosingModule(), name) } - override DataFlow::Node getSourceNode(string name) { + overlay[global] + override DataFlow::Node getReExportedSourceNode(string name) { result = this.getReExportedES2015Module().getAnExport().getSourceNode(name) } } /** - * Holds if the given bulk export `reExport` should not re-export `name` because there is an explicit export - * of that name in the same module. + * Holds if bulk re-exports in `mod` should not re-export `name` because there is an explicit export + * of that name in `mod`. * * At compile time, shadowing works across declaration spaces. * For instance, directly exporting an interface `X` will block a variable `X` from being re-exported: @@ -430,8 +465,9 @@ class BulkReExportDeclaration extends ReExportDeclaration, @export_all_declarati * At runtime, the interface `X` will have been removed, so `X` is actually re-exported anyway, * but we ignore this subtlety. */ -private predicate isShadowedFromBulkExport(BulkReExportDeclaration reExport, string name) { - exists(ExportNamedDeclaration other | other.getTopLevel() = reExport.getEnclosingModule() | +overlay[global] +private predicate isShadowedFromBulkExport(Module mod, string name) { + exists(ExportNamedDeclaration other | other.getTopLevel() = mod | other.getAnExportedDecl().getName() = name or other.getASpecifier().getExportedName() = name @@ -452,7 +488,7 @@ class ExportDefaultDeclaration extends ExportDeclaration, @export_default_declar /** Gets the operand statement or expression that is exported by this declaration. */ ExprOrStmt getOperand() { result = this.getChild(0) } - override predicate exportsAs(LexicalName v, string name) { + override predicate exportsDirectlyAs(LexicalName v, string name) { name = "default" and v = this.getADecl().getVariable() } @@ -464,7 +500,7 @@ class ExportDefaultDeclaration extends ExportDeclaration, @export_default_declar ) } - override DataFlow::Node getSourceNode(string name) { + override DataFlow::Node getDirectSourceNode(string name) { name = "default" and result = DataFlow::valueNode(this.getOperand()) } } @@ -506,19 +542,20 @@ class ExportNamedDeclaration extends ExportDeclaration, @export_named_declaratio /** Gets the variable declaration, if any, exported by this named export. */ VarDecl getADecl() { result = this.getAnExportedDecl() } - override predicate exportsAs(LexicalName v, string name) { - exists(LexicalDecl vd | vd = this.getAnExportedDecl() | - name = vd.getName() and v = vd.getALexicalName() - ) - or - exists(ExportSpecifier spec | spec = this.getASpecifier() and name = spec.getExportedName() | - v = spec.getLocal().(LexicalAccess).getALexicalName() + override predicate exportsDirectlyAs(LexicalName v, string name) { + ( + exists(LexicalDecl vd | vd = this.getAnExportedDecl() | + name = vd.getName() and v = vd.getALexicalName() + ) or - this.(ReExportDeclaration).getReExportedES2015Module().exportsAs(v, spec.getLocalName()) - ) + exists(ExportSpecifier spec | spec = this.getASpecifier() and name = spec.getExportedName() | + v = spec.getLocal().(LexicalAccess).getALexicalName() + ) + ) and + not (this.isTypeOnly() and v instanceof Variable) } - override DataFlow::Node getSourceNode(string name) { + override DataFlow::Node getDirectSourceNode(string name) { exists(VarDef d | d.getTarget() = this.getADecl() | name = d.getTarget().(VarDecl).getName() and result = DataFlow::valueNode(d.getSource()) @@ -534,12 +571,11 @@ class ExportNamedDeclaration extends ExportDeclaration, @export_named_declaratio exists(ExportSpecifier spec | spec = this.getASpecifier() and name = spec.getExportedName() | not exists(this.getImportedPath()) and result = DataFlow::valueNode(spec.getLocal()) or - exists(ReExportDeclaration red | red = this | - result = red.getReExportedES2015Module().getAnExport().getSourceNode(spec.getLocalName()) - or - spec instanceof ExportNamespaceSpecifier and - result = DataFlow::valueNode(spec) - ) + // For `export * as B from ".."`, we use the ExportNamespaceSpecifier as a representative for the + // object that gets exposed as `B`. + this instanceof ReExportDeclaration and + spec instanceof ExportNamespaceSpecifier and + result = DataFlow::valueNode(spec) ) } @@ -555,6 +591,7 @@ class ExportNamedDeclaration extends ExportDeclaration, @export_named_declaratio private import semmle.javascript.dataflow.internal.PreCallGraphStep +overlay[global] private class ExportNamespaceStep extends PreCallGraphStep { override predicate storeStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) { exists(ExportNamedDeclaration exprt, ExportNamespaceSpecifier spec | @@ -566,18 +603,6 @@ private class ExportNamespaceStep extends PreCallGraphStep { } } -/** - * An export declaration with the `type` modifier. - */ -private class TypeOnlyExportDeclaration extends ExportNamedDeclaration { - TypeOnlyExportDeclaration() { this.isTypeOnly() } - - override predicate exportsAs(LexicalName v, string name) { - super.exportsAs(v, name) and - not v instanceof Variable - } -} - /** * An export specifier in an export declaration. * @@ -745,17 +770,34 @@ abstract class ReExportDeclaration extends ExportDeclaration { abstract ConstantString getImportedPath(); /** Gets the module from which this declaration re-exports, if it is an ES2015 module. */ + overlay[global] ES2015Module getReExportedES2015Module() { result = this.getReExportedModule() } /** Gets the module from which this declaration re-exports. */ + overlay[global] cached Module getReExportedModule() { Stages::Imports::ref() and result.getFile() = ImportPathResolver::resolveExpr(this.getImportedPath()) } + + /** + * Holds if this re-export declaration ultimately re-exports `v` (from another module) + * under the given `name`. + */ + overlay[global] + abstract predicate reExportsAs(LexicalName v, string name); + + /** + * Gets the data flow node (from another module) corresponding to the value that is re-exported + * under the name `name`. + */ + overlay[global] + abstract DataFlow::Node getReExportedSourceNode(string name); } /** A literal path expression appearing in a re-export declaration. */ +overlay[global] deprecated private class LiteralReExportPath extends PathExpr, ConstantString { LiteralReExportPath() { exists(ReExportDeclaration bred | this = bred.getImportedPath()) } @@ -778,6 +820,21 @@ class SelectiveReExportDeclaration extends ReExportDeclaration, ExportNamedDecla override ConstantString getImportedPath() { result = ExportNamedDeclaration.super.getImportedPath() } + + overlay[global] + override predicate reExportsAs(LexicalName v, string name) { + exists(ExportSpecifier spec | spec = this.getASpecifier() and name = spec.getExportedName() | + this.getReExportedES2015Module().exportsAs(v, spec.getLocalName()) + ) and + not (this.isTypeOnly() and v instanceof Variable) + } + + overlay[global] + override DataFlow::Node getReExportedSourceNode(string name) { + exists(ExportSpecifier spec | spec = this.getASpecifier() and name = spec.getExportedName() | + result = this.getReExportedES2015Module().getAnExport().getSourceNode(spec.getLocalName()) + ) + } } /** @@ -794,14 +851,4 @@ class SelectiveReExportDeclaration extends ReExportDeclaration, ExportNamedDecla */ class OriginalExportDeclaration extends ExportDeclaration { OriginalExportDeclaration() { not this instanceof ReExportDeclaration } - - override predicate exportsAs(LexicalName v, string name) { - this.(ExportDefaultDeclaration).exportsAs(v, name) or - this.(ExportNamedDeclaration).exportsAs(v, name) - } - - override DataFlow::Node getSourceNode(string name) { - result = this.(ExportDefaultDeclaration).getSourceNode(name) or - result = this.(ExportNamedDeclaration).getSourceNode(name) - } } diff --git a/javascript/ql/lib/semmle/javascript/Errors.qll b/javascript/ql/lib/semmle/javascript/Errors.qll index 6a5d73566a4..9015e89efbf 100644 --- a/javascript/ql/lib/semmle/javascript/Errors.qll +++ b/javascript/ql/lib/semmle/javascript/Errors.qll @@ -1,4 +1,6 @@ /** Provides classes for working with syntax errors. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/Expr.qll b/javascript/ql/lib/semmle/javascript/Expr.qll index ae02511ba41..008cc128377 100644 --- a/javascript/ql/lib/semmle/javascript/Expr.qll +++ b/javascript/ql/lib/semmle/javascript/Expr.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with expressions. */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.CachedStages @@ -115,12 +117,14 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { string getStringValue() { Stages::Ast::ref() and result = getStringValue(this) } /** Holds if this expression is impure, that is, its evaluation could have side effects. */ + overlay[global] predicate isImpure() { any() } /** * Holds if this expression is pure, that is, its evaluation is guaranteed * to be side-effect free. */ + overlay[global] predicate isPure() { not this.isImpure() } /** @@ -153,21 +157,25 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { * Holds if this expression accesses the global variable `g`, either directly * or through the `window` object. */ + overlay[global] predicate accessesGlobal(string g) { this.flow().accessesGlobal(g) } /** * Holds if this expression may evaluate to `s`. */ + overlay[global] predicate mayHaveStringValue(string s) { this.flow().mayHaveStringValue(s) } /** * Holds if this expression may evaluate to `b`. */ + overlay[global] predicate mayHaveBooleanValue(boolean b) { this.flow().mayHaveBooleanValue(b) } /** * Holds if this expression may refer to the initial value of parameter `p`. */ + overlay[global] predicate mayReferToParameter(Parameter p) { DataFlow::parameterNode(p).flowsToExpr(this) } /** @@ -178,6 +186,7 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { * Has no result if the expression is in a JavaScript file or in a TypeScript * file that was extracted without type information. */ + overlay[global] deprecated Type getType() { ast_node_type(this, result) } /** @@ -240,21 +249,16 @@ class Expr extends @expr, ExprOrStmt, ExprOrType, AST::ValueNode { ) } - pragma[inline] - private Stmt getRawEnclosingStmt(Expr e) { - // For performance reasons, we need the enclosing statement without overrides - enclosing_stmt(e, result) - } - /** * Gets the data-flow node where exceptions thrown by this expression will * propagate if this expression causes an exception to be thrown. */ + overlay[caller?] pragma[inline] DataFlow::Node getExceptionTarget() { - result = getCatchParameterFromStmt(this.getRawEnclosingStmt(this)) + result = getCatchParameterFromStmt(getRawEnclosingStmt(this)) or - not exists(getCatchParameterFromStmt(this.getRawEnclosingStmt(this))) and + not exists(getCatchParameterFromStmt(getRawEnclosingStmt(this))) and result = any(DataFlow::FunctionNode f | f.getFunction() = this.getContainer()).getExceptionalReturn() } @@ -267,6 +271,13 @@ private DataFlow::Node getCatchParameterFromStmt(Stmt stmt) { DataFlow::parameterNode(stmt.getEnclosingTryCatchStmt().getACatchClause().getAParameter()) } +overlay[caller?] +pragma[inline] +private Stmt getRawEnclosingStmt(Expr e) { + // For performance reasons, we need the enclosing statement without overrides + enclosing_stmt(e, result) +} + /** * An identifier. * @@ -301,6 +312,7 @@ class Identifier extends @identifier, ExprOrType { * ``` */ class Label extends @label, Identifier, Expr { + overlay[global] override predicate isImpure() { none() } override string getAPrimaryQlClass() { result = "Label" } @@ -330,6 +342,7 @@ class Literal extends @literal, Expr { */ string getRawValue() { literals(_, result, this) } + overlay[global] override predicate isImpure() { none() } override string getAPrimaryQlClass() { result = "Literal" } @@ -352,6 +365,7 @@ class ParExpr extends @par_expr, Expr { override int getIntValue() { result = this.getExpression().getIntValue() } + overlay[global] override predicate isImpure() { this.getExpression().isImpure() } override Expr getUnderlyingValue() { result = this.getExpression().getUnderlyingValue() } @@ -500,6 +514,7 @@ class RegExpLiteral extends @regexp_literal, Literal, RegExpParent { * ``` */ class ThisExpr extends @this_expr, Expr { + overlay[global] override predicate isImpure() { none() } /** @@ -555,6 +570,7 @@ class ArrayExpr extends @array_expr, Expr { /** Holds if this array literal has an omitted element. */ predicate hasOmittedElement() { this.elementIsOmitted(_) } + overlay[global] override predicate isImpure() { this.getAnElement().isImpure() } override string getAPrimaryQlClass() { result = "ArrayExpr" } @@ -597,6 +613,7 @@ class ObjectExpr extends @obj_expr, Expr { */ predicate hasTrailingComma() { this.getLastToken().getPreviousToken().getValue() = "," } + overlay[global] override predicate isImpure() { this.getAProperty().isImpure() } override string getAPrimaryQlClass() { result = "ObjectExpr" } @@ -664,6 +681,7 @@ class Property extends @property, Documentable { * Holds if this property is impure, that is, the evaluation of its name or * its initializer expression could have side effects. */ + overlay[global] predicate isImpure() { this.isComputed() and this.getNameExpr().isImpure() or @@ -826,6 +844,7 @@ class FunctionExpr extends @function_expr, Expr, Function { Stages::Ast::ref() and result = Expr.super.getContainer() } + overlay[global] override predicate isImpure() { none() } override string getAPrimaryQlClass() { result = "FunctionExpr" } @@ -846,6 +865,7 @@ class ArrowFunctionExpr extends @arrow_function_expr, Expr, Function { override StmtContainer getEnclosingContainer() { result = Expr.super.getContainer() } + overlay[global] override predicate isImpure() { none() } override Function getThisBinder() { @@ -877,6 +897,7 @@ class SeqExpr extends @seq_expr, Expr { /** Gets the last expression in this sequence. */ Expr getLastOperand() { result = this.getOperand(this.getNumOperands() - 1) } + overlay[global] override predicate isImpure() { this.getAnOperand().isImpure() } override Expr getUnderlyingValue() { result = this.getLastOperand().getUnderlyingValue() } @@ -906,6 +927,7 @@ class ConditionalExpr extends @conditional_expr, Expr { /** Gets either the 'then' or the 'else' expression of this conditional. */ Expr getABranch() { result = this.getConsequent() or result = this.getAlternate() } + overlay[global] override predicate isImpure() { this.getCondition().isImpure() or this.getABranch().isImpure() @@ -985,6 +1007,7 @@ class InvokeExpr extends @invokeexpr, Expr { * * This predicate is an approximation, computed using only local data flow. */ + overlay[global] predicate hasOptionArgument(int i, string name, Expr value) { value = this.flow().(DataFlow::InvokeNode).getOptionArgument(i, name).asExpr() } @@ -997,6 +1020,7 @@ class InvokeExpr extends @invokeexpr, Expr { * * This predicate is only populated for files extracted with full TypeScript extraction. */ + overlay[global] deprecated CallSignatureType getResolvedSignature() { invoke_expr_signature(this, result) } /** @@ -1014,6 +1038,7 @@ class InvokeExpr extends @invokeexpr, Expr { * * This predicate is only populated for files extracted with full TypeScript extraction. */ + overlay[global] deprecated CanonicalFunctionName getResolvedCalleeName() { ast_node_symbol(this, result) } /** @@ -1022,6 +1047,7 @@ class InvokeExpr extends @invokeexpr, Expr { * Note that the resolved function may be overridden in a subclass and thus is not * necessarily the actual target of this invocation at runtime. */ + overlay[global] Function getResolvedCallee() { TypeResolution::callTarget(this, result) } } @@ -1156,6 +1182,7 @@ class DotExpr extends @dot_expr, PropAccess { /** Gets the identifier specifying the name of the accessed property. */ Identifier getProperty() { result = this.getChildExpr(1) } + overlay[global] override predicate isImpure() { this.getBase().isImpure() } override string getAPrimaryQlClass() { result = "DotExpr" } @@ -1176,6 +1203,7 @@ class IndexExpr extends @index_expr, PropAccess { override string getPropertyName() { result = this.getIndex().(Literal).getValue() } + overlay[global] override predicate isImpure() { this.getBase().isImpure() or this.getIndex().isImpure() @@ -1201,6 +1229,7 @@ class UnaryExpr extends @unaryexpr, Expr { /** Gets the operator of this expression. */ string getOperator() { none() } + overlay[global] override predicate isImpure() { this.getOperand().isImpure() } override ControlFlowNode getFirstControlFlowNode() { @@ -1302,6 +1331,7 @@ class VoidExpr extends @void_expr, UnaryExpr { class DeleteExpr extends @delete_expr, UnaryExpr { override string getOperator() { result = "delete" } + overlay[global] override predicate isImpure() { any() } } @@ -1352,6 +1382,7 @@ class BinaryExpr extends @binaryexpr, Expr { /** Gets the operator of this expression. */ string getOperator() { none() } + overlay[global] override predicate isImpure() { this.getAnOperand().isImpure() } override ControlFlowNode getFirstControlFlowNode() { @@ -1617,13 +1648,19 @@ private string getConstantString(Expr e) { result = e.(TemplateElement).getValue() } +pragma[nomagic] +private predicate hasConstantStringValue(Expr e) { + exists(getConstantString(e)) + or + hasAllConstantLeafs(e.getUnderlyingValue()) +} + /** * Holds if `add` is a string-concatenation where all the transitive leafs have a constant string value. */ private predicate hasAllConstantLeafs(AddExpr add) { - forex(Expr leaf | leaf = getAnAddOperand*(add) and not exists(getAnAddOperand(leaf)) | - exists(getConstantString(leaf)) - ) + hasConstantStringValue(add.getLeftOperand()) and + hasConstantStringValue(add.getRightOperand()) } /** @@ -2233,6 +2270,7 @@ class YieldExpr extends @yield_expr, Expr { /** Holds if this is a `yield*` expression. */ predicate isDelegating() { is_delegating(this) } + overlay[global] override predicate isImpure() { any() } override ControlFlowNode getFirstControlFlowNode() { @@ -2289,6 +2327,7 @@ class ComprehensionExpr extends @comprehension_expr, Expr { /** Gets the body expression of this comprehension. */ Expr getBody() { result = this.getChildExpr(0) } + overlay[global] override predicate isImpure() { this.getABlock().isImpure() or this.getAFilter().isImpure() or @@ -2349,6 +2388,7 @@ class ComprehensionBlock extends @comprehension_block, Expr { /** Gets the domain over which this comprehension block iterates. */ Expr getDomain() { result = this.getChildExpr(1) } + overlay[global] override predicate isImpure() { this.getIterator().isImpure() or this.getDomain().isImpure() @@ -2675,6 +2715,7 @@ class AwaitExpr extends @await_expr, Expr { /** Gets the operand of this `await` expression. */ Expr getOperand() { result = this.getChildExpr(0) } + overlay[global] override predicate isImpure() { any() } override ControlFlowNode getFirstControlFlowNode() { @@ -2698,6 +2739,7 @@ class AwaitExpr extends @await_expr, Expr { * ``` */ class FunctionSentExpr extends @function_sent_expr, Expr { + overlay[global] override predicate isImpure() { none() } override string getAPrimaryQlClass() { result = "FunctionSentExpr" } @@ -2857,6 +2899,7 @@ class DynamicImportExpr extends @dynamic_import, Expr, Import { } /** A literal path expression appearing in a dynamic import. */ +overlay[global] deprecated private class LiteralDynamicImportPath extends PathExpr, ConstantString { LiteralDynamicImportPath() { exists(DynamicImportExpr di | this.getParentExpr*() = di.getSource()) @@ -2919,6 +2962,7 @@ class OptionalChainRoot extends ChainElem { * ``` */ class ImportMetaExpr extends @import_meta_expr, Expr { + overlay[global] override predicate isImpure() { none() } override string getAPrimaryQlClass() { result = "ImportMetaExpr" } diff --git a/javascript/ql/lib/semmle/javascript/Extend.qll b/javascript/ql/lib/semmle/javascript/Extend.qll index d0eeade5892..b871a74a03b 100644 --- a/javascript/ql/lib/semmle/javascript/Extend.qll +++ b/javascript/ql/lib/semmle/javascript/Extend.qll @@ -1,6 +1,8 @@ /** * Provides classes for reasoning about `extend`-like functions. */ +overlay[local?] +module; import javascript @@ -169,6 +171,7 @@ private class FunctionalExtendCallShallow extends ExtendCall { * * Since all object properties are preserved, we model this as a value-preserving step. */ +overlay[global] private class ExtendCallStep extends PreCallGraphStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(ExtendCall extend | @@ -184,6 +187,7 @@ private import semmle.javascript.dataflow.internal.PreCallGraphStep /** * A step through a cloning library, such as `clone` or `fclone`. */ +overlay[global] private class CloneStep extends PreCallGraphStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(DataFlow::CallNode call | diff --git a/javascript/ql/lib/semmle/javascript/Externs.qll b/javascript/ql/lib/semmle/javascript/Externs.qll index a2a2533d849..22d6d03d7dd 100644 --- a/javascript/ql/lib/semmle/javascript/Externs.qll +++ b/javascript/ql/lib/semmle/javascript/Externs.qll @@ -36,6 +36,8 @@ * Array.prototype.length; * */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/Files.qll b/javascript/ql/lib/semmle/javascript/Files.qll index b9274d92eba..556d25911f1 100644 --- a/javascript/ql/lib/semmle/javascript/Files.qll +++ b/javascript/ql/lib/semmle/javascript/Files.qll @@ -1,4 +1,6 @@ /** Provides classes for working with files and folders. */ +overlay[local?] +module; import javascript private import NodeModuleResolutionImpl @@ -33,12 +35,14 @@ module Folder = Impl::Folder; /** A folder. */ class Folder extends Container, Impl::Folder { /** Gets the file or subfolder in this folder that has the given `name`, if any. */ + overlay[global] Container getChildContainer(string name) { result = this.getAChildContainer() and result.getBaseName() = name } /** Gets the file in this folder that has the given `stem` and `extension`, if any. */ + overlay[global] File getFile(string stem, string extension) { result = this.getAChildContainer() and result.getStem() = stem and @@ -46,6 +50,7 @@ class Folder extends Container, Impl::Folder { } /** Like `getFile` except `d.ts` is treated as a single extension. */ + overlay[global] private File getFileLongExtension(string stem, string extension) { not (stem.matches("%.d") and extension = "ts") and result = this.getFile(stem, extension) @@ -65,6 +70,7 @@ class Folder extends Container, Impl::Folder { * * HTML files will not be found by this method. */ + overlay[global] File getJavaScriptFile(string stem) { result = min(int p, string ext | @@ -78,6 +84,7 @@ class Folder extends Container, Impl::Folder { * Gets an implementation file and/or a typings file from this folder that has the given `stem`. * This could be a single `.ts` file or a pair of `.js` and `.d.ts` files. */ + overlay[global] File getJavaScriptFileOrTypings(string stem) { exists(File jsFile | jsFile = this.getJavaScriptFile(stem) | result = jsFile @@ -88,6 +95,7 @@ class Folder extends Container, Impl::Folder { } /** Gets a subfolder contained in this folder. */ + overlay[global] Folder getASubFolder() { result = this.getAChildContainer() } } diff --git a/javascript/ql/lib/semmle/javascript/Functions.qll b/javascript/ql/lib/semmle/javascript/Functions.qll index b72bfbc888e..186ef1bc028 100644 --- a/javascript/ql/lib/semmle/javascript/Functions.qll +++ b/javascript/ql/lib/semmle/javascript/Functions.qll @@ -1,4 +1,6 @@ /** Provides classes for working with functions. */ +overlay[local?] +module; import javascript @@ -434,11 +436,13 @@ class Function extends @function, Parameterized, TypeParameterized, StmtContaine * * This predicate is only populated for files extracted with full TypeScript extraction. */ + overlay[global] deprecated CanonicalFunctionName getCanonicalName() { ast_node_symbol(this, result) } /** * Gets the call signature of this function, as determined by the TypeScript compiler, if any. */ + overlay[global] deprecated CallSignatureType getCallSignature() { declared_function_signature(this, result) } } diff --git a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll index 4a461961f8a..7b3004dbde4 100644 --- a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll +++ b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll @@ -1,6 +1,8 @@ /** * Provides predicates for associating qualified names with data flow nodes. */ +overlay[local?] +module; import javascript private import semmle.javascript.dataflow.InferredTypes @@ -204,6 +206,7 @@ module AccessPath { * Holds if the global `accessPath` is only assigned to from one file, not counting * self-assignments. */ + overlay[global] predicate isAssignedInUniqueFile(string accessPath) { strictcount(File f | isAssignedInFile(accessPath, f)) = 1 } @@ -354,6 +357,7 @@ module AccessPath { * Gets a variable that is relevant for the computations in the `GetLaterAccess` module. * This predicate restricts as much as it can, but without depending on `getAVariableRef`. */ + overlay[caller?] pragma[inline] private SsaVariable getARelevantVariableSimple() { // The variable might be used where `getLaterBaseAccess()` is called. @@ -405,6 +409,7 @@ module AccessPath { * } * ``` */ + overlay[caller?] pragma[inline] DataFlow::Node getAReferenceTo(Root root, string path) { path = fromReference(result, root) and @@ -428,6 +433,7 @@ module AccessPath { * })(NS = NS || {}); * ``` */ + overlay[caller?] pragma[inline] DataFlow::Node getAReferenceTo(string path) { path = fromReference(result, DataFlow::globalAccessPathRootPseudoNode()) @@ -449,6 +455,7 @@ module AccessPath { * } * ``` */ + overlay[caller?] pragma[inline] DataFlow::Node getAnAssignmentTo(Root root, string path) { path = fromRhs(result, root) and @@ -470,6 +477,7 @@ module AccessPath { * })(foo = foo || {}); * ``` */ + overlay[caller?] pragma[inline] DataFlow::Node getAnAssignmentTo(string path) { path = fromRhs(result, DataFlow::globalAccessPathRootPseudoNode()) @@ -480,6 +488,7 @@ module AccessPath { * * See `getAReferenceTo` and `getAnAssignmentTo` for more details. */ + overlay[caller?] pragma[inline] DataFlow::Node getAReferenceOrAssignmentTo(string path) { result = getAReferenceTo(path) @@ -492,6 +501,7 @@ module AccessPath { * * See `getAReferenceTo` and `getAnAssignmentTo` for more details. */ + overlay[caller?] pragma[inline] DataFlow::Node getAReferenceOrAssignmentTo(Root root, string path) { result = getAReferenceTo(root, path) @@ -502,6 +512,7 @@ module AccessPath { /** * Holds if there is a step from `pred` to `succ` through an assignment to an access path. */ + overlay[caller?] pragma[inline] predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(string name, Root root | @@ -519,6 +530,7 @@ module AccessPath { /** * Gets a `SourceNode` that refers to the same value or access path as the given node. */ + overlay[caller?] pragma[inline] DataFlow::SourceNode getAnAliasedSourceNode(DataFlow::Node node) { exists(DataFlow::SourceNode root, string accessPath | @@ -657,7 +669,7 @@ module AccessPath { */ cached predicate hasDominatingWrite(DataFlow::PropRead read) { - Stages::TypeTracking::ref() and + Stages::DataFlowStage::ref() and // within the same basic block. exists(ReachableBasicBlock bb, Root root, string path, int ranking | read.asExpr() = rankedAccessPath(bb, root, path, ranking, AccessPathRead()) and diff --git a/javascript/ql/lib/semmle/javascript/HTML.qll b/javascript/ql/lib/semmle/javascript/HTML.qll index 43b66db459f..fa3deaf661f 100644 --- a/javascript/ql/lib/semmle/javascript/HTML.qll +++ b/javascript/ql/lib/semmle/javascript/HTML.qll @@ -1,4 +1,6 @@ /** Provides classes for working with HTML documents. */ +overlay[local?] +module; import javascript @@ -283,6 +285,7 @@ module HTML { /** * A path string arising from the `src` attribute of a `script` tag. */ + overlay[global] deprecated private class ScriptSrcPath extends PathString { ScriptSrcPath() { scriptSrc(this, _) } diff --git a/javascript/ql/lib/semmle/javascript/JSDoc.qll b/javascript/ql/lib/semmle/javascript/JSDoc.qll index 85b7695cd70..48d2a984ec4 100644 --- a/javascript/ql/lib/semmle/javascript/JSDoc.qll +++ b/javascript/ql/lib/semmle/javascript/JSDoc.qll @@ -1,4 +1,6 @@ /** Provides classes for working with JSDoc comments. */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.CachedStages @@ -627,6 +629,7 @@ module JSDoc { /** * A statement container which may declare JSDoc name aliases. */ + overlay[global] deprecated class Environment extends StmtContainer { /** * Gets the fully qualified name aliased by the given unqualified name diff --git a/javascript/ql/lib/semmle/javascript/JSON.qll b/javascript/ql/lib/semmle/javascript/JSON.qll index 19fc3ec84d7..ba5b42ba1ee 100644 --- a/javascript/ql/lib/semmle/javascript/JSON.qll +++ b/javascript/ql/lib/semmle/javascript/JSON.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with JSON data. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/JSX.qll b/javascript/ql/lib/semmle/javascript/JSX.qll index ed8a7b097a6..ab9a4339bf7 100644 --- a/javascript/ql/lib/semmle/javascript/JSX.qll +++ b/javascript/ql/lib/semmle/javascript/JSX.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with JSX code. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/Lines.qll b/javascript/ql/lib/semmle/javascript/Lines.qll index 1db9187008a..e0f675aa6e0 100644 --- a/javascript/ql/lib/semmle/javascript/Lines.qll +++ b/javascript/ql/lib/semmle/javascript/Lines.qll @@ -4,6 +4,8 @@ * This information is only available for snapshots that have been extracted with * the `--extract-program-text` flag. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/Locations.qll b/javascript/ql/lib/semmle/javascript/Locations.qll index a3ad79ef93e..4aa93dd6937 100644 --- a/javascript/ql/lib/semmle/javascript/Locations.qll +++ b/javascript/ql/lib/semmle/javascript/Locations.qll @@ -1,4 +1,6 @@ /** Provides classes for working with locations and program elements that have locations. */ +overlay[local?] +module; import javascript @@ -30,6 +32,7 @@ final class Location extends @location_default { int getNumLines() { result = this.getEndLine() - this.getStartLine() + 1 } /** Holds if this location starts before location `that`. */ + overlay[caller?] pragma[inline] predicate startsBefore(Location that) { exists(string f, int sl1, int sc1, int sl2, int sc2 | @@ -43,6 +46,7 @@ final class Location extends @location_default { } /** Holds if this location ends after location `that`. */ + overlay[caller?] pragma[inline] predicate endsAfter(Location that) { exists(string f, int el1, int ec1, int el2, int ec2 | diff --git a/javascript/ql/lib/semmle/javascript/Modules.qll b/javascript/ql/lib/semmle/javascript/Modules.qll index 8b0330b708b..9bd9ce43451 100644 --- a/javascript/ql/lib/semmle/javascript/Modules.qll +++ b/javascript/ql/lib/semmle/javascript/Modules.qll @@ -3,6 +3,8 @@ * ECMAScript 2015-style modules, and the older CommonJS and AMD-style * modules. */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.CachedStages @@ -23,9 +25,11 @@ abstract class Module extends TopLevel { Import getAnImport() { result.getTopLevel() = this } /** Gets a module from which this module imports. */ + overlay[global] Module getAnImportedModule() { result = this.getAnImport().getImportedModule() } /** Gets a symbol exported by this module. */ + overlay[global] string getAnExportedSymbol() { exists(this.getAnExportedValue(result)) } /** @@ -39,12 +43,14 @@ abstract class Module extends TopLevel { * Symbols defined in another module that are re-exported by * this module are only sometimes considered. */ + overlay[global] cached abstract DataFlow::Node getAnExportedValue(string name); /** * Gets a value that is exported as the whole exports object of this module. */ + overlay[global] cached DataFlow::Node getABulkExportedNode() { none() } // overridden in subclasses @@ -55,6 +61,7 @@ abstract class Module extends TopLevel { * This can be used to determine which value a default-import will likely refer to, * as the interaction between different module types is not standardized. */ + overlay[global] DataFlow::Node getDefaultOrBulkExport() { result = [this.getAnExportedValue("default"), this.getABulkExportedNode()] } @@ -69,6 +76,7 @@ abstract class Module extends TopLevel { * This predicate is not part of the public API, it is only exposed to allow * overriding by subclasses. */ + overlay[global] deprecated predicate searchRoot(PathExpr path, Folder searchRoot, int priority) { path.getEnclosingModule() = this and priority = 0 and @@ -90,6 +98,7 @@ abstract class Module extends TopLevel { * resolves to a folder containing a main module (such as `index.js`), then * that file is the result. */ + overlay[global] deprecated File resolve(PathExpr path) { path.getEnclosingModule() = this and ( @@ -124,6 +133,7 @@ abstract class Import extends AstNode { abstract Module getEnclosingModule(); /** DEPRECATED. Use `getImportedPathExpr` instead. */ + overlay[global] deprecated PathExpr getImportedPath() { result = this.getImportedPathExpr() } /** Gets the (unresolved) path that this import refers to. */ @@ -138,6 +148,7 @@ abstract class Import extends AstNode { * Any externs module whose name exactly matches the imported * path is assumed to be a possible target of the import. */ + overlay[global] Module resolveExternsImport() { result.isExterns() and result.getName() = this.getImportedPathString() } @@ -145,16 +156,19 @@ abstract class Import extends AstNode { /** * Gets the module the path of this import resolves to. */ + overlay[global] Module resolveImportedPath() { result.getFile() = this.getImportedFile() } /** * Gets the module the path of this import resolves to. */ + overlay[global] File getImportedFile() { result = ImportPathResolver::resolveExpr(this.getImportedPathExpr()) } /** * DEPRECATED. Use `getImportedModule()` instead. */ + overlay[global] deprecated Module resolveFromTypeScriptSymbol() { exists(CanonicalName symbol | ast_node_symbol(this, symbol) and @@ -170,6 +184,7 @@ abstract class Import extends AstNode { * behavior of Node.js imports, which prefer core modules such as `fs` over any * source module of the same name. */ + overlay[global] cached Module getImportedModule() { Stages::Imports::ref() and @@ -210,6 +225,7 @@ abstract class Import extends AstNode { * in cases where it would cause ambiguity between named exports and properties * of a default export. */ + overlay[global] final DataFlow::Node getImportedModuleNodeStrict() { result = this.getImportedModuleNode() and not ( diff --git a/javascript/ql/lib/semmle/javascript/NPM.qll b/javascript/ql/lib/semmle/javascript/NPM.qll index cbe580b4568..857fc163804 100644 --- a/javascript/ql/lib/semmle/javascript/NPM.qll +++ b/javascript/ql/lib/semmle/javascript/NPM.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with NPM module definitions and dependencies. */ +overlay[local?] +module; import javascript private import NodeModuleResolutionImpl diff --git a/javascript/ql/lib/semmle/javascript/NodeJS.qll b/javascript/ql/lib/semmle/javascript/NodeJS.qll index 7e9e2fdea90..0fbd8d79a74 100644 --- a/javascript/ql/lib/semmle/javascript/NodeJS.qll +++ b/javascript/ql/lib/semmle/javascript/NodeJS.qll @@ -17,6 +17,7 @@ private import semmle.javascript.dataflow.internal.DataFlowNode * process.stdout.write(fs.readFileSync(process.argv[i], 'utf8')); * ``` */ +overlay[local?] class NodeModule extends Module { NodeModule() { is_module(this) and @@ -36,11 +37,13 @@ class NodeModule extends Module { * Gets an abstract value representing one or more values that may flow * into this module's `module.exports` property. */ + overlay[global] pragma[noinline] DefiniteAbstractValue getAModuleExportsValue() { result = this.getAModuleExportsProperty().getAValue() } + overlay[global] pragma[noinline] private AbstractProperty getAModuleExportsProperty() { result.getBase().(AbstractModuleObject).getModule() = this and @@ -52,12 +55,14 @@ class NodeModule extends Module { * For performance this predicate only computes relevant expressions (in `getAModuleExportsCandidate`). * So if using this predicate - consider expanding the list of relevant expressions. */ + overlay[global] DataFlow::AnalyzedNode getAModuleExportsNode() { result = getAModuleExportsCandidate() and result.getAValue() = this.getAModuleExportsValue() } /** Gets a symbol exported by this module. */ + overlay[global] override string getAnExportedSymbol() { result = super.getAnExportedSymbol() or @@ -70,6 +75,7 @@ class NodeModule extends Module { ) } + overlay[global] override DataFlow::Node getAnExportedValue(string name) { // a property write whose base is `exports` or `module.exports` exists(DataFlow::PropWrite pwn | result = pwn.getRhs() | @@ -114,6 +120,7 @@ class NodeModule extends Module { ) } + overlay[global] override DataFlow::Node getABulkExportedNode() { Stages::Imports::ref() and exists(DataFlow::PropWrite write | @@ -124,6 +131,7 @@ class NodeModule extends Module { } /** Gets a symbol that the module object inherits from its prototypes. */ + overlay[global] private string getAnImplicitlyExportedSymbol() { exists(ExternalConstructor ec | ec = this.getPrototypeOfExportedExpr() | result = ec.getAMember().getName() @@ -136,6 +144,7 @@ class NodeModule extends Module { } /** Gets an externs declaration of the prototype object of a value exported by this module. */ + overlay[global] private ExternalConstructor getPrototypeOfExportedExpr() { exists(AbstractValue exported | exported = this.getAModuleExportsValue() | result instanceof ObjectExternal @@ -146,6 +155,7 @@ class NodeModule extends Module { ) } + overlay[global] deprecated override predicate searchRoot(PathExpr path, Folder searchRoot, int priority) { path.getEnclosingModule() = this and exists(string pathval | pathval = path.getValue() | @@ -224,6 +234,7 @@ predicate findNodeModulesFolder(Folder f, Folder nodeModules, int distance) { /** * A Node.js `require` variable. */ +overlay[local?] private class RequireVariable extends Variable { RequireVariable() { this = any(ModuleScope m).getVariable("require") @@ -236,6 +247,7 @@ private class RequireVariable extends Variable { } } +overlay[local?] private predicate isModuleModule(EarlyStageNode nd) { exists(ImportDeclaration imp | imp.getRawImportPath() = "module" | nd = TDestructuredModuleImportNode(imp) @@ -249,6 +261,7 @@ private predicate isModuleModule(EarlyStageNode nd) { ) } +overlay[local?] private predicate isCreateRequire(EarlyStageNode nd) { exists(PropAccess prop | isModuleModule(TValueNode(prop.getBase())) and @@ -278,6 +291,7 @@ private predicate isCreateRequire(EarlyStageNode nd) { /** * Holds if `nd` may refer to `require`, either directly or modulo local data flow. */ +overlay[local?] cached private predicate isRequire(EarlyStageNode nd) { exists(VarAccess access | @@ -320,6 +334,7 @@ private predicate isRequire(EarlyStageNode nd) { * require('fs') * ``` */ +overlay[local?] class Require extends CallExpr, Import { Require() { isRequire(TValueNode(this.getCallee())) } diff --git a/javascript/ql/lib/semmle/javascript/Promises.qll b/javascript/ql/lib/semmle/javascript/Promises.qll index 2feb92e2e55..6868505b22a 100644 --- a/javascript/ql/lib/semmle/javascript/Promises.qll +++ b/javascript/ql/lib/semmle/javascript/Promises.qll @@ -186,11 +186,13 @@ module Promises { /** * Gets the pseudo-field used to describe resolved values in a promise. */ + overlay[local?] string valueProp() { result = "$PromiseResolveField$" } /** * Gets the pseudo-field used to describe rejected values in a promise. */ + overlay[local?] string errorProp() { result = "$PromiseRejectField$" } /** A property set containing the pseudo-properites of a promise object. */ @@ -236,6 +238,7 @@ module PromiseTypeTracking { * * These type-tracking steps are already included in the default type-tracking steps (through `PreCallGraphStep`). */ + overlay[caller?] pragma[inline] DataFlow::Node promiseStep(DataFlow::Node pred, StepSummary summary) { exists(string field | field = Promises::valueProp() | @@ -254,6 +257,7 @@ module PromiseTypeTracking { * Gets the result from a single step through a promise, from `pred` with tracker `t2` to `result` with tracker `t`. * This can be loading a resolved value from a promise, storing a value in a promise, or copying a resolved value from one promise to another. */ + overlay[caller?] pragma[inline] DataFlow::SourceNode promiseStep( DataFlow::SourceNode pred, DataFlow::TypeTracker t, DataFlow::TypeTracker t2 diff --git a/javascript/ql/lib/semmle/javascript/Regexp.qll b/javascript/ql/lib/semmle/javascript/Regexp.qll index ea2993ae7da..c42df3939c2 100644 --- a/javascript/ql/lib/semmle/javascript/Regexp.qll +++ b/javascript/ql/lib/semmle/javascript/Regexp.qll @@ -4,6 +4,8 @@ * Regular expression literals are represented as an abstract syntax tree of regular expression * terms. */ +overlay[local?] +module; import javascript private import semmle.javascript.dataflow.InferredTypes @@ -150,6 +152,7 @@ class RegExpTerm extends Locatable, @regexpterm { * /[a-z]+/g; // YES - Regexp literals are always used as regexp * ``` */ + overlay[global] predicate isUsedAsRegExp() { exists(RegExpParent parent | parent = this.getRootTerm().getParent() | parent instanceof RegExpLiteral @@ -964,6 +967,7 @@ class RegExpParseError extends Error, @regexp_parse_error { /** * Holds if `func` is a method defined on `String.prototype` with name `name`. */ +overlay[global] private predicate isNativeStringMethod(Function func, string name) { exists(ExternalInstanceMemberDecl decl | decl.hasQualifiedName("String", name) and @@ -975,6 +979,7 @@ private predicate isNativeStringMethod(Function func, string name) { * Holds if `name` is the name of a property on a Match object returned by `String.prototype.match`, * not including array indices. */ +overlay[global] private predicate isMatchObjectProperty(string name) { any(ExternalInstanceMemberDecl decl).hasQualifiedName("Array", name) or @@ -982,6 +987,7 @@ private predicate isMatchObjectProperty(string name) { } /** Holds if `call` is a call to `match` whose result is used in a way that is incompatible with Match objects. */ +overlay[global] private predicate isUsedAsNonMatchObject(DataFlow::MethodCallNode call) { call.getMethodName() = ["match", "matchAll"] and call.getNumArgument() = 1 and @@ -1006,10 +1012,11 @@ private predicate isUsedAsNonMatchObject(DataFlow::MethodCallNode call) { /** * Holds if `value` is used in a way that suggests it returns a number. */ +overlay[global] pragma[inline] private predicate isUsedAsNumber(DataFlow::LocalSourceNode value) { any(Comparison compare) - .hasOperands(value.getALocalUse().asExpr(), any(Expr e | e.analyze().getAType() = TTNumber())) + .hasOperands(value.getALocalUse().asExpr(), any(Expr e | canBeNumber(e.analyze()))) or value.flowsToExpr(any(ArithmeticExpr e).getAnOperand()) or @@ -1024,20 +1031,31 @@ private predicate isUsedAsNumber(DataFlow::LocalSourceNode value) { ) } +bindingset[node] +overlay[global] +pragma[inline_late] +private predicate canBeString(DataFlow::AnalyzedNode node) { node.getAType() = TTString() } + +bindingset[node] +overlay[global] +pragma[inline_late] +private predicate canBeNumber(DataFlow::AnalyzedNode node) { node.getAType() = TTNumber() } + /** * Holds if `source` may be interpreted as a regular expression. */ +overlay[global] cached predicate isInterpretedAsRegExp(DataFlow::Node source) { Stages::Taint::ref() and - source.analyze().getAType() = TTString() and + canBeString(source) and ( // The first argument to an invocation of `RegExp` (with or without `new`). source = DataFlow::globalVarRef("RegExp").getAnInvocation().getArgument(0) or // The argument of a call that coerces the argument to a regular expression. exists(DataFlow::MethodCallNode mce, string methodName | - mce.getReceiver().analyze().getAType() = TTString() and + canBeString(mce.getReceiver()) and mce.getMethodName() = methodName and not exists(Function func | func = mce.getACallee() | not isNativeStringMethod(func, methodName) @@ -1073,6 +1091,7 @@ predicate isInterpretedAsRegExp(DataFlow::Node source) { * Gets a node whose value may flow (inter-procedurally) to `re`, where it is interpreted * as a part of a regular expression. */ +overlay[global] private DataFlow::Node regExpSource(DataFlow::Node re, DataFlow::TypeBackTracker t) { t.start() and re = result and @@ -1090,6 +1109,7 @@ private DataFlow::Node regExpSource(DataFlow::Node re, DataFlow::TypeBackTracker * Gets a node whose value may flow (inter-procedurally) to `re`, where it is interpreted * as a part of a regular expression. */ +overlay[global] private DataFlow::Node regExpSource(DataFlow::Node re) { result = regExpSource(re, DataFlow::TypeBackTracker::end()) } @@ -1098,6 +1118,7 @@ private DataFlow::Node regExpSource(DataFlow::Node re) { * A node whose value may flow to a position where it is interpreted * as a part of a regular expression. */ +overlay[global] abstract class RegExpPatternSource extends DataFlow::Node { /** * Gets a node where the pattern of this node is parsed as a part of @@ -1126,6 +1147,7 @@ abstract class RegExpPatternSource extends DataFlow::Node { /** * A regular expression literal, viewed as the pattern source for itself. */ +overlay[global] private class RegExpLiteralPatternSource extends RegExpPatternSource, DataFlow::ValueNode { override RegExpLiteral astNode; @@ -1145,6 +1167,7 @@ private class RegExpLiteralPatternSource extends RegExpPatternSource, DataFlow:: * A node whose string value may flow to a position where it is interpreted * as a part of a regular expression. */ +overlay[global] private class StringRegExpPatternSource extends RegExpPatternSource { DataFlow::Node parse; @@ -1169,6 +1192,7 @@ private class StringRegExpPatternSource extends RegExpPatternSource { * A node whose string value may flow to a position where it is interpreted * as a part of a regular expression. */ +overlay[global] private class StringConcatRegExpPatternSource extends RegExpPatternSource { DataFlow::Node parse; @@ -1331,6 +1355,7 @@ module RegExp { /** * Gets the AST of a regular expression object that can flow to `node`. */ + overlay[global] RegExpTerm getRegExpObjectFromNode(DataFlow::Node node) { exists(DataFlow::RegExpCreationNode regexp | regexp.getAReference().flowsTo(node) and @@ -1342,6 +1367,7 @@ module RegExp { * Gets the AST of a regular expression that can flow to `node`, * including `RegExp` objects as well as strings interpreted as regular expressions. */ + overlay[global] RegExpTerm getRegExpFromNode(DataFlow::Node node) { result = getRegExpObjectFromNode(node) or diff --git a/javascript/ql/lib/semmle/javascript/SSA.qll b/javascript/ql/lib/semmle/javascript/SSA.qll index a2c5bf1d34e..04d08c2343f 100644 --- a/javascript/ql/lib/semmle/javascript/SSA.qll +++ b/javascript/ql/lib/semmle/javascript/SSA.qll @@ -73,6 +73,8 @@ * expression in `k` induces a re-capture of `x` to reflect the fact that `x` * is incremented between the two `console.log` calls. */ +overlay[local?] +module; import javascript private import semmle.javascript.dataflow.Refinements diff --git a/javascript/ql/lib/semmle/javascript/Stmt.qll b/javascript/ql/lib/semmle/javascript/Stmt.qll index 93eb1d1dea0..95ae6f5be59 100644 --- a/javascript/ql/lib/semmle/javascript/Stmt.qll +++ b/javascript/ql/lib/semmle/javascript/Stmt.qll @@ -1,4 +1,6 @@ /** Provides classes for working with statements. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/Templates.qll b/javascript/ql/lib/semmle/javascript/Templates.qll index 5e2b4a2d8aa..d6eaef94589 100644 --- a/javascript/ql/lib/semmle/javascript/Templates.qll +++ b/javascript/ql/lib/semmle/javascript/Templates.qll @@ -1,4 +1,6 @@ /** Provides classes for working with ECMAScript 2015-style template expressions. */ +overlay[local?] +module; import javascript @@ -58,6 +60,7 @@ class TemplateLiteral extends Expr, @template_literal { */ int getNumElement() { result = count(this.getAnElement()) } + overlay[global] override predicate isImpure() { this.getAnElement().isImpure() } override string getAPrimaryQlClass() { result = "TemplateLiteral" } diff --git a/javascript/ql/lib/semmle/javascript/Tokens.qll b/javascript/ql/lib/semmle/javascript/Tokens.qll index c9eeef69dfb..cb55a8296e6 100644 --- a/javascript/ql/lib/semmle/javascript/Tokens.qll +++ b/javascript/ql/lib/semmle/javascript/Tokens.qll @@ -1,6 +1,8 @@ /** * Provides classes for working with the token-based representation of JavaScript programs. */ +overlay[local?] +module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/TypeAnnotations.qll b/javascript/ql/lib/semmle/javascript/TypeAnnotations.qll index 6d0a13c4a38..dacc3913e65 100644 --- a/javascript/ql/lib/semmle/javascript/TypeAnnotations.qll +++ b/javascript/ql/lib/semmle/javascript/TypeAnnotations.qll @@ -1,6 +1,8 @@ /** * Provides classes for reasoning about type annotations independently of dialect. */ +overlay[local?] +module; import javascript private import internal.StmtContainers @@ -18,6 +20,7 @@ class TypeAnnotation extends @type_annotation, NodeInStmtContainer { * This can be used to map a type name to the class/interface it refers to, or * associate it with a named type coming from an dependency. */ + overlay[global] TypeNameBindingNode getTypeBinding() { result = this } /** Holds if this is the `any` type. */ @@ -90,6 +93,7 @@ class TypeAnnotation extends @type_annotation, NodeInStmtContainer { * * Holds if this is a reference to the type with qualified name `globalName` relative to the global scope. */ + overlay[global] deprecated predicate hasQualifiedName(string globalName) { UnderlyingTypes::nodeHasUnderlyingType(this, globalName) } @@ -99,6 +103,7 @@ class TypeAnnotation extends @type_annotation, NodeInStmtContainer { * * Holds if this is a reference to the type exported from `moduleName` under the name `exportedName`. */ + overlay[global] deprecated predicate hasQualifiedName(string moduleName, string exportedName) { UnderlyingTypes::nodeHasUnderlyingType(this, moduleName, exportedName) } @@ -107,6 +112,7 @@ class TypeAnnotation extends @type_annotation, NodeInStmtContainer { * Holds if this is a reference to the type with qualified name `globalName` relative to the global scope, * or is declared as a subtype thereof, or is a union or intersection containing such a type. */ + overlay[global] final predicate hasUnderlyingType(string globalName) { UnderlyingTypes::nodeHasUnderlyingType(this, globalName) } @@ -115,6 +121,7 @@ class TypeAnnotation extends @type_annotation, NodeInStmtContainer { * Holds if this is a reference to the type exported from `moduleName` under the name `exportedName`, * or is declared as a subtype thereof, or is a union or intersection containing such a type. */ + overlay[global] final predicate hasUnderlyingType(string moduleName, string exportedName) { UnderlyingTypes::nodeHasUnderlyingType(this, moduleName, exportedName) } @@ -135,6 +142,7 @@ class TypeAnnotation extends @type_annotation, NodeInStmtContainer { * * Note that this has no result for JSDoc type annotations. */ + overlay[global] deprecated Type getType() { none() } /** @@ -142,5 +150,6 @@ class TypeAnnotation extends @type_annotation, NodeInStmtContainer { * * This unfolds nullability modifiers and generic type applications. */ + overlay[global] final DataFlow::ClassNode getClass() { UnderlyingTypes::nodeHasUnderlyingClassType(this, result) } } diff --git a/javascript/ql/lib/semmle/javascript/TypeScript.qll b/javascript/ql/lib/semmle/javascript/TypeScript.qll index 79b71fcd8c0..7772ff3e21a 100644 --- a/javascript/ql/lib/semmle/javascript/TypeScript.qll +++ b/javascript/ql/lib/semmle/javascript/TypeScript.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + import javascript /** @@ -31,6 +34,7 @@ class NamespaceDefinition extends Stmt, @namespace_definition, AST::ValueNode { /** * Gets the canonical name of the namespace being defined. */ + overlay[global] deprecated Namespace getNamespace() { result.getADefinition() = this } } @@ -111,11 +115,13 @@ class TypeDefinition extends AstNode, @type_definition { /** * Gets the canonical name of the type being defined. */ + overlay[global] deprecated TypeName getTypeName() { result.getADefinition() = this } /** * Gets the type defined by this declaration. */ + overlay[global] deprecated Type getType() { ast_node_type(this.getIdentifier(), result) } override string getAPrimaryQlClass() { result = "TypeDefinition" } @@ -221,6 +227,7 @@ class ExternalModuleReference extends Expr, Import, @external_module_reference { } /** A literal path expression appearing in an external module reference. */ +overlay[global] deprecated private class LiteralExternalModulePath extends PathExpr, ConstantString { LiteralExternalModulePath() { exists(ExternalModuleReference emr | this.getParentExpr*() = emr.getExpression()) @@ -268,6 +275,7 @@ class TypeAliasDeclaration extends @type_alias_declaration, TypeParameterized, S /** * Gets the canonical name of the type being defined. */ + overlay[global] deprecated TypeName getTypeName() { result.getADefinition() = this } override string getAPrimaryQlClass() { result = "TypeAliasDeclaration" } @@ -548,6 +556,7 @@ class LocalNamespaceName extends @local_namespace_name, LexicalName { /** * Gets the canonical name of the namespace referenced by this name. */ + overlay[global] deprecated Namespace getNamespace() { result = this.getADeclaration().getNamespace() } override DeclarationSpace getDeclarationSpace() { result = "namespace" } @@ -568,6 +577,7 @@ class TypeExpr extends ExprOrType, @typeexpr, TypeAnnotation { * Has no result if this occurs in a TypeScript file that was extracted * without type information. */ + overlay[global] deprecated override Type getType() { ast_node_type(this, result) } override Stmt getEnclosingStmt() { result = ExprOrType.super.getEnclosingStmt() } @@ -692,6 +702,7 @@ class TypeAccess extends @typeaccess, TypeExpr, TypeRef { /** * Gets the canonical name of the type being accessed. */ + overlay[global] deprecated TypeName getTypeName() { ast_node_symbol(this, result) } override string getAPrimaryQlClass() { result = "TypeAccess" } @@ -1379,6 +1390,7 @@ class LocalNamespaceDecl extends VarDecl, NamespaceRef { /** * Gets the canonical name of the namespace being defined or aliased by this name. */ + overlay[global] deprecated Namespace getNamespace() { ast_node_symbol(this, result) } } @@ -1397,6 +1409,7 @@ class NamespaceAccess extends TypeExpr, NamespaceRef, @namespace_access { /** * Gets the canonical name of the namespace being accessed. */ + overlay[global] deprecated Namespace getNamespace() { ast_node_symbol(this, result) } override string getAPrimaryQlClass() { result = "NamespaceAccess" } @@ -1506,6 +1519,7 @@ class EnumDeclaration extends NamespaceDefinition, @enum_declaration, AST::Value /** * Gets the canonical name of the type being defined. */ + overlay[global] deprecated TypeName getTypeName() { ast_node_symbol(this, result) } /** @@ -1594,6 +1608,7 @@ class EnumMember extends AstNode, @enum_member { /** * Gets the canonical name of the type defined by this enum member. */ + overlay[global] deprecated TypeName getTypeName() { ast_node_symbol(this, result) } override string getAPrimaryQlClass() { result = "EnumMember" } @@ -1762,6 +1777,7 @@ class TypeRootFolder extends Folder { /** * Gets the priority with which this type root folder should be used from within the given search root. */ + overlay[global] int getSearchPriority(Folder searchRoot) { findNodeModulesFolder(searchRoot, this.getNodeModulesFolder(), result) } @@ -1780,6 +1796,7 @@ class TypeRootFolder extends Folder { * For instance, there may be many AST nodes representing different uses of the * `number` keyword, but there only exists one `number` type. */ +overlay[global] deprecated class Type extends @type { /** * Gets a string representation of this type. @@ -1984,6 +2001,7 @@ deprecated class Type extends @type { * * A union type or intersection type, such as `string | number` or `T & U`. */ +overlay[global] deprecated class UnionOrIntersectionType extends Type, @union_or_intersection_type { /** * Gets the `i`th member of this union or intersection, starting at 0. @@ -2012,6 +2030,7 @@ deprecated class UnionOrIntersectionType extends Type, @union_or_intersection_ty * Note that the `boolean` type is represented as the union `true | false`, * but is still displayed as `boolean` in string representations. */ +overlay[global] deprecated class UnionType extends UnionOrIntersectionType, @union_type { } /** @@ -2022,6 +2041,7 @@ deprecated class UnionType extends UnionOrIntersectionType, @union_type { } * * An intersection type, such as `T & {x: number}`. */ +overlay[global] deprecated class IntersectionType extends UnionOrIntersectionType, @intersection_type { } /** @@ -2040,6 +2060,7 @@ deprecated class IntersectionType extends UnionOrIntersectionType, @intersection * Foreign array-like objects such as `HTMLCollection` are not normal JavaScript arrays, * and their corresponding types are not considered array types either. */ +overlay[global] deprecated class ArrayType extends Type { ArrayType() { this instanceof @tuple_type or @@ -2061,6 +2082,7 @@ deprecated class ArrayType extends Type { * * An array type such as `Array`, or equivalently, `string[]`. */ +overlay[global] deprecated class PlainArrayType extends ArrayType, TypeReference { PlainArrayType() { this.hasQualifiedName("Array") } @@ -2075,6 +2097,7 @@ deprecated class PlainArrayType extends ArrayType, TypeReference { * * A read-only array type such as `ReadonlyArray`. */ +overlay[global] deprecated class ReadonlyArrayType extends ArrayType, TypeReference { ReadonlyArrayType() { this.hasQualifiedName("ReadonlyArray") } } @@ -2087,6 +2110,7 @@ deprecated class ReadonlyArrayType extends ArrayType, TypeReference { * * A tuple type, such as `[number, string]`. */ +overlay[global] deprecated class TupleType extends ArrayType, @tuple_type { /** * Gets the `i`th member of this tuple type, starting at 0. @@ -2148,6 +2172,7 @@ deprecated class TupleType extends ArrayType, @tuple_type { * * The predefined `any` type. */ +overlay[global] deprecated class AnyType extends Type, @any_type { } /** @@ -2158,6 +2183,7 @@ deprecated class AnyType extends Type, @any_type { } * * The predefined `unknown` type. */ +overlay[global] deprecated class UnknownType extends Type, @unknown_type { } /** @@ -2168,6 +2194,7 @@ deprecated class UnknownType extends Type, @unknown_type { } * * The predefined `string` type. */ +overlay[global] deprecated class StringType extends Type, @string_type { } /** @@ -2178,6 +2205,7 @@ deprecated class StringType extends Type, @string_type { } * * The predefined `number` type. */ +overlay[global] deprecated class NumberType extends Type, @number_type { } /** @@ -2188,6 +2216,7 @@ deprecated class NumberType extends Type, @number_type { } * * The predefined `bigint` type. */ +overlay[global] deprecated class BigIntType extends Type, @bigint_type { } /** @@ -2198,6 +2227,7 @@ deprecated class BigIntType extends Type, @bigint_type { } * * A boolean, number, or string literal type. */ +overlay[global] deprecated class LiteralType extends Type, @literal_type { /** * Gets the string value of this literal. @@ -2213,6 +2243,7 @@ deprecated class LiteralType extends Type, @literal_type { * * The boolean literal type `true` or `false`. */ +overlay[global] deprecated class BooleanLiteralType extends LiteralType, @boolean_literal_type { /** * Gets the boolean value represented by this type. @@ -2227,6 +2258,7 @@ deprecated class BooleanLiteralType extends LiteralType, @boolean_literal_type { /** * A number literal as a static type. */ +overlay[global] deprecated class NumberLiteralType extends LiteralType, @number_literal_type { override string getStringValue() { type_literal_value(this, result) } @@ -2249,6 +2281,7 @@ deprecated class NumberLiteralType extends LiteralType, @number_literal_type { * * A string literal as a static type. */ +overlay[global] deprecated class StringLiteralType extends LiteralType, @string_literal_type { override string getStringValue() { type_literal_value(this, result) } } @@ -2261,6 +2294,7 @@ deprecated class StringLiteralType extends LiteralType, @string_literal_type { * * A bigint literal as a static type. */ +overlay[global] deprecated class BigIntLiteralType extends LiteralType { override string getStringValue() { type_literal_value(this, result) } @@ -2283,6 +2317,7 @@ deprecated class BigIntLiteralType extends LiteralType { * * The `boolean` type, internally represented as the union type `true | false`. */ +overlay[global] deprecated class BooleanType extends UnionType { BooleanType() { this.getAnElementType() instanceof @true_type and @@ -2299,6 +2334,7 @@ deprecated class BooleanType extends UnionType { * * The `string` type or a string literal type. */ +overlay[global] deprecated class StringLikeType extends Type { StringLikeType() { this instanceof StringType or @@ -2314,6 +2350,7 @@ deprecated class StringLikeType extends Type { * * The `number` type or a number literal type. */ +overlay[global] deprecated class NumberLikeType extends Type { NumberLikeType() { this instanceof NumberType or @@ -2329,6 +2366,7 @@ deprecated class NumberLikeType extends Type { * * The `boolean`, `true,` or `false` type. */ +overlay[global] deprecated class BooleanLikeType extends Type { BooleanLikeType() { this instanceof BooleanType or @@ -2344,6 +2382,7 @@ deprecated class BooleanLikeType extends Type { * * The `void` type. */ +overlay[global] deprecated class VoidType extends Type, @void_type { } /** @@ -2354,6 +2393,7 @@ deprecated class VoidType extends Type, @void_type { } * * The `undefined` type. */ +overlay[global] deprecated class UndefinedType extends Type, @undefined_type { } /** @@ -2364,6 +2404,7 @@ deprecated class UndefinedType extends Type, @undefined_type { } * * The `null` type. */ +overlay[global] deprecated class NullType extends Type, @null_type { } /** @@ -2374,6 +2415,7 @@ deprecated class NullType extends Type, @null_type { } * * The `never` type. */ +overlay[global] deprecated class NeverType extends Type, @never_type { } /** @@ -2384,6 +2426,7 @@ deprecated class NeverType extends Type, @never_type { } * * The `symbol` type or a specific `unique symbol` type. */ +overlay[global] deprecated class SymbolType extends Type, @symbol_type { } /** @@ -2394,6 +2437,7 @@ deprecated class SymbolType extends Type, @symbol_type { } * * The `symbol` type. */ +overlay[global] deprecated class PlainSymbolType extends SymbolType, @plain_symbol_type { } /** @@ -2404,6 +2448,7 @@ deprecated class PlainSymbolType extends SymbolType, @plain_symbol_type { } * * A `unique symbol` type. */ +overlay[global] deprecated class UniqueSymbolType extends SymbolType, @unique_symbol_type { /** * Gets the canonical name of the variable exposing the symbol. @@ -2438,6 +2483,7 @@ deprecated class UniqueSymbolType extends SymbolType, @unique_symbol_type { * * The `object` type. */ +overlay[global] deprecated class ObjectKeywordType extends Type, @objectkeyword_type { } /** @@ -2448,6 +2494,7 @@ deprecated class ObjectKeywordType extends Type, @objectkeyword_type { } * * A type that refers to a class, interface, enum, or enum member. */ +overlay[global] deprecated class TypeReference extends Type, @type_reference { /** * Gets the canonical name of the type being referenced. @@ -2506,6 +2553,7 @@ deprecated class TypeReference extends Type, @type_reference { * * A type that refers to a class, possibly with type arguments. */ +overlay[global] deprecated class ClassType extends TypeReference { ClassDefinition declaration; @@ -2525,6 +2573,7 @@ deprecated class ClassType extends TypeReference { * * A type that refers to an interface, possibly with type arguents. */ +overlay[global] deprecated class InterfaceType extends TypeReference { InterfaceDeclaration declaration; @@ -2544,6 +2593,7 @@ deprecated class InterfaceType extends TypeReference { * * A type that refers to an enum. */ +overlay[global] deprecated class EnumType extends TypeReference { EnumDeclaration declaration; @@ -2563,6 +2613,7 @@ deprecated class EnumType extends TypeReference { * * A type that refers to the value of an enum member. */ +overlay[global] deprecated class EnumLiteralType extends TypeReference { EnumMember declaration; @@ -2582,6 +2633,7 @@ deprecated class EnumLiteralType extends TypeReference { * * A type that refers to a type alias. */ +overlay[global] deprecated class TypeAliasReference extends TypeReference { TypeAliasReference() { type_alias(this, _) } @@ -2601,6 +2653,7 @@ deprecated class TypeAliasReference extends TypeReference { * * An anonymous interface type, such as `{ x: number }`. */ +overlay[global] deprecated class AnonymousInterfaceType extends Type, @object_type { } /** @@ -2611,6 +2664,7 @@ deprecated class AnonymousInterfaceType extends Type, @object_type { } * * A type that refers to a type variable. */ +overlay[global] deprecated class TypeVariableType extends Type, @typevariable_type { /** * Gets a syntactic declaration of this type variable. @@ -2656,6 +2710,7 @@ deprecated class TypeVariableType extends Type, @typevariable_type { * * A type that refers to a type variable declared on a class, interface or function. */ +overlay[global] deprecated class CanonicalTypeVariableType extends TypeVariableType, @canonical_type_variable_type { override TypeName getHostType() { result = this.getCanonicalName().getParent() } @@ -2681,6 +2736,7 @@ deprecated class CanonicalTypeVariableType extends TypeVariableType, @canonical_ * - `(x: T) => T` * - `(x: S, y: T) => T`. */ +overlay[global] deprecated class LexicalTypeVariableType extends TypeVariableType, @lexical_type_variable_type { override string getName() { types(this, _, result) // The toString value contains the name. @@ -2703,6 +2759,7 @@ deprecated class LexicalTypeVariableType extends TypeVariableType, @lexical_type * } * ``` */ +overlay[global] deprecated class ThisType extends Type, @this_type { /** * Gets the type containing the `this` type. @@ -2721,6 +2778,7 @@ deprecated class ThisType extends Type, @this_type { * The type of a named value, `typeof X`, typically denoting the type of * a class constructor, namespace object, enum object, or module object. */ +overlay[global] deprecated class TypeofType extends Type, @typeof_type { /** * Gets the canonical name of the named value. @@ -2801,6 +2859,7 @@ module SignatureKind { * * A function or constructor signature in a TypeScript type. */ +overlay[global] deprecated class CallSignatureType extends @signature_type { /** * Gets a value indicating if this is a function or constructor signature. @@ -2955,6 +3014,7 @@ deprecated class CallSignatureType extends @signature_type { * * A function call signature in a type, that is, a signature without the `new` keyword. */ +overlay[global] deprecated class FunctionCallSignatureType extends CallSignatureType, @function_signature_type { } /** @@ -2965,6 +3025,7 @@ deprecated class FunctionCallSignatureType extends CallSignatureType, @function_ * * A constructor call signature in a type, that is, a signature with the `new` keyword. */ +overlay[global] deprecated class ConstructorCallSignatureType extends CallSignatureType, @constructor_signature_type { } @@ -2976,6 +3037,7 @@ deprecated class ConstructorCallSignatureType extends CallSignatureType, @constr * - It has one type parameter, say, `T` * - It has a `then` method whose first argument is a callback that takes a `T` as argument. */ +overlay[global] deprecated private class PromiseTypeName extends TypeName { PromiseTypeName() { // The name must suggest it is a promise. @@ -3005,6 +3067,7 @@ deprecated private class PromiseTypeName extends TypeName { * This includes types whose name and `then` method signature suggest it is a promise, * such as `PromiseLike` and `Thenable`. */ +overlay[global] deprecated class PromiseType extends TypeReference { PromiseType() { this.getNumTypeArgument() = 1 and diff --git a/javascript/ql/lib/semmle/javascript/Variables.qll b/javascript/ql/lib/semmle/javascript/Variables.qll index adc0ad5b9c8..aa97233af49 100644 --- a/javascript/ql/lib/semmle/javascript/Variables.qll +++ b/javascript/ql/lib/semmle/javascript/Variables.qll @@ -1,4 +1,6 @@ /** Provides classes for modeling program variables. */ +overlay[local?] +module; import javascript @@ -62,6 +64,7 @@ class LocalScope extends Scope { */ class ModuleScope extends Scope, @module_scope { /** Gets the module that induces this scope. */ + overlay[global] Module getModule() { result = this.getScopeElement() } override string toString() { result = "module scope" } @@ -256,6 +259,7 @@ class VarRef extends @varref, Identifier, BindingPattern, LexicalRef { override VarRef getABindingVarRef() { result = this } + overlay[global] override predicate isImpure() { none() } override Expr getUnderlyingReference() { result = this } @@ -543,6 +547,7 @@ class ArrayPattern extends DestructuringPattern, @array_pattern { /** Holds if this array pattern has an omitted element. */ predicate hasOmittedElement() { this.elementIsOmitted(_) } + overlay[global] override predicate isImpure() { this.getAnElement().isImpure() } override VarRef getABindingVarRef() { @@ -583,6 +588,7 @@ class ObjectPattern extends DestructuringPattern, @object_pattern { /** Gets the rest property pattern of this object pattern, if any. */ override Expr getRest() { result = this.getChildExpr(-1) } + overlay[global] override predicate isImpure() { this.getAPropertyPattern().isImpure() } override VarRef getABindingVarRef() { @@ -640,6 +646,7 @@ class PropertyPattern extends @property, AstNode { ObjectPattern getObjectPattern() { properties(this, result, _, _, _) } /** Holds if this pattern is impure, that is, if its evaluation could have side effects. */ + overlay[global] predicate isImpure() { this.isComputed() and this.getNameExpr().isImpure() or @@ -844,6 +851,7 @@ class SimpleParameter extends Parameter, VarDecl { * Gets a use of this parameter that refers to its initial value as * passed in from the caller. */ + overlay[global] VarUse getAnInitialUse() { exists(SsaDefinition ssa | ssa.getAContributingVarDef() = this and diff --git a/javascript/ql/lib/semmle/javascript/XML.qll b/javascript/ql/lib/semmle/javascript/XML.qll index 54157809260..e4073362fc6 100644 --- a/javascript/ql/lib/semmle/javascript/XML.qll +++ b/javascript/ql/lib/semmle/javascript/XML.qll @@ -1,6 +1,8 @@ /** * Provides classes and predicates for working with XML files and their content. */ +overlay[local?] +module; import semmle.files.FileSystem private import codeql.xml.Xml diff --git a/javascript/ql/lib/semmle/javascript/YAML.qll b/javascript/ql/lib/semmle/javascript/YAML.qll index a312d78b6fb..21b0825c861 100644 --- a/javascript/ql/lib/semmle/javascript/YAML.qll +++ b/javascript/ql/lib/semmle/javascript/YAML.qll @@ -4,6 +4,8 @@ * YAML documents are represented as abstract syntax trees whose nodes * are either YAML values or alias nodes referring to another YAML value. */ +overlay[local?] +module; import javascript private import codeql.yaml.Yaml as LibYaml diff --git a/javascript/ql/lib/semmle/javascript/dataflow/AbstractValues.qll b/javascript/ql/lib/semmle/javascript/dataflow/AbstractValues.qll index 41509516cc1..8692f1b6ff3 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/AbstractValues.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/AbstractValues.qll @@ -37,6 +37,8 @@ * they represent; additionally, indefinite abstract values record * the source of imprecision that caused them to arise. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.AbstractValuesImpl @@ -57,6 +59,7 @@ class AbstractValue extends TAbstractValue { * Gets the Boolean value some concrete value represented by this * abstract value coerces to. */ + pragma[nomagic] abstract boolean getBooleanValue(); /** @@ -97,6 +100,7 @@ class AbstractValue extends TAbstractValue { * In all cases, purely local flow tracking is used to find prototype objects, so * this predicate cannot be relied on to compute all possible prototype objects. */ + overlay[global] DefiniteAbstractValue getAPrototype() { exists(AbstractProtoProperty proto | proto.getBase() = this and diff --git a/javascript/ql/lib/semmle/javascript/dataflow/AdditionalFlowSteps.qll b/javascript/ql/lib/semmle/javascript/dataflow/AdditionalFlowSteps.qll index d0deff8788c..3b59fc52952 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/AdditionalFlowSteps.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/AdditionalFlowSteps.qll @@ -33,21 +33,25 @@ private import semmle.javascript.internal.CachedStages * Note: For performance reasons, all subclasses of this class should be part * of the standard library. Use `isAdditionalFlowStep` for query-specific flow steps. */ +overlay[local?] class AdditionalFlowStep extends Unit { /** * Holds if `pred` → `succ` should be considered a value-preserving data flow edge.f */ + overlay[global] predicate step(DataFlow::Node pred, DataFlow::Node succ) { none() } /** * Holds if `pred` → `succ` should be considered a value-preserving data flow edge that * crosses calling contexts. */ + overlay[global] predicate jumpStep(DataFlow::Node pred, DataFlow::Node succ) { none() } /** * Holds if `pred` should be stored in the given `content` of the object `succ`. */ + overlay[global] predicate storeStep(DataFlow::Node pred, DataFlow::ContentSet contents, DataFlow::Node succ) { none() } @@ -55,6 +59,7 @@ class AdditionalFlowStep extends Unit { /** * Holds if the given `content` of the object in `pred` should be read into `succ`. */ + overlay[global] predicate readStep(DataFlow::Node pred, DataFlow::ContentSet contents, DataFlow::Node succ) { none() } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll b/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll index f773000c8cc..ffbb9e497b0 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Configuration.qll @@ -625,15 +625,19 @@ abstract deprecated class LabeledBarrierGuardNode extends BarrierGuardNode { * * For use with load/store steps in `DataFlow::SharedFlowStep` and TypeTracking. */ +overlay[local?] module PseudoProperties { /** Holds if `s` is a pseudo-property. */ bindingset[s] + overlay[caller?] predicate isPseudoProperty(string s) { s.matches("$%$") } bindingset[s] + overlay[caller?] private string pseudoProperty(string s) { result = "$" + s + "$" } bindingset[s, v] + overlay[caller?] private string pseudoProperty(string s, string v) { result = "$" + s + "|" + v + "$" } /** @@ -680,6 +684,7 @@ module PseudoProperties { * Gets a pseudo-property for the location of a map value where the key is `key`. * The string value of the `key` is encoded in the result, and there is only a result if the string value of `key` is known. */ + overlay[caller?] pragma[inline] string mapValueKnownKey(DataFlow::Node key) { result = mapValueKey(any(string s | key.mayHaveStringValue(s))) @@ -689,17 +694,20 @@ module PseudoProperties { * Gets a pseudo-property for the location of a map value where the key is `key`. */ bindingset[key] + overlay[caller?] string mapValueKey(string key) { result = pseudoProperty("mapValue", key) } /** * Holds if `prop` equals `mapValueKey(key)` for some value of `key`. */ bindingset[prop] + overlay[caller?] predicate isMapValueKey(string prop) { prop.matches("$mapValue|%$") } /** * Gets a pseudo-property for the location of a map value where the key is `key`. */ + overlay[caller?] pragma[inline] string mapValue(DataFlow::Node key) { result = mapValueKnownKey(key) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/CustomAbstractValueDefinitions.qll b/javascript/ql/lib/semmle/javascript/dataflow/CustomAbstractValueDefinitions.qll index 5a762f4aa1b..e4cc05595ec 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/CustomAbstractValueDefinitions.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/CustomAbstractValueDefinitions.qll @@ -7,6 +7,8 @@ * For performance reasons, all subclasses of `CustomAbstractValueDefinition` * should be part of the standard library. */ +overlay[local?] +module; private import javascript private import internal.AbstractValuesImpl @@ -32,6 +34,7 @@ class CustomAbstractValueFromDefinition extends AbstractValue, TCustomAbstractVa override predicate isIndefinite(DataFlow::Incompleteness cause) { def.isIndefinite(cause) } + overlay[global] override DefiniteAbstractValue getAPrototype() { result = def.getAPrototype() } override predicate hasLocationInfo( @@ -98,6 +101,7 @@ abstract class CustomAbstractValueDefinition extends Locatable { * Gets an abstract value that represents a prototype object of the * induced abstract value. */ + overlay[global] AbstractValue getAPrototype() { exists(AbstractProtoProperty proto | proto.getBase() = this.getAbstractValue() and @@ -119,6 +123,7 @@ abstract class CustomAbstractValueDefinition extends Locatable { /** * Flow analysis for custom abstract values. */ +overlay[global] class CustomAbstractValueFromDefinitionNode extends DataFlow::AnalyzedNode, DataFlow::ValueNode { CustomAbstractValueFromDefinition val; diff --git a/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll b/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll index 071d6d08433..a24d7976b3d 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll @@ -17,6 +17,8 @@ * Flow through global variables, object properties or function calls is not * modeled (except for immediately invoked functions as explained above). */ +overlay[local?] +module; import javascript private import internal.CallGraphs @@ -64,9 +66,11 @@ module DataFlow { * `p.getALocalSource()` does _not_ return the corresponding argument, and * `p.isIncomplete("call")` holds. */ + overlay[global] predicate isIncomplete(Incompleteness cause) { isIncomplete(this, cause) } /** Gets type inference results for this data flow node. */ + overlay[global] AnalyzedNode analyze() { result = this } /** Gets the expression corresponding to this data flow node, if any. */ @@ -124,11 +128,13 @@ module DataFlow { int getIntValue() { result = this.asExpr().getIntValue() } /** Gets a function value that may reach this node. */ + overlay[global] final FunctionNode getAFunctionValue() { CallGraph::getAFunctionReference(result, 0).flowsTo(this) } /** Gets a function value that may reach this node with the given `imprecision` level. */ + overlay[global] final FunctionNode getAFunctionValue(int imprecision) { CallGraph::getAFunctionReference(result, imprecision).flowsTo(this) } @@ -137,6 +143,7 @@ module DataFlow { * Gets a function value that may reach this node, * possibly derived from a partial function invocation. */ + overlay[global] final FunctionNode getABoundFunctionValue(int boundArgs) { result = this.getAFunctionValue() and boundArgs = 0 or @@ -192,6 +199,7 @@ module DataFlow { FlowSteps::identityFunctionStep(result, this) } + overlay[global] private NameResolution::Node getNameResolutionNode() { this = valueNode(result) or @@ -205,6 +213,7 @@ module DataFlow { * Holds if this node is annotated with the given named type, * or is declared as a subtype thereof, or is a union or intersection containing such a type. */ + overlay[global] cached predicate hasUnderlyingType(string globalName) { Stages::TypeTracking::ref() and @@ -218,6 +227,7 @@ module DataFlow { * Holds if this node is annotated with the given named type, * or is declared as a subtype thereof, or is a union or intersection containing such a type. */ + overlay[global] cached predicate hasUnderlyingType(string moduleName, string typeName) { Stages::TypeTracking::ref() and @@ -466,6 +476,7 @@ module DataFlow { /** * Gets an accessor (`get` or `set` method) that may be invoked by this property reference. */ + overlay[global] final DataFlow::FunctionNode getAnAccessorCallee() { result = CallGraph::getAnAccessorCallee(this) } @@ -1419,11 +1430,13 @@ module DataFlow { * This predicate is only defined for expressions, properties, and for statements that declare * a function, a class, or a TypeScript namespace or enum. */ + pragma[nomagic] ValueNode valueNode(AstNode nd) { result.getAstNode() = nd } /** * Gets the data flow node corresponding to `e`. */ + overlay[caller?] pragma[inline] ExprNode exprNode(Expr e) { result = valueNode(e) } @@ -1762,6 +1775,7 @@ module DataFlow { ) } + overlay[global] private class ReflectiveParamsStep extends LegacyPreCallGraphStep { override predicate loadStep(DataFlow::Node obj, DataFlow::Node element, string prop) { exists(DataFlow::ReflectiveParametersNode params, DataFlow::FunctionNode f, int i | @@ -1774,6 +1788,7 @@ module DataFlow { } /** A taint step from the reflective parameters node to any parameter. */ + overlay[global] private class ReflectiveParamsTaintStep extends TaintTracking::LegacyTaintStep { override predicate step(DataFlow::Node obj, DataFlow::Node element) { exists(DataFlow::ReflectiveParametersNode params, DataFlow::FunctionNode f | @@ -1787,6 +1802,7 @@ module DataFlow { /** * Holds if there is a step from `pred` to `succ` through a field accessed through `this` in a class. */ + overlay[global] predicate localFieldStep(DataFlow::Node pred, DataFlow::Node succ) { exists(ClassNode cls, string prop | pred = AccessPath::getAnAssignmentTo(cls.getADirectSuperClass*().getAReceiverNode(), prop) or @@ -1819,6 +1835,7 @@ module DataFlow { * `p.getALocalSource()` does _not_ return the corresponding argument, and * `p.isIncomplete("call")` holds. */ + overlay[global] predicate isIncomplete(Node nd, Incompleteness cause) { exists(SsaVariable ssa | nd = TSsaDefNode(ssa.getDefinition()) | defIsIncomplete(ssa.(SsaExplicitDefinition).getDef(), cause) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll b/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll index eb7160683a7..c4661b321ea 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll @@ -1,4 +1,6 @@ /** Provides classes and predicates for defining flow summaries. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.sharedlib.FlowSummaryImpl as Impl diff --git a/javascript/ql/lib/semmle/javascript/dataflow/InferredTypes.qll b/javascript/ql/lib/semmle/javascript/dataflow/InferredTypes.qll index b7b2b9ba1e5..cfce0fd20cd 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/InferredTypes.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/InferredTypes.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + /** * Types inferred by the flow analysis, represented as type tags. * diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll b/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll index 0e6394a6f55..d854dfc3f62 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll @@ -3,6 +3,8 @@ * as nodes corresponding to function definitions or nodes corresponding to * parameters. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dependencies.Dependencies @@ -158,6 +160,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN * addEventHandler("click", foo.bind(this, "value of x")) * ``` */ + overlay[global] ParameterNode getABoundCallbackParameter(int callback, int param) { exists(int boundArgs | result = @@ -178,6 +181,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN private ObjectLiteralNode getOptionsArgument(int i) { result.flowsTo(this.getArgument(i)) } /** Gets an abstract value representing possible callees of this call site. */ + overlay[global] final AbstractValue getACalleeValue() { exists(DataFlow::Node callee, DataFlow::AnalyzedNode analyzed | pragma[only_bind_into](callee) = this.getCalleeNode() and @@ -192,6 +196,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN * To alter the call graph as seen by the interprocedural data flow libraries, override * the `getACallee(int imprecision)` predicate instead. */ + overlay[global] final Function getACallee() { result = this.getACallee(0) } /** @@ -206,6 +211,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN * This predicate can be overridden to alter the call graph used by the interprocedural * data flow libraries. */ + overlay[global] Function getACallee(int imprecision) { result = CallGraph::getACallee(this, imprecision).getFunction() } @@ -214,6 +220,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN * Holds if the approximation of possible callees for this call site is * affected by the given analysis incompleteness `cause`. */ + overlay[global] predicate isIndefinite(DataFlow::Incompleteness cause) { this.getACalleeValue().isIndefinite(cause) } @@ -229,6 +236,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN * independent contexts, so tracking flow through it leads to * imprecision. */ + overlay[global] predicate isImprecise() { this.isIndefinite("global") and exists(DefiniteAbstractValue v | v = this.getACalleeValue() | not v instanceof AbstractCallable) @@ -238,6 +246,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN * Holds if our approximation of possible callees for this call site is * likely to be incomplete. */ + overlay[global] predicate isIncomplete() { // the flow analysis identifies a source of incompleteness other than // global flow (which usually leads to imprecision rather than incompleteness) @@ -248,6 +257,7 @@ class InvokeNode extends DataFlow::SourceNode instanceof DataFlow::Impl::InvokeN * Holds if our approximation of possible callees for this call site is * likely to be imprecise or incomplete. */ + overlay[global] predicate isUncertain() { this.isImprecise() or this.isIncomplete() } /** @@ -383,6 +393,9 @@ DataFlow::SourceNode globalObjectRef() { // DOM result = globalVariable("window") or + // DOM alias via `document.defaultView` + result = globalVariable("document").getAPropertyRead("defaultView") + or // Node.js result = globalVariable("global") or @@ -763,7 +776,7 @@ module ModuleImportNode { cached ModuleImportNode moduleImport(string path) { // NB. internal modules may be imported with a "node:" prefix - Stages::Imports::ref() and result.getPath() = ["node:" + path, path] + result.getPath() = ["node:" + path, path] } /** @@ -771,6 +784,7 @@ ModuleImportNode moduleImport(string path) { * `require("lodash")` in a context where a package.json file includes * `"lodash"` as a dependency. */ +overlay[global] ModuleImportNode dependencyModuleImport(Dependency dep) { result = dep.getAUse("import").(Import).getImportedModuleNode() } @@ -861,6 +875,7 @@ module MemberKind { * * Additional patterns can be recognized as class nodes, by extending `DataFlow::ClassNode::Range`. */ +overlay[global] class ClassNode extends DataFlow::ValueNode, DataFlow::SourceNode { override AST::ValueNode astNode; AbstractCallable function; @@ -1329,6 +1344,7 @@ class ClassNode extends DataFlow::ValueNode, DataFlow::SourceNode { /** * Helper predicate to get a prototype reference in a file. */ +overlay[global] private DataFlow::PropRef getAPrototypeReferenceInFile(string name, File f) { result.getBase() = AccessPath::getAReferenceOrAssignmentTo(name) and result.getPropertyName() = "prototype" and @@ -1338,6 +1354,7 @@ private DataFlow::PropRef getAPrototypeReferenceInFile(string name, File f) { /** * Helper predicate to get an instantiation in a file. */ +overlay[global] private DataFlow::NewNode getAnInstantiationInFile(string name, File f) { result = AccessPath::getAReferenceTo(name).(DataFlow::LocalSourceNode).getAnInstantiation() and result.getFile() = f @@ -1346,6 +1363,7 @@ private DataFlow::NewNode getAnInstantiationInFile(string name, File f) { /** * Gets a reference to the function `func`, where there exists a read/write of the "prototype" property on that reference. */ +overlay[global] pragma[noinline] private DataFlow::SourceNode getAFunctionValueWithPrototype(AbstractValue func) { exists(result.getAPropertyReference("prototype")) and @@ -1353,6 +1371,7 @@ private DataFlow::SourceNode getAFunctionValueWithPrototype(AbstractValue func) func instanceof AbstractCallable // the join-order goes bad if `func` has type `AbstractFunction`. } +overlay[global] module ClassNode { /** * A dataflow node that should be considered a class node. @@ -1435,6 +1454,7 @@ module ClassNode { * _.partial(fn, x, y, z) * ``` */ +overlay[global] class PartialInvokeNode extends DataFlow::Node instanceof PartialInvokeNode::Range { /** Gets a node holding a callback invoked by this partial invocation node. */ DataFlow::Node getACallbackNode() { @@ -1470,6 +1490,7 @@ class PartialInvokeNode extends DataFlow::Node instanceof PartialInvokeNode::Ran } } +overlay[global] module PartialInvokeNode { /** * A data flow node that performs a partial function application. @@ -1717,6 +1738,7 @@ class RegExpCreationNode extends DataFlow::SourceNode { predicate maybeGlobal() { RegExp::maybeGlobal(this.tryGetFlags()) } /** Gets a data flow node referring to this regular expression. */ + overlay[global] private DataFlow::SourceNode getAReference(DataFlow::TypeTracker t) { t.start() and result = this @@ -1725,6 +1747,7 @@ class RegExpCreationNode extends DataFlow::SourceNode { } /** Gets a data flow node referring to this regular expression. */ + overlay[global] cached DataFlow::SourceNode getAReference() { Stages::FlowSteps::ref() and @@ -1736,6 +1759,7 @@ class RegExpCreationNode extends DataFlow::SourceNode { * A guard node for a variable in a negative condition, such as `x` in `if(!x)`. * Can be added to a `isBarrier` in a data-flow configuration to block flow through such checks. */ +overlay[global] class VarAccessBarrier extends DataFlow::Node { VarAccessBarrier() { exists(ConditionGuardNode guard, SsaRefinementNode refinement | diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Refinements.qll b/javascript/ql/lib/semmle/javascript/dataflow/Refinements.qll index feb0187487e..2fa76caed79 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Refinements.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Refinements.qll @@ -27,6 +27,8 @@ * so the refinement can evaluate to both `true` and `false` for the same * candidate value. */ +overlay[local?] +module; import javascript private import AbstractValues @@ -45,6 +47,7 @@ abstract class RefinementCandidate extends Expr { /** * Gets a refinement value inferred for this expression in context `ctxt`. */ + overlay[global] pragma[nomagic] abstract RefinementValue eval(RefinementContext ctxt); } @@ -64,6 +67,7 @@ class Refinement extends Expr instanceof RefinementCandidate { /** * Gets a refinement value inferred for this expression in context `ctxt`. */ + overlay[global] RefinementValue eval(RefinementContext ctxt) { result = super.eval(ctxt) } } @@ -71,6 +75,7 @@ class Refinement extends Expr instanceof RefinementCandidate { abstract private class LiteralRefinement extends RefinementCandidate, Literal { override SsaSourceVariable getARefinedVar() { none() } + overlay[global] override RefinementValue eval(RefinementContext ctxt) { ctxt.appliesTo(this) and result = this.eval() } @@ -78,16 +83,19 @@ abstract private class LiteralRefinement extends RefinementCandidate, Literal { /** * Gets the refinement value that represents this literal. */ + overlay[global] RefinementValue eval() { result = TAny() } } /** A `null` literal, viewed as a refinement expression. */ private class NullLiteralRefinement extends LiteralRefinement, NullLiteral { + overlay[global] override RefinementValue eval() { result = TValueWithType(TTNull()) } } /** A Boolean literal, viewed as a refinement expression. */ private class BoolRefinement extends LiteralRefinement, BooleanLiteral { + overlay[global] override RefinementValue eval() { exists(boolean b | b.toString() = this.getValue() | result = TBoolConstant(b)) } @@ -95,11 +103,13 @@ private class BoolRefinement extends LiteralRefinement, BooleanLiteral { /** A constant string, viewed as a refinement expression. */ private class StringRefinement extends LiteralRefinement, ConstantString { + overlay[global] override RefinementValue eval() { result = TStringConstant(this.getStringValue()) } } /** A numeric literal, viewed as a refinement expression. */ abstract private class NumberRefinement extends LiteralRefinement, NumberLiteral { + overlay[global] override RefinementValue eval() { result = TValueWithType(TTNumber()) } } @@ -112,6 +122,7 @@ abstract private class NumberRefinement extends LiteralRefinement, NumberLiteral private class IntRefinement extends NumberRefinement, NumberLiteral { IntRefinement() { this.getValue().toInt() = 0 } + overlay[global] override RefinementValue eval() { result = TIntConstant(this.getValue().toInt()) } } @@ -123,6 +134,7 @@ private class UndefinedInRefinement extends RefinementCandidate, { override SsaSourceVariable getARefinedVar() { none() } + overlay[global] override RefinementValue eval(RefinementContext ctxt) { ctxt.appliesTo(this) and result = TValueWithType(TTUndefined()) @@ -135,6 +147,7 @@ private class VariableRefinement extends RefinementCandidate, VarUse { override SsaSourceVariable getARefinedVar() { result = this.getVariable() } + overlay[global] override RefinementValue eval(RefinementContext ctxt) { ctxt.appliesTo(this) and result = ctxt.(VarRefinementContext).getAValue() @@ -149,6 +162,7 @@ private class ParRefinement extends RefinementCandidate, ParExpr { result = this.getExpression().(RefinementCandidate).getARefinedVar() } + overlay[global] override RefinementValue eval(RefinementContext ctxt) { result = this.getExpression().(RefinementCandidate).eval(ctxt) } @@ -162,6 +176,7 @@ private class TypeofRefinement extends RefinementCandidate, TypeofExpr { result = this.getOperand().(RefinementCandidate).getARefinedVar() } + overlay[global] override RefinementValue eval(RefinementContext ctxt) { exists(RefinementValue opVal | opVal = this.getOperand().(RefinementCandidate).eval(ctxt) and @@ -182,6 +197,7 @@ private class EqRefinement extends RefinementCandidate, EqualityTest { result = this.getRightOperand().(RefinementCandidate).getARefinedVar() } + overlay[global] override RefinementValue eval(RefinementContext ctxt) { exists(RefinementCandidate l, RefinementValue lv, RefinementCandidate r, RefinementValue rv | l = this.getLeftOperand() and @@ -220,6 +236,7 @@ private class IndexRefinement extends RefinementCandidate, IndexExpr { result = this.getIndex().(RefinementCandidate).getARefinedVar() } + overlay[global] override RefinementValue eval(RefinementContext ctxt) { exists( RefinementCandidate base, RefinementValue baseVal, RefinementCandidate index, @@ -242,6 +259,7 @@ private class IndexRefinement extends RefinementCandidate, IndexExpr { * if any. */ bindingset[s, i] +overlay[global] private RefinementValue evalIndex(StringConstant s, IntConstant i) { result = TStringConstant(s.getValue().charAt(i.getValue())) } @@ -249,6 +267,7 @@ private RefinementValue evalIndex(StringConstant s, IntConstant i) { /** * A context in which a refinement expression is analyzed. */ +overlay[global] newtype TRefinementContext = /** * A refinement context associated with refinement `ref`, specifying that variable `var` @@ -266,6 +285,7 @@ newtype TRefinementContext = /** * A context in which a refinement expression is analyzed. */ +overlay[global] class RefinementContext extends TRefinementContext { /** * Holds if refinement expression `cand` might be analyzed in this context. @@ -280,6 +300,7 @@ class RefinementContext extends TRefinementContext { * A refinement context specifying that some variable is assumed to have one particular * abstract value. */ +overlay[global] class VarRefinementContext extends RefinementContext, TVarRefinementContext { override predicate appliesTo(RefinementCandidate cand) { exists(AnalyzedRefinement ref, SsaSourceVariable var | diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll b/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll index 7503e5001e0..55614388e7b 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll @@ -5,6 +5,8 @@ * Note that unlike `TypeTracking.qll`, this library only performs * local tracking within a function. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.TypeTracking @@ -192,6 +194,7 @@ class SourceNode extends DataFlow::Node instanceof SourceNode::Range { * * See `TypeTracker` for more details about how to use this. */ + overlay[global] pragma[inline] DataFlow::SourceNode track(TypeTracker t2, TypeTracker t) { t = t2.step(this, result) } @@ -200,6 +203,7 @@ class SourceNode extends DataFlow::Node instanceof SourceNode::Range { * * See `TypeBackTracker` for more details about how to use this. */ + overlay[global] pragma[inline] DataFlow::SourceNode backtrack(TypeBackTracker t2, TypeBackTracker t) { t2 = t.step(result, this) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/TypeInference.qll b/javascript/ql/lib/semmle/javascript/dataflow/TypeInference.qll index 32ad78eb2c6..a5e686a90c2 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/TypeInference.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/TypeInference.qll @@ -92,10 +92,15 @@ class AnalyzedNode extends DataFlow::Node { PrimitiveType getAPrimitiveType() { result = this.getAValue().toPrimitive().getType() } /** Gets a Boolean value that this node evaluates to. */ + bindingset[this] + overlay[caller?] + pragma[inline_late] boolean getABooleanValue() { result = this.getAValue().getBooleanValue() } /** Gets the unique Boolean value that this node evaluates to, if any. */ - boolean getTheBooleanValue() { forex(boolean bv | bv = this.getABooleanValue() | result = bv) } + overlay[caller?] + pragma[inline] + boolean getTheBooleanValue() { result = unique( | | this.getABooleanValue()) } /** Gets the unique type inferred for this node, if any. */ InferredType getTheType() { result = unique(InferredType t | t = this.getAType()) } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/AbstractValuesImpl.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/AbstractValuesImpl.qll index 6bcef1dc412..65f0d24e48d 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/AbstractValuesImpl.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/AbstractValuesImpl.qll @@ -3,6 +3,8 @@ * * Provides a representation for abstract values. */ +overlay[local?] +module; private import javascript import semmle.javascript.dataflow.AbstractValues diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/AccessPaths.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/AccessPaths.qll index 3bcc36a6577..bd992810517 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/AccessPaths.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/AccessPaths.qll @@ -14,6 +14,8 @@ * to the same value have the same access paths, so access paths are neither sound nor * complete as an approximation of expression semantics. */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.CachedStages diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/AdditionalFlowInternal.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/AdditionalFlowInternal.qll index d7f92ce8dd3..ed07ffa7395 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/AdditionalFlowInternal.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/AdditionalFlowInternal.qll @@ -5,6 +5,7 @@ private import semmle.javascript.dataflow.internal.DataFlowPrivate /** * Gets a data-flow node synthesized using `AdditionalFlowInternal#needsSynthesizedNode`. */ +overlay[local?] DataFlow::Node getSynthesizedNode(AstNode node, string tag) { result = TGenericSynthesizedNode(node, tag, _) } @@ -12,6 +13,7 @@ DataFlow::Node getSynthesizedNode(AstNode node, string tag) { /** * An extension to `AdditionalFlowStep` with additional internal-only predicates. */ +overlay[local?] class AdditionalFlowInternal extends DataFlow::AdditionalFlowStep { /** * Holds if a data-flow node should be synthesized for the pair `(node, tag)`. @@ -25,10 +27,12 @@ class AdditionalFlowInternal extends DataFlow::AdditionalFlowStep { /** * Holds if `node` should only permit flow of values stored in `contents`. */ + overlay[global] predicate expectsContent(DataFlow::Node node, DataFlow::ContentSet contents) { none() } /** * Holds if `node` should not permit flow of values stored in `contents`. */ + overlay[global] predicate clearsContent(DataFlow::Node node, DataFlow::ContentSet contents) { none() } } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll index 6dd0ebf0bb1..371fbce77a9 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll @@ -358,25 +358,18 @@ module MakeStateBarrierGuard< } /** - * Gets a logical `and` expression, or parenthesized expression, that contains `guard`. + * Gets any of the ancestors of `guard` that preserves the value of `possibleOutcome`. Includes the guard itself. */ - private Expr getALogicalAndParent(BarrierGuard guard) { - barrierGuardIsRelevant(guard) and result = guard.asExpr() + private Expr getALogicalOperatorParent(BarrierGuard guard, boolean possibleOutcome) { + barrierGuardIsRelevant(guard) and result = guard.asExpr() and possibleOutcome = [true, false] or - result.(LogAndExpr).getAnOperand() = getALogicalAndParent(guard) + result.(LogOrExpr).getAnOperand() = getALogicalOperatorParent(guard, possibleOutcome) and + possibleOutcome = false or - result.getUnderlyingValue() = getALogicalAndParent(guard) - } - - /** - * Gets a logical `or` expression, or parenthesized expression, that contains `guard`. - */ - private Expr getALogicalOrParent(BarrierGuard guard) { - barrierGuardIsRelevant(guard) and result = guard.asExpr() + result.(LogAndExpr).getAnOperand() = getALogicalOperatorParent(guard, possibleOutcome) and + possibleOutcome = true or - result.(LogOrExpr).getAnOperand() = getALogicalOrParent(guard) - or - result.getUnderlyingValue() = getALogicalOrParent(guard) + result.getUnderlyingValue() = getALogicalOperatorParent(guard, possibleOutcome) } final private class FinalFunction = Function; @@ -394,15 +387,7 @@ module MakeStateBarrierGuard< exists(BarrierGuard guard | barrierGuardIsRelevant(guard) and exists(Expr e | - exists(Expr returnExpr | - returnExpr = guard.asExpr() - or - // ad hoc support for conjunctions: - getALogicalAndParent(guard) = returnExpr and guardOutcome = true - or - // ad hoc support for disjunctions: - getALogicalOrParent(guard) = returnExpr and guardOutcome = false - | + exists(Expr returnExpr | returnExpr = getALogicalOperatorParent(guard, guardOutcome) | exists(SsaExplicitDefinition ssa | ssa.getDef().getSource() = returnExpr and ssa.getVariable().getAUse() = this.getAReturnedExpr() diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll index cc4c883381e..67f4e55a5bb 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/CallGraphs.qll @@ -97,9 +97,14 @@ module CallGraph { not exists(read.getPropertyName()) and result = read and // there exists only local reads of the object, nothing else. - forex(DataFlow::Node ref | ref = obj.getALocalUse() and exists(ref.asExpr()) | - ref = [obj, any(DataFlow::PropRead r).getBase()] - ) + objectOnlyUsedForPropRead(obj) + ) + } + + pragma[nomagic] + private predicate objectOnlyUsedForPropRead(DataFlow::ObjectLiteralNode obj) { + forex(DataFlow::Node ref | ref = obj.getALocalUse() and exists(ref.asExpr()) | + ref = [obj, any(DataFlow::PropRead r).getBase()] ) } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/Contents.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/Contents.qll index a5af2737c18..787a766c897 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/Contents.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/Contents.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + private import javascript private import semmle.javascript.frameworks.data.internal.ApiGraphModels as ApiGraphModels private import semmle.javascript.dataflow.internal.FlowSummaryPrivate as FlowSummaryPrivate @@ -194,6 +197,7 @@ module Public { */ class ContentSet extends TContentSet { /** Gets a content that may be stored into when storing into this set. */ + overlay[caller?] pragma[inline] Content getAStoreContent() { result = this.asSingleton() @@ -333,12 +337,14 @@ module Public { /** * A content set containing only the given content. */ + overlay[caller?] pragma[inline] ContentSet singleton(Content content) { result.asSingleton() = content } /** * A content set corresponding to the given property name. */ + overlay[caller?] pragma[inline] ContentSet property(PropertyName name) { result.asSingleton().asPropertyName() = name } @@ -399,6 +405,7 @@ module Public { * If `bound` is too large, it is truncated to the greatest lower bound we can represent. */ bindingset[bound] + overlay[caller?] ContentSet arrayElementLowerBoundFromInt(int bound) { result = arrayElementLowerBound(bound.minimum(getMaxPreciseArrayIndex() + 1)) } @@ -409,6 +416,7 @@ module Public { * If `n` is too large, it is truncated to the greatest lower bound we can represent. */ bindingset[n] + overlay[caller?] ContentSet arrayElementFromInt(int n) { result = arrayElementKnown(n) or @@ -448,6 +456,7 @@ module Public { * If `key` is not one of the keys we track precisely, this is mapped to the unknown key instead. */ bindingset[key] + overlay[caller?] ContentSet mapValueFromKey(string key) { result = mapValueWithKnownKey(key) or @@ -510,6 +519,7 @@ module Public { * are mapped to their corresponding content sets (which are no longer seen as property names). */ bindingset[propertyName] + overlay[caller?] ContentSet fromLegacyProperty(string propertyName) { result = fromLegacyPseudoProperty(propertyName) or diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll index 8d54f639cb0..315c8706bc0 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowNode.qll @@ -3,6 +3,8 @@ * * Contains the raw data type underlying `DataFlow::Node`. */ +overlay[local?] +module; private import javascript private import codeql.util.Boolean diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll index 1a4051ccdf6..f8836e51ad9 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + private import javascript private import semmle.javascript.dataflow.internal.CallGraphs private import semmle.javascript.dataflow.internal.DataFlowNode @@ -310,6 +313,7 @@ private predicate returnNodeImpl(DataFlow::Node node, ReturnKind kind) { kind = MkExceptionalReturnKind() } +overlay[global] private DataFlow::Node getAnOutNodeImpl(DataFlowCall call, ReturnKind kind) { kind = MkNormalReturnKind() and result = call.asOrdinaryCall() or @@ -336,10 +340,12 @@ class ReturnNode extends DataFlow::Node { } /** A node that receives an output from a call. */ +overlay[global] class OutNode extends DataFlow::Node { OutNode() { this = getAnOutNodeImpl(_, _) } } +overlay[global] OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) { result = getAnOutNodeImpl(call, kind) } cached @@ -416,9 +422,11 @@ abstract class LibraryCallable extends string { LibraryCallable() { any() } /** Gets a call to this library callable. */ + overlay[global] DataFlow::InvokeNode getACall() { none() } /** Same as `getACall()` except this does not depend on the call graph or API graph. */ + overlay[global] DataFlow::InvokeNode getACallSimple() { none() } } @@ -432,6 +440,7 @@ abstract class LibraryCallableInternal extends LibraryCallable { * * Same as `getACall()` but is evaluated later and may depend negatively on `getACall()`. */ + overlay[global] DataFlow::InvokeNode getACallStage2() { none() } } @@ -467,6 +476,7 @@ predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition isParameterNodeImpl(p, c, pos) } +overlay[global] private predicate isArgumentNodeImpl(Node n, DataFlowCall call, ArgumentPosition pos) { n = call.asOrdinaryCall().getArgument(pos.asPositional()) or @@ -523,6 +533,7 @@ private predicate isArgumentNodeImpl(Node n, DataFlowCall call, ArgumentPosition ) } +overlay[global] predicate isArgumentNode(ArgumentNode n, DataFlowCall call, ArgumentPosition pos) { isArgumentNodeImpl(n, call, pos) } @@ -545,11 +556,13 @@ DataFlowCallable nodeGetEnclosingCallable(Node node) { node instanceof DataFlow::XmlAttributeNode and result.asFileCallable() = node.getFile() } +overlay[global] newtype TDataFlowType = TFunctionType(Function f) or TInstanceType(DataFlow::ClassNode cls) or TAnyType() +overlay[global] class DataFlowType extends TDataFlowType { string toDebugString() { result = @@ -575,6 +588,7 @@ class DataFlowType extends TDataFlowType { /** * Holds if `t1` is strictly stronger than `t2`. */ +overlay[global] predicate typeStrongerThan(DataFlowType t1, DataFlowType t2) { // 't1' is a subclass of 't2' t1.asInstanceOfClass() = t2.asInstanceOfClass().getADirectSubClass+() @@ -584,6 +598,7 @@ predicate typeStrongerThan(DataFlowType t1, DataFlowType t2) { t2 = TAnyType() } +overlay[global] private DataFlowType getPreciseType(Node node) { exists(Function f | (node = TValueNode(f) or node = TFunctionSelfReferenceNode(f)) and @@ -598,6 +613,7 @@ private DataFlowType getPreciseType(Node node) { result = getPreciseType(node.(PostUpdateNode).getPreUpdateNode()) } +overlay[global] DataFlowType getNodeType(Node node) { result = getPreciseType(node) or @@ -681,19 +697,23 @@ predicate neverSkipInPathGraph(Node node) { node.asExpr() instanceof VarRef } +overlay[global] string ppReprType(DataFlowType t) { none() } +overlay[global] pragma[inline] private predicate compatibleTypesWithAny(DataFlowType t1, DataFlowType t2) { t1 != TAnyType() and t2 = TAnyType() } +overlay[global] pragma[nomagic] private predicate compatibleTypes1(DataFlowType t1, DataFlowType t2) { t1.asInstanceOfClass().getADirectSubClass+() = t2.asInstanceOfClass() } +overlay[global] pragma[inline] predicate compatibleTypes(DataFlowType t1, DataFlowType t2) { t1 = t2 @@ -742,6 +762,7 @@ class ContentApprox extends TContentApprox { } } +overlay[global] pragma[inline] ContentApprox getContentApprox(Content c) { c instanceof MkPropertyContent and result = TApproxPropertyContent() @@ -767,6 +788,7 @@ ContentApprox getContentApprox(Content c) { c instanceof MkCapturedContent and result = TApproxCapturedContent() } +overlay[global] cached private newtype TDataFlowCall = MkOrdinaryCall(DataFlow::InvokeNode node) or @@ -791,6 +813,7 @@ private newtype TDataFlowCall = FlowSummaryImpl::Private::summaryCallbackRange(c, receiver) } +overlay[global] class DataFlowCall extends TDataFlowCall { DataFlowCallable getEnclosingCallable() { none() } // Overridden in subclass @@ -816,6 +839,7 @@ class DataFlowCall extends TDataFlowCall { Location getLocation() { none() } // Overridden in subclass } +overlay[global] private class OrdinaryCall extends DataFlowCall, MkOrdinaryCall { private DataFlow::InvokeNode node; @@ -832,6 +856,7 @@ private class OrdinaryCall extends DataFlowCall, MkOrdinaryCall { override Location getLocation() { result = node.getLocation() } } +overlay[global] private class PartialCall extends DataFlowCall, MkPartialCall { private DataFlow::PartialInvokeNode node; private DataFlow::Node callback; @@ -851,6 +876,7 @@ private class PartialCall extends DataFlowCall, MkPartialCall { override Location getLocation() { result = node.getLocation() } } +overlay[global] private class BoundCall extends DataFlowCall, MkBoundCall { private DataFlow::InvokeNode node; private int boundArgs; @@ -868,6 +894,7 @@ private class BoundCall extends DataFlowCall, MkBoundCall { override Location getLocation() { result = node.getLocation() } } +overlay[global] private class AccessorCall extends DataFlowCall, MkAccessorCall { private DataFlow::PropRef ref; @@ -882,6 +909,7 @@ private class AccessorCall extends DataFlowCall, MkAccessorCall { override Location getLocation() { result = ref.getLocation() } } +overlay[global] class SummaryCall extends DataFlowCall, MkSummaryCall { private FlowSummaryImpl::Public::SummarizedCallable enclosingCallable; private FlowSummaryImpl::Private::SummaryNode receiver; @@ -908,6 +936,7 @@ class SummaryCall extends DataFlowCall, MkSummaryCall { * This is to help ensure captured variables can flow into the lambda in cases where * we can't find its call sites. */ +overlay[global] private class ImpliedLambdaCall extends DataFlowCall, MkImpliedLambdaCall { private Function function; @@ -981,6 +1010,7 @@ class DataFlowExpr = Expr; Node exprNode(DataFlowExpr expr) { result = DataFlow::exprNode(expr) } +overlay[global] pragma[nomagic] predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos @@ -993,6 +1023,7 @@ predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { // are only using these in cases where either the call or callee is generated by a flow summary. } +overlay[global] pragma[inline] DataFlowCallable viableCallable(DataFlowCall node) { // Note: we never include call edges externs here, as it negatively affects the field-flow branch limit, @@ -1021,6 +1052,7 @@ DataFlowCallable viableCallable(DataFlowCall node) { result.asSourceCallableNotExterns() = node.asImpliedLambdaCall() } +overlay[global] private DataFlowCall getACallOnThis(DataFlow::ClassNode cls) { result.asOrdinaryCall() = cls.getAReceiverNode().getAPropertyRead().getACall() or @@ -1029,6 +1061,7 @@ private DataFlowCall getACallOnThis(DataFlow::ClassNode cls) { result.asPartialCall().getACallbackNode() = cls.getAReceiverNode().getAPropertyRead() } +overlay[global] private predicate downwardCall(DataFlowCall call) { exists(DataFlow::ClassNode cls | call = getACallOnThis(cls) and @@ -1041,9 +1074,11 @@ private predicate downwardCall(DataFlowCall call) { * Holds if the set of viable implementations that can be called by `call` * might be improved by knowing the call context. */ +overlay[global] predicate mayBenefitFromCallContext(DataFlowCall call) { downwardCall(call) } /** Gets the type of the receiver of `call`. */ +overlay[global] private DataFlowType getThisArgumentType(DataFlowCall call) { exists(DataFlow::Node node | isArgumentNodeImpl(node, call, MkThisParameter()) and @@ -1052,6 +1087,7 @@ private DataFlowType getThisArgumentType(DataFlowCall call) { } /** Gets the type of the 'this' parameter of `call`. */ +overlay[global] private DataFlowType getThisParameterType(DataFlowCallable callable) { exists(DataFlow::Node node | isParameterNodeImpl(node, callable, MkThisParameter()) and @@ -1063,6 +1099,7 @@ private DataFlowType getThisParameterType(DataFlowCallable callable) { * 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. */ +overlay[global] DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) { mayBenefitFromCallContext(call) and result = viableCallable(call) and @@ -1071,16 +1108,19 @@ DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) { } bindingset[node, fun] +overlay[caller?] pragma[inline_late] private predicate sameContainerAsEnclosingContainer(Node node, Function fun) { node.getContainer() = fun.getEnclosingContainer() } +overlay[global] abstract private class BarrierGuardAdapter extends DataFlow::Node { // Note: avoid depending on DataFlow::FlowLabel here as it will cause these barriers to be re-evaluated predicate blocksExpr(boolean outcome, Expr e) { none() } } +overlay[global] deprecated private class BarrierGuardAdapterSubclass extends BarrierGuardAdapter instanceof DataFlow::AdditionalBarrierGuardNode { override predicate blocksExpr(boolean outcome, Expr e) { super.blocks(outcome, e) } @@ -1092,6 +1132,7 @@ deprecated private class BarrierGuardAdapterSubclass extends BarrierGuardAdapter * * The standard library contains no subclasses of that class; this is for backwards compatibility only. */ +overlay[global] pragma[nomagic] private predicate legacyBarrier(DataFlow::Node node) { node = MakeBarrierGuard::getABarrierNode() @@ -1100,6 +1141,7 @@ private predicate legacyBarrier(DataFlow::Node node) { /** * Holds if `node` should be removed from the local data flow graph, for compatibility with legacy code. */ +overlay[global] pragma[nomagic] private predicate isBlockedLegacyNode(Node node) { // Ignore captured variable nodes for those variables that are handled by the captured-variable library. @@ -1155,6 +1197,7 @@ private predicate imprecisePostUpdateStep(DataFlow::PostUpdateNode postUpdate, D * Holds if there is a value-preserving steps `node1` -> `node2` that might * be cross function boundaries. */ +overlay[global] private predicate valuePreservingStep(Node node1, Node node2) { node1.getASuccessor() = node2 and not isBlockedLegacyNode(node1) and @@ -1223,10 +1266,12 @@ private predicate useUseFlow(Node node1, Node node2) { ) } +overlay[global] predicate simpleLocalFlowStep(Node node1, Node node2, string model) { simpleLocalFlowStep(node1, node2) and model = "" } +overlay[global] predicate simpleLocalFlowStep(Node node1, Node node2) { valuePreservingStep(node1, node2) and nodeGetEnclosingCallable(pragma[only_bind_out](node1)) = @@ -1314,6 +1359,7 @@ private predicate excludedJumpStep(Node node1, Node node2) { * that does not follow a call edge. For example, a step through a global * variable. */ +overlay[global] predicate jumpStep(Node node1, Node node2) { valuePreservingStep(node1, node2) and node1.getContainer() != node2.getContainer() and @@ -1330,6 +1376,7 @@ predicate jumpStep(Node node1, Node node2) { * `node1` references an object with a content `c.getAReadContent()` whose * value ends up in `node2`. */ +overlay[global] predicate readStep(Node node1, ContentSet c, Node node2) { exists(DataFlow::PropRead read | node1 = read.getBase() and @@ -1447,6 +1494,7 @@ private predicate stringifiedNode(Node node) { } /** Gets the post-update node for which `node` is the corresponding pre-update node. */ +pragma[nomagic] private Node getPostUpdateForStore(Node base) { exists(Expr expr | base = TValueNode(expr) and @@ -1469,6 +1517,7 @@ private Node getPostUpdateForStore(Node base) { } /** Gets node to target with a store to the given `base` object.. */ +overlay[caller?] pragma[inline] private Node getStoreTarget(DataFlow::Node base) { result = getPostUpdateForStore(base) @@ -1487,6 +1536,7 @@ private int firstSpreadArgumentIndex(InvokeExpr expr) { * `node2` references an object with a content `c.getAStoreContent()` that * contains the value of `node1`. */ +overlay[global] predicate storeStep(Node node1, ContentSet c, Node node2) { exists(DataFlow::PropWrite write | node1 = write.getRhs() and @@ -1545,6 +1595,7 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { * any value stored inside `f` is cleared at the pre-update node associated with `x` * in `x.f = newValue`. */ +overlay[global] predicate clearsContent(Node n, ContentSet c) { FlowSummaryPrivate::Steps::summaryClearsContent(n.(FlowSummaryNode).getSummaryNode(), c) or @@ -1578,6 +1629,7 @@ predicate clearsContent(Node n, ContentSet c) { * Holds if the value that is being tracked is expected to be stored inside content `c` * at node `n`. */ +overlay[global] predicate expectsContent(Node n, ContentSet c) { FlowSummaryPrivate::Steps::summaryExpectsContent(n.(FlowSummaryNode).getSummaryNode(), c) or @@ -1602,6 +1654,7 @@ abstract class NodeRegion extends Unit { /** * Holds if the node `n` is unreachable when the call context is `call`. */ +overlay[global] predicate isUnreachableInCall(NodeRegion n, DataFlowCall call) { none() // TODO: could be useful, but not currently implemented for JS } @@ -1635,6 +1688,7 @@ predicate lambdaCreation(Node creation, LambdaCallKind kind, DataFlowCallable c) } /** Holds if `call` is a lambda call of kind `kind` where `receiver` is the lambda expression. */ +overlay[global] predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { call.isSummaryCall(_, receiver.(FlowSummaryNode).getSummaryNode()) and exists(kind) or @@ -1646,6 +1700,7 @@ 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() } +overlay[global] class ArgumentNode extends DataFlow::Node { ArgumentNode() { isArgumentNodeImpl(this, _, _) } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSteps.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSteps.qll index 1711faa4ade..7102e3c6a53 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSteps.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSteps.qll @@ -48,6 +48,7 @@ private predicate legacyPostUpdateStep(DataFlow::Node pred, DataFlow::Node succ) * Holds if data can flow in one step from `pred` to `succ`, taking * additional steps from the configuration into account. */ +overlay[caller?] pragma[inline] deprecated predicate localFlowStep( DataFlow::Node pred, DataFlow::Node succ, DataFlow::Configuration configuration, @@ -523,6 +524,7 @@ private module CachedSteps { /** * Holds if there is a step from `pred` to `succ` through a call to an identity function. */ + overlay[local?] cached predicate identityFunctionStep(DataFlow::Node pred, DataFlow::CallNode succ) { exists(DataFlow::GlobalVarRefNode global | diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll index a5131e4fd64..fe7bab98341 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll @@ -1,6 +1,8 @@ /** * Provides JS specific classes and predicates for defining flow summaries. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.DataFlowPrivate @@ -140,6 +142,7 @@ string encodeArgumentPosition(ArgumentPosition pos) { ReturnKind getStandardReturnValueKind() { result = MkNormalReturnKind() and Stage::ref() } private module FlowSummaryStepInput implements Private::StepsInputSig { + overlay[global] DataFlowCall getACall(SummarizedCallable sc) { exists(LibraryCallable callable | callable = sc | result.asOrdinaryCall() = diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll index 8edacdc2f0f..1799bc416ee 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + private import javascript as js private import semmle.javascript.dataflow.internal.DataFlowNode private import semmle.javascript.dataflow.internal.VariableOrThis diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableOrThis.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableOrThis.qll index a517e0d91fd..96964110e11 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableOrThis.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableOrThis.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + private import javascript private import DataFlowNode diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll index 7e610c3c23c..7b479ac475b 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll @@ -3,6 +3,8 @@ * * JavaScript's old SSA library is still responsible for the ordinary SSA flow. */ +overlay[local?] +module; private import javascript as js private import codeql.ssa.Ssa @@ -94,6 +96,7 @@ module SsaDataflowInput implements DataFlowIntegrationInputSig { } } + overlay[caller?] pragma[inline] predicate guardDirectlyControlsBlock(Guard guard, js::Cfg::BasicBlock bb, GuardValue branch) { exists(js::ConditionGuardNode g | diff --git a/javascript/ql/lib/semmle/javascript/frameworks/AngularJS/AngularJSCore.qll b/javascript/ql/lib/semmle/javascript/frameworks/AngularJS/AngularJSCore.qll index 41d14c1e3be..944256bd456 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/AngularJS/AngularJSCore.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/AngularJS/AngularJSCore.qll @@ -15,6 +15,7 @@ private import AngularJS /** * Holds if `nd` is a reference to the `angular` variable. */ +overlay[local?] DataFlow::SourceNode angular() { // either as a global result = DataFlow::globalVarRef("angular") diff --git a/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll b/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll index db2487ce46a..c95b7a8dc6a 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll @@ -172,6 +172,7 @@ module AsyncPackage { DataFlow::FunctionNode getFinalCallback() { result = this.getCallback(finalCallbackIndex) } } + overlay[local?] private class IterationCallFlowSummary extends DataFlow::SummarizedCallable { private int callbackArgIndex; @@ -219,6 +220,7 @@ module AsyncPackage { * * For example: `data -> result` in `async.sortBy(data, orderingFn, (err, result) => {})`. */ + overlay[local?] private class IterationPreserveTaintStepFlowSummary extends DataFlow::SummarizedCallable { IterationPreserveTaintStepFlowSummary() { this = "async.sortBy" } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/LazyCache.qll b/javascript/ql/lib/semmle/javascript/frameworks/LazyCache.qll index 2c460fcc345..e239c79b852 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/LazyCache.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/LazyCache.qll @@ -1,6 +1,8 @@ /** * Models imports through the NPM `lazy-cache` package. */ +overlay[local?] +module; import javascript @@ -43,7 +45,7 @@ module LazyCache { pragma[noopt] override DataFlow::Node getImportedModuleNode() { this instanceof LazyCacheImport and - result = this.flow() + result = DataFlow::valueNode(this) or exists(LazyCacheVariable variable, Expr base, PropAccess access, string localName | // To avoid recursion, this should not depend on `SourceNode`. @@ -52,12 +54,13 @@ module LazyCache { access.getBase() = base and localName = this.getLocalAlias() and access.getPropertyName() = localName and - result = access.flow() + result = DataFlow::valueNode(access) ) } } /** A constant path element appearing in a call to a lazy-cache object. */ + overlay[global] deprecated private class LazyCachePathExpr extends PathExpr, ConstantString { LazyCachePathExpr() { this = any(LazyCacheImport rp).getArgument(0) } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll b/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll index 20258622737..74808368c71 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll @@ -9,6 +9,7 @@ module LodashUnderscore { /** * A data flow node that accesses a given member of `lodash` or `underscore`. */ + overlay[local?] abstract class Member extends DataFlow::SourceNode { /** Gets the name of the accessed member. */ abstract string getName(); @@ -17,6 +18,7 @@ module LodashUnderscore { /** * An import of `lodash` or `underscore` accessing a given member of that package. */ + overlay[local?] private class DefaultMember extends Member { string name; @@ -39,12 +41,14 @@ module LodashUnderscore { * In addition to normal imports, this supports per-method imports such as `require("lodash.map")` and `require("lodash/map")`. * In addition, the global variable `_` is assumed to refer to `lodash` or `underscore`. */ + overlay[local?] DataFlow::SourceNode member(string name) { result.(Member).getName() = name } /** * Holds if `name` is the name of a member exported from the `lodash` package * which has a corresponding `lodash.xxx` NPM package. */ + overlay[local?] private predicate isLodashMember(string name) { // Can be generated using Object.keys(require('lodash')) name = @@ -181,9 +185,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashEach extends DataFlow::SummarizedCallable { LodashEach() { this = "_.each-like" } + overlay[global] override DataFlow::CallNode getACall() { result = member(["each", "eachRight", "forEach", "forEachRight", "every", "some"]).getACall() } @@ -195,9 +201,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashMap extends DataFlow::SummarizedCallable { LodashMap() { this = "_.map" } + overlay[global] override DataFlow::CallNode getACall() { result = member("map").getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -212,9 +220,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashFlatMap extends DataFlow::SummarizedCallable { LodashFlatMap() { this = "_.flatMap" } + overlay[global] override DataFlow::CallNode getACall() { result = member("flatMap").getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -232,9 +242,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashFlatMapDeep extends DataFlow::SummarizedCallable { LodashFlatMapDeep() { this = "_.flatMapDeep" } + overlay[global] override DataFlow::CallNode getACall() { result = member(["flatMapDeep", "flatMapDepth"]).getACall() } @@ -254,9 +266,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashReduce extends DataFlow::SummarizedCallable { LodashReduce() { this = "_.reduce-like" } + overlay[global] override DataFlow::CallNode getACall() { result = member(["reduce", "reduceRight"]).getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -271,9 +285,11 @@ module LodashUnderscore { } } + overlay[local?] private class LoashSortBy extends DataFlow::SummarizedCallable { LoashSortBy() { this = "_.sortBy-like" } + overlay[global] override DataFlow::CallNode getACall() { result = member(["sortBy", "orderBy"]).getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -287,9 +303,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashMinMaxBy extends DataFlow::SummarizedCallable { LodashMinMaxBy() { this = "_.minBy / _.maxBy" } + overlay[global] override DataFlow::CallNode getACall() { result = member(["minBy", "maxBy"]).getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -299,9 +317,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashPartition extends DataFlow::SummarizedCallable { LodashPartition() { this = "_.partition" } + overlay[global] override DataFlow::CallNode getACall() { result = member("partition").getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -311,9 +331,11 @@ module LodashUnderscore { } } + overlay[local?] private class UnderscoreMapObject extends DataFlow::SummarizedCallable { UnderscoreMapObject() { this = "_.mapObject" } + overlay[global] override DataFlow::CallNode getACall() { result = member("mapObject").getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -330,9 +352,11 @@ module LodashUnderscore { } } + overlay[local?] private class LodashTap extends DataFlow::SummarizedCallable { LodashTap() { this = "_.tap" } + overlay[global] override DataFlow::CallNode getACall() { result = member("tap").getACall() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { @@ -342,6 +366,7 @@ module LodashUnderscore { } } + overlay[local?] private class LodashGroupBy extends DataFlow::SummarizedCallable { LodashGroupBy() { this = "_.groupBy" } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Next.qll b/javascript/ql/lib/semmle/javascript/frameworks/Next.qll index 551d325f26a..a65fcdce44d 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Next.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Next.qll @@ -13,12 +13,31 @@ module NextJS { */ PackageJson getANextPackage() { result.getDependencies().getADependency("next", _) } + bindingset[base, name] + pragma[inline_late] + private Folder getOptionalFolder(Folder base, string name) { + result = base.getFolder(name) + or + not exists(base.getFolder(name)) and + result = base + } + + private Folder packageRoot() { result = getANextPackage().getFile().getParentContainer() } + + private Folder srcRoot() { result = getOptionalFolder(packageRoot(), "src") } + + private Folder appRoot() { result = srcRoot().getFolder("app") } + + private Folder pagesRoot() { result = [srcRoot(), appRoot()].getFolder("pages") } + + private Folder apiRoot() { result = [pagesRoot(), appRoot()].getFolder("api") } + /** * Gets a "pages" folder in a `Next.js` application. * JavaScript files inside these folders are mapped to routes. */ Folder getAPagesFolder() { - result = getANextPackage().getFile().getParentContainer().getFolder("pages") + result = pagesRoot() or result = getAPagesFolder().getAFolder() } @@ -217,8 +236,7 @@ module NextJS { * the App Router (`app/api/`) Next.js 13+ structures. */ Folder apiFolder() { - result = - getANextPackage().getFile().getParentContainer().getFolder(["pages", "app"]).getFolder("api") or + result = apiRoot() or result = apiFolder().getAFolder() } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll b/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll index c5f8c3d14f1..b6506ddd648 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll @@ -8,14 +8,17 @@ import semmle.javascript.security.SensitiveActions private import semmle.javascript.dataflow.internal.PreCallGraphStep module NodeJSLib { + overlay[local?] private GlobalVariable processVariable() { variables(result, "process", any(GlobalScope sc)) } + overlay[local?] pragma[nomagic] private GlobalVarAccess processExprInTopLevel(TopLevel tl) { result = processVariable().getAnAccess() and tl = result.getTopLevel() } + overlay[local?] pragma[nomagic] private GlobalVarAccess processExprInNodeModule() { result = processExprInTopLevel(any(NodeModule m)) @@ -25,6 +28,7 @@ module NodeJSLib { * An access to the global `process` variable in a Node.js module, interpreted as * an import of the `process` module. */ + overlay[local?] private class ImplicitProcessImport extends DataFlow::ModuleImportNode::Range { ImplicitProcessImport() { this = DataFlow::exprNode(processExprInNodeModule()) } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/PropertyProjection.qll b/javascript/ql/lib/semmle/javascript/frameworks/PropertyProjection.qll index 11fb0f5ceba..957121da5af 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/PropertyProjection.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/PropertyProjection.qll @@ -4,6 +4,8 @@ * Subclass `PropertyProjection` to refine the behavior of the analysis on existing property projections. * Subclass `CustomPropertyProjection` to introduce new kinds of property projections. */ +overlay[local?] +module; import javascript @@ -137,6 +139,7 @@ private class VarArgsPropertyProjection extends PropertyProjection::Range { /** * A taint step for a property projection. */ +overlay[global] private class PropertyProjectionTaintStep extends TaintTracking::SharedTaintStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { // reading from a tainted object yields a tainted result diff --git a/javascript/ql/lib/semmle/javascript/frameworks/React.qll b/javascript/ql/lib/semmle/javascript/frameworks/React.qll index d55ace8636d..42885f6b9cb 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/React.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/React.qll @@ -612,6 +612,25 @@ private class UseStateStep extends PreCallGraphStep { } } +/** + * Step through a `useRef` call. + * + * It returns an object with a single property (`current`) initialized to the initial value. + * + * For example: + * ```js + * const inputRef1 = useRef(initialValue); + * ``` + */ +private class UseRefStep extends PreCallGraphStep { + override predicate step(DataFlow::Node pred, DataFlow::Node succ) { + exists(DataFlow::CallNode call | call = react().getAMemberCall("useRef") | + pred = call.getArgument(0) and // initial state + succ = call.getAPropertyRead("current") + ) + } +} + /** * A step through a React context object. * @@ -785,6 +804,17 @@ private class ReactRouterLocationSource extends DOM::LocationSource::Range { } } +private class UseRefDomValueSource extends DOM::DomValueSource::Range { + UseRefDomValueSource() { + this = + any(JsxAttribute attrib | attrib.getName() = "ref") + .getValue() + .flow() + .getALocalSource() + .getAPropertyRead("current") + } +} + /** * Gets a reference to a function which, if called with a React component, returns wrapped * version of that component, which we model as a direct reference to the underlying component. diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Templating.qll b/javascript/ql/lib/semmle/javascript/frameworks/Templating.qll index a7286c7a199..d63bafe7b6f 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Templating.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Templating.qll @@ -1,6 +1,8 @@ /** * Provides predicates for working with templating libraries. */ +overlay[local?] +module; import javascript @@ -45,6 +47,7 @@ module Templating { Locatable getParent() { template_placeholder_tag_info(this, result, _) } /** Gets a data flow node representing the value plugged into this placeholder. */ + overlay[global] DataFlow::TemplatePlaceholderTagNode asDataFlowNode() { result.getTag() = this } /** Gets the top-level containing the template expression to be inserted at this placeholder. */ @@ -54,6 +57,7 @@ module Templating { * Holds if this performs raw interpolation, that is, inserts its result * in the output without escaping it. */ + overlay[global] predicate isRawInterpolation() { this.getRawText() .regexpMatch(getLikelyTemplateSyntax(this.getFile()).getRawInterpolationRegexp()) @@ -62,6 +66,7 @@ module Templating { /** * Holds if this performs HTML escaping on the result before inserting it in the template. */ + overlay[global] predicate isEscapingInterpolation() { this.getRawText() .regexpMatch(getLikelyTemplateSyntax(this.getFile()).getEscapingInterpolationRegexp()) @@ -93,6 +98,7 @@ module Templating { * Holds if this placeholder occurs in the definition of another template, which means the output * is susceptible to code injection. */ + overlay[global] predicate isInNestedTemplateContext(string templateType) { templateType = "AngularJS" and AngularJS::isInterpretedByAngularJS(this.getParent()) and @@ -135,6 +141,7 @@ module Templating { * * For example, the call generated from `items | async` would be found by `getAPipeCall("async")`. */ + overlay[global] DataFlow::CallNode getAPipeCall(string name) { result.getCalleeNode().asExpr().(PipeRefExpr).getName() = name } @@ -153,16 +160,19 @@ module Templating { Expr getExpression() { result = this.getChildStmt(0).(ExprStmt).getExpr() } /** Gets the data flow node representing the initialization of the given variable in this scope. */ + overlay[global] DataFlow::Node getVariableInit(string name) { result = DataFlow::ssaDefinitionNode(Ssa::implicitInit(this.getScope().getVariable(name))) } /** Gets a data flow node corresponding to a use of the given template variable within this top-level. */ + overlay[global] DataFlow::SourceNode getAVariableUse(string name) { result = this.getScope().getVariable(name).getAnAccess().flow() } /** Gets a data flow node corresponding to a use of the given template variable within this top-level. */ + overlay[global] DataFlow::SourceNode getAnAccessPathUse(string accessPath) { result = this.getAVariableUse(accessPath) or @@ -177,6 +187,7 @@ module Templating { /** * A place where a template is instantiated or rendered. */ + overlay[global] class TemplateInstantiation extends DataFlow::Node instanceof TemplateInstantiation::Range { /** Gets a data flow node that refers to the instantiated template string, if any. */ DataFlow::SourceNode getOutput() { result = super.getOutput() } @@ -206,6 +217,7 @@ module Templating { } /** Companion module to the `TemplateInstantiation` class. */ + overlay[global] module TemplateInstantiation { abstract class Range extends DataFlow::Node { /** Gets a data flow node that refers to the instantiated template, if any. */ @@ -230,6 +242,7 @@ module Templating { } /** Gets an API node that may flow to `succ` through a template instantiation. */ + overlay[global] private API::Node getTemplateInput(DataFlow::SourceNode succ) { exists(TemplateInstantiation inst, API::Node base, string name | base.asSink() = inst.getTemplateParamsNode() and @@ -258,6 +271,7 @@ module Templating { ) } + overlay[global] private class TemplateInputStep extends DataFlow::SharedFlowStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { getTemplateInput(succ).asSink() = pred @@ -268,6 +282,7 @@ module Templating { * A data flow step from the expression in a placeholder tag to the tag itself, * representing the value plugged into the template. */ + overlay[global] private class TemplatePlaceholderStep extends DataFlow::SharedFlowStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(TemplatePlaceholderTag tag | @@ -281,6 +296,7 @@ module Templating { * A taint step from a `TemplatePlaceholderTag` to the enclosing expression in the * surrounding JavaScript program. */ + overlay[global] private class PlaceholderToGeneratedCodeStep extends TaintTracking::SharedTaintStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(TemplatePlaceholderTag tag | @@ -296,6 +312,7 @@ module Templating { final TemplatePlaceholderTag getAPlaceholder() { result.getFile() = this } /** Gets a template file referenced by this one via a template inclusion tag, such as `{% include foo %}` */ + overlay[global] TemplateFile getAnImportedFile() { result = this.getAPlaceholder().(TemplateInclusionTag).getImportedFile() } @@ -314,6 +331,7 @@ module Templating { * - The root folder is considered unknown, and so a heuristic is used to guess the most * likely template file being referenced. */ + overlay[global] abstract class TemplateFileReference extends DataFlow::Node { /** Gets the value that identifies the template. */ string getValue() { @@ -335,6 +353,7 @@ module Templating { } /** Get file argument of a template instantiation, seen as a template file reference. */ + overlay[global] private class DefaultTemplateFileReference extends TemplateFileReference { DefaultTemplateFileReference() { this = any(TemplateInstantiation inst).getTemplateFileNode() } } @@ -352,6 +371,7 @@ module Templating { * - The root folder is considered unknown, and so a heuristic is used to guess the most * likely template file being referenced. */ + overlay[global] abstract class TemplateFileReferenceString extends string { bindingset[this] TemplateFileReferenceString() { this = this } @@ -382,6 +402,7 @@ module Templating { } /** The value of a template reference node, as a template reference string. */ + overlay[global] private class DefaultTemplateReferenceString extends TemplateFileReferenceString { TemplateFileReference r; @@ -397,6 +418,7 @@ module Templating { } /** The `X` in a path of form `../X`, treated as a separate path string with a different context folder. */ + overlay[global] private class UpwardTraversalSuffix extends TemplateFileReferenceString { TemplateFileReferenceString original; @@ -412,6 +434,7 @@ module Templating { * Gets a "fingerprint" for the given template file, which is used to references * that might refer to it (for pruning purposes only). */ + overlay[global] pragma[nomagic] private string getTemplateFileFingerprint(TemplateFile file) { result = file.getStem() @@ -424,6 +447,7 @@ module Templating { * Gets a "fingerprint" for the given string, which must match one of the fingerprints of * the referenced file (for pruning purposes only). */ + overlay[global] pragma[nomagic] private string getTemplateRefFingerprint(TemplateFileReferenceString ref) { result = ref.getStem() and not result = ["index", ""] @@ -442,6 +466,7 @@ module Templating { * * This is only used to speed up `getAMatchingTarget` by pruning out pairs that can't match. */ + overlay[global] pragma[nomagic] private TemplateFile getAPotentialTarget(TemplateFileReferenceString ref) { getTemplateFileFingerprint(result) = getTemplateRefFingerprint(ref) @@ -467,6 +492,7 @@ module Templating { * Additionally, a file whose stem is `index` matches if `ref` would match the parent folder by * the above rules. For example: `bar` matches `src/bar/index.html`. */ + overlay[global] pragma[nomagic] private TemplateFile getAMatchingTarget(TemplateFileReferenceString ref) { result = getAPotentialTarget(ref) and @@ -491,6 +517,7 @@ module Templating { * The string `list` in `A/components/foo.js` will resolve to `A/views/list.html`, * and vice versa in `B/components/foo.js`. */ + overlay[global] pragma[nomagic] private int getRankOfMatchingTarget( TemplateFile file, Folder baseFolder, TemplateFileReferenceString ref @@ -508,6 +535,7 @@ module Templating { /** * Gets the template file referred to by `ref` when resolved from `baseFolder`. */ + overlay[global] private TemplateFile getBestMatchingTarget(Folder baseFolder, TemplateFileReferenceString ref) { result = max(getAMatchingTarget(ref) as f order by getRankOfMatchingTarget(f, baseFolder, ref)) } @@ -599,6 +627,7 @@ module Templating { override string getAPackageName() { result = "dot" } } + overlay[global] private TemplateSyntax getOwnTemplateSyntaxInFolder(Folder f) { exists(PackageDependencies deps | deps.getADependency(result.getAPackageName(), _) and @@ -606,6 +635,7 @@ module Templating { ) } + overlay[global] private TemplateSyntax getTemplateSyntaxInFolder(Folder f) { result = getOwnTemplateSyntaxInFolder(f) or @@ -613,6 +643,7 @@ module Templating { result = getTemplateSyntaxInFolder(f.getParentContainer()) } + overlay[global] private TemplateSyntax getTemplateSyntaxFromInstantiation(TemplateFile file) { result = any(TemplateInstantiation inst | inst.getTemplateFile() = file).getTemplateSyntax() } @@ -620,6 +651,7 @@ module Templating { /** * Gets a template syntax likely to be used in the given file. */ + overlay[global] TemplateSyntax getLikelyTemplateSyntax(TemplateFile file) { result = getTemplateSyntaxFromInstantiation(file) or @@ -632,6 +664,7 @@ module Templating { } /** A step through the `safe` pipe, which bypasses HTML escaping. */ + overlay[global] private class SafePipeStep extends TaintTracking::SharedTaintStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(DataFlow::CallNode call | @@ -645,6 +678,7 @@ module Templating { /** * An EJS-style `include` call within a template tag, such as `<%- include(file, { params }) %>`. */ + overlay[global] private class EjsIncludeCallInTemplate extends TemplateInstantiation::Range, DataFlow::CallNode { EjsIncludeCallInTemplate() { exists(TemplatePlaceholderTag tag | @@ -669,6 +703,7 @@ module Templating { * * These API nodes are used in the `getTemplateInput` predicate. */ + overlay[global] private class IncludeFunctionAsEntryPoint extends API::EntryPoint { IncludeFunctionAsEntryPoint() { this = "IncludeFunctionAsEntryPoint" } @@ -703,6 +738,7 @@ module Templating { string getPath() { result = rawPath.trim().replaceAll("\\", "/").regexpReplaceAll("^\\./", "") } /** Gets the file referenced by this inclusion tag. */ + overlay[global] TemplateFile getImportedFile() { result = this.getPath() @@ -712,6 +748,7 @@ module Templating { } /** The imported string from a template inclusion tag. */ + overlay[global] private class TemplateInclusionPathString extends TemplateFileReferenceString { TemplateInclusionTag tag; @@ -723,6 +760,7 @@ module Templating { /** * A call to a member of the `consolidate` library, seen as a template instantiation. */ + overlay[global] private class ConsolidateCall extends TemplateInstantiation::Range, API::CallNode { string engine; diff --git a/javascript/ql/lib/semmle/javascript/frameworks/UriLibraries.qll b/javascript/ql/lib/semmle/javascript/frameworks/UriLibraries.qll index 90dcc886ed4..03887819b25 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/UriLibraries.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/UriLibraries.qll @@ -422,9 +422,11 @@ private module ClosureLibraryUri { } } +overlay[local?] private class QueryStringStringification extends DataFlow::SummarizedCallable { QueryStringStringification() { this = "query-string stringification" } + overlay[global] override DataFlow::InvokeNode getACall() { result = API::moduleImport(["querystring", "query-string", "querystringify", "qs"]) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/ModelsAsData.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/ModelsAsData.qll index 82deb735c62..5d65f901d22 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/ModelsAsData.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/ModelsAsData.qll @@ -48,6 +48,7 @@ private class ThreatModelSourceFromDataExtension extends ThreatModelSource::Rang } } +overlay[local?] private class SummarizedCallableFromModel extends DataFlow::SummarizedCallable { string type; string path; @@ -57,6 +58,7 @@ private class SummarizedCallableFromModel extends DataFlow::SummarizedCallable { this = type + ";" + path } + overlay[global] override DataFlow::InvokeNode getACall() { ModelOutput::resolvedSummaryBase(type, path, result) } override predicate propagatesFlow( diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll index c04a85487ac..80ec45a3cf1 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll @@ -62,6 +62,8 @@ * should be prefixed with a tilde character (`~`). For example, `~Bar` can be used to indicate that * the type is not intended to match a static type. */ +overlay[local?] +module; private import codeql.util.Unit private import ApiGraphModelsSpecific as Specific diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll index 4969da43be3..3f38c498f32 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll @@ -1,6 +1,8 @@ /** * Defines extensible predicates for contributing library models from data extensions. */ +overlay[local] +module; /** * Holds if the value at `(type, path)` should be seen as a flow diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll index f0d751ad31b..3fb76f76f70 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll @@ -41,6 +41,7 @@ class Location = JS::Location; * The model generator must explicitly generate the step between `(package)` and `(package).foo`, for example. */ bindingset[rawType] +overlay[caller?] predicate parseTypeString(string rawType, string package, string qualifiedName) { exists(string regexp | regexp = "('[^']+'|[^.]+)(.*)" and @@ -55,6 +56,7 @@ predicate parseTypeString(string rawType, string package, string qualifiedName) /** * Holds if models describing `package` may be relevant for the analysis of this database. */ +overlay[local?] predicate isPackageUsed(string package) { package = "global" or @@ -68,6 +70,7 @@ predicate isPackageUsed(string package) { } bindingset[type] +overlay[local?] predicate isTypeUsed(string type) { exists(string package | parseTypeString(type, package, _) and @@ -79,8 +82,10 @@ predicate isTypeUsed(string type) { * Holds if `type` can be obtained from an instance of `otherType` due to * language semantics modeled by `getExtraNodeFromType`. */ +overlay[local?] predicate hasImplicitTypeModel(string type, string otherType) { none() } +overlay[local?] pragma[nomagic] private predicate parseRelevantTypeString(string rawType, string package, string qualifiedName) { isRelevantFullPath(rawType, _) and @@ -190,6 +195,7 @@ API::Node getExtraSuccessorFromNode(API::Node node, AccessPathTokenBase token) { } bindingset[node] +overlay[caller?] pragma[inline_late] private API::Node getAGuardedRouteHandlerApprox(API::Node node) { // For now just get any routing node with the same root (i.e. the same web app), as @@ -230,6 +236,7 @@ private predicate blockFuzzyCall(DataFlow::CallNode call) { isCommonBuiltinMethodName(call.getCalleeName()) } +overlay[caller?] pragma[inline] API::Node getAFuzzySuccessor(API::Node node) { result = node.getAMember() and diff --git a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll index d8e4a18dfc1..e0324bf5a6b 100644 --- a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll +++ b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll @@ -2,6 +2,8 @@ * Provides classes for working with basic blocks, and predicates for computing * liveness information for local variables. */ +overlay[local?] +module; import javascript private import semmle.javascript.internal.StmtContainers @@ -318,6 +320,7 @@ module Public { /** * Holds if this basic block strictly dominates `bb`. */ + overlay[caller?] pragma[inline] predicate strictlyDominates(ReachableBasicBlock bb) { this = immediateDominator+(bb) } @@ -326,12 +329,14 @@ module Public { * * This predicate is reflexive: each reachable basic block dominates itself. */ + overlay[caller?] pragma[inline] predicate dominates(ReachableBasicBlock bb) { this = immediateDominator*(bb) } /** * Holds if this basic block strictly post-dominates `bb`. */ + overlay[caller?] pragma[inline] predicate strictlyPostDominates(ReachableBasicBlock bb) { this = immediatePostDominator+(bb) } @@ -340,6 +345,7 @@ module Public { * * This predicate is reflexive: each reachable basic block post-dominates itself. */ + overlay[caller?] pragma[inline] predicate postDominates(ReachableBasicBlock bb) { this = immediatePostDominator*(bb) } } diff --git a/javascript/ql/lib/semmle/javascript/internal/CachedStages.qll b/javascript/ql/lib/semmle/javascript/internal/CachedStages.qll index 98a35692822..eab6b76b031 100644 --- a/javascript/ql/lib/semmle/javascript/internal/CachedStages.qll +++ b/javascript/ql/lib/semmle/javascript/internal/CachedStages.qll @@ -40,6 +40,7 @@ module Stages { /** * The `ast` stage. */ + overlay[local?] cached module Ast { /** @@ -84,6 +85,7 @@ module Stages { /** * The `basicblocks` stage. */ + overlay[local?] cached module BasicBlocks { /** @@ -110,6 +112,7 @@ module Stages { /** * The part of data flow computed before flow summary nodes. */ + overlay[local?] cached module EarlyDataFlowStage { /** @@ -134,6 +137,7 @@ module Stages { /** * The `dataflow` stage. */ + overlay[local?] cached module DataFlowStage { /** @@ -167,8 +171,6 @@ module Stages { or exists(any(DataFlow::PropRef ref).getBase()) or - exists(any(DataFlow::ClassNode cls)) - or exists(any(DataFlow::CallNode node).getArgument(_)) or exists(any(DataFlow::CallNode node).getAnArgument()) @@ -202,8 +204,6 @@ module Stages { or exists(any(Import i).getImportedModule()) or - exists(DataFlow::moduleImport(_)) - or exists(any(ReExportDeclaration d).getReExportedModule()) or exists(any(Module m).getABulkExportedNode()) diff --git a/javascript/ql/lib/semmle/javascript/internal/Overlay.qll b/javascript/ql/lib/semmle/javascript/internal/Overlay.qll index a20ac1868e6..db3dc8ac6bf 100644 --- a/javascript/ql/lib/semmle/javascript/internal/Overlay.qll +++ b/javascript/ql/lib/semmle/javascript/internal/Overlay.qll @@ -1,24 +1,29 @@ private import javascript +private import OverlayXml /** Holds if the database is an overlay. */ -overlay[local] +overlay[local?] private predicate isOverlay() { databaseMetadata("isOverlay", "true") } -overlay[local] +overlay[local?] private string getFileFromEntity(@locatable node) { - exists(@location loc, @file file | - hasLocation(node, loc) and - locations_default(loc, file, _, _, _, _) and - files(file, result) + exists(@location loc | + hasLocation(node, loc) + or + json_locations(node, loc) + or + yaml_locations(node, loc) + | + result = getFileFromLocation(loc) ) } /** Holds if `file` was changed or deleted in the overlay. */ -overlay[local] +overlay[local?] private predicate discardFile(string file) { isOverlay() and overlayChangedFiles(file) } /** Holds if `node` is in the `file` and is part of the overlay base database. */ -overlay[local] +overlay[local?] private predicate discardableEntity(string file, @locatable node) { not isOverlay() and file = getFileFromEntity(node) } @@ -28,3 +33,23 @@ overlay[discard_entity] private predicate discardEntity(@locatable node) { exists(string file | discardableEntity(file, node) and discardFile(file)) } + +overlay[local?] +private string getFileFromLocation(@location loc) { + exists(@file file | + locations_default(loc, file, _, _, _, _) and + files(file, result) + ) +} + +/** Holds if `loc` is in the `file` and is part of the overlay base database. */ +overlay[local?] +private predicate discardableLocation(string file, @location node) { + not isOverlay() and file = getFileFromLocation(node) +} + +/** Holds if `loc` should be discarded, because it is part of the overlay base and is in a file that was also extracted as part of the overlay database. */ +overlay[discard_entity] +private predicate discardLocation(@location loc) { + exists(string file | discardableLocation(file, loc) and discardFile(file)) +} diff --git a/javascript/ql/lib/semmle/javascript/internal/OverlayXml.qll b/javascript/ql/lib/semmle/javascript/internal/OverlayXml.qll new file mode 100644 index 00000000000..95d49f2d611 --- /dev/null +++ b/javascript/ql/lib/semmle/javascript/internal/OverlayXml.qll @@ -0,0 +1,46 @@ +overlay[local] +module; + +/** + * A local predicate that always holds for the overlay variant and never holds for the base variant. + * This is used to define local predicates that behave differently for the base and overlay variant. + */ +private predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +private string getXmlFile(@xmllocatable locatable) { + exists(@location_default location, @file file | xmllocations(locatable, location) | + locations_default(location, file, _, _, _, _) and + files(file, result) + ) +} + +private string getXmlFileInBase(@xmllocatable locatable) { + not isOverlay() and + result = getXmlFile(locatable) +} + +/** + * Holds if the given `file` was extracted as part of the overlay and was extracted by the HTML/XML + * extractor. + */ +private predicate overlayXmlExtracted(string file) { + isOverlay() and + exists(@xmllocatable locatable | + not files(locatable, _) and not xmlNs(locatable, _, _, _) and file = getXmlFile(locatable) + ) +} + +/** + * Holds if the given XML `locatable` should be discarded, because it is part of the overlay base + * and is in a file that was also extracted as part of the overlay database. + */ +overlay[discard_entity] +private predicate discardXmlLocatable(@xmllocatable locatable) { + exists(string file | file = getXmlFileInBase(locatable) | + overlayChangedFiles(file) + or + // The HTML/XML extractor is currently not incremental and may extract more files than those + // included in overlayChangedFiles. + overlayXmlExtracted(file) + ) +} diff --git a/javascript/ql/lib/semmle/javascript/internal/StmtContainers.qll b/javascript/ql/lib/semmle/javascript/internal/StmtContainers.qll index a1df0504ce8..65984e2eb9b 100644 --- a/javascript/ql/lib/semmle/javascript/internal/StmtContainers.qll +++ b/javascript/ql/lib/semmle/javascript/internal/StmtContainers.qll @@ -4,6 +4,8 @@ * Provides predicates and classes for relating nodes to their * enclosing `StmtContainer`. */ +overlay[local?] +module; private import javascript private import semmle.javascript.internal.CachedStages @@ -46,6 +48,7 @@ class NodeInStmtContainer extends Locatable, @node_in_stmt_container { /** * Gets the function or toplevel to which this node belongs. */ + overlay[caller?] pragma[inline] final StmtContainer getContainer() { result = getStmtContainer(this) } } diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AmbiguousCoreMethods.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AmbiguousCoreMethods.qll index 45ad9cf7a9c..4e1c9ee6884 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AmbiguousCoreMethods.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AmbiguousCoreMethods.qll @@ -20,6 +20,8 @@ * * (Promise is absent in the table above as there currently are no name clashes with Promise methods) */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.DataFlowNode diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll index 6754d3db307..1196ffdbac9 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll @@ -3,6 +3,8 @@ * * Note that some of Array methods are modeled in `AmbiguousCoreMethods.qll`, and `toString` is special-cased elsewhere. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.FlowSummary diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll index 246ac0f19d0..6a33c9a5c4f 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll @@ -1,6 +1,8 @@ /** * Contains flow steps to model flow through `async` functions and the `await` operator. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.DataFlowNode diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Decoders.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Decoders.qll index 2866c892608..80e43fdfcd8 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Decoders.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Decoders.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + private import javascript private import semmle.javascript.dataflow.FlowSummary private import semmle.javascript.dataflow.InferredTypes diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/DynamicImportStep.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/DynamicImportStep.qll index 2976b467315..2661802b97e 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/DynamicImportStep.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/DynamicImportStep.qll @@ -1,6 +1,8 @@ /** * Contains flow steps to model flow from a module into a dynamic `import()` expression. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.DataFlowNode diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ExceptionFlow.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ExceptionFlow.qll index 252baab207b..3dff015d9f3 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ExceptionFlow.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ExceptionFlow.qll @@ -1,6 +1,8 @@ /** * Contains a summary for propagating exceptions out of callbacks */ +overlay[local?] +module; private import javascript private import FlowSummaryUtil diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll index 33f891935f4..290567efbd9 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + private import javascript private import semmle.javascript.dataflow.FlowSummary private import semmle.javascript.dataflow.internal.Contents::Private diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ForOfLoops.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ForOfLoops.qll index ecc84170026..d8460f7d729 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ForOfLoops.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/ForOfLoops.qll @@ -1,6 +1,8 @@ /** * Contains flow steps to model flow through `for..of` loops. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.DataFlowNode @@ -48,12 +50,18 @@ class ForOfLoopStep extends AdditionalFlowInternal { ) { exists(ForOfStmt stmt | pred = getSynthesizedNode(stmt, "for-of-map-key") and - contents.asSingleton().asArrayIndex() = 0 + contents = arrayIndex0() or pred = getSynthesizedNode(stmt, "for-of-map-value") and - contents.asSingleton().asArrayIndex() = 1 + contents = arrayIndex1() | succ = DataFlow::lvalueNode(stmt.getLValue()) ) } } + +pragma[nomagic] +private DataFlow::ContentSet arrayIndex0() { result.asSingleton().asArrayIndex() = 0 } + +pragma[nomagic] +private DataFlow::ContentSet arrayIndex1() { result.asSingleton().asArrayIndex() = 1 } diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll index 75815d00341..4f0868db519 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll @@ -1,6 +1,8 @@ /** * Contains flow steps to model flow through generator functions. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.DataFlowNode diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll index 6b1a182a49b..7f9c13c63df 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll @@ -1,6 +1,8 @@ /** * Contains flow summaries and steps modeling flow through iterators. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.internal.DataFlowNode diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/JsonStringify.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/JsonStringify.qll index ecd2dcdfc79..4b8ecdeb4f2 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/JsonStringify.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/JsonStringify.qll @@ -1,6 +1,8 @@ /** * Contains implicit read steps at the input to any function that converts a deep object to a string, such as `JSON.stringify`. */ +overlay[local?] +module; private import javascript private import FlowSummaryUtil diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll index d9649d407c6..645e36941dc 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll @@ -1,6 +1,8 @@ /** * Contains flow summaries and steps modeling flow through `Map` objects. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.FlowSummary diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll index 74048f0e397..10292958df2 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll @@ -1,6 +1,8 @@ /** * Contains flow summaries and steps modeling flow through `Promise` objects. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.FlowSummary diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll index 6b4f089b38e..e4d0951764f 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll @@ -1,6 +1,8 @@ /** * Contains flow summaries and steps modeling flow through `Set` objects. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.FlowSummary diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll index bf9442219a7..b5ecc8ef603 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll @@ -1,6 +1,8 @@ /** * Contains flow summaries and steps modeling flow through string methods. */ +overlay[local?] +module; private import javascript private import semmle.javascript.dataflow.FlowSummary diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/TypedArrays.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/TypedArrays.qll index 19a28036db4..0ac2307c81a 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/TypedArrays.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/TypedArrays.qll @@ -1,3 +1,6 @@ +overlay[local?] +module; + private import javascript private import semmle.javascript.dataflow.FlowSummary private import semmle.javascript.dataflow.InferredTypes diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/UrlSearchParams.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/UrlSearchParams.qll index 0a47b6fcf9f..3d8d88d8ae4 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/UrlSearchParams.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/UrlSearchParams.qll @@ -3,6 +3,8 @@ * * For now, the `URLSearchParams` object is modeled as a `Map` object. */ +overlay[local?] +module; private import javascript diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/ExternalAPIUsedWithUntrustedDataQuery.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/ExternalAPIUsedWithUntrustedDataQuery.qll index 7972c379e87..7a936044756 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/ExternalAPIUsedWithUntrustedDataQuery.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/ExternalAPIUsedWithUntrustedDataQuery.qll @@ -97,7 +97,7 @@ class ExternalApiDataNode extends DataFlow::Node instanceof Sink { } /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { ExternalAPIUsedWithUntrustedDataFlow::flow(_, this) } + UntrustedExternalApiDataNode() { ExternalAPIUsedWithUntrustedDataFlow::flowTo(this) } /** Gets a source of untrusted data which is passed to this external API data node. */ DataFlow::Node getAnUntrustedSource() { ExternalAPIUsedWithUntrustedDataFlow::flow(result, this) } @@ -110,7 +110,7 @@ private newtype TExternalApi = /** An external API sink with `name`. */ MkExternalApiNode(string name) { exists(Sink sink | - ExternalAPIUsedWithUntrustedDataFlow::flow(_, sink) and + ExternalAPIUsedWithUntrustedDataFlow::flowTo(sink) and name = sink.getApiName() ) } diff --git a/javascript/ql/lib/utils/test/InlineSummaries.qll b/javascript/ql/lib/utils/test/InlineSummaries.qll index 559f1360977..1633e056b7f 100644 --- a/javascript/ql/lib/utils/test/InlineSummaries.qll +++ b/javascript/ql/lib/utils/test/InlineSummaries.qll @@ -1,6 +1,7 @@ import javascript import semmle.javascript.dataflow.FlowSummary +overlay[local?] class MkSummary extends SummarizedCallable { private CallExpr mkSummary; diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 4a453506818..11b27f044cf 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,24 @@ +## 2.2.3 + +No user-facing changes. + +## 2.2.2 + +No user-facing changes. + +## 2.2.1 + +### Minor Analysis Improvements + +* Fixed a bug in the Next.js model that would cause the analysis to miss server-side taint sources in the `app/pages` folder. + +## 2.2.0 + +### Query Metadata Changes + +* Increased the `security-severity` score of the `js/xss-through-dom` query from 6.1 to 7.8 to align with other XSS queries. +* Reduced the `security-severity` score of the `js/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. + ## 2.1.3 No user-facing changes. diff --git a/javascript/ql/src/Expressions/DuplicateProperty.ql b/javascript/ql/src/Expressions/DuplicateProperty.ql index febdfe5b882..b13f1a93ec0 100644 --- a/javascript/ql/src/Expressions/DuplicateProperty.ql +++ b/javascript/ql/src/Expressions/DuplicateProperty.ql @@ -14,12 +14,26 @@ import Clones +bindingset[init] +pragma[inline_late] +private Property getPropertyFromInitializerStrict(Expr init) { result.getInit() = init } + +pragma[nomagic] +private predicate duplicateProperties( + DuplicatePropertyInitDetector dup, Property prop1, Property prop2 +) { + exists(Expr init2 | + dup.same(init2) and + prop1 = getPropertyFromInitializerStrict(dup) and + prop2 = getPropertyFromInitializerStrict(init2) + ) +} + from ObjectExpr oe, int i, int j, Property p, Property q, DuplicatePropertyInitDetector dpid where + duplicateProperties(dpid, p, q) and p = oe.getProperty(i) and q = oe.getProperty(j) and - dpid = p.getInit() and - dpid.same(q.getInit()) and i < j and // only report the next duplicate not exists(int mid | mid in [i + 1 .. j - 1] | dpid.same(oe.getProperty(mid).getInit())) diff --git a/javascript/ql/src/change-notes/2025-10-22-adjust-query-severity.md b/javascript/ql/src/change-notes/released/2.2.0.md similarity index 66% rename from javascript/ql/src/change-notes/2025-10-22-adjust-query-severity.md rename to javascript/ql/src/change-notes/released/2.2.0.md index ca81037f44b..6a60b337eef 100644 --- a/javascript/ql/src/change-notes/2025-10-22-adjust-query-severity.md +++ b/javascript/ql/src/change-notes/released/2.2.0.md @@ -1,5 +1,6 @@ ---- -category: queryMetadata ---- +## 2.2.0 + +### Query Metadata Changes + * Increased the `security-severity` score of the `js/xss-through-dom` query from 6.1 to 7.8 to align with other XSS queries. -* Reduced the `security-severity` score of the `js/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. \ No newline at end of file +* Reduced the `security-severity` score of the `js/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. diff --git a/javascript/ql/src/change-notes/released/2.2.1.md b/javascript/ql/src/change-notes/released/2.2.1.md new file mode 100644 index 00000000000..b4bd337fd49 --- /dev/null +++ b/javascript/ql/src/change-notes/released/2.2.1.md @@ -0,0 +1,5 @@ +## 2.2.1 + +### Minor Analysis Improvements + +* Fixed a bug in the Next.js model that would cause the analysis to miss server-side taint sources in the `app/pages` folder. diff --git a/javascript/ql/src/change-notes/released/2.2.2.md b/javascript/ql/src/change-notes/released/2.2.2.md new file mode 100644 index 00000000000..807fd2a0fba --- /dev/null +++ b/javascript/ql/src/change-notes/released/2.2.2.md @@ -0,0 +1,3 @@ +## 2.2.2 + +No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/2.2.3.md b/javascript/ql/src/change-notes/released/2.2.3.md new file mode 100644 index 00000000000..1db16246c5a --- /dev/null +++ b/javascript/ql/src/change-notes/released/2.2.3.md @@ -0,0 +1,3 @@ +## 2.2.3 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 345fb0c73a4..5ee5c5be7fc 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.3 +lastReleaseVersion: 2.2.3 diff --git a/javascript/ql/src/experimental/Security/CWE-347/decodeJwtWithoutVerification.ql b/javascript/ql/src/experimental/Security/CWE-347/decodeJwtWithoutVerification.ql index 429744bbbd1..259d27227a3 100644 --- a/javascript/ql/src/experimental/Security/CWE-347/decodeJwtWithoutVerification.ql +++ b/javascript/ql/src/experimental/Security/CWE-347/decodeJwtWithoutVerification.ql @@ -36,6 +36,6 @@ import UnverifiedDecodeFlow::PathGraph from UnverifiedDecodeFlow::PathNode source, UnverifiedDecodeFlow::PathNode sink where UnverifiedDecodeFlow::flowPath(source, sink) and - not VerifiedDecodeFlow::flow(source.getNode(), _) + not VerifiedDecodeFlow::flowFrom(source.getNode()) select source.getNode(), source, sink, "Decoding JWT $@.", sink.getNode(), "without signature verification" diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 93dd9cf7ae7..1ef59ad1834 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.1.4-dev +version: 2.2.4-dev groups: - javascript - queries diff --git a/javascript/ql/test/library-tests/AMD/tests.ql b/javascript/ql/test/library-tests/AMD/tests.ql index e71ae089f2d..150c5e9a294 100644 --- a/javascript/ql/test/library-tests/AMD/tests.ql +++ b/javascript/ql/test/library-tests/AMD/tests.ql @@ -1,5 +1,6 @@ import javascript +overlay[local] class TestAmdModuleRange extends AmdModuleDefinition::Range { TestAmdModuleRange() { this.getCallee().(PropAccess).getQualifiedName() = "test.amd.range" } } diff --git a/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitions.ql b/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitions.ql index a2d69f55ce8..c0571921fba 100644 --- a/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitions.ql +++ b/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitions.ql @@ -4,6 +4,7 @@ import semmle.javascript.dataflow.internal.FlowSteps as FlowSteps import semmle.javascript.dataflow.internal.AbstractPropertiesImpl as AbstractPropertiesImpl import semmle.javascript.dataflow.CustomAbstractValueDefinitions +overlay[local] class MyCustomAbstractValueDefinition extends CustomAbstractValueDefinition { DataFlow::ValueNode node; diff --git a/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitionsFlow.ql b/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitionsFlow.ql index 0308ad6bf45..0f34b14b48c 100644 --- a/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitionsFlow.ql +++ b/javascript/ql/test/library-tests/CustomAbstractValueDefinitions/CustomAbstractValueDefinitionsFlow.ql @@ -2,6 +2,7 @@ import javascript import semmle.javascript.dataflow.InferredTypes import semmle.javascript.dataflow.CustomAbstractValueDefinitions +overlay[local] class MyCustomAbstractValueDefinition extends CustomAbstractValueDefinition, AST::ValueNode { MyCustomAbstractValueDefinition() { this.flow() instanceof DataFlow::ObjectLiteralNode and diff --git a/javascript/ql/test/library-tests/FlowCustomisation/customValues.ql b/javascript/ql/test/library-tests/FlowCustomisation/customValues.ql index 0b3f87f1b8d..75c4af21ed7 100644 --- a/javascript/ql/test/library-tests/FlowCustomisation/customValues.ql +++ b/javascript/ql/test/library-tests/FlowCustomisation/customValues.ql @@ -4,6 +4,7 @@ private import semmle.javascript.dataflow.InferredTypes /** * A custom abstract value representing the DOM object `document`. */ +overlay[local] class Document extends CustomAbstractValueTag { Document() { this = "document" } @@ -25,6 +26,7 @@ class Document extends CustomAbstractValueTag { * Note that `getType()` isn't quite right, since `typeof document.all === 'undefined'`, * but that's fine for the purposes of this test. */ +overlay[local] class DocumentAll extends CustomAbstractValueTag { DocumentAll() { this = "document.all" } diff --git a/javascript/ql/test/library-tests/FlowSummary/test.ql b/javascript/ql/test/library-tests/FlowSummary/test.ql index 0e40dcdadb0..147908706c8 100644 --- a/javascript/ql/test/library-tests/FlowSummary/test.ql +++ b/javascript/ql/test/library-tests/FlowSummary/test.ql @@ -32,5 +32,5 @@ class BasicBarrierGuard extends DataFlow::CallNode { deprecated class ConsistencyConfig extends ConsistencyConfiguration { ConsistencyConfig() { this = "ConsistencyConfig" } - override DataFlow::Node getAnAlert() { Flow::flow(_, result) } + override DataFlow::Node getAnAlert() { Flow::flowTo(result) } } diff --git a/javascript/ql/test/library-tests/ModuleImportNodes/CustomImport.ql b/javascript/ql/test/library-tests/ModuleImportNodes/CustomImport.ql index abc8c4e1755..c118e36e606 100644 --- a/javascript/ql/test/library-tests/ModuleImportNodes/CustomImport.ql +++ b/javascript/ql/test/library-tests/ModuleImportNodes/CustomImport.ql @@ -1,5 +1,6 @@ import javascript +overlay[local] class CustomImport extends DataFlow::ModuleImportNode::Range, DataFlow::CallNode { CustomImport() { this.getCalleeName() = "customImport" } diff --git a/javascript/ql/test/library-tests/Nodes/globalObjectRef.expected b/javascript/ql/test/library-tests/Nodes/globalObjectRef.expected index 0c35fe87b26..d3a779eb597 100644 --- a/javascript/ql/test/library-tests/Nodes/globalObjectRef.expected +++ b/javascript/ql/test/library-tests/Nodes/globalObjectRef.expected @@ -5,9 +5,12 @@ | tst2.js:8:1:8:6 | global | | tst3.js:1:1:1:0 | this | | tst3.js:3:9:3:19 | goog.global | +| tst4.js:1:1:1:0 | this | +| tst4.js:1:1:1:38 | require ... ultView | | tst.js:1:1:1:0 | this | | tst.js:1:1:1:6 | window | | tst.js:3:1:3:6 | window | | tst.js:4:1:4:6 | window | | tst.js:5:1:5:4 | self | | tst.js:6:1:6:10 | globalThis | +| tst.js:7:1:7:20 | document.defaultView | diff --git a/javascript/ql/test/library-tests/Nodes/globalVarRef.expected b/javascript/ql/test/library-tests/Nodes/globalVarRef.expected index 507e099b80a..48d912d3aa7 100644 --- a/javascript/ql/test/library-tests/Nodes/globalVarRef.expected +++ b/javascript/ql/test/library-tests/Nodes/globalVarRef.expected @@ -1,15 +1,19 @@ | Object | tst2.js:8:1:8:13 | global.Object | | String | tst2.js:9:1:9:11 | this.String | | document | tst2.js:2:1:2:26 | require ... ument") | +| document | tst4.js:1:1:1:26 | require ... ument") | | document | tst.js:3:1:3:15 | window.document | | document | tst.js:5:1:5:13 | self.document | | document | tst.js:6:1:6:19 | globalThis.document | +| document | tst.js:7:1:7:8 | document | | foo | tst3.js:4:1:4:5 | w.foo | | global | tst2.js:7:1:7:6 | global | | global | tst2.js:8:1:8:6 | global | | globalThis | tst.js:6:1:6:10 | globalThis | | goog | tst3.js:1:1:1:4 | goog | | goog | tst3.js:3:9:3:12 | goog | +| history | tst4.js:1:1:1:46 | require ... history | +| history | tst.js:7:1:7:28 | documen ... history | | self | tst.js:5:1:5:4 | self | | setTimeout | tst2.js:5:1:5:12 | g.setTimeout | | window | tst2.js:3:1:3:24 | require ... indow") | diff --git a/javascript/ql/test/library-tests/Nodes/tst.js b/javascript/ql/test/library-tests/Nodes/tst.js index ec660b25580..395309672d3 100644 --- a/javascript/ql/test/library-tests/Nodes/tst.js +++ b/javascript/ql/test/library-tests/Nodes/tst.js @@ -4,3 +4,4 @@ window.document; window.window.document; self.document; globalThis.document; +document.defaultView.history; diff --git a/javascript/ql/test/library-tests/Nodes/tst4.js b/javascript/ql/test/library-tests/Nodes/tst4.js new file mode 100644 index 00000000000..087a780629e --- /dev/null +++ b/javascript/ql/test/library-tests/Nodes/tst4.js @@ -0,0 +1 @@ +require("global/document").defaultView.history; diff --git a/javascript/ql/test/library-tests/RecursionPrevention/SourceNodeFlowsTo.ql b/javascript/ql/test/library-tests/RecursionPrevention/SourceNodeFlowsTo.ql index 9a5350948fe..a9d27450aee 100644 --- a/javascript/ql/test/library-tests/RecursionPrevention/SourceNodeFlowsTo.ql +++ b/javascript/ql/test/library-tests/RecursionPrevention/SourceNodeFlowsTo.ql @@ -7,6 +7,7 @@ import javascript +overlay[local] class BadSourceNode extends DataFlow::SourceNode { BadSourceNode() { this.(DataFlow::PropRead).getPropertyName() = "foo" } diff --git a/javascript/ql/test/library-tests/frameworks/data/test.ql b/javascript/ql/test/library-tests/frameworks/data/test.ql index 6a1d571351b..6ba504e921f 100644 --- a/javascript/ql/test/library-tests/frameworks/data/test.ql +++ b/javascript/ql/test/library-tests/frameworks/data/test.ql @@ -2,6 +2,7 @@ import javascript deprecated import utils.test.ConsistencyChecking import semmle.javascript.frameworks.data.internal.ApiGraphModels as ApiGraphModels +overlay[local] class TypeModelFromCodeQL extends ModelInput::TypeModel { override predicate isTypeUsed(string type) { type = "danger-constant" } diff --git a/javascript/ql/test/library-tests/frameworks/data/warnings.ql b/javascript/ql/test/library-tests/frameworks/data/warnings.ql index 1ede8e08bcc..2c3c044ef69 100644 --- a/javascript/ql/test/library-tests/frameworks/data/warnings.ql +++ b/javascript/ql/test/library-tests/frameworks/data/warnings.ql @@ -1,6 +1,7 @@ import javascript import semmle.javascript.frameworks.data.internal.ApiGraphModels as ApiGraphModels +overlay[local] class IsTesting extends ApiGraphModels::TestAllModels { IsTesting() { this = this } } diff --git a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected index e536364f805..b488018d09d 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected @@ -35,6 +35,8 @@ | app/api/routeNextRequest.ts:15:20:15:23 | body | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | app/api/routeNextRequest.ts:15:20:15:23 | body | Cross-site scripting vulnerability due to a $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value | | app/api/routeNextRequest.ts:27:20:27:23 | body | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | app/api/routeNextRequest.ts:27:20:27:23 | body | Cross-site scripting vulnerability due to a $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value | | app/api/routeNextRequest.ts:31:27:31:30 | body | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | app/api/routeNextRequest.ts:31:27:31:30 | body | Cross-site scripting vulnerability due to a $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value | +| app/pages/Next2.jsx:8:13:8:19 | req.url | app/pages/Next2.jsx:8:13:8:19 | req.url | app/pages/Next2.jsx:8:13:8:19 | req.url | Cross-site scripting vulnerability due to a $@. | app/pages/Next2.jsx:8:13:8:19 | req.url | user-provided value | +| app/pages/Next2.jsx:15:13:15:19 | req.url | app/pages/Next2.jsx:15:13:15:19 | req.url | app/pages/Next2.jsx:15:13:15:19 | req.url | Cross-site scripting vulnerability due to a $@. | app/pages/Next2.jsx:15:13:15:19 | req.url | user-provided value | | etherpad.js:11:12:11:19 | response | etherpad.js:9:16:9:30 | req.query.jsonp | etherpad.js:11:12:11:19 | response | Cross-site scripting vulnerability due to a $@. | etherpad.js:9:16:9:30 | req.query.jsonp | user-provided value | | formatting.js:6:14:6:47 | util.fo ... , evil) | formatting.js:4:16:4:29 | req.query.evil | formatting.js:6:14:6:47 | util.fo ... , evil) | Cross-site scripting vulnerability due to a $@. | formatting.js:4:16:4:29 | req.query.evil | user-provided value | | formatting.js:7:14:7:53 | require ... , evil) | formatting.js:4:16:4:29 | req.query.evil | formatting.js:7:14:7:53 | require ... , evil) | Cross-site scripting vulnerability due to a $@. | formatting.js:4:16:4:29 | req.query.evil | user-provided value | @@ -365,6 +367,8 @@ nodes | app/api/routeNextRequest.ts:15:20:15:23 | body | semmle.label | body | | app/api/routeNextRequest.ts:27:20:27:23 | body | semmle.label | body | | app/api/routeNextRequest.ts:31:27:31:30 | body | semmle.label | body | +| app/pages/Next2.jsx:8:13:8:19 | req.url | semmle.label | req.url | +| app/pages/Next2.jsx:15:13:15:19 | req.url | semmle.label | req.url | | etherpad.js:9:5:9:12 | response | semmle.label | response | | etherpad.js:9:16:9:30 | req.query.jsonp | semmle.label | req.query.jsonp | | etherpad.js:11:12:11:19 | response | semmle.label | response | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected index a4b02fa0749..2dceb5fa807 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected @@ -34,6 +34,8 @@ | app/api/routeNextRequest.ts:15:20:15:23 | body | Cross-site scripting vulnerability due to $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value | | app/api/routeNextRequest.ts:27:20:27:23 | body | Cross-site scripting vulnerability due to $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value | | app/api/routeNextRequest.ts:31:27:31:30 | body | Cross-site scripting vulnerability due to $@. | app/api/routeNextRequest.ts:4:22:4:31 | req.json() | user-provided value | +| app/pages/Next2.jsx:8:13:8:19 | req.url | Cross-site scripting vulnerability due to $@. | app/pages/Next2.jsx:8:13:8:19 | req.url | user-provided value | +| app/pages/Next2.jsx:15:13:15:19 | req.url | Cross-site scripting vulnerability due to $@. | app/pages/Next2.jsx:15:13:15:19 | req.url | user-provided value | | formatting.js:6:14:6:47 | util.fo ... , evil) | Cross-site scripting vulnerability due to $@. | formatting.js:4:16:4:29 | req.query.evil | user-provided value | | formatting.js:7:14:7:53 | require ... , evil) | Cross-site scripting vulnerability due to $@. | formatting.js:4:16:4:29 | req.query.evil | user-provided value | | live-server.js:6:13:6:50 | ` ... /html>` | Cross-site scripting vulnerability due to $@. | live-server.js:4:21:4:27 | req.url | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/app/pages/Next2.jsx b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/app/pages/Next2.jsx new file mode 100644 index 00000000000..d6c2232e957 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/app/pages/Next2.jsx @@ -0,0 +1,19 @@ +export default function Post() { + return ; +} + +Post.getInitialProps = async (ctx) => { + const req = ctx.req; + const res = ctx.res; + res.end(req.url); // $ Alert + return {} +} + +export async function getServerSideProps(ctx) { + const req = ctx.req; + const res = ctx.res; + res.end(req.url); // $ Alert + return { + props: {} + } +} \ No newline at end of file diff --git a/javascript/ql/test/tutorials/Introducing the JavaScript libraries/query17.qll b/javascript/ql/test/tutorials/Introducing the JavaScript libraries/query17.qll index e6dff623e97..e0a5ac34a91 100644 --- a/javascript/ql/test/tutorials/Introducing the JavaScript libraries/query17.qll +++ b/javascript/ql/test/tutorials/Introducing the JavaScript libraries/query17.qll @@ -14,7 +14,7 @@ predicate passwordVarAssign(Variable v, DataFlow::Node nd) { module PasswordFlow = DataFlow::Global; query predicate test_query17(DataFlow::Node sink, string res) { - exists(Variable v | PasswordFlow::flow(_, sink) and passwordVarAssign(v, sink) | + exists(Variable v | PasswordFlow::flowTo(sink) and passwordVarAssign(v, sink) | res = "Password variable " + v.toString() + " is assigned a constant string." ) } diff --git a/misc/bazel/csharp.bzl b/misc/bazel/csharp.bzl index 7a317909627..0cf2e30d0de 100644 --- a/misc/bazel/csharp.bzl +++ b/misc/bazel/csharp.bzl @@ -2,7 +2,7 @@ load("@rules_dotnet//dotnet:defs.bzl", "csharp_binary", "csharp_library", "cshar load("@rules_pkg//pkg:mappings.bzl", "strip_prefix") load("//misc/bazel:pkg.bzl", "codeql_pkg_files") -TARGET_FRAMEWORK = "net9.0" +TARGET_FRAMEWORK = "net10.0" def _gen_assembly_info(name): assembly_info_gen = name + "-assembly-info" diff --git a/misc/bazel/registry/fix.py b/misc/bazel/registry/fix.py index a2b947e19e2..863c832be59 100755 --- a/misc/bazel/registry/fix.py +++ b/misc/bazel/registry/fix.py @@ -35,6 +35,9 @@ def patch_json(file, **kwargs): def update(data): data = json.loads(data) if data else {} data.update(kwargs) + for k, v in kwargs.items(): + if v is None: + data.pop(k) return json.dumps(data, indent=4) + "\n" patch_file(file, update) @@ -48,8 +51,21 @@ for entry in this_dir.joinpath("modules").iterdir(): patch_json(entry / "metadata.json", versions=[v.name for v in versions]) for version in versions: - patch_json(version / "source.json", patches={ - p.name: sha256(p) for p in version.joinpath("patches").iterdir() - }) - patch_file(version / "MODULE.bazel", - lambda s: re.sub(r'''version\s*=\s*['"].*['"]''', f'version = "{version.name}"', s, 1)) + patches = version.joinpath("patches") + overlay = version.joinpath("overlay") + modules = [version / "MODULE.bazel", overlay / "MODULE.bazel"] + for module in modules: + if module.is_file(): + patch_file( + module, + lambda s: re.sub(r'''version\s*=\s*['"].*['"]''', f'version = "{version.name}"', s, 1)) + patch_json( + version / "source.json", + patches={ + p.name: sha256(p) for p in patches.iterdir() + } if patches.is_dir() else None, + patch_strip=1 if patches.is_dir() else None, + overlay={ + o.name: sha256(o) for o in overlay.iterdir() + } if overlay.is_dir() else None, + ) diff --git a/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/MODULE.bazel b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/MODULE.bazel new file mode 100644 index 00000000000..898d1bed0fc --- /dev/null +++ b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/MODULE.bazel @@ -0,0 +1,9 @@ +module( + name = "fmt", + version = "12.1.0-codeql.1", + bazel_compatibility = [">=7.2.1"], + compatibility_level = 10, +) + +bazel_dep(name = "rules_cc", version = "0.2.13") +bazel_dep(name = "rules_license", version = "1.0.0") diff --git a/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/overlay/BUILD.bazel b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/overlay/BUILD.bazel new file mode 100644 index 00000000000..bde3d4a3d31 --- /dev/null +++ b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/overlay/BUILD.bazel @@ -0,0 +1,40 @@ +load("@rules_cc//cc:cc_library.bzl", "cc_library") +load("@rules_license//rules:license.bzl", "license") + +package( + default_applicable_licenses = [":license"], +) + +exports_files([ + "LICENSE", +]) + +license( + name = "license", + license_kinds = ["@rules_license//licenses/spdx:MIT"], + license_text = "LICENSE", +) + +cc_library( + name = "fmt", + srcs = [ + #"src/fmt.cc", # No C++ module support, yet in Bazel (https://github.com/bazelbuild/bazel/pull/19940) + "src/format.cc", + "src/os.cc", + ], + hdrs = glob([ + "include/fmt/*.h", + ]), + # codeql change: disable UTF8 support, it's causing issues on Windows + # copts = select({ + # "@rules_cc//cc/compiler:msvc-cl": ["/utf-8"], + # "//conditions:default": [], + # }), + defines = select({ + "@rules_cc//cc/compiler:msvc-cl": ["FMT_UNICODE=0"], + "//conditions:default": [], + }), + includes = ["include"], + strip_include_prefix = "include", # workaround: only needed on some macOS systems (see https://github.com/bazelbuild/bazel-central-registry/issues/1537) + visibility = ["//visibility:public"], +) diff --git a/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/overlay/MODULE.bazel b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/overlay/MODULE.bazel new file mode 100644 index 00000000000..898d1bed0fc --- /dev/null +++ b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/overlay/MODULE.bazel @@ -0,0 +1,9 @@ +module( + name = "fmt", + version = "12.1.0-codeql.1", + bazel_compatibility = [">=7.2.1"], + compatibility_level = 10, +) + +bazel_dep(name = "rules_cc", version = "0.2.13") +bazel_dep(name = "rules_license", version = "1.0.0") diff --git a/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/source.json b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/source.json new file mode 100644 index 00000000000..91a417baba5 --- /dev/null +++ b/misc/bazel/registry/modules/fmt/12.1.0-codeql.1/source.json @@ -0,0 +1,9 @@ +{ + "url": "https://github.com/fmtlib/fmt/releases/download/12.1.0/fmt-12.1.0.zip", + "integrity": "sha256-aV/Rl/pa/4/Ge18rvBEEkKh1zfekFoashRL7SA+orac=", + "strip_prefix": "fmt-12.1.0", + "overlay": { + "BUILD.bazel": "sha256-T6CBBdPY92Iloq9NrMjm9kQeQA3nTZJeym6xG5cclOQ=", + "MODULE.bazel": "sha256-Dgke/2OMsffv9jPSDxIwIgJIb4L77VW6lR8TsNHsekg=" + } +} diff --git a/misc/bazel/registry/modules/fmt/metadata.json b/misc/bazel/registry/modules/fmt/metadata.json new file mode 100644 index 00000000000..ca5dd486153 --- /dev/null +++ b/misc/bazel/registry/modules/fmt/metadata.json @@ -0,0 +1,22 @@ +{ + "homepage": "https://github.com/fmtlib/fmt", + "maintainers": [ + { + "email": "julian.amann@tum.de", + "github": "Vertexwahn", + "github_user_id": 3775001, + "name": "Julian Amann" + }, + { + "github": "mering", + "github_user_id": 133344217 + } + ], + "repository": [ + "github:fmtlib/fmt" + ], + "versions": [ + "12.1.0-codeql.1" + ], + "yanked_versions": {} +} diff --git a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/MODULE.bazel b/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/MODULE.bazel deleted file mode 100644 index ba047f282b0..00000000000 --- a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/MODULE.bazel +++ /dev/null @@ -1,57 +0,0 @@ -"rules_dotnet" - -module( - name = "rules_dotnet", - version = "0.19.2-codeql.1", - bazel_compatibility = [">=7.0.0"], - compatibility_level = 0, -) - -dotnet = use_extension("@rules_dotnet//dotnet:extensions.bzl", "dotnet") -dotnet.toolchain(dotnet_version = "9.0.300") -use_repo(dotnet, "dotnet_toolchains") - -register_toolchains("@dotnet_toolchains//:all") - -paket2bazel_dependencies_extension = use_extension("//dotnet:paket.paket2bazel_dependencies_extension.bzl", "paket2bazel_dependencies_extension") -use_repo(paket2bazel_dependencies_extension, "paket.paket2bazel_dependencies") - -rules_dotnet_nuget_packages_extension = use_extension("//dotnet:paket.rules_dotnet_nuget_packages_extension.bzl", "rules_dotnet_nuget_packages_extension") -use_repo(rules_dotnet_nuget_packages_extension, "paket.rules_dotnet_nuget_packages") - -targeting_packs_extension = use_extension("//dotnet/private/sdk/targeting_packs:dotnet.targeting_packs_extension.bzl", "targeting_packs_extension") -use_repo(targeting_packs_extension, "dotnet.targeting_packs") - -runtime_packs_extension = use_extension("//dotnet/private/sdk/runtime_packs:dotnet.runtime_packs_extension.bzl", "runtime_packs_extension") -use_repo(runtime_packs_extension, "dotnet.runtime_packs") - -apphost_packs_extension = use_extension("//dotnet/private/sdk/apphost_packs:dotnet.apphost_packs_extension.bzl", "apphost_packs_extension") -use_repo(apphost_packs_extension, "dotnet.apphost_packs") - -bazel_dep(name = "bazel_skylib", version = "1.7.1") -bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") -bazel_dep(name = "rules_shell", version = "0.5.0") - -# Dev dependencies -bazel_dep(name = "stardoc", version = "0.8.0", dev_dependency = True) -bazel_dep(name = "rules_pkg", version = "1.1.0", dev_dependency = True) -bazel_dep(name = "gazelle", version = "0.44.0", dev_dependency = True, repo_name = "bazel_gazelle") -bazel_dep(name = "bazel_skylib_gazelle_plugin", version = "1.7.1", dev_dependency = True) -bazel_dep(name = "rules_cc", version = "0.1.2", dev_dependency = True) -bazel_dep(name = "rules_testing", version = "0.8.0", dev_dependency = True) -bazel_dep(name = "bazel_ci_rules", version = "1.0.0", dev_dependency = True) -bazel_dep(name = "dotnet_test_resources_other_repo", version = "", dev_dependency = True) -local_path_override( - module_name = "dotnet_test_resources_other_repo", - path = "dotnet/private/tests/resources/other_repo", -) - -rules_dotnet_dev_nuget_packages_extension = use_extension("//dotnet:paket.rules_dotnet_dev_nuget_packages_extension.bzl", "rules_dotnet_dev_nuget_packages_extension", dev_dependency = True) -use_repo(rules_dotnet_dev_nuget_packages_extension, "paket.rules_dotnet_dev_nuget_packages") - -rules_dotnet_nuget_resource_assemblies_tests_extension = use_extension("//dotnet:paket.rules_dotnet_nuget_resource_assemblies_tests_extension.bzl", "rules_dotnet_nuget_resource_assemblies_tests_extension", dev_dependency = True) -use_repo(rules_dotnet_nuget_resource_assemblies_tests_extension, "paket.rules_dotnet_nuget_resource_assemblies_tests") - -internal_dev_deps = use_extension("//dotnet:internal_dev_deps.bzl", "internal_dev_deps", dev_dependency = True) -use_repo(internal_dev_deps, "buildkite_config") diff --git a/misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/MODULE.bazel b/misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/MODULE.bazel new file mode 100644 index 00000000000..caaf52f2b9b --- /dev/null +++ b/misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/MODULE.bazel @@ -0,0 +1,71 @@ +"rules_dotnet" + +module( + name = "rules_dotnet", + version = "0.21.5-codeql.1", + bazel_compatibility = [">=8.0.0"], + compatibility_level = 0, +) + +dotnet = use_extension("@rules_dotnet//dotnet:extensions.bzl", "dotnet") +dotnet.toolchain(dotnet_version = "10.0.100") +dotnet.toolchain( + name = "dotnet_apphost", + dotnet_version = "10.0.100", +) +use_repo(dotnet, "dotnet_toolchains") + +# These toolchains are used to build the apphost shimmer +use_repo(dotnet, "dotnet_apphost_x86_64-unknown-linux-gnu") +use_repo(dotnet, "dotnet_apphost_arm64-unknown-linux-gnu") +use_repo(dotnet, "dotnet_apphost_aarch64-apple-darwin") +use_repo(dotnet, "dotnet_apphost_x86_64-apple-darwin") +use_repo(dotnet, "dotnet_apphost_x86_64-pc-windows-msvc") +use_repo(dotnet, "dotnet_apphost_arm64-pc-windows-msvc") + +register_toolchains("@dotnet_toolchains//:all") + +paket2bazel_dependencies_extension = use_extension("@rules_dotnet//dotnet:paket.paket2bazel_dependencies_extension.bzl", "paket2bazel_dependencies_extension") +use_repo(paket2bazel_dependencies_extension, "paket.paket2bazel_dependencies") + +rules_dotnet_nuget_packages_extension = use_extension("@rules_dotnet//dotnet:paket.rules_dotnet_nuget_packages_extension.bzl", "rules_dotnet_nuget_packages_extension") +use_repo(rules_dotnet_nuget_packages_extension, "paket.rules_dotnet_nuget_packages") + +targeting_packs_extension = use_extension("@rules_dotnet//dotnet/private/sdk/targeting_packs:dotnet.targeting_packs_extension.bzl", "targeting_packs_extension") +use_repo(targeting_packs_extension, "dotnet.targeting_packs") + +runtime_packs_extension = use_extension("@rules_dotnet//dotnet/private/sdk/runtime_packs:dotnet.runtime_packs_extension.bzl", "runtime_packs_extension") +use_repo(runtime_packs_extension, "dotnet.runtime_packs") + +apphost_packs_extension = use_extension("@rules_dotnet//dotnet/private/sdk/apphost_packs:dotnet.apphost_packs_extension.bzl", "apphost_packs_extension") +use_repo(apphost_packs_extension, "dotnet.apphost_packs") + +bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "platforms", version = "1.0.0") +bazel_dep(name = "bazel_lib", version = "3.0.0") +bazel_dep(name = "rules_shell", version = "0.5.0") + +# Dev dependencies +bazel_dep(name = "rules_pkg", version = "1.1.0", dev_dependency = True) +bazel_dep(name = "gazelle", version = "0.44.0", dev_dependency = True, repo_name = "bazel_gazelle") +bazel_dep(name = "bazel_skylib_gazelle_plugin", version = "1.7.1", dev_dependency = True) +bazel_dep(name = "rules_cc", version = "0.1.2", dev_dependency = True) +bazel_dep(name = "rules_testing", version = "0.8.0", dev_dependency = True) +bazel_dep(name = "bazel_ci_rules", version = "1.0.0", dev_dependency = True) +bazel_dep(name = "dotnet_test_resources_other_repo", version = "", dev_dependency = True) +local_path_override( + module_name = "dotnet_test_resources_other_repo", + path = "dotnet/private/tests/resources/other_repo", +) + +rules_dotnet_dev_nuget_packages_extension = use_extension("@rules_dotnet//dotnet:paket.rules_dotnet_dev_nuget_packages_extension.bzl", "rules_dotnet_dev_nuget_packages_extension", dev_dependency = True) +use_repo(rules_dotnet_dev_nuget_packages_extension, "paket.rules_dotnet_dev_nuget_packages") + +rules_dotnet_nuget_resource_assemblies_tests_extension = use_extension("@rules_dotnet//dotnet:paket.rules_dotnet_nuget_resource_assemblies_tests_extension.bzl", "rules_dotnet_nuget_resource_assemblies_tests_extension", dev_dependency = True) +use_repo(rules_dotnet_nuget_resource_assemblies_tests_extension, "paket.rules_dotnet_nuget_resource_assemblies_tests") + +internal_dev_deps = use_extension("@rules_dotnet//dotnet:internal_dev_deps.bzl", "internal_dev_deps", dev_dependency = True) +use_repo(internal_dev_deps, "buildkite_config") + +rules_dotnet_nuget_tool_tests_extension = use_extension("@rules_dotnet//dotnet:paket.rules_dotnet_nuget_tool_tests_extension.bzl", "rules_dotnet_nuget_tool_tests_extension", dev_dependency = True) +use_repo(rules_dotnet_nuget_tool_tests_extension, "paket.rules_dotnet_nuget_tool_tests") diff --git a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/patches/revert_additional_files_in_nuget_archive.patch b/misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/patches/revert_additional_files_in_nuget_archive.patch similarity index 100% rename from misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/patches/revert_additional_files_in_nuget_archive.patch rename to misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/patches/revert_additional_files_in_nuget_archive.patch diff --git a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/source.json b/misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/source.json similarity index 57% rename from misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/source.json rename to misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/source.json index 928683521e2..aabd82d97c0 100644 --- a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/source.json +++ b/misc/bazel/registry/modules/rules_dotnet/0.21.5-codeql.1/source.json @@ -1,7 +1,7 @@ { - "integrity": "sha256-6f9LidI9BUve7+TpoL1sh5GKC6sgLSYNImlVnVaiHEE=", - "strip_prefix": "rules_dotnet-0.19.2", - "url": "https://github.com/bazel-contrib/rules_dotnet/releases/download/v0.19.2/rules_dotnet-v0.19.2.tar.gz", + "integrity": "sha256-fgvSYSFAtQh+MuDzTji3iWR642WwefGCSzCLLUtZyFE=", + "strip_prefix": "rules_dotnet-0.21.5", + "url": "https://github.com/bazel-contrib/rules_dotnet/releases/download/v0.21.5/rules_dotnet-v0.21.5.tar.gz", "patches": { "revert_additional_files_in_nuget_archive.patch": "sha256-FzMKXeHVhIBXQRCNFB0EANDszgJc/BBaPgWCzkbW9Ck=" }, diff --git a/misc/bazel/registry/modules/rules_dotnet/metadata.json b/misc/bazel/registry/modules/rules_dotnet/metadata.json index 684babcda14..ea34a05cfb6 100644 --- a/misc/bazel/registry/modules/rules_dotnet/metadata.json +++ b/misc/bazel/registry/modules/rules_dotnet/metadata.json @@ -13,7 +13,7 @@ "github:bazel-contrib/rules_dotnet" ], "versions": [ - "0.19.2-codeql.1" + "0.21.5-codeql.1" ], "yanked_versions": {} } diff --git a/misc/ripunzip/BUILD.bazel b/misc/ripunzip/BUILD.bazel index fb33124f3b2..abd9c082887 100644 --- a/misc/ripunzip/BUILD.bazel +++ b/misc/ripunzip/BUILD.bazel @@ -2,7 +2,7 @@ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") alias( name = "ripunzip", - actual = select({"@platforms//os:" + os: "@ripunzip-%s//:ripunzip" % os for os in ("linux", "windows", "macos")}), + actual = "@ripunzip", visibility = ["//visibility:public"], ) diff --git a/misc/ripunzip/BUILD.ripunzip.bazel b/misc/ripunzip/BUILD.ripunzip.bazel index e2832d1e275..582138dd3e1 100644 --- a/misc/ripunzip/BUILD.ripunzip.bazel +++ b/misc/ripunzip/BUILD.ripunzip.bazel @@ -2,7 +2,7 @@ load("@bazel_skylib//rules:native_binary.bzl", "native_binary") native_binary( name = "ripunzip", - src = glob(["ripunzip-*"])[0], + src = glob(["bin/ripunzip*"])[0], out = "ripunzip" + select({ "@platforms//os:windows": ".exe", "//conditions:default": "", diff --git a/misc/ripunzip/ripunzip-Linux.tar.zst b/misc/ripunzip/ripunzip-Linux.tar.zst deleted file mode 100644 index 94530212daf..00000000000 --- a/misc/ripunzip/ripunzip-Linux.tar.zst +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6df3e70fa425f5640aba1b319ed21f0a12d3e5d39d5da8cb4820396149c95bd -size 4740396 diff --git a/misc/ripunzip/ripunzip-Windows.tar.zst b/misc/ripunzip/ripunzip-Windows.tar.zst deleted file mode 100644 index 81f156c41b5..00000000000 --- a/misc/ripunzip/ripunzip-Windows.tar.zst +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a85c91867649a0ca0bbfddd2c88a3f3da7e0a44edd293571d72ee8492bc9b81b -size 1765497 diff --git a/misc/ripunzip/ripunzip-macOS.tar.zst b/misc/ripunzip/ripunzip-macOS.tar.zst deleted file mode 100644 index 2f5e111c78e..00000000000 --- a/misc/ripunzip/ripunzip-macOS.tar.zst +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fbc5326b12fa6b9e06d48c60fb9cd363fff9a0c87a81ed93c29facbe9d2e4f2 -size 3796231 diff --git a/misc/ripunzip/ripunzip.bzl b/misc/ripunzip/ripunzip.bzl new file mode 100644 index 00000000000..2e707c267e2 --- /dev/null +++ b/misc/ripunzip/ripunzip.bzl @@ -0,0 +1,59 @@ +def _ripunzip_archive_impl(repository_ctx): + version = repository_ctx.attr.version + url_prefix = "https://github.com/GoogleChrome/ripunzip/releases/download/v%s" % version + build_file = Label("//misc/ripunzip:BUILD.ripunzip.bazel") + if "linux" in repository_ctx.os.name: + # ripunzip only provides a deb package for Linux: we fish the binary out of it + # a deb archive contains a data.tar.xz one which contains the files to be installed under usr/bin + repository_ctx.download_and_extract( + url = "%s/ripunzip_%s-1_amd64.deb" % (url_prefix, version), + sha256 = repository_ctx.attr.sha256_linux, + canonical_id = "ripunzip-linux", + output = "deb", + ) + repository_ctx.extract( + "deb/data.tar.xz", + strip_prefix = "usr/bin", + output = "bin", + ) + elif "windows" in repository_ctx.os.name: + repository_ctx.download_and_extract( + url = "%s/ripunzip_v%s_x86_64-pc-windows-msvc.zip" % (url_prefix, version), + canonical_id = "ripunzip-windows", + sha256 = repository_ctx.attr.sha256_windows, + output = "bin", + ) + elif "mac os" in repository_ctx.os.name: + arch = repository_ctx.os.arch + if arch == "x86_64": + suffix = "x86_64-apple-darwin" + sha256 = repository_ctx.attr.sha256_macos_intel + canonical_id = "ripunzip-macos-intel" + elif arch == "aarch64": + suffix = "aarch64-apple-darwin" + sha256 = repository_ctx.attr.sha256_macos_arm + canonical_id = "ripunzip-macos-arm" + else: + fail("Unsupported macOS architecture: %s" % arch) + repository_ctx.download_and_extract( + url = "%s/ripunzip_v%s_%s.tar.gz" % (url_prefix, version, suffix), + sha256 = sha256, + canonical_id = canonical_id, + output = "bin", + ) + else: + fail("Unsupported OS: %s" % repository_ctx.os.name) + repository_ctx.file("WORKSPACE.bazel") + repository_ctx.symlink(build_file, "BUILD.bazel") + +ripunzip_archive = repository_rule( + implementation = _ripunzip_archive_impl, + doc = "Downloads a prebuilt ripunzip binary for the host platform from https://github.com/GoogleChrome/ripunzip/releases", + attrs = { + "version": attr.string(mandatory = True), + "sha256_linux": attr.string(mandatory = True), + "sha256_windows": attr.string(mandatory = True), + "sha256_macos_intel": attr.string(mandatory = True), + "sha256_macos_arm": attr.string(mandatory = True), + }, +) diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 203d289a673..5e5c3c37bae 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.35.md b/misc/suite-helpers/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.36.md b/misc/suite-helpers/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.37.md b/misc/suite-helpers/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.38.md b/misc/suite-helpers/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index e3283b5dc3f..3a79aea9f46 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.35-dev +version: 1.0.39-dev groups: shared warnOnImplicitThis: true diff --git a/python/extractor/imp.py b/python/extractor/imp.py index 8d703250b67..5130f64ebef 100644 --- a/python/extractor/imp.py +++ b/python/extractor/imp.py @@ -25,7 +25,7 @@ try: from importlib._bootstrap import _ERR_MSG except ImportError: from importlib._bootstrap import _ERR_MSG_PREFIX - _ERR_MSG = _ERR_MSG_PREFIX + '{name!r}' + _ERR_MSG = _ERR_MSG_PREFIX + '{!r}' from importlib import machinery from importlib import util diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 2f6a18ac7a9..445d40dab3d 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ from io import BytesIO #Semantic version of extractor. #Update this if any changes are made -VERSION = "7.1.5" +VERSION = "7.1.6" PY_EXTENSIONS = ".py", ".pyw" diff --git a/python/ql/examples/snippets/call.ql b/python/ql/examples/snippets/call.ql index b326024a33c..0c68bbd69b9 100644 --- a/python/ql/examples/snippets/call.ql +++ b/python/ql/examples/snippets/call.ql @@ -7,6 +7,7 @@ */ import python +private import LegacyPointsTo from Value len, CallNode call where len.getName() = "len" and len.getACall() = call diff --git a/python/ql/examples/snippets/extend_class.ql b/python/ql/examples/snippets/extend_class.ql index 805929ab709..8efc1b8241a 100644 --- a/python/ql/examples/snippets/extend_class.ql +++ b/python/ql/examples/snippets/extend_class.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from ClassObject sub, ClassObject base where diff --git a/python/ql/examples/snippets/method_call.ql b/python/ql/examples/snippets/method_call.ql index f78a9e43be0..c331b7c8bef 100644 --- a/python/ql/examples/snippets/method_call.ql +++ b/python/ql/examples/snippets/method_call.ql @@ -7,6 +7,7 @@ */ import python +private import LegacyPointsTo from AstNode call, PythonFunctionValue method where diff --git a/python/ql/examples/snippets/mutualrecursion.ql b/python/ql/examples/snippets/mutualrecursion.ql index 0cd445b6e3b..040dbae99d4 100644 --- a/python/ql/examples/snippets/mutualrecursion.ql +++ b/python/ql/examples/snippets/mutualrecursion.ql @@ -7,6 +7,7 @@ */ import python +private import LegacyPointsTo from FunctionObject m, FunctionObject n where m != n and m.getACallee() = n and n.getACallee() = m diff --git a/python/ql/examples/snippets/override_method.ql b/python/ql/examples/snippets/override_method.ql index 2b601d59df7..40c2eed8531 100644 --- a/python/ql/examples/snippets/override_method.ql +++ b/python/ql/examples/snippets/override_method.ql @@ -7,6 +7,7 @@ */ import python +private import LegacyPointsTo from FunctionObject override, FunctionObject base where diff --git a/python/ql/examples/snippets/recursion.ql b/python/ql/examples/snippets/recursion.ql index b986a265db5..7e0770f3927 100644 --- a/python/ql/examples/snippets/recursion.ql +++ b/python/ql/examples/snippets/recursion.ql @@ -7,6 +7,7 @@ */ import python +private import LegacyPointsTo from PythonFunctionValue f where f.getACall().getScope() = f.getScope() diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index df8a66ca0e6..17da65f262d 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,23 @@ +## 5.0.3 + +No user-facing changes. + +## 5.0.2 + +No user-facing changes. + +## 5.0.1 + +### Bug Fixes + +- Fixed a bug in the Python extractor's import handling where failing to find an import in `find_module` would cause a `KeyError` to be raised. (Contributed by @akoeplinger.) + +## 5.0.0 + +### Breaking Changes + +- The classes `ControlFlowNode`, `Expr`, and `Module` no longer expose predicates that invoke the points-to analysis. To access these predicates, import the module `LegacyPointsTo` and follow the instructions given therein. + ## 4.1.0 ### New Features diff --git a/python/ql/lib/LegacyPointsTo.qll b/python/ql/lib/LegacyPointsTo.qll index 3e675854601..45f4a80e8d1 100644 --- a/python/ql/lib/LegacyPointsTo.qll +++ b/python/ql/lib/LegacyPointsTo.qll @@ -20,8 +20,21 @@ */ private import python -private import semmle.python.pointsto.PointsTo -private import semmle.python.objects.Modules +import semmle.python.pointsto.Base +import semmle.python.pointsto.Context +import semmle.python.pointsto.PointsTo +import semmle.python.pointsto.PointsToContext +import semmle.python.objects.ObjectAPI +import semmle.python.objects.ObjectInternal +import semmle.python.types.Object +import semmle.python.types.ClassObject +import semmle.python.types.FunctionObject +import semmle.python.types.ModuleObject +import semmle.python.types.Exceptions +import semmle.python.types.Properties +import semmle.python.types.Descriptors +import semmle.python.SelfAttribute +import semmle.python.Metrics /** * An extension of `ControlFlowNode` that provides points-to predicates. @@ -93,6 +106,24 @@ class ControlFlowNodeWithPointsTo extends ControlFlowNode { // for that variable. exists(SsaVariable v | v.getAUse() = this | varHasCompletePointsToSet(v)) } + + /** Whether it is unlikely that this ControlFlowNode can be reached */ + predicate unlikelyReachable() { + not start_bb_likely_reachable(this.getBasicBlock()) + or + exists(BasicBlock b | + start_bb_likely_reachable(b) and + not end_bb_likely_reachable(b) and + // If there is an unlikely successor edge earlier in the BB + // than this node, then this node must be unreachable. + exists(ControlFlowNode p, int i, int j | + p.(RaisingNode).unlikelySuccessor(_) and + p = b.getNode(i) and + this = b.getNode(j) and + i < j + ) + ) + } } /** @@ -121,6 +152,45 @@ private predicate varHasCompletePointsToSet(SsaVariable var) { ) } +private predicate start_bb_likely_reachable(BasicBlock b) { + exists(Scope s | s.getEntryNode() = b.getNode(_)) + or + exists(BasicBlock pred | + pred = b.getAPredecessor() and + end_bb_likely_reachable(pred) and + not pred.getLastNode().(RaisingNode).unlikelySuccessor(b) + ) +} + +private predicate end_bb_likely_reachable(BasicBlock b) { + start_bb_likely_reachable(b) and + not exists(ControlFlowNode p, ControlFlowNode s | + p.(RaisingNode).unlikelySuccessor(s) and + p = b.getNode(_) and + s = b.getNode(_) and + not p = b.getLastNode() + ) +} + +/** + * An extension of `BasicBlock` that provides points-to related methods. + */ +class BasicBlockWithPointsTo extends BasicBlock { + /** + * Whether (as inferred by type inference) it is highly unlikely (or impossible) for control to flow from this to succ. + */ + predicate unlikelySuccessor(BasicBlockWithPointsTo succ) { + this.getLastNode().(RaisingNode).unlikelySuccessor(succ.firstNode()) + or + not end_bb_likely_reachable(this) and succ = this.getASuccessor() + } + + /** + * Whether (as inferred by type inference) this basic block is likely to be reachable. + */ + predicate likelyReachable() { start_bb_likely_reachable(this) } +} + /** * An extension of `Expr` that provides points-to predicates. */ @@ -208,3 +278,155 @@ class ModuleWithPointsTo extends Module { override string getAQlClass() { none() } } + +/** + * An extension of `Function` that provides points-to related methods. + */ +class FunctionWithPointsTo extends Function { + /** Gets the FunctionObject corresponding to this function */ + FunctionObject getFunctionObject() { result.getOrigin() = this.getDefinition() } + + override string getAQlClass() { none() } +} + +/** + * An extension of `Class` that provides points-to related methods. + */ +class ClassWithPointsTo extends Class { + /** Gets the ClassObject corresponding to this class */ + ClassObject getClassObject() { result.getOrigin() = this.getParent() } + + override string getAQlClass() { none() } +} + +/** Gets the `Object` corresponding to the immutable literal `l`. */ +Object getLiteralObject(ImmutableLiteral l) { + l instanceof IntegerLiteral and + ( + py_cobjecttypes(result, theIntType()) and py_cobjectnames(result, l.(Num).getN()) + or + py_cobjecttypes(result, theLongType()) and py_cobjectnames(result, l.(Num).getN()) + ) + or + l instanceof FloatLiteral and + py_cobjecttypes(result, theFloatType()) and + py_cobjectnames(result, l.(Num).getN()) + or + l instanceof ImaginaryLiteral and + py_cobjecttypes(result, theComplexType()) and + py_cobjectnames(result, l.(Num).getN()) + or + l instanceof NegativeIntegerLiteral and + ( + (py_cobjecttypes(result, theIntType()) or py_cobjecttypes(result, theLongType())) and + py_cobjectnames(result, "-" + l.(UnaryExpr).getOperand().(IntegerLiteral).getN()) + ) + or + l instanceof Bytes and + py_cobjecttypes(result, theBytesType()) and + py_cobjectnames(result, l.(Bytes).quotedString()) + or + l instanceof Unicode and + py_cobjecttypes(result, theUnicodeType()) and + py_cobjectnames(result, l.(Unicode).quotedString()) + or + l instanceof True and + name_consts(l, "True") and + result = theTrueObject() + or + l instanceof False and + name_consts(l, "False") and + result = theFalseObject() + or + l instanceof None and + name_consts(l, "None") and + result = theNoneObject() +} + +private predicate gettext_installed() { + // Good enough (and fast) approximation + exists(Module m | m.getName() = "gettext") +} + +private predicate builtin_constant(string name) { + exists(Object::builtin(name)) + or + name = "WindowsError" + or + name = "_" and gettext_installed() +} + +/** Whether this name is (almost) always defined, ie. it is a builtin or VM defined name */ +predicate globallyDefinedName(string name) { builtin_constant(name) or auto_name(name) } + +private predicate auto_name(string name) { + name = "__file__" or name = "__builtins__" or name = "__name__" +} + +/** An extension of `SsaVariable` that provides points-to related methods. */ +class SsaVariableWithPointsTo extends SsaVariable { + /** Gets an argument of the phi function defining this variable, pruned of unlikely edges. */ + SsaVariable getAPrunedPhiInput() { + result = this.getAPhiInput() and + exists(BasicBlock incoming | incoming = this.getPredecessorBlockForPhiArgument(result) | + not incoming.getLastNode().(RaisingNode).unlikelySuccessor(this.getDefinition()) + ) + } + + /** Gets the incoming edges for a Phi node, pruned of unlikely edges. */ + private BasicBlockWithPointsTo getAPrunedPredecessorBlockForPhi() { + result = this.getAPredecessorBlockForPhi() and + not result.unlikelySuccessor(this.getDefinition().getBasicBlock()) + } + + private predicate implicitlyDefined() { + not exists(this.getDefinition()) and + not py_ssa_phi(this, _) and + exists(GlobalVariable var | this.getVariable() = var | + globallyDefinedName(var.getId()) + or + var.getId() = "__path__" and var.getScope().(Module).isPackageInit() + ) + } + + /** Whether this variable may be undefined */ + predicate maybeUndefined() { + not exists(this.getDefinition()) and not py_ssa_phi(this, _) and not this.implicitlyDefined() + or + this.getDefinition().isDelete() + or + exists(SsaVariableWithPointsTo var | var = this.getAPrunedPhiInput() | var.maybeUndefined()) + or + /* + * For phi-nodes, there must be a corresponding phi-input for each control-flow + * predecessor. Otherwise, the variable will be undefined on that incoming edge. + * WARNING: the same phi-input may cover multiple predecessors, so this check + * cannot be done by counting. + */ + + exists(BasicBlock incoming | + reaches_end(incoming) and + incoming = this.getAPrunedPredecessorBlockForPhi() and + not this.getAPhiInput().getDefinition().getBasicBlock().dominates(incoming) + ) + } + + override string getAQlClass() { none() } +} + +private predicate reaches_end(BasicBlock b) { + not exits_early(b) and + ( + /* Entry point */ + not exists(BasicBlock prev | prev.getASuccessor() = b) + or + exists(BasicBlock prev | prev.getASuccessor() = b | reaches_end(prev)) + ) +} + +private predicate exits_early(BasicBlock b) { + exists(FunctionObject f | + f.neverReturns() and + f.getACall().getBasicBlock() = b + ) +} diff --git a/python/ql/lib/analysis/DefinitionTracking.qll b/python/ql/lib/analysis/DefinitionTracking.qll index 53f8e791cd8..0d58bd69b7b 100644 --- a/python/ql/lib/analysis/DefinitionTracking.qll +++ b/python/ql/lib/analysis/DefinitionTracking.qll @@ -4,7 +4,7 @@ import python private import LegacyPointsTo -import semmle.python.pointsto.PointsTo +private import semmle.python.types.ImportTime import IDEContextual private newtype TDefinition = diff --git a/python/ql/lib/change-notes/2025-11-22-tornado-websockets.md b/python/ql/lib/change-notes/2025-11-22-tornado-websockets.md new file mode 100644 index 00000000000..8ba2ef549ee --- /dev/null +++ b/python/ql/lib/change-notes/2025-11-22-tornado-websockets.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Additional models for remote flow sources for `tornado.websocket.WebSocketHandler` have been added. \ No newline at end of file diff --git a/python/ql/lib/change-notes/2025-11-26-model-ParseResult.md b/python/ql/lib/change-notes/2025-11-26-model-ParseResult.md new file mode 100644 index 00000000000..9d461643613 --- /dev/null +++ b/python/ql/lib/change-notes/2025-11-26-model-ParseResult.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added taint flow model and type model for `urllib.parseurl`. \ No newline at end of file diff --git a/python/ql/lib/change-notes/2025-11-26-remove-top-level-points-to-import.md b/python/ql/lib/change-notes/2025-11-26-remove-top-level-points-to-import.md new file mode 100644 index 00000000000..7122c217c41 --- /dev/null +++ b/python/ql/lib/change-notes/2025-11-26-remove-top-level-points-to-import.md @@ -0,0 +1,7 @@ +--- +category: breaking +--- + +* All modules that depend on the points-to analysis have now been removed from the top level `python.qll` module. To access the points-to functionality, import the new `LegacyPointsTo` module. This also means that some predicates have been removed from various classes, for instance `Function.getFunctionObject()`. To access these predicates, import the `LegacyPointsTo` module and use the `FunctionWithPointsTo` class instead. Most cases follow this pattern, but there are a few exceptions: + * The `getLiteralObject` method on `ImmutableLiteral` subclasses has been replaced with a predicate `getLiteralObject(ImmutableLiteral l)` in the `LegacyPointsTo` module. + * The `getMetrics` method on `Function`, `Class`, and `Module` has been removed. To access metrics, import `LegacyPointsTo` and use the classes `FunctionMetrics`, etc. instead. diff --git a/python/ql/lib/change-notes/2025-11-26-socketio.md b/python/ql/lib/change-notes/2025-11-26-socketio.md new file mode 100644 index 00000000000..e58bec0bbc1 --- /dev/null +++ b/python/ql/lib/change-notes/2025-11-26-socketio.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Remote flow sources for the `python-socketio` package have been modeled. \ No newline at end of file diff --git a/python/ql/lib/change-notes/2025-10-30-remove-points-to-from-cfg-and-expr.md b/python/ql/lib/change-notes/released/5.0.0.md similarity index 87% rename from python/ql/lib/change-notes/2025-10-30-remove-points-to-from-cfg-and-expr.md rename to python/ql/lib/change-notes/released/5.0.0.md index 9b8eef6bcba..ae6a34880e0 100644 --- a/python/ql/lib/change-notes/2025-10-30-remove-points-to-from-cfg-and-expr.md +++ b/python/ql/lib/change-notes/released/5.0.0.md @@ -1,5 +1,5 @@ ---- -category: breaking ---- +## 5.0.0 + +### Breaking Changes - The classes `ControlFlowNode`, `Expr`, and `Module` no longer expose predicates that invoke the points-to analysis. To access these predicates, import the module `LegacyPointsTo` and follow the instructions given therein. diff --git a/python/ql/lib/change-notes/released/5.0.1.md b/python/ql/lib/change-notes/released/5.0.1.md new file mode 100644 index 00000000000..97ea0f1bc48 --- /dev/null +++ b/python/ql/lib/change-notes/released/5.0.1.md @@ -0,0 +1,5 @@ +## 5.0.1 + +### Bug Fixes + +- Fixed a bug in the Python extractor's import handling where failing to find an import in `find_module` would cause a `KeyError` to be raised. (Contributed by @akoeplinger.) diff --git a/python/ql/lib/change-notes/released/5.0.2.md b/python/ql/lib/change-notes/released/5.0.2.md new file mode 100644 index 00000000000..3f921f9ca8b --- /dev/null +++ b/python/ql/lib/change-notes/released/5.0.2.md @@ -0,0 +1,3 @@ +## 5.0.2 + +No user-facing changes. diff --git a/python/ql/lib/change-notes/released/5.0.3.md b/python/ql/lib/change-notes/released/5.0.3.md new file mode 100644 index 00000000000..57074925279 --- /dev/null +++ b/python/ql/lib/change-notes/released/5.0.3.md @@ -0,0 +1,3 @@ +## 5.0.3 + +No user-facing changes. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index d5b1bf88d10..6997554f6dd 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.1.0 +lastReleaseVersion: 5.0.3 diff --git a/python/ql/lib/python.qll b/python/ql/lib/python.qll index b08f0ae35bb..54306408a33 100644 --- a/python/ql/lib/python.qll +++ b/python/ql/lib/python.qll @@ -14,27 +14,27 @@ import semmle.python.Patterns import semmle.python.Keywords import semmle.python.Comprehensions import semmle.python.Flow -import semmle.python.Metrics +private import semmle.python.Metrics import semmle.python.Constants import semmle.python.Scope import semmle.python.Comment import semmle.python.GuardedControlFlow -import semmle.python.types.ImportTime -import semmle.python.types.Object -import semmle.python.types.ClassObject -import semmle.python.types.FunctionObject -import semmle.python.types.ModuleObject -import semmle.python.types.Version -import semmle.python.types.Descriptors +private import semmle.python.types.ImportTime +private import semmle.python.types.Object +private import semmle.python.types.ClassObject +private import semmle.python.types.FunctionObject +private import semmle.python.types.ModuleObject +private import semmle.python.types.Version +private import semmle.python.types.Descriptors import semmle.python.SSA -import semmle.python.SelfAttribute -import semmle.python.types.Properties +private import semmle.python.SelfAttribute +private import semmle.python.types.Properties import semmle.python.xml.XML import semmle.python.essa.Essa -import semmle.python.pointsto.Base -import semmle.python.pointsto.Context -import semmle.python.pointsto.CallGraph -import semmle.python.objects.ObjectAPI +private import semmle.python.pointsto.Base +private import semmle.python.pointsto.Context +private import semmle.python.pointsto.CallGraph +private import semmle.python.objects.ObjectAPI import semmle.python.Unit import site private import semmle.python.Overlay diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index bb28a8f6315..43e09a9cd09 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 4.1.1-dev +version: 5.0.4-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/lib/semmle/python/Class.qll b/python/ql/lib/semmle/python/Class.qll index 58a6504b547..19b81e86a12 100644 --- a/python/ql/lib/semmle/python/Class.qll +++ b/python/ql/lib/semmle/python/Class.qll @@ -141,18 +141,12 @@ class Class extends Class_, Scope, AstNode { /** Gets the metaclass expression */ Expr getMetaClass() { result = this.getParent().getMetaClass() } - /** Gets the ClassObject corresponding to this class */ - ClassObject getClassObject() { result.getOrigin() = this.getParent() } - /** Gets the nth base of this class definition. */ Expr getBase(int index) { result = this.getParent().getBase(index) } /** Gets a base of this class definition. */ Expr getABase() { result = this.getParent().getABase() } - /** Gets the metrics for this class */ - ClassMetrics getMetrics() { result = this } - /** * Gets the qualified name for this class. * Should return the same name as the `__qualname__` attribute on classes in Python 3. diff --git a/python/ql/lib/semmle/python/Exprs.qll b/python/ql/lib/semmle/python/Exprs.qll index e5ee2bdb28c..c374863d684 100644 --- a/python/ql/lib/semmle/python/Exprs.qll +++ b/python/ql/lib/semmle/python/Exprs.qll @@ -240,17 +240,12 @@ class Bytes extends StringLiteral { /* syntax: b"hello" */ Bytes() { not this.isUnicode() } - override Object getLiteralObject() { - py_cobjecttypes(result, theBytesType()) and - py_cobjectnames(result, this.quotedString()) - } - /** * The extractor puts quotes into the name of each string (to prevent "0" clashing with 0). * The following predicate help us match up a string/byte literals in the source * which the equivalent object. */ - private string quotedString() { + string quotedString() { exists(string b_unquoted | b_unquoted = this.getS() | result = "b'" + b_unquoted + "'") } } @@ -266,8 +261,6 @@ class Ellipsis extends Ellipsis_ { * Consists of string (both unicode and byte) literals and numeric literals. */ abstract class ImmutableLiteral extends Expr { - abstract Object getLiteralObject(); - abstract boolean booleanValue(); } @@ -292,12 +285,6 @@ class IntegerLiteral extends Num { override string toString() { result = "IntegerLiteral" } - override Object getLiteralObject() { - py_cobjecttypes(result, theIntType()) and py_cobjectnames(result, this.getN()) - or - py_cobjecttypes(result, theLongType()) and py_cobjectnames(result, this.getN()) - } - override boolean booleanValue() { this.getValue() = 0 and result = false or @@ -317,10 +304,6 @@ class FloatLiteral extends Num { override string toString() { result = "FloatLiteral" } - override Object getLiteralObject() { - py_cobjecttypes(result, theFloatType()) and py_cobjectnames(result, this.getN()) - } - override boolean booleanValue() { this.getValue() = 0.0 and result = false or @@ -343,10 +326,6 @@ class ImaginaryLiteral extends Num { override string toString() { result = "ImaginaryLiteral" } - override Object getLiteralObject() { - py_cobjecttypes(result, theComplexType()) and py_cobjectnames(result, this.getN()) - } - override boolean booleanValue() { this.getValue() = 0.0 and result = false or @@ -365,11 +344,6 @@ class NegativeIntegerLiteral extends ImmutableLiteral, UnaryExpr { override boolean booleanValue() { result = this.getOperand().(IntegerLiteral).booleanValue() } - override Object getLiteralObject() { - (py_cobjecttypes(result, theIntType()) or py_cobjecttypes(result, theLongType())) and - py_cobjectnames(result, "-" + this.getOperand().(IntegerLiteral).getN()) - } - /** * Gets the (integer) value of this constant. Will not return a result if the value does not fit into * a 32 bit signed value @@ -385,11 +359,6 @@ class Unicode extends StringLiteral { /* syntax: "hello" */ Unicode() { this.isUnicode() } - override Object getLiteralObject() { - py_cobjecttypes(result, theUnicodeType()) and - py_cobjectnames(result, this.quotedString()) - } - /** * Gets the quoted representation fo this string. * @@ -593,12 +562,11 @@ class StringLiteral extends Str_, ImmutableLiteral { this.getText() != "" and result = true } - override Object getLiteralObject() { none() } - override string toString() { result = "StringLiteral" } } -private predicate name_consts(Name_ n, string id) { +/** Holds if `n` is a named constant (`True`, `False`, or `None`) with name `id`. */ +predicate name_consts(Name_ n, string id) { exists(Variable v | py_variables(v, n) and id = v.getId() | id = "True" or id = "False" or id = "None" ) @@ -627,8 +595,6 @@ class True extends BooleanLiteral { /* syntax: True */ True() { name_consts(this, "True") } - override Object getLiteralObject() { name_consts(this, "True") and result = theTrueObject() } - override boolean booleanValue() { result = true } } @@ -637,8 +603,6 @@ class False extends BooleanLiteral { /* syntax: False */ False() { name_consts(this, "False") } - override Object getLiteralObject() { name_consts(this, "False") and result = theFalseObject() } - override boolean booleanValue() { result = false } } @@ -647,8 +611,6 @@ class None extends NameConstant { /* syntax: None */ None() { name_consts(this, "None") } - override Object getLiteralObject() { name_consts(this, "None") and result = theNoneObject() } - override boolean booleanValue() { result = false } } diff --git a/python/ql/lib/semmle/python/Flow.qll b/python/ql/lib/semmle/python/Flow.qll index 496c1abc52a..898cd566ab9 100644 --- a/python/ql/lib/semmle/python/Flow.qll +++ b/python/ql/lib/semmle/python/Flow.qll @@ -190,24 +190,6 @@ class ControlFlowNode extends @py_flow_node { /** Whether this node is a normal (non-exceptional) exit */ predicate isNormalExit() { py_scope_flow(this, _, 0) or py_scope_flow(this, _, 2) } - /** Whether it is unlikely that this ControlFlowNode can be reached */ - predicate unlikelyReachable() { - not start_bb_likely_reachable(this.getBasicBlock()) - or - exists(BasicBlock b | - start_bb_likely_reachable(b) and - not end_bb_likely_reachable(b) and - // If there is an unlikely successor edge earlier in the BB - // than this node, then this node must be unreachable. - exists(ControlFlowNode p, int i, int j | - p.(RaisingNode).unlikelySuccessor(_) and - p = b.getNode(i) and - this = b.getNode(j) and - i < j - ) - ) - } - /** Whether this strictly dominates other. */ pragma[inline] predicate strictlyDominates(ControlFlowNode other) { @@ -901,6 +883,58 @@ class StarredNode extends ControlFlowNode { ControlFlowNode getValue() { toAst(result) = toAst(this).(Starred).getValue() } } +/** The ControlFlowNode for an 'except' statement. */ +class ExceptFlowNode extends ControlFlowNode { + ExceptFlowNode() { this.getNode() instanceof ExceptStmt } + + /** + * Gets the type handled by this exception handler. + * `ExceptionType` in `except ExceptionType as e:` + */ + ControlFlowNode getType() { + exists(ExceptStmt ex | + this.getBasicBlock().dominates(result.getBasicBlock()) and + ex = this.getNode() and + result = ex.getType().getAFlowNode() + ) + } + + /** + * Gets the name assigned to the handled exception, if any. + * `e` in `except ExceptionType as e:` + */ + ControlFlowNode getName() { + exists(ExceptStmt ex | + this.getBasicBlock().dominates(result.getBasicBlock()) and + ex = this.getNode() and + result = ex.getName().getAFlowNode() + ) + } +} + +/** The ControlFlowNode for an 'except*' statement. */ +class ExceptGroupFlowNode extends ControlFlowNode { + ExceptGroupFlowNode() { this.getNode() instanceof ExceptGroupStmt } + + /** + * Gets the type handled by this exception handler. + * `ExceptionType` in `except* ExceptionType as e:` + */ + ControlFlowNode getType() { + this.getBasicBlock().dominates(result.getBasicBlock()) and + result = this.getNode().(ExceptGroupStmt).getType().getAFlowNode() + } + + /** + * Gets the name assigned to the handled exception, if any. + * `e` in `except* ExceptionType as e:` + */ + ControlFlowNode getName() { + this.getBasicBlock().dominates(result.getBasicBlock()) and + result = this.getNode().(ExceptGroupStmt).getName().getAFlowNode() + } +} + private module Scopes { private predicate fast_local(NameNode n) { exists(FastLocalVariable v | @@ -1004,7 +1038,8 @@ class BasicBlock extends @py_flow_node { ) } - private ControlFlowNode firstNode() { result = this } + /** Gets the first node in this basic block */ + ControlFlowNode firstNode() { result = this } /** Gets the last node in this basic block */ ControlFlowNode getLastNode() { @@ -1093,15 +1128,6 @@ class BasicBlock extends @py_flow_node { ) } - /** - * Whether (as inferred by type inference) it is highly unlikely (or impossible) for control to flow from this to succ. - */ - predicate unlikelySuccessor(BasicBlock succ) { - this.getLastNode().(RaisingNode).unlikelySuccessor(succ.firstNode()) - or - not end_bb_likely_reachable(this) and succ = this.getASuccessor() - } - /** Holds if this basic block strictly reaches the other. Is the start of other reachable from the end of this. */ cached predicate strictlyReaches(BasicBlock other) { @@ -1112,11 +1138,6 @@ class BasicBlock extends @py_flow_node { /** Holds if this basic block reaches the other. Is the start of other reachable from the end of this. */ predicate reaches(BasicBlock other) { this = other or this.strictlyReaches(other) } - /** - * Whether (as inferred by type inference) this basic block is likely to be reachable. - */ - predicate likelyReachable() { start_bb_likely_reachable(this) } - /** * Gets the `ConditionBlock`, if any, that controls this block and * does not control any other `ConditionBlock`s that control this block. @@ -1144,26 +1165,6 @@ class BasicBlock extends @py_flow_node { } } -private predicate start_bb_likely_reachable(BasicBlock b) { - exists(Scope s | s.getEntryNode() = b.getNode(_)) - or - exists(BasicBlock pred | - pred = b.getAPredecessor() and - end_bb_likely_reachable(pred) and - not pred.getLastNode().(RaisingNode).unlikelySuccessor(b) - ) -} - -private predicate end_bb_likely_reachable(BasicBlock b) { - start_bb_likely_reachable(b) and - not exists(ControlFlowNode p, ControlFlowNode s | - p.(RaisingNode).unlikelySuccessor(s) and - p = b.getNode(_) and - s = b.getNode(_) and - not p = b.getLastNode() - ) -} - private class ControlFlowNodeAlias = ControlFlowNode; final private class FinalBasicBlock = BasicBlock; diff --git a/python/ql/lib/semmle/python/Frameworks.qll b/python/ql/lib/semmle/python/Frameworks.qll index 955385141f7..7694419b41d 100644 --- a/python/ql/lib/semmle/python/Frameworks.qll +++ b/python/ql/lib/semmle/python/Frameworks.qll @@ -78,6 +78,7 @@ private import semmle.python.frameworks.Sanic private import semmle.python.frameworks.ServerLess private import semmle.python.frameworks.Setuptools private import semmle.python.frameworks.Simplejson +private import semmle.python.frameworks.Socketio private import semmle.python.frameworks.SqlAlchemy private import semmle.python.frameworks.Starlette private import semmle.python.frameworks.Stdlib diff --git a/python/ql/lib/semmle/python/Function.qll b/python/ql/lib/semmle/python/Function.qll index 589d7f47161..e15d28d3a12 100644 --- a/python/ql/lib/semmle/python/Function.qll +++ b/python/ql/lib/semmle/python/Function.qll @@ -84,12 +84,6 @@ class Function extends Function_, Scope, AstNode { /** Gets the name used to define this function */ override string getName() { result = Function_.super.getName() } - /** Gets the metrics for this function */ - FunctionMetrics getMetrics() { result = this } - - /** Gets the FunctionObject corresponding to this function */ - FunctionObject getFunctionObject() { result.getOrigin() = this.getDefinition() } - /** * Whether this function is a procedure, that is, it has no explicit return statement and always returns None. * Note that generator and async functions are not procedures as they return generators and coroutines respectively. diff --git a/python/ql/lib/semmle/python/Metrics.qll b/python/ql/lib/semmle/python/Metrics.qll index dcc5cf959d9..4959a06317f 100644 --- a/python/ql/lib/semmle/python/Metrics.qll +++ b/python/ql/lib/semmle/python/Metrics.qll @@ -29,9 +29,9 @@ class FunctionMetrics extends Function { */ int getCyclomaticComplexity() { exists(int e, int n | - n = count(BasicBlock b | b = this.getABasicBlock() and b.likelyReachable()) and + n = count(BasicBlockWithPointsTo b | b = this.getABasicBlock() and b.likelyReachable()) and e = - count(BasicBlock b1, BasicBlock b2 | + count(BasicBlockWithPointsTo b1, BasicBlockWithPointsTo b2 | b1 = this.getABasicBlock() and b1.likelyReachable() and b2 = this.getABasicBlock() and diff --git a/python/ql/lib/semmle/python/Module.qll b/python/ql/lib/semmle/python/Module.qll index 666217874b7..f22f0d6fe39 100644 --- a/python/ql/lib/semmle/python/Module.qll +++ b/python/ql/lib/semmle/python/Module.qll @@ -86,9 +86,6 @@ class Module extends Module_, Scope, AstNode { result = this.getName().regexpReplaceAll("\\.[^.]*$", "") } - /** Gets the metrics for this module */ - ModuleMetrics getMetrics() { result = this } - string getAnImportedModuleName() { exists(Import i | i.getEnclosingModule() = this | result = i.getAnImportedModuleName()) or diff --git a/python/ql/lib/semmle/python/Overlay.qll b/python/ql/lib/semmle/python/Overlay.qll index fa782801457..a8c473d1e4a 100644 --- a/python/ql/lib/semmle/python/Overlay.qll +++ b/python/ql/lib/semmle/python/Overlay.qll @@ -2,6 +2,8 @@ * Defines entity discard predicates for Python overlay analysis. */ +private import internal.OverlayXml + /*- Predicates -*/ /** * Holds always for the overlay variant and never for the base variant. @@ -303,33 +305,6 @@ final private class DiscardableComment extends Discardable instanceof @py_commen } } -/*- XML -*/ -overlay[local] -final private class DiscardableXmlLocatable extends Discardable instanceof @xmllocatable { - override string getPath() { - exists(@location loc | xmllocations(this, loc) | result = getPathForLocation(loc)) - } -} - -overlay[local] -private predicate overlayXmlExtracted(string path) { - exists(DiscardableXmlLocatable d | not files(d, _) and not xmlNs(d, _, _, _) | - d.existsInOverlay() and - path = d.getPath() - ) -} - -overlay[discard_entity] -private predicate discardXmlLocatable(@xmllocatable el) { - exists(DiscardableXmlLocatable d | d = el | - // The XML extractor is currently not incremental and may extract more - // XML files than those included in `overlayChangedFiles`, so this discard predicate - // handles those files alongside the normal `discardStarEntity` logic. - overlayXmlExtracted(d.getPath()) and - d.existsInBase() - ) -} - /*- YAML -*/ overlay[local] final private class DiscardableYamlLocatable extends Discardable instanceof @yaml_locatable { diff --git a/python/ql/lib/semmle/python/SSA.qll b/python/ql/lib/semmle/python/SSA.qll index 98cd39a4c43..b71bd95de79 100644 --- a/python/ql/lib/semmle/python/SSA.qll +++ b/python/ql/lib/semmle/python/SSA.qll @@ -61,14 +61,6 @@ class SsaVariable extends @py_ssa_var { ) } - /** Gets an argument of the phi function defining this variable, pruned of unlikely edges. */ - SsaVariable getAPrunedPhiInput() { - result = this.getAPhiInput() and - exists(BasicBlock incoming | incoming = this.getPredecessorBlockForPhiArgument(result) | - not incoming.getLastNode().(RaisingNode).unlikelySuccessor(this.getDefinition()) - ) - } - /** Gets a variable that ultimately defines this variable and is not itself defined by another variable */ SsaVariable getAnUltimateDefinition() { result = this and not exists(this.getAPhiInput()) @@ -85,17 +77,11 @@ class SsaVariable extends @py_ssa_var { string getId() { result = this.getVariable().getId() } /** Gets the incoming edges for a Phi node. */ - private BasicBlock getAPredecessorBlockForPhi() { + BasicBlock getAPredecessorBlockForPhi() { exists(this.getAPhiInput()) and result.getASuccessor() = this.getDefinition().getBasicBlock() } - /** Gets the incoming edges for a Phi node, pruned of unlikely edges. */ - private BasicBlock getAPrunedPredecessorBlockForPhi() { - result = this.getAPredecessorBlockForPhi() and - not result.unlikelySuccessor(this.getDefinition().getBasicBlock()) - } - /** Whether it is possible to reach a use of this variable without passing a definition */ predicate reachableWithoutDefinition() { not exists(this.getDefinition()) and not py_ssa_phi(this, _) @@ -115,38 +101,6 @@ class SsaVariable extends @py_ssa_var { ) } - /** Whether this variable may be undefined */ - predicate maybeUndefined() { - not exists(this.getDefinition()) and not py_ssa_phi(this, _) and not this.implicitlyDefined() - or - this.getDefinition().isDelete() - or - exists(SsaVariable var | var = this.getAPrunedPhiInput() | var.maybeUndefined()) - or - /* - * For phi-nodes, there must be a corresponding phi-input for each control-flow - * predecessor. Otherwise, the variable will be undefined on that incoming edge. - * WARNING: the same phi-input may cover multiple predecessors, so this check - * cannot be done by counting. - */ - - exists(BasicBlock incoming | - reaches_end(incoming) and - incoming = this.getAPrunedPredecessorBlockForPhi() and - not this.getAPhiInput().getDefinition().getBasicBlock().dominates(incoming) - ) - } - - private predicate implicitlyDefined() { - not exists(this.getDefinition()) and - not py_ssa_phi(this, _) and - exists(GlobalVariable var | this.getVariable() = var | - globallyDefinedName(var.getId()) - or - var.getId() = "__path__" and var.getScope().(Module).isPackageInit() - ) - } - /** * Gets the global variable that is accessed if this local is undefined. * Only applies to local variables in class scopes. @@ -173,43 +127,6 @@ class SsaVariable extends @py_ssa_var { } } -private predicate reaches_end(BasicBlock b) { - not exits_early(b) and - ( - /* Entry point */ - not exists(BasicBlock prev | prev.getASuccessor() = b) - or - exists(BasicBlock prev | prev.getASuccessor() = b | reaches_end(prev)) - ) -} - -private predicate exits_early(BasicBlock b) { - exists(FunctionObject f | - f.neverReturns() and - f.getACall().getBasicBlock() = b - ) -} - -private predicate gettext_installed() { - // Good enough (and fast) approximation - exists(Module m | m.getName() = "gettext") -} - -private predicate builtin_constant(string name) { - exists(Object::builtin(name)) - or - name = "WindowsError" - or - name = "_" and gettext_installed() -} - -private predicate auto_name(string name) { - name = "__file__" or name = "__builtins__" or name = "__name__" -} - -/** Whether this name is (almost) always defined, ie. it is a builtin or VM defined name */ -predicate globallyDefinedName(string name) { builtin_constant(name) or auto_name(name) } - /** An SSA variable that is backed by a global variable */ class GlobalSsaVariable extends EssaVariable { GlobalSsaVariable() { this.getSourceVariable() instanceof GlobalVariable } diff --git a/python/ql/lib/semmle/python/SelfAttribute.qll b/python/ql/lib/semmle/python/SelfAttribute.qll index 01a110999ba..90ef2b38401 100644 --- a/python/ql/lib/semmle/python/SelfAttribute.qll +++ b/python/ql/lib/semmle/python/SelfAttribute.qll @@ -5,6 +5,7 @@ import python private import semmle.python.pointsto.Filters +private import LegacyPointsTo /** * An attribute access where the left hand side of the attribute expression diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/Attributes.qll b/python/ql/lib/semmle/python/dataflow/new/internal/Attributes.qll index 42c0c862e89..e9bcc5e6785 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/Attributes.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/Attributes.qll @@ -1,9 +1,10 @@ /** This module provides an API for attribute reads and writes. */ +private import python import DataFlowUtil import DataFlowPublic private import DataFlowPrivate -private import semmle.python.types.Builtins +private import semmle.python.dataflow.new.internal.Builtins /** * A data flow node that reads or writes an attribute of an object. @@ -134,8 +135,12 @@ private class BuiltInCallNode extends CallNode { BuiltInCallNode() { // TODO disallow instances where the name of the built-in may refer to an in-scope variable of that name. - exists(NameNode id | this.getFunction() = id and id.getId() = name and id.isGlobal()) and - name = any(Builtin b).getName() + exists(NameNode id | + name = Builtins::getBuiltinName() and + this.getFunction() = id and + id.getId() = name and + id.isGlobal() + ) } /** Gets the name of the built-in function that is called at this `CallNode` */ diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index e1290b7758c..f3943f53f86 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -9,6 +9,7 @@ private import semmle.python.dataflow.new.DataFlow private import semmle.python.dataflow.new.internal.ImportStar private import semmle.python.dataflow.new.TypeTracking private import semmle.python.dataflow.new.internal.DataFlowPrivate +private import semmle.python.essa.SsaDefinitions /** * Python modules and the way imports are resolved are... complicated. Here's a crash course in how diff --git a/python/ql/lib/semmle/python/dataflow/old/Configuration.qll b/python/ql/lib/semmle/python/dataflow/old/Configuration.qll index 7d03e6c562f..f0e33169cf2 100644 --- a/python/ql/lib/semmle/python/dataflow/old/Configuration.qll +++ b/python/ql/lib/semmle/python/dataflow/old/Configuration.qll @@ -1,6 +1,6 @@ import python import semmle.python.dataflow.TaintTracking -private import semmle.python.objects.ObjectInternal +private import LegacyPointsTo private import semmle.python.dataflow.Implementation module TaintTracking { diff --git a/python/ql/lib/semmle/python/dataflow/old/Files.qll b/python/ql/lib/semmle/python/dataflow/old/Files.qll index 3439e559efa..18537768445 100644 --- a/python/ql/lib/semmle/python/dataflow/old/Files.qll +++ b/python/ql/lib/semmle/python/dataflow/old/Files.qll @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo import semmle.python.dataflow.TaintTracking class OpenFile extends TaintKind { diff --git a/python/ql/lib/semmle/python/dataflow/old/Implementation.qll b/python/ql/lib/semmle/python/dataflow/old/Implementation.qll index 83476db803c..18020c7d9ff 100644 --- a/python/ql/lib/semmle/python/dataflow/old/Implementation.qll +++ b/python/ql/lib/semmle/python/dataflow/old/Implementation.qll @@ -1,7 +1,6 @@ import python private import LegacyPointsTo import semmle.python.dataflow.TaintTracking -private import semmle.python.objects.ObjectInternal private import semmle.python.pointsto.Filters as Filters import semmle.python.dataflow.Legacy @@ -257,7 +256,7 @@ class TaintTrackingImplementation extends string instanceof TaintTracking::Confi TaintKind kind, string edgeLabel ) { this.unprunedStep(src, node, context, path, kind, edgeLabel) and - node.getBasicBlock().likelyReachable() and + node.getBasicBlock().(BasicBlockWithPointsTo).likelyReachable() and not super.isBarrier(node) and ( not path = TNoAttribute() @@ -685,7 +684,9 @@ private class EssaTaintTracking extends string instanceof TaintTracking::Configu TaintTrackingNode src, PhiFunction defn, TaintTrackingContext context, AttributePath path, TaintKind kind ) { - exists(DataFlow::Node srcnode, BasicBlock pred, EssaVariable predvar, DataFlow::Node phi | + exists( + DataFlow::Node srcnode, BasicBlockWithPointsTo pred, EssaVariable predvar, DataFlow::Node phi + | src = TTaintTrackingNode_(srcnode, context, path, kind, this) and defn = phi.asVariable().getDefinition() and predvar = defn.getInput(pred) and diff --git a/python/ql/lib/semmle/python/dataflow/old/StateTracking.qll b/python/ql/lib/semmle/python/dataflow/old/StateTracking.qll index 2ca9be0dfb9..0eeb103ee55 100644 --- a/python/ql/lib/semmle/python/dataflow/old/StateTracking.qll +++ b/python/ql/lib/semmle/python/dataflow/old/StateTracking.qll @@ -9,9 +9,7 @@ */ import python -private import semmle.python.pointsto.PointsTo -private import semmle.python.pointsto.PointsToContext -private import semmle.python.objects.ObjectInternal +private import LegacyPointsTo /** A state that should be tracked. */ abstract class TrackableState extends string { diff --git a/python/ql/lib/semmle/python/dataflow/old/TaintTracking.qll b/python/ql/lib/semmle/python/dataflow/old/TaintTracking.qll index 15459a31043..8dfa344f458 100644 --- a/python/ql/lib/semmle/python/dataflow/old/TaintTracking.qll +++ b/python/ql/lib/semmle/python/dataflow/old/TaintTracking.qll @@ -89,7 +89,6 @@ import python private import LegacyPointsTo private import semmle.python.pointsto.Filters as Filters -private import semmle.python.objects.ObjectInternal private import semmle.python.dataflow.Implementation import semmle.python.dataflow.Configuration diff --git a/python/ql/lib/semmle/python/dependencies/DependencyKind.qll b/python/ql/lib/semmle/python/dependencies/DependencyKind.qll index 2e4fab1af0b..4ceda85ff41 100644 --- a/python/ql/lib/semmle/python/dependencies/DependencyKind.qll +++ b/python/ql/lib/semmle/python/dependencies/DependencyKind.qll @@ -1,4 +1,5 @@ import semmle.python.dependencies.Dependencies +private import LegacyPointsTo /** * A library describing an abstract mechanism for representing dependency categories. diff --git a/python/ql/lib/semmle/python/dependencies/TechInventory.qll b/python/ql/lib/semmle/python/dependencies/TechInventory.qll index 20a938b86d0..2c29a05c48b 100644 --- a/python/ql/lib/semmle/python/dependencies/TechInventory.qll +++ b/python/ql/lib/semmle/python/dependencies/TechInventory.qll @@ -1,6 +1,7 @@ import python import semmle.python.dependencies.Dependencies import semmle.python.dependencies.DependencyKind +private import LegacyPointsTo /** * Combine the source-file and package into a single string: diff --git a/python/ql/lib/semmle/python/essa/Definitions.qll b/python/ql/lib/semmle/python/essa/Definitions.qll index 9c0df69c28e..aca6991b9f6 100644 --- a/python/ql/lib/semmle/python/essa/Definitions.qll +++ b/python/ql/lib/semmle/python/essa/Definitions.qll @@ -1,5 +1,4 @@ import python - /* * Classification of variables. These should be non-overlapping and complete. * @@ -12,6 +11,9 @@ import python * Escaping globals -- Global variables that have definitions and at least one of those definitions is in another scope. */ +private import semmle.python.types.ImportTime +private import semmle.python.essa.SsaDefinitions + /** A source language variable, to be converted into a set of SSA variables. */ abstract class SsaSourceVariable extends @py_variable { SsaSourceVariable() { @@ -274,6 +276,17 @@ class ModuleVariable extends SsaSourceVariable instanceof GlobalVariable { override CallNode redefinedAtCallSite() { none() } } +/** Holds if `f` is an import of the form `from .[...] import ...` and the enclosing scope is an __init__ module */ +private predicate import_from_dot_in_init(ImportExprNode f) { + f.getScope() = any(Module m).getInitModule() and + ( + f.getNode().getLevel() = 1 and + not exists(f.getNode().getName()) + or + f.getNode().getImportedModuleName() = f.getEnclosingModule().getPackage().getName() + ) +} + class NonEscapingGlobalVariable extends ModuleVariable { NonEscapingGlobalVariable() { this instanceof GlobalVariable and diff --git a/python/ql/lib/semmle/python/essa/Essa.qll b/python/ql/lib/semmle/python/essa/Essa.qll index cf2aca1e2ac..384bfd2f91f 100644 --- a/python/ql/lib/semmle/python/essa/Essa.qll +++ b/python/ql/lib/semmle/python/essa/Essa.qll @@ -6,6 +6,7 @@ import python private import SsaCompute import semmle.python.essa.Definitions private import semmle.python.internal.CachedStages +private import semmle.python.essa.SsaDefinitions /** An (enhanced) SSA variable derived from `SsaSourceVariable`. */ class EssaVariable extends TEssaDefinition { diff --git a/python/ql/lib/semmle/python/essa/SsaDefinitions.qll b/python/ql/lib/semmle/python/essa/SsaDefinitions.qll index 0c1c8836f4e..6c87af102fa 100644 --- a/python/ql/lib/semmle/python/essa/SsaDefinitions.qll +++ b/python/ql/lib/semmle/python/essa/SsaDefinitions.qll @@ -6,6 +6,13 @@ import python private import semmle.python.internal.CachedStages +/** Hold if `expr` is a test (a branch) and `use` is within that test */ +predicate test_contains(ControlFlowNode expr, ControlFlowNode use) { + expr.getNode() instanceof Expr and + expr.isBranch() and + expr.getAChild*() = use +} + cached module SsaSource { /** Holds if `v` is used as the receiver in a method call. */ diff --git a/python/ql/lib/semmle/python/frameworks/Socketio.qll b/python/ql/lib/semmle/python/frameworks/Socketio.qll new file mode 100644 index 00000000000..4006dcfbe7d --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/Socketio.qll @@ -0,0 +1,119 @@ +/** + * Provides definitions and modeling for the `python-socketio` PyPI package. + * See https://python-socketio.readthedocs.io/en/stable/. + */ + +private import python +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.Concepts +private import semmle.python.ApiGraphs +private import semmle.python.frameworks.internal.PoorMansFunctionResolution + +/** + * Provides models for the `python-socketio` PyPI package. + * See https://python-socketio.readthedocs.io/en/stable/. + */ +module SocketIO { + /** Provides models for socketio `Server` and `AsyncServer` classes. */ + module Server { + /** Gets an instance of a socketio `Server` or `AsyncServer`. */ + API::Node server() { + result = API::moduleImport("socketio").getMember(["Server", "AsyncServer"]).getAnInstance() + } + + /** Gets a decorator that indicates a socketio event handler. */ + private API::Node serverEventAnnotation() { + result = server().getMember("event") + or + result = server().getMember("on").getReturn() + } + + private class EventHandler extends Http::Server::RequestHandler::Range { + EventHandler() { + serverEventAnnotation().getAValueReachableFromSource().asExpr() = this.getADecorator() + or + exists(DataFlow::CallCfgNode c, DataFlow::Node arg | + c = server().getMember("on").getACall() + | + ( + arg = c.getArg(1) + or + arg = c.getArgByName("handler") + ) and + poorMansFunctionTracker(this) = arg + ) + } + + override Parameter getARoutedParameter() { + result = this.getAnArg() and + not result = this.getArg(0) // First parameter is `sid`, which is not a remote flow source as it cannot be controlled by the client. + } + + override string getFramework() { result = "socketio" } + } + + private class CallbackArgument extends DataFlow::Node { + CallbackArgument() { + exists(DataFlow::CallCfgNode c | + c = [server(), Namespace::instance()].getMember(["emit", "send"]).getACall() + | + this = c.getArgByName("callback") + ) + } + } + + private class CallbackHandler extends Http::Server::RequestHandler::Range { + CallbackHandler() { any(CallbackArgument ca) = poorMansFunctionTracker(this) } + + override Parameter getARoutedParameter() { result = this.getAnArg() } + + override string getFramework() { result = "socketio" } + } + + private class SocketIOCall extends RemoteFlowSource::Range { + SocketIOCall() { this = [server(), Namespace::instance()].getMember("call").getACall() } + + override string getSourceType() { result = "socketio call" } + } + } + + /** Provides modeling for socketio server Namespace/AsyncNamespace classes. */ + module Namespace { + /** Gets a reference to the `socketio.Namespace` or `socketio.AsyncNamespace` classes or any subclass. */ + API::Node subclassRef() { + result = + API::moduleImport("socketio").getMember(["Namespace", "AsyncNamespace"]).getASubclass*() + } + + /** Gets a reference to an instance of a subclass of `socketio.Namespace` or `socketio.AsyncNamespace`. */ + API::Node instance() { + result = subclassRef().getAnInstance() + or + result = subclassRef().getAMember().getSelfParameter() + } + + /** A socketio Namespace class. */ + class NamespaceClass extends Class { + NamespaceClass() { this.getABase() = subclassRef().asSource().asExpr() } + + /** Gets a handler for socketio events. */ + Function getAnEventHandler() { + result = this.getAMethod() and + result.getName().matches("on_%") + } + } + + private class NamespaceEventHandler extends Http::Server::RequestHandler::Range { + NamespaceEventHandler() { this = any(NamespaceClass nc).getAnEventHandler() } + + override Parameter getARoutedParameter() { + result = this.getAnArg() and + not result = this.getArg(0) and + not result = this.getArg(1) // First 2 parameters are `self` and `sid`. + } + + override string getFramework() { result = "socketio" } + } + } +} diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.model.yml b/python/ql/lib/semmle/python/frameworks/Stdlib.model.yml index cdbb451b673..a01bf1b40ba 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.model.yml +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.model.yml @@ -142,6 +142,8 @@ extensions: - ["typing", "Member[cast]", "Argument[1,val:]", "ReturnValue", "value"] # See https://docs.python.org/3/library/urllib.parse.html#urllib.parse.parse_qs - ["urllib", "Member[parse].Member[parse_qs]", "Argument[0,qs:]", "ReturnValue", "taint"] + # See https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlparse + - ["urllib", "Member[parse].Member[urlparse]", "Argument[0,urlstring:]", "ReturnValue", "taint"] # See https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote - ["urllib", "Member[parse].Member[quote]", "Argument[0,string:]", "ReturnValue", "taint"] # See https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus @@ -181,7 +183,9 @@ extensions: - addsTo: pack: codeql/python-all extensible: typeModel - data: [] + data: + # See https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlparse + - ["urllib.parse.ParseResult~Subclass", 'urllib', 'Member[parse].Member[urlparse]'] - addsTo: pack: codeql/python-all diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index c6b671e8b78..143a575c6e9 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -245,6 +245,67 @@ module Stdlib { } } + /** + * Provides models for the `urllib.parse.ParseResult` class + * + * See https://docs.python.org/3.9/library/urllib.parse.html#urllib.parse.ParseResult. + */ + module ParseResult { + /** Gets a reference to the `urllib.parse.ParseResult` class. */ + API::Node classRef() { + result = API::moduleImport("urllib").getMember("parse").getMember("ParseResult") + or + result = ModelOutput::getATypeNode("urllib.parse.ParseResult~Subclass").getASubclass*() + } + + /** + * A source of instances of `urllib.parse.ParseResult`, extend this class to model new instances. + * + * This can include instantiations of the class, return values from function + * calls, or a special parameter that will be set when functions are called by an external + * library. + * + * Use the predicate `ParseResult::instance()` to get references to instances of `urllib.parse.ParseResult`. + */ + abstract class InstanceSource extends DataFlow::LocalSourceNode { } + + /** A direct instantiation of `urllib.parse.ParseResult`. */ + private class ClassInstantiation extends InstanceSource, DataFlow::CallCfgNode { + ClassInstantiation() { this = classRef().getACall() } + } + + /** Gets a reference to an instance of `urllib.parse.ParseResult`. */ + private DataFlow::TypeTrackingNode instance(DataFlow::TypeTracker t) { + t.start() and + result instanceof InstanceSource + or + exists(DataFlow::TypeTracker t2 | result = instance(t2).track(t2, t)) + } + + /** Gets a reference to an instance of `urllib.parse.ParseResult`. */ + DataFlow::Node instance() { instance(DataFlow::TypeTracker::end()).flowsTo(result) } + + /** + * Taint propagation for `urllib.parse.ParseResult`. + */ + private class InstanceTaintSteps extends InstanceTaintStepsHelper { + InstanceTaintSteps() { this = "urllib.parse.ParseResult" } + + override DataFlow::Node getInstance() { result = instance() } + + override string getAttributeName() { + result in [ + "netloc", "path", "params", "query", "fragment", "username", "password", "hostname", + "port" + ] + } + + override string getMethodName() { none() } + + override string getAsyncMethodName() { none() } + } + } + // --------------------------------------------------------------------------- // logging // --------------------------------------------------------------------------- diff --git a/python/ql/lib/semmle/python/frameworks/Tornado.qll b/python/ql/lib/semmle/python/frameworks/Tornado.qll index 7cfe381b1f9..61cf7df316e 100644 --- a/python/ql/lib/semmle/python/frameworks/Tornado.qll +++ b/python/ql/lib/semmle/python/frameworks/Tornado.qll @@ -135,6 +135,8 @@ module Tornado { API::Node subclassRef() { result = web().getMember("RequestHandler").getASubclass*() or + result = WebSocket::WebSocketHandler::subclassRef() + or result = ModelOutput::getATypeNode("tornado.web.RequestHandler~Subclass").getASubclass*() } @@ -428,6 +430,49 @@ module Tornado { } } } + + // --------------------------------------------------------------------------- + // tornado.websocket + // --------------------------------------------------------------------------- + /** Gets a reference to the `tornado.websocket` module. */ + API::Node websocket() { result = Tornado::tornado().getMember("websocket") } + + /** Provides models for the `tornado.websocket` module */ + module WebSocket { + /** + * Provides models for the `tornado.websocket.WebSocketHandler` class and subclasses. + * + * See https://www.tornadoweb.org/en/stable/websocket.html#tornado.websocket.WebSocketHandler. + */ + module WebSocketHandler { + /** Gets a reference to the `tornado.websocket.WebSocketHandler` class or any subclass. */ + API::Node subclassRef() { + result = websocket().getMember("WebSocketHandler").getASubclass*() + or + result = + ModelOutput::getATypeNode("tornado.websocket.WebSocketHandler~Subclass").getASubclass*() + } + + /** A subclass of `tornado.websocket.WebSocketHandler`. */ + class WebSocketHandlerClass extends Web::RequestHandler::RequestHandlerClass { + WebSocketHandlerClass() { this.getParent() = subclassRef().asSource().asExpr() } + + override Function getARequestHandler() { + result = super.getARequestHandler() + or + result = this.getAMethod() and + result.getName() = "open" + } + + /** Gets a function that could handle incoming WebSocket events, if any. */ + Function getAWebSocketEventHandler() { + result = this.getAMethod() and + result.getName() = + ["on_message", "on_close", "on_ping", "on_pong", "select_subprotocol", "check_origin"] + } + } + } + } } // --------------------------------------------------------------------------- @@ -542,6 +587,27 @@ module Tornado { override string getFramework() { result = "Tornado" } } + /** A request handler for WebSocket events. */ + private class TornadoWebSocketEventHandler extends Http::Server::RequestHandler::Range { + TornadoWebSocketEventHandler() { + exists(TornadoModule::WebSocket::WebSocketHandler::WebSocketHandlerClass cls | + cls.getAWebSocketEventHandler() = this + ) + } + + override Parameter getARoutedParameter() { + // The `open` method is handled as a normal request handler in `TornadoRouteSetup` or `TornadoRequestHandlerWithoutKnownRoute`. + // For other event handlers (such as `on_message`), all parameters should be remote flow sources, as they are not affected by routing. + result in [ + this.getArg(_), this.getArgByName(_), this.getVararg().(Parameter), + this.getKwarg().(Parameter) + ] and + not result = this.getArg(0) + } + + override string getFramework() { result = "Tornado" } + } + // --------------------------------------------------------------------------- // Response modeling // --------------------------------------------------------------------------- diff --git a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll index c04a85487ac..80ec45a3cf1 100644 --- a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll +++ b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModels.qll @@ -62,6 +62,8 @@ * should be prefixed with a tilde character (`~`). For example, `~Bar` can be used to indicate that * the type is not intended to match a static type. */ +overlay[local?] +module; private import codeql.util.Unit private import ApiGraphModelsSpecific as Specific diff --git a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll index 4969da43be3..3f38c498f32 100644 --- a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll +++ b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll @@ -1,6 +1,8 @@ /** * Defines extensible predicates for contributing library models from data extensions. */ +overlay[local] +module; /** * Holds if the value at `(type, path)` should be seen as a flow diff --git a/python/ql/lib/semmle/python/internal/OverlayXml.qll b/python/ql/lib/semmle/python/internal/OverlayXml.qll new file mode 100644 index 00000000000..95d49f2d611 --- /dev/null +++ b/python/ql/lib/semmle/python/internal/OverlayXml.qll @@ -0,0 +1,46 @@ +overlay[local] +module; + +/** + * A local predicate that always holds for the overlay variant and never holds for the base variant. + * This is used to define local predicates that behave differently for the base and overlay variant. + */ +private predicate isOverlay() { databaseMetadata("isOverlay", "true") } + +private string getXmlFile(@xmllocatable locatable) { + exists(@location_default location, @file file | xmllocations(locatable, location) | + locations_default(location, file, _, _, _, _) and + files(file, result) + ) +} + +private string getXmlFileInBase(@xmllocatable locatable) { + not isOverlay() and + result = getXmlFile(locatable) +} + +/** + * Holds if the given `file` was extracted as part of the overlay and was extracted by the HTML/XML + * extractor. + */ +private predicate overlayXmlExtracted(string file) { + isOverlay() and + exists(@xmllocatable locatable | + not files(locatable, _) and not xmlNs(locatable, _, _, _) and file = getXmlFile(locatable) + ) +} + +/** + * Holds if the given XML `locatable` should be discarded, because it is part of the overlay base + * and is in a file that was also extracted as part of the overlay database. + */ +overlay[discard_entity] +private predicate discardXmlLocatable(@xmllocatable locatable) { + exists(string file | file = getXmlFileInBase(locatable) | + overlayChangedFiles(file) + or + // The HTML/XML extractor is currently not incremental and may extract more files than those + // included in overlayChangedFiles. + overlayXmlExtracted(file) + ) +} diff --git a/python/ql/lib/semmle/python/libraries/Zope.qll b/python/ql/lib/semmle/python/libraries/Zope.qll index fea3cecf418..defea3e4720 100644 --- a/python/ql/lib/semmle/python/libraries/Zope.qll +++ b/python/ql/lib/semmle/python/libraries/Zope.qll @@ -1,7 +1,7 @@ /** Utilities for handling the zope libraries */ import python -private import semmle.python.pointsto.PointsTo +private import LegacyPointsTo /** A method that belongs to a sub-class of `zope.interface.Interface` */ class ZopeInterfaceMethodValue extends PythonFunctionValue { diff --git a/python/ql/lib/semmle/python/objects/Constants.qll b/python/ql/lib/semmle/python/objects/Constants.qll index 31b63399ff4..49221df5b67 100644 --- a/python/ql/lib/semmle/python/objects/Constants.qll +++ b/python/ql/lib/semmle/python/objects/Constants.qll @@ -5,6 +5,7 @@ private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.MRO private import semmle.python.pointsto.PointsToContext private import semmle.python.types.Builtins +private import semmle.python.objects.ObjectAPI /** * A constant. diff --git a/python/ql/lib/semmle/python/objects/Descriptors.qll b/python/ql/lib/semmle/python/objects/Descriptors.qll index 2c18708e16a..5cb855ee5ca 100644 --- a/python/ql/lib/semmle/python/objects/Descriptors.qll +++ b/python/ql/lib/semmle/python/objects/Descriptors.qll @@ -5,6 +5,7 @@ private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.PointsToContext private import semmle.python.pointsto.MRO private import semmle.python.types.Builtins +private import semmle.python.pointsto.Context /** A property object. */ class PropertyInternal extends ObjectInternal, TProperty { diff --git a/python/ql/lib/semmle/python/objects/Instances.qll b/python/ql/lib/semmle/python/objects/Instances.qll index 0b4187b6928..2ae00502902 100644 --- a/python/ql/lib/semmle/python/objects/Instances.qll +++ b/python/ql/lib/semmle/python/objects/Instances.qll @@ -5,6 +5,8 @@ private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.MRO private import semmle.python.pointsto.PointsToContext private import semmle.python.types.Builtins +private import semmle.python.pointsto.Context +private import semmle.python.pointsto.Base /** A class representing instances */ abstract class InstanceObject extends ObjectInternal { diff --git a/python/ql/lib/semmle/python/objects/Modules.qll b/python/ql/lib/semmle/python/objects/Modules.qll index e523ad0b70a..8c5653fa2a3 100644 --- a/python/ql/lib/semmle/python/objects/Modules.qll +++ b/python/ql/lib/semmle/python/objects/Modules.qll @@ -5,6 +5,7 @@ private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.MRO private import semmle.python.pointsto.PointsToContext private import semmle.python.types.Builtins +private import semmle.python.types.ImportTime /** A class representing modules */ abstract class ModuleObjectInternal extends ObjectInternal { diff --git a/python/ql/lib/semmle/python/objects/ObjectAPI.qll b/python/ql/lib/semmle/python/objects/ObjectAPI.qll index 45247c5d9d4..a5d4d91cc7a 100644 --- a/python/ql/lib/semmle/python/objects/ObjectAPI.qll +++ b/python/ql/lib/semmle/python/objects/ObjectAPI.qll @@ -6,9 +6,6 @@ import python private import LegacyPointsTo private import TObject -private import semmle.python.objects.ObjectInternal -private import semmle.python.pointsto.PointsTo -private import semmle.python.pointsto.PointsToContext private import semmle.python.pointsto.MRO private import semmle.python.types.Builtins diff --git a/python/ql/lib/semmle/python/objects/TObject.qll b/python/ql/lib/semmle/python/objects/TObject.qll index 12b4dc901c3..c041827ff5a 100644 --- a/python/ql/lib/semmle/python/objects/TObject.qll +++ b/python/ql/lib/semmle/python/objects/TObject.qll @@ -6,6 +6,7 @@ private import semmle.python.objects.ObjectInternal private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.PointsToContext private import semmle.python.internal.CachedStages +private import semmle.python.pointsto.Context /** * Internal type backing `ObjectInternal` and `Value` diff --git a/python/ql/lib/semmle/python/pointsto/Base.qll b/python/ql/lib/semmle/python/pointsto/Base.qll index 56dc633eb9c..bf159c4b559 100644 --- a/python/ql/lib/semmle/python/pointsto/Base.qll +++ b/python/ql/lib/semmle/python/pointsto/Base.qll @@ -12,6 +12,8 @@ import python import semmle.python.essa.SsaDefinitions private import semmle.python.types.Builtins private import semmle.python.internal.CachedStages +private import semmle.python.types.Object +private import semmle.python.types.ClassObject /* * The following predicates exist in order to provide @@ -42,24 +44,6 @@ private predicate class_defines_name(Class cls, string name) { exists(SsaVariable var | name = var.getId() and var.getAUse() = cls.getANormalExit()) } -/** Hold if `expr` is a test (a branch) and `use` is within that test */ -predicate test_contains(ControlFlowNode expr, ControlFlowNode use) { - expr.getNode() instanceof Expr and - expr.isBranch() and - expr.getAChild*() = use -} - -/** Holds if `f` is an import of the form `from .[...] import ...` and the enclosing scope is an __init__ module */ -predicate import_from_dot_in_init(ImportExprNode f) { - f.getScope() = any(Module m).getInitModule() and - ( - f.getNode().getLevel() = 1 and - not exists(f.getNode().getName()) - or - f.getNode().getImportedModuleName() = f.getEnclosingModule().getPackage().getName() - ) -} - /** Gets the pseudo-object representing the value referred to by an undefined variable */ Object undefinedVariable() { py_special_objects(result, "_semmle_undefined_value") } diff --git a/python/ql/lib/semmle/python/pointsto/CallGraph.qll b/python/ql/lib/semmle/python/pointsto/CallGraph.qll index da225439588..734a5540254 100644 --- a/python/ql/lib/semmle/python/pointsto/CallGraph.qll +++ b/python/ql/lib/semmle/python/pointsto/CallGraph.qll @@ -11,6 +11,8 @@ import python private import semmle.python.pointsto.PointsToContext +private import semmle.python.types.FunctionObject +private import semmle.python.pointsto.Context private newtype TTInvocation = TInvocation(FunctionObject f, Context c) { diff --git a/python/ql/lib/semmle/python/pointsto/PointsTo.qll b/python/ql/lib/semmle/python/pointsto/PointsTo.qll index 56e8f6d6a63..66b82367de0 100644 --- a/python/ql/lib/semmle/python/pointsto/PointsTo.qll +++ b/python/ql/lib/semmle/python/pointsto/PointsTo.qll @@ -6,7 +6,13 @@ private import semmle.python.pointsto.PointsToContext private import semmle.python.pointsto.MRO private import semmle.python.types.Builtins private import semmle.python.types.Extensions +private import semmle.python.pointsto.Context private import semmle.python.internal.CachedStages +private import semmle.python.types.Object +private import semmle.python.types.FunctionObject +private import semmle.python.types.ClassObject +private import semmle.python.pointsto.Base +private import semmle.python.types.ImportTime /* Use this version for speed */ class CfgOrigin extends @py_object { diff --git a/python/ql/lib/semmle/python/pointsto/PointsToContext.qll b/python/ql/lib/semmle/python/pointsto/PointsToContext.qll index d68ce93e576..fb005b8f046 100644 --- a/python/ql/lib/semmle/python/pointsto/PointsToContext.qll +++ b/python/ql/lib/semmle/python/pointsto/PointsToContext.qll @@ -1,6 +1,8 @@ import python private import semmle.python.pointsto.PointsTo private import semmle.python.objects.ObjectInternal +private import semmle.python.types.ImportTime +private import semmle.python.types.Version /* * A note on 'cost'. Cost doesn't represent the cost to compute, diff --git a/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll b/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll index e60afa470ec..304e6376d2c 100644 --- a/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll @@ -50,7 +50,7 @@ module FullServerSideRequestForgeryFlow = TaintTracking::Global 0 and type.getBaseType(i) = base and result = type.getBaseType(i - 1)) diff --git a/python/ql/src/Classes/MaybeUndefinedClassAttribute.ql b/python/ql/src/Classes/MaybeUndefinedClassAttribute.ql index 9818aaece3c..6c4138f4f57 100644 --- a/python/ql/src/Classes/MaybeUndefinedClassAttribute.ql +++ b/python/ql/src/Classes/MaybeUndefinedClassAttribute.ql @@ -12,6 +12,7 @@ import python import ClassAttributes +private import LegacyPointsTo predicate guarded_by_other_attribute(SelfAttributeRead a, CheckClass c) { c.sometimesDefines(a.getName()) and diff --git a/python/ql/src/Classes/MutatingDescriptor.ql b/python/ql/src/Classes/MutatingDescriptor.ql index aad468f8e3c..b597de92d2e 100644 --- a/python/ql/src/Classes/MutatingDescriptor.ql +++ b/python/ql/src/Classes/MutatingDescriptor.ql @@ -1,5 +1,5 @@ /** - * @name Mutation of descriptor in `__get__` or `__set__` method. + * @name Mutation of descriptor in `__get__` or `__set__` method * @description Descriptor objects can be shared across many instances. Mutating them can cause strange side effects or race conditions. * @kind problem * @tags quality @@ -12,6 +12,7 @@ */ import python +private import LegacyPointsTo predicate mutates_descriptor(ClassObject cls, SelfAttributeStore s) { cls.isDescriptorType() and diff --git a/python/ql/src/Classes/OverwritingAttributeInSuperClass.ql b/python/ql/src/Classes/OverwritingAttributeInSuperClass.ql index 699e4387a14..89d33d54814 100644 --- a/python/ql/src/Classes/OverwritingAttributeInSuperClass.ql +++ b/python/ql/src/Classes/OverwritingAttributeInSuperClass.ql @@ -12,6 +12,7 @@ */ import python +private import LegacyPointsTo class InitCallStmt extends ExprStmt { InitCallStmt() { diff --git a/python/ql/src/Classes/PropertyInOldStyleClass.ql b/python/ql/src/Classes/PropertyInOldStyleClass.ql index 6e1b9a063c0..2fd7b1d14cf 100644 --- a/python/ql/src/Classes/PropertyInOldStyleClass.ql +++ b/python/ql/src/Classes/PropertyInOldStyleClass.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from PropertyObject prop, ClassObject cls where cls.declaredAttribute(_) = prop and not cls.failedInference() and not cls.isNewStyle() diff --git a/python/ql/src/Classes/ShouldBeContextManager.ql b/python/ql/src/Classes/ShouldBeContextManager.ql index 2423206e3cf..6aec0f0e0ab 100644 --- a/python/ql/src/Classes/ShouldBeContextManager.ql +++ b/python/ql/src/Classes/ShouldBeContextManager.ql @@ -14,6 +14,7 @@ */ import python +private import LegacyPointsTo from ClassValue c where not c.isBuiltin() and not c.isContextManager() and exists(c.declaredAttribute("__del__")) diff --git a/python/ql/src/Classes/SlotsInOldStyleClass.ql b/python/ql/src/Classes/SlotsInOldStyleClass.ql index bb229edc8d3..2f91a88cf64 100644 --- a/python/ql/src/Classes/SlotsInOldStyleClass.ql +++ b/python/ql/src/Classes/SlotsInOldStyleClass.ql @@ -12,6 +12,7 @@ */ import python +private import LegacyPointsTo from ClassObject c where not c.isNewStyle() and c.declaresAttribute("__slots__") and not c.failedInference() diff --git a/python/ql/src/Classes/SuperInOldStyleClass.ql b/python/ql/src/Classes/SuperInOldStyleClass.ql index deba0889449..a6a272b1b3b 100644 --- a/python/ql/src/Classes/SuperInOldStyleClass.ql +++ b/python/ql/src/Classes/SuperInOldStyleClass.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo predicate uses_of_super_in_old_style_class(Call s) { exists(Function f, ClassObject c | diff --git a/python/ql/src/Classes/UndefinedClassAttribute.ql b/python/ql/src/Classes/UndefinedClassAttribute.ql index 748c4681820..38dcb9b4a7d 100644 --- a/python/ql/src/Classes/UndefinedClassAttribute.ql +++ b/python/ql/src/Classes/UndefinedClassAttribute.ql @@ -12,6 +12,7 @@ import python import ClassAttributes +private import LegacyPointsTo predicate undefined_class_attribute(SelfAttributeRead a, CheckClass c, int line, string name) { name = a.getName() and diff --git a/python/ql/src/Classes/UselessClass.ql b/python/ql/src/Classes/UselessClass.ql index 7e33660dafc..740c74bf96d 100644 --- a/python/ql/src/Classes/UselessClass.ql +++ b/python/ql/src/Classes/UselessClass.ql @@ -13,6 +13,7 @@ */ import python +private import LegacyPointsTo predicate fewer_than_two_public_methods(Class cls, int methods) { (methods = 0 or methods = 1) and diff --git a/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql b/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql index 1de99ebdbf6..5b50855dcdf 100644 --- a/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql +++ b/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql @@ -16,6 +16,7 @@ import python import Expressions.CallArgs +private import LegacyPointsTo from Call call, ClassValue cls, string name, FunctionValue init where diff --git a/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql b/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql index 8518905f3a9..263a1a336a1 100644 --- a/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql +++ b/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql @@ -15,6 +15,7 @@ import python import Expressions.CallArgs +private import LegacyPointsTo from Call call, ClassValue cls, string too, string should, int limit, FunctionValue init where diff --git a/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql b/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql index 2bf97b469ee..dc1c3f2fa35 100644 --- a/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql +++ b/python/ql/src/Exceptions/IllegalExceptionHandlerType.ql @@ -12,8 +12,9 @@ */ import python +private import LegacyPointsTo -from ExceptFlowNode ex, Value t, ClassValue c, ControlFlowNode origin, string what +from ExceptFlowNodeWithPointsTo ex, Value t, ClassValue c, ControlFlowNode origin, string what where ex.handledException(t, c, origin) and ( diff --git a/python/ql/src/Exceptions/IllegalRaise.ql b/python/ql/src/Exceptions/IllegalRaise.ql index 04319e246ed..f9f263552b1 100644 --- a/python/ql/src/Exceptions/IllegalRaise.ql +++ b/python/ql/src/Exceptions/IllegalRaise.ql @@ -14,6 +14,7 @@ import python import Raising import Exceptions.NotImplemented +private import LegacyPointsTo from Raise r, ClassValue t where diff --git a/python/ql/src/Expressions/ContainsNonContainer.ql b/python/ql/src/Expressions/ContainsNonContainer.ql index fd2123dd436..de8c3879567 100644 --- a/python/ql/src/Expressions/ContainsNonContainer.ql +++ b/python/ql/src/Expressions/ContainsNonContainer.ql @@ -13,7 +13,6 @@ import python private import LegacyPointsTo -import semmle.python.pointsto.PointsTo predicate rhs_in_expr(ControlFlowNode rhs, Compare cmp) { exists(Cmpop op, int i | cmp.getOp(i) = op and cmp.getComparator(i) = rhs.getNode() | diff --git a/python/ql/src/Expressions/IsComparisons.qll b/python/ql/src/Expressions/IsComparisons.qll index 1ed4534bd23..cb052ceca76 100644 --- a/python/ql/src/Expressions/IsComparisons.qll +++ b/python/ql/src/Expressions/IsComparisons.qll @@ -2,7 +2,6 @@ import python private import LegacyPointsTo -private import semmle.python.objects.ObjectInternal /** Holds if the comparison `comp` uses `is` or `is not` (represented as `op`) to compare its `left` and `right` arguments. */ predicate comparison_using_is(Compare comp, ControlFlowNode left, Cmpop op, ControlFlowNode right) { diff --git a/python/ql/src/Expressions/NonPortableComparisonUsingIs.ql b/python/ql/src/Expressions/NonPortableComparisonUsingIs.ql index 894cc78c8f4..d705bea0765 100644 --- a/python/ql/src/Expressions/NonPortableComparisonUsingIs.ql +++ b/python/ql/src/Expressions/NonPortableComparisonUsingIs.ql @@ -13,6 +13,7 @@ import python import IsComparisons +private import LegacyPointsTo from Compare comp, Cmpop op, ClassValue c where diff --git a/python/ql/src/Expressions/RedundantComparison.qll b/python/ql/src/Expressions/RedundantComparison.qll index a0d4f906501..dc40a89c784 100644 --- a/python/ql/src/Expressions/RedundantComparison.qll +++ b/python/ql/src/Expressions/RedundantComparison.qll @@ -1,6 +1,7 @@ /** Helper functions for queries that test redundant comparisons. */ import python +private import LegacyPointsTo /** A comparison where the left and right hand sides appear to be identical. */ class RedundantComparison extends Compare { diff --git a/python/ql/src/Expressions/WrongNameForArgumentInCall.ql b/python/ql/src/Expressions/WrongNameForArgumentInCall.ql index 21403c51c61..f267df13e19 100644 --- a/python/ql/src/Expressions/WrongNameForArgumentInCall.ql +++ b/python/ql/src/Expressions/WrongNameForArgumentInCall.ql @@ -16,6 +16,7 @@ import python import Expressions.CallArgs +private import LegacyPointsTo from Call call, FunctionObject func, string name where diff --git a/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql b/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql index d7b27e5c3d7..cf741d4cf64 100644 --- a/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql +++ b/python/ql/src/Expressions/WrongNumberArgumentsForFormat.ql @@ -15,7 +15,6 @@ import python import LegacyPointsTo -import semmle.python.objects.ObjectInternal import semmle.python.strings predicate string_format(BinaryExpr operation, StringLiteral str, Value args, AstNode origin) { diff --git a/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql b/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql index bde54558c9b..35d9341fb05 100644 --- a/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql +++ b/python/ql/src/Expressions/WrongNumberArgumentsInCall.ql @@ -13,6 +13,7 @@ */ import python +private import LegacyPointsTo import CallArgs from Call call, FunctionValue func, string too, string should, int limit diff --git a/python/ql/src/Functions/ConsistentReturns.ql b/python/ql/src/Functions/ConsistentReturns.ql index 1bc7b5724b3..9beeafc6372 100644 --- a/python/ql/src/Functions/ConsistentReturns.ql +++ b/python/ql/src/Functions/ConsistentReturns.ql @@ -12,6 +12,7 @@ */ import python +private import LegacyPointsTo predicate explicitly_returns_non_none(Function func) { exists(Return return | @@ -21,7 +22,7 @@ predicate explicitly_returns_non_none(Function func) { } predicate has_implicit_return(Function func) { - exists(ControlFlowNode fallthru | + exists(ControlFlowNodeWithPointsTo fallthru | fallthru = func.getFallthroughNode() and not fallthru.unlikelyReachable() ) or diff --git a/python/ql/src/Functions/DeprecatedSliceMethod.ql b/python/ql/src/Functions/DeprecatedSliceMethod.ql index af596f704cd..3e9cdb681d9 100644 --- a/python/ql/src/Functions/DeprecatedSliceMethod.ql +++ b/python/ql/src/Functions/DeprecatedSliceMethod.ql @@ -10,6 +10,7 @@ */ import python +private import LegacyPointsTo predicate slice_method_name(string name) { name = "__getslice__" or name = "__setslice__" or name = "__delslice__" diff --git a/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql b/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql index a4e3bd6e0ce..0a640d46239 100644 --- a/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql +++ b/python/ql/src/Functions/IncorrectlyOverriddenMethod.ql @@ -14,6 +14,7 @@ import python import Expressions.CallArgs +private import LegacyPointsTo from Call call, FunctionValue func, FunctionValue overridden, string problem where diff --git a/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql b/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql index 6b31795d94e..18cbddaff31 100644 --- a/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql +++ b/python/ql/src/Functions/IncorrectlySpecifiedOverriddenMethod.ql @@ -14,6 +14,7 @@ import python import Expressions.CallArgs +private import LegacyPointsTo from Call call, FunctionValue func, FunctionValue overriding, string problem where diff --git a/python/ql/src/Functions/IterReturnsNonIterator.ql b/python/ql/src/Functions/IterReturnsNonIterator.ql index 367332cf49a..08234726314 100644 --- a/python/ql/src/Functions/IterReturnsNonIterator.ql +++ b/python/ql/src/Functions/IterReturnsNonIterator.ql @@ -12,6 +12,7 @@ */ import python +private import LegacyPointsTo from ClassValue iterable, FunctionValue iter, ClassValue iterator where diff --git a/python/ql/src/Functions/OverlyComplexDelMethod.ql b/python/ql/src/Functions/OverlyComplexDelMethod.ql index b93dc4af3c3..12776db1b60 100644 --- a/python/ql/src/Functions/OverlyComplexDelMethod.ql +++ b/python/ql/src/Functions/OverlyComplexDelMethod.ql @@ -12,11 +12,12 @@ */ import python +private import LegacyPointsTo from FunctionValue method where exists(ClassValue c | c.declaredAttribute("__del__") = method and - method.getScope().getMetrics().getCyclomaticComplexity() > 3 + method.getScope().(FunctionMetrics).getCyclomaticComplexity() > 3 ) select method, "Overly complex '__del__' method." diff --git a/python/ql/src/Functions/ReturnValueIgnored.ql b/python/ql/src/Functions/ReturnValueIgnored.ql index d8f81534b8a..3716b989d89 100644 --- a/python/ql/src/Functions/ReturnValueIgnored.ql +++ b/python/ql/src/Functions/ReturnValueIgnored.ql @@ -14,7 +14,7 @@ */ import python -import semmle.python.objects.Callables +private import LegacyPointsTo predicate meaningful_return_value(Expr val) { val instanceof Name diff --git a/python/ql/src/Imports/Cyclic.qll b/python/ql/src/Imports/Cyclic.qll index 720ea8f0048..ad24a08eddd 100644 --- a/python/ql/src/Imports/Cyclic.qll +++ b/python/ql/src/Imports/Cyclic.qll @@ -1,5 +1,6 @@ import python private import LegacyPointsTo +private import semmle.python.types.ImportTime predicate is_import_time(Stmt s) { not s.getScope+() instanceof Function } diff --git a/python/ql/src/Imports/CyclicImport.ql b/python/ql/src/Imports/CyclicImport.ql index 9e4a153a110..464d906db98 100644 --- a/python/ql/src/Imports/CyclicImport.ql +++ b/python/ql/src/Imports/CyclicImport.ql @@ -13,6 +13,7 @@ import python import Cyclic +private import LegacyPointsTo from ModuleValue m1, ModuleValue m2, Stmt imp where diff --git a/python/ql/src/Imports/ModuleImportsItself.ql b/python/ql/src/Imports/ModuleImportsItself.ql index 72d223da3db..97fb68791d1 100644 --- a/python/ql/src/Imports/ModuleImportsItself.ql +++ b/python/ql/src/Imports/ModuleImportsItself.ql @@ -12,6 +12,7 @@ */ import python +private import LegacyPointsTo predicate modules_imports_itself(ImportingStmt i, ModuleValue m) { i.getEnclosingModule() = m.getScope() and diff --git a/python/ql/src/Imports/ModuleLevelCyclicImport.ql b/python/ql/src/Imports/ModuleLevelCyclicImport.ql index 7d9b0cc31c7..7910cb76823 100644 --- a/python/ql/src/Imports/ModuleLevelCyclicImport.ql +++ b/python/ql/src/Imports/ModuleLevelCyclicImport.ql @@ -14,6 +14,7 @@ import python import Cyclic +private import LegacyPointsTo // This is a potentially crashing bug if // 1. the imports in the whole cycle are lexically outside a def (and so executed at import time) diff --git a/python/ql/src/Imports/UnintentionalImport.ql b/python/ql/src/Imports/UnintentionalImport.ql index 1faf3bb55f3..db1775a0d41 100644 --- a/python/ql/src/Imports/UnintentionalImport.ql +++ b/python/ql/src/Imports/UnintentionalImport.ql @@ -13,6 +13,8 @@ */ import python +private import LegacyPointsTo +private import semmle.python.types.ImportTime predicate import_star(ImportStar imp, ModuleValue exporter) { exporter.importedAs(imp.getImportedModuleName()) diff --git a/python/ql/src/Metrics/CLinesOfCode.ql b/python/ql/src/Metrics/CLinesOfCode.ql index c7b29615593..66a107a521f 100644 --- a/python/ql/src/Metrics/CLinesOfCode.ql +++ b/python/ql/src/Metrics/CLinesOfCode.ql @@ -10,6 +10,7 @@ */ import python +private import LegacyPointsTo -from Function f -select f, f.getMetrics().getNumberOfLinesOfCode() as n order by n desc +from FunctionMetrics f +select f, f.getNumberOfLinesOfCode() as n order by n desc diff --git a/python/ql/src/Metrics/ClassAfferentCoupling.ql b/python/ql/src/Metrics/ClassAfferentCoupling.ql index 295e8c61a6c..3faf714d09c 100644 --- a/python/ql/src/Metrics/ClassAfferentCoupling.ql +++ b/python/ql/src/Metrics/ClassAfferentCoupling.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from ClassMetrics cls select cls, cls.getAfferentCoupling() as n order by n desc diff --git a/python/ql/src/Metrics/ClassEfferentCoupling.ql b/python/ql/src/Metrics/ClassEfferentCoupling.ql index d960c0142e3..b4c5a29696b 100644 --- a/python/ql/src/Metrics/ClassEfferentCoupling.ql +++ b/python/ql/src/Metrics/ClassEfferentCoupling.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from ClassMetrics cls select cls, cls.getEfferentCoupling() as n order by n desc diff --git a/python/ql/src/Metrics/CommentRatio.ql b/python/ql/src/Metrics/CommentRatio.ql index 8ebb27cf304..38394c1bf4f 100644 --- a/python/ql/src/Metrics/CommentRatio.ql +++ b/python/ql/src/Metrics/CommentRatio.ql @@ -12,8 +12,10 @@ */ import python +private import LegacyPointsTo -from Module m, ModuleMetrics mm -where mm = m.getMetrics() and mm.getNumberOfLines() > 0 -select m, 100.0 * (mm.getNumberOfLinesOfComments().(float) / mm.getNumberOfLines().(float)) as ratio +from ModuleMetrics mm +where mm.getNumberOfLines() > 0 +select mm, + 100.0 * (mm.getNumberOfLinesOfComments().(float) / mm.getNumberOfLines().(float)) as ratio order by ratio desc diff --git a/python/ql/src/Metrics/CyclomaticComplexity.ql b/python/ql/src/Metrics/CyclomaticComplexity.ql index 1e332f4ec9f..3d9ca10dd99 100644 --- a/python/ql/src/Metrics/CyclomaticComplexity.ql +++ b/python/ql/src/Metrics/CyclomaticComplexity.ql @@ -13,7 +13,8 @@ */ import python +private import LegacyPointsTo -from Function func, int complexity -where complexity = func.getMetrics().getCyclomaticComplexity() +from FunctionMetrics func, int complexity +where complexity = func.getCyclomaticComplexity() select func, complexity order by complexity desc diff --git a/python/ql/src/Metrics/Dependencies/ExternalDependenciesSourceLinks.ql b/python/ql/src/Metrics/Dependencies/ExternalDependenciesSourceLinks.ql index 98bb4e63cc3..60dbcdcc7fc 100644 --- a/python/ql/src/Metrics/Dependencies/ExternalDependenciesSourceLinks.ql +++ b/python/ql/src/Metrics/Dependencies/ExternalDependenciesSourceLinks.ql @@ -8,6 +8,7 @@ import python import semmle.python.dependencies.TechInventory +private import LegacyPointsTo /* * This query creates the source links for the ExternalDependencies.ql query. diff --git a/python/ql/src/Metrics/DirectImports.ql b/python/ql/src/Metrics/DirectImports.ql index 240cd65e687..e383d4b3657 100644 --- a/python/ql/src/Metrics/DirectImports.ql +++ b/python/ql/src/Metrics/DirectImports.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from ModuleValue m, int n where n = count(ModuleValue imp | imp = m.getAnImportedModule()) diff --git a/python/ql/src/Metrics/DocStringRatio.ql b/python/ql/src/Metrics/DocStringRatio.ql index a8cd8b8dc4e..824ff5a3509 100644 --- a/python/ql/src/Metrics/DocStringRatio.ql +++ b/python/ql/src/Metrics/DocStringRatio.ql @@ -11,9 +11,10 @@ */ import python +private import LegacyPointsTo -from Module m, ModuleMetrics mm -where mm = m.getMetrics() and mm.getNumberOfLines() > 0 -select m, +from ModuleMetrics mm +where mm.getNumberOfLines() > 0 +select mm, 100.0 * (mm.getNumberOfLinesOfDocStrings().(float) / mm.getNumberOfLines().(float)) as ratio order by ratio desc diff --git a/python/ql/src/Metrics/FLines.ql b/python/ql/src/Metrics/FLines.ql index 340fb6f58ea..dc5418711c9 100644 --- a/python/ql/src/Metrics/FLines.ql +++ b/python/ql/src/Metrics/FLines.ql @@ -9,7 +9,8 @@ */ import python +private import LegacyPointsTo -from Module m, int n -where n = m.getMetrics().getNumberOfLines() +from ModuleMetrics m, int n +where n = m.getNumberOfLines() select m, n order by n desc diff --git a/python/ql/src/Metrics/FLinesOfCode.ql b/python/ql/src/Metrics/FLinesOfCode.ql index 84c952f9267..8159eb86c57 100644 --- a/python/ql/src/Metrics/FLinesOfCode.ql +++ b/python/ql/src/Metrics/FLinesOfCode.ql @@ -11,7 +11,8 @@ */ import python +private import LegacyPointsTo -from Module m, int n -where n = m.getMetrics().getNumberOfLinesOfCode() +from ModuleMetrics m, int n +where n = m.getNumberOfLinesOfCode() select m, n order by n desc diff --git a/python/ql/src/Metrics/FLinesOfComments.ql b/python/ql/src/Metrics/FLinesOfComments.ql index 18a234eef67..ac4b295003a 100644 --- a/python/ql/src/Metrics/FLinesOfComments.ql +++ b/python/ql/src/Metrics/FLinesOfComments.ql @@ -10,8 +10,8 @@ */ import python +private import LegacyPointsTo -from Module m, int n -where - n = m.getMetrics().getNumberOfLinesOfComments() + m.getMetrics().getNumberOfLinesOfDocStrings() +from ModuleMetrics m, int n +where n = m.getNumberOfLinesOfComments() + m.getNumberOfLinesOfDocStrings() select m, n order by n desc diff --git a/python/ql/src/Metrics/FunctionNumberOfCalls.ql b/python/ql/src/Metrics/FunctionNumberOfCalls.ql index fb4dfe5a9d2..60171c790bf 100644 --- a/python/ql/src/Metrics/FunctionNumberOfCalls.ql +++ b/python/ql/src/Metrics/FunctionNumberOfCalls.ql @@ -9,6 +9,7 @@ */ import python +private import LegacyPointsTo from FunctionMetrics func select func, func.getNumberOfCalls() as n order by n desc diff --git a/python/ql/src/Metrics/FunctionStatementNestingDepth.ql b/python/ql/src/Metrics/FunctionStatementNestingDepth.ql index ab40cc6068d..94f7e355750 100644 --- a/python/ql/src/Metrics/FunctionStatementNestingDepth.ql +++ b/python/ql/src/Metrics/FunctionStatementNestingDepth.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from FunctionMetrics func select func, func.getStatementNestingDepth() as n order by n desc diff --git a/python/ql/src/Metrics/History/HChurn.ql b/python/ql/src/Metrics/History/HChurn.ql index d6a8722e6e2..dba28843670 100644 --- a/python/ql/src/Metrics/History/HChurn.ql +++ b/python/ql/src/Metrics/History/HChurn.ql @@ -10,8 +10,9 @@ import python import external.VCS +private import LegacyPointsTo -from Module m, int n +from ModuleMetrics m, int n where n = sum(Commit entry, int churn | @@ -19,5 +20,5 @@ where | churn ) and - exists(m.getMetrics().getNumberOfLinesOfCode()) + exists(m.getNumberOfLinesOfCode()) select m, n order by n desc diff --git a/python/ql/src/Metrics/History/HLinesAdded.ql b/python/ql/src/Metrics/History/HLinesAdded.ql index 3ecec917ab1..51a0af62460 100644 --- a/python/ql/src/Metrics/History/HLinesAdded.ql +++ b/python/ql/src/Metrics/History/HLinesAdded.ql @@ -10,8 +10,9 @@ import python import external.VCS +private import LegacyPointsTo -from Module m, int n +from ModuleMetrics m, int n where n = sum(Commit entry, int churn | @@ -19,5 +20,5 @@ where | churn ) and - exists(m.getMetrics().getNumberOfLinesOfCode()) + exists(m.getNumberOfLinesOfCode()) select m, n order by n desc diff --git a/python/ql/src/Metrics/History/HLinesDeleted.ql b/python/ql/src/Metrics/History/HLinesDeleted.ql index ded74756d55..3016c9f128b 100644 --- a/python/ql/src/Metrics/History/HLinesDeleted.ql +++ b/python/ql/src/Metrics/History/HLinesDeleted.ql @@ -10,8 +10,9 @@ import python import external.VCS +private import LegacyPointsTo -from Module m, int n +from ModuleMetrics m, int n where n = sum(Commit entry, int churn | @@ -19,5 +20,5 @@ where | churn ) and - exists(m.getMetrics().getNumberOfLinesOfCode()) + exists(m.getNumberOfLinesOfCode()) select m, n order by n desc diff --git a/python/ql/src/Metrics/History/HNumberOfAuthors.ql b/python/ql/src/Metrics/History/HNumberOfAuthors.ql index 15e679e58c5..ff00773d98c 100644 --- a/python/ql/src/Metrics/History/HNumberOfAuthors.ql +++ b/python/ql/src/Metrics/History/HNumberOfAuthors.ql @@ -10,7 +10,8 @@ import python import external.VCS +private import LegacyPointsTo -from Module m -where exists(m.getMetrics().getNumberOfLinesOfCode()) +from ModuleMetrics m +where exists(m.getNumberOfLinesOfCode()) select m, count(Author author | author.getAnEditedFile() = m.getFile()) diff --git a/python/ql/src/Metrics/History/HNumberOfCoCommits.ql b/python/ql/src/Metrics/History/HNumberOfCoCommits.ql index afb62353a03..4192ecf57ac 100644 --- a/python/ql/src/Metrics/History/HNumberOfCoCommits.ql +++ b/python/ql/src/Metrics/History/HNumberOfCoCommits.ql @@ -10,11 +10,12 @@ import python import external.VCS +private import LegacyPointsTo int committedFiles(Commit commit) { result = count(commit.getAnAffectedFile()) } -from Module m -where exists(m.getMetrics().getNumberOfLinesOfCode()) +from ModuleMetrics m +where exists(m.getNumberOfLinesOfCode()) select m, avg(Commit commit, int toAvg | commit.getAnAffectedFile() = m.getFile() and toAvg = committedFiles(commit) - 1 diff --git a/python/ql/src/Metrics/History/HNumberOfReCommits.ql b/python/ql/src/Metrics/History/HNumberOfReCommits.ql index 5df9194ee34..f12c51840dc 100644 --- a/python/ql/src/Metrics/History/HNumberOfReCommits.ql +++ b/python/ql/src/Metrics/History/HNumberOfReCommits.ql @@ -10,6 +10,7 @@ import python import external.VCS +private import LegacyPointsTo predicate inRange(Commit first, Commit second) { first.getAnAffectedFile() = second.getAnAffectedFile() and @@ -29,6 +30,6 @@ int recommitsForFile(File f) { ) } -from Module m -where exists(m.getMetrics().getNumberOfLinesOfCode()) +from ModuleMetrics m +where exists(m.getNumberOfLinesOfCode()) select m, recommitsForFile(m.getFile()) diff --git a/python/ql/src/Metrics/History/HNumberOfRecentAuthors.ql b/python/ql/src/Metrics/History/HNumberOfRecentAuthors.ql index e04baa491f4..9b787f52957 100644 --- a/python/ql/src/Metrics/History/HNumberOfRecentAuthors.ql +++ b/python/ql/src/Metrics/History/HNumberOfRecentAuthors.ql @@ -10,9 +10,10 @@ import python import external.VCS +private import LegacyPointsTo -from Module m -where exists(m.getMetrics().getNumberOfLinesOfCode()) +from ModuleMetrics m +where exists(m.getNumberOfLinesOfCode()) select m, count(Author author | exists(Commit e | diff --git a/python/ql/src/Metrics/History/HNumberOfRecentChangedFiles.ql b/python/ql/src/Metrics/History/HNumberOfRecentChangedFiles.ql index f0d8473b302..501094907af 100644 --- a/python/ql/src/Metrics/History/HNumberOfRecentChangedFiles.ql +++ b/python/ql/src/Metrics/History/HNumberOfRecentChangedFiles.ql @@ -10,11 +10,12 @@ import python import external.VCS +private import LegacyPointsTo -from Module m +from ModuleMetrics m where exists(Commit e | e.getAnAffectedFile() = m.getFile() and e.daysToNow() <= 180 and not artificialChange(e) ) and - exists(m.getMetrics().getNumberOfLinesOfCode()) + exists(m.getNumberOfLinesOfCode()) select m, 1 diff --git a/python/ql/src/Metrics/LackofCohesionInMethodsCK.ql b/python/ql/src/Metrics/LackofCohesionInMethodsCK.ql index c0ef582c32b..f06b050827c 100644 --- a/python/ql/src/Metrics/LackofCohesionInMethodsCK.ql +++ b/python/ql/src/Metrics/LackofCohesionInMethodsCK.ql @@ -9,6 +9,7 @@ */ import python +private import LegacyPointsTo from ClassMetrics cls select cls, cls.getLackOfCohesionCK() as n order by n desc diff --git a/python/ql/src/Metrics/LackofCohesionInMethodsHM.ql b/python/ql/src/Metrics/LackofCohesionInMethodsHM.ql index 5cc77ecfb4f..1456b76b286 100644 --- a/python/ql/src/Metrics/LackofCohesionInMethodsHM.ql +++ b/python/ql/src/Metrics/LackofCohesionInMethodsHM.ql @@ -9,6 +9,7 @@ */ import python +private import LegacyPointsTo from ClassMetrics cls select cls, cls.getLackOfCohesionHM() as n order by n desc diff --git a/python/ql/src/Metrics/ModuleAfferentCoupling.ql b/python/ql/src/Metrics/ModuleAfferentCoupling.ql index 7bf51433785..d61cc61e4da 100644 --- a/python/ql/src/Metrics/ModuleAfferentCoupling.ql +++ b/python/ql/src/Metrics/ModuleAfferentCoupling.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from ModuleMetrics m select m, m.getAfferentCoupling() as n order by n desc diff --git a/python/ql/src/Metrics/ModuleEfferentCoupling.ql b/python/ql/src/Metrics/ModuleEfferentCoupling.ql index 51fdcf5423b..bfabf4b6012 100644 --- a/python/ql/src/Metrics/ModuleEfferentCoupling.ql +++ b/python/ql/src/Metrics/ModuleEfferentCoupling.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from ModuleMetrics m select m, m.getEfferentCoupling() as n order by n desc diff --git a/python/ql/src/Metrics/NumberOfParametersWithoutDefault.ql b/python/ql/src/Metrics/NumberOfParametersWithoutDefault.ql index 00a4c1bf0db..e5164499331 100644 --- a/python/ql/src/Metrics/NumberOfParametersWithoutDefault.ql +++ b/python/ql/src/Metrics/NumberOfParametersWithoutDefault.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from FunctionMetrics func select func, func.getNumberOfParametersWithoutDefault() as n order by n desc diff --git a/python/ql/src/Metrics/TransitiveImports.ql b/python/ql/src/Metrics/TransitiveImports.ql index a46a7a16302..364840fbcb9 100644 --- a/python/ql/src/Metrics/TransitiveImports.ql +++ b/python/ql/src/Metrics/TransitiveImports.ql @@ -11,6 +11,7 @@ */ import python +private import LegacyPointsTo from ModuleValue m, int n where n = count(ModuleValue imp | imp = m.getAnImportedModule+() and imp != m) diff --git a/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll b/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll index 34649c0fb86..9c12845a0ca 100644 --- a/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll +++ b/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll @@ -182,7 +182,7 @@ module UntrustedDataToExternalApiFlow = TaintTracking::Global 2 and + (f.getNumberOfLinesOfCode() - count(f.getADecorator())) > 2 and not exists(PythonPropertyObject p | p.getGetter().getFunction() = f or p.getSetter().getFunction() = f diff --git a/python/ql/src/Statements/RedundantAssignment.ql b/python/ql/src/Statements/RedundantAssignment.ql index 357364c41b2..a443e199b1c 100644 --- a/python/ql/src/Statements/RedundantAssignment.ql +++ b/python/ql/src/Statements/RedundantAssignment.ql @@ -36,7 +36,7 @@ predicate same_value(Expr left, Expr right) { } predicate maybe_defined_in_outer_scope(Name n) { - exists(SsaVariable v | v.getAUse().getNode() = n | v.maybeUndefined()) + exists(SsaVariableWithPointsTo v | v.getAUse().getNode() = n | v.maybeUndefined()) } /* diff --git a/python/ql/src/Statements/SideEffectInAssert.ql b/python/ql/src/Statements/SideEffectInAssert.ql index 92cb95d702b..902b6c4c9c1 100644 --- a/python/ql/src/Statements/SideEffectInAssert.ql +++ b/python/ql/src/Statements/SideEffectInAssert.ql @@ -13,6 +13,7 @@ */ import python +private import LegacyPointsTo predicate func_with_side_effects(Expr e) { exists(string name | name = e.(Attribute).getName() or name = e.(Name).getId() | diff --git a/python/ql/src/Statements/TopLevelPrint.ql b/python/ql/src/Statements/TopLevelPrint.ql index 2d481421b7e..12095f7a484 100644 --- a/python/ql/src/Statements/TopLevelPrint.ql +++ b/python/ql/src/Statements/TopLevelPrint.ql @@ -12,6 +12,7 @@ */ import python +private import LegacyPointsTo predicate main_eq_name(If i) { exists(Name n, StringLiteral m, Compare c | diff --git a/python/ql/src/Statements/UnnecessaryDelete.ql b/python/ql/src/Statements/UnnecessaryDelete.ql index 808a3f3a0d3..c7b80ecc66a 100644 --- a/python/ql/src/Statements/UnnecessaryDelete.ql +++ b/python/ql/src/Statements/UnnecessaryDelete.ql @@ -13,6 +13,7 @@ */ import python +private import LegacyPointsTo predicate isInsideLoop(AstNode node) { node.getParentNode() instanceof While diff --git a/python/ql/src/Summary/LinesOfCode.ql b/python/ql/src/Summary/LinesOfCode.ql index a07a896c4ca..04cb33a3451 100644 --- a/python/ql/src/Summary/LinesOfCode.ql +++ b/python/ql/src/Summary/LinesOfCode.ql @@ -10,5 +10,6 @@ */ import python +private import LegacyPointsTo -select sum(Module m | | m.getMetrics().getNumberOfLinesOfCode()) +select sum(ModuleMetrics m | | m.getNumberOfLinesOfCode()) diff --git a/python/ql/src/Summary/LinesOfUserCode.ql b/python/ql/src/Summary/LinesOfUserCode.ql index f6d6f25872f..f920ebb51f4 100644 --- a/python/ql/src/Summary/LinesOfUserCode.ql +++ b/python/ql/src/Summary/LinesOfUserCode.ql @@ -14,10 +14,11 @@ import python import semmle.python.filters.GeneratedCode +private import LegacyPointsTo -select sum(Module m | +select sum(ModuleMetrics m | exists(m.getFile().getRelativePath()) and not m.getFile() instanceof GeneratedFile | - m.getMetrics().getNumberOfLinesOfCode() + m.getNumberOfLinesOfCode() ) diff --git a/python/ql/src/Variables/Global.ql b/python/ql/src/Variables/Global.ql index b29fb564a87..40e777c62d6 100644 --- a/python/ql/src/Variables/Global.ql +++ b/python/ql/src/Variables/Global.ql @@ -1,5 +1,5 @@ /** - * @name Use of the 'global' statement. + * @name Use of the 'global' statement * @description Use of the 'global' statement may indicate poor modularity. * @kind problem * @problem.severity recommendation diff --git a/python/ql/src/Variables/Undefined.qll b/python/ql/src/Variables/Undefined.qll index 58deee4dc59..42437a81340 100644 --- a/python/ql/src/Variables/Undefined.qll +++ b/python/ql/src/Variables/Undefined.qll @@ -1,6 +1,7 @@ import python import Loop import semmle.python.dataflow.TaintTracking +private import LegacyPointsTo /** A marker for "uninitialized". */ class Uninitialized extends TaintKind { diff --git a/python/ql/src/Variables/UndefinedGlobal.ql b/python/ql/src/Variables/UndefinedGlobal.ql index 3ea1c0d38eb..404ac64aa5a 100644 --- a/python/ql/src/Variables/UndefinedGlobal.ql +++ b/python/ql/src/Variables/UndefinedGlobal.ql @@ -12,9 +12,9 @@ import python private import LegacyPointsTo +private import semmle.python.types.ImportTime import Variables.MonkeyPatched import Loop -import semmle.python.pointsto.PointsTo predicate guarded_against_name_error(Name u) { exists(Try t | t.getBody().getAnItem().contains(u) | @@ -62,7 +62,7 @@ predicate undefined_use_in_function(Name u) { not u.getEnclosingModule().(ImportTimeScope).definesName(u.getId()) and not exists(ModuleValue m | m.getScope() = u.getEnclosingModule() | m.hasAttribute(u.getId())) and not globallyDefinedName(u.getId()) and - not exists(SsaVariable var | var.getAUse().getNode() = u and not var.maybeUndefined()) and + not exists(SsaVariableWithPointsTo var | var.getAUse().getNode() = u and not var.maybeUndefined()) and not guarded_against_name_error(u) and not (u.getEnclosingModule().isPackageInit() and u.getId() = "__path__") } @@ -70,7 +70,7 @@ predicate undefined_use_in_function(Name u) { predicate undefined_use_in_class_or_module(Name u) { exists(GlobalVariable v | u.uses(v)) and not u.getScope().getScope*() instanceof Function and - exists(SsaVariable var | var.getAUse().getNode() = u | var.maybeUndefined()) and + exists(SsaVariableWithPointsTo var | var.getAUse().getNode() = u | var.maybeUndefined()) and not guarded_against_name_error(u) and not exists(ModuleValue m | m.getScope() = u.getEnclosingModule() | m.hasAttribute(u.getId())) and not (u.getEnclosingModule().isPackageInit() and u.getId() = "__path__") and diff --git a/python/ql/src/Variables/UndefinedPlaceHolder.ql b/python/ql/src/Variables/UndefinedPlaceHolder.ql index b0eeeda871a..29f9b3a1a51 100644 --- a/python/ql/src/Variables/UndefinedPlaceHolder.ql +++ b/python/ql/src/Variables/UndefinedPlaceHolder.ql @@ -13,10 +13,14 @@ import python import Variables.MonkeyPatched +private import LegacyPointsTo +private import semmle.python.types.ImportTime /* Local variable part */ predicate initialized_as_local(PlaceHolder use) { - exists(SsaVariable l, Function f | f = use.getScope() and l.getAUse() = use.getAFlowNode() | + exists(SsaVariableWithPointsTo l, Function f | + f = use.getScope() and l.getAUse() = use.getAFlowNode() + | l.getVariable() instanceof LocalVariable and not l.maybeUndefined() ) diff --git a/python/ql/src/Variables/UninitializedLocal.ql b/python/ql/src/Variables/UninitializedLocal.ql index d4d94f5a4f3..48332e01af3 100644 --- a/python/ql/src/Variables/UninitializedLocal.ql +++ b/python/ql/src/Variables/UninitializedLocal.ql @@ -14,7 +14,6 @@ import python private import LegacyPointsTo import Undefined -import semmle.python.pointsto.PointsTo predicate uninitialized_local(NameNode use) { exists(FastLocalVariable local | use.uses(local) or use.deletes(local) | diff --git a/python/ql/src/Variables/UnusedParameter.ql b/python/ql/src/Variables/UnusedParameter.ql index 7228974b7c7..1efb984fd0b 100644 --- a/python/ql/src/Variables/UnusedParameter.ql +++ b/python/ql/src/Variables/UnusedParameter.ql @@ -14,6 +14,7 @@ import python import Definition +private import LegacyPointsTo predicate unused_parameter(FunctionValue f, LocalVariable v) { v.isParameter() and diff --git a/python/ql/src/analysis/CallGraphEfficiency.ql b/python/ql/src/analysis/CallGraphEfficiency.ql index 5e36823b8ac..3990b68ecc6 100644 --- a/python/ql/src/analysis/CallGraphEfficiency.ql +++ b/python/ql/src/analysis/CallGraphEfficiency.ql @@ -4,8 +4,7 @@ */ import python -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo from int total_facts, int total_size, int depth, float efficiency where diff --git a/python/ql/src/analysis/CallGraphMarginalEfficiency.ql b/python/ql/src/analysis/CallGraphMarginalEfficiency.ql index 394bf379eeb..f2e931c411c 100644 --- a/python/ql/src/analysis/CallGraphMarginalEfficiency.ql +++ b/python/ql/src/analysis/CallGraphMarginalEfficiency.ql @@ -4,8 +4,7 @@ */ import python -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo from int total_facts, int total_size, int depth, float efficiency where diff --git a/python/ql/src/analysis/ContextEfficiency.ql b/python/ql/src/analysis/ContextEfficiency.ql index 205091ba1e3..76ca78fc867 100644 --- a/python/ql/src/analysis/ContextEfficiency.ql +++ b/python/ql/src/analysis/ContextEfficiency.ql @@ -4,8 +4,7 @@ */ import python -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo from int total_facts, int total_size, int depth, float efficiency where diff --git a/python/ql/src/analysis/ContextMarginalEfficiency.ql b/python/ql/src/analysis/ContextMarginalEfficiency.ql index 755ccad683c..c87de8c6ebe 100644 --- a/python/ql/src/analysis/ContextMarginalEfficiency.ql +++ b/python/ql/src/analysis/ContextMarginalEfficiency.ql @@ -4,8 +4,7 @@ */ import python -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo int depth(ControlFlowNode f, Object value, ClassObject cls) { exists(PointsToContext ctx | diff --git a/python/ql/src/analysis/CrossProjectDefinitions.qll b/python/ql/src/analysis/CrossProjectDefinitions.qll index 84fd8215712..64b30f566f1 100644 --- a/python/ql/src/analysis/CrossProjectDefinitions.qll +++ b/python/ql/src/analysis/CrossProjectDefinitions.qll @@ -3,7 +3,7 @@ */ import python -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo private newtype TSymbol = TModule(Module m) or diff --git a/python/ql/src/analysis/Efficiency.ql b/python/ql/src/analysis/Efficiency.ql index 37cb5c97387..d8ed85f2a2b 100644 --- a/python/ql/src/analysis/Efficiency.ql +++ b/python/ql/src/analysis/Efficiency.ql @@ -5,8 +5,6 @@ import python private import LegacyPointsTo -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext predicate trivial(ControlFlowNode f) { f.getNode() instanceof Parameter diff --git a/python/ql/src/analysis/FailedInference.ql b/python/ql/src/analysis/FailedInference.ql index 192cf696fbf..feae8fdc5ee 100644 --- a/python/ql/src/analysis/FailedInference.ql +++ b/python/ql/src/analysis/FailedInference.ql @@ -1,5 +1,5 @@ import python -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo from ClassValue cls, string reason where Types::failedInference(cls, reason) diff --git a/python/ql/src/analysis/KeyPointsToFailure.ql b/python/ql/src/analysis/KeyPointsToFailure.ql index d869d547c75..f07e8638f38 100644 --- a/python/ql/src/analysis/KeyPointsToFailure.ql +++ b/python/ql/src/analysis/KeyPointsToFailure.ql @@ -1,5 +1,5 @@ /** - * @name Key points-to fails for expression. + * @name Key points-to fails for expression * @description Expression does not "point-to" an object which prevents further points-to analysis. * @kind problem * @problem.severity info diff --git a/python/ql/src/analysis/PointsToFailure.ql b/python/ql/src/analysis/PointsToFailure.ql index 7b9a2ac0659..fee1e80d2f7 100644 --- a/python/ql/src/analysis/PointsToFailure.ql +++ b/python/ql/src/analysis/PointsToFailure.ql @@ -1,5 +1,5 @@ /** - * @name points-to fails for expression. + * @name points-to fails for expression * @description Expression does not "point-to" an object which prevents type inference. * @kind problem * @id py/points-to-failure diff --git a/python/ql/src/analysis/Summary.ql b/python/ql/src/analysis/Summary.ql index 630f4e2678b..bad5070a9ef 100644 --- a/python/ql/src/analysis/Summary.ql +++ b/python/ql/src/analysis/Summary.ql @@ -3,6 +3,7 @@ */ import python +private import LegacyPointsTo from string key, string value where diff --git a/python/ql/src/analysis/TypeHierarchyFailure.ql b/python/ql/src/analysis/TypeHierarchyFailure.ql index c4c91005743..c6ad4be9822 100644 --- a/python/ql/src/analysis/TypeHierarchyFailure.ql +++ b/python/ql/src/analysis/TypeHierarchyFailure.ql @@ -8,6 +8,7 @@ */ import python +private import LegacyPointsTo from Class cls, string reason where exists(ClassObject c | c.getPyClass() = cls | c.failedInference(reason)) diff --git a/python/ql/src/change-notes/2025-10-22-adjust-query-severity.md b/python/ql/src/change-notes/2025-10-22-adjust-query-severity.md deleted file mode 100644 index bc314358a6f..00000000000 --- a/python/ql/src/change-notes/2025-10-22-adjust-query-severity.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: queryMetadata ---- -* Reduced the `security-severity` score of the `py/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. \ No newline at end of file diff --git a/python/ql/src/change-notes/released/1.7.0.md b/python/ql/src/change-notes/released/1.7.0.md new file mode 100644 index 00000000000..92850b2e464 --- /dev/null +++ b/python/ql/src/change-notes/released/1.7.0.md @@ -0,0 +1,5 @@ +## 1.7.0 + +### Query Metadata Changes + +* Reduced the `security-severity` score of the `py/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. diff --git a/python/ql/src/change-notes/released/1.7.1.md b/python/ql/src/change-notes/released/1.7.1.md new file mode 100644 index 00000000000..5c9570fd0c3 --- /dev/null +++ b/python/ql/src/change-notes/released/1.7.1.md @@ -0,0 +1,3 @@ +## 1.7.1 + +No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.7.2.md b/python/ql/src/change-notes/released/1.7.2.md new file mode 100644 index 00000000000..b950385c16d --- /dev/null +++ b/python/ql/src/change-notes/released/1.7.2.md @@ -0,0 +1,3 @@ +## 1.7.2 + +No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.7.3.md b/python/ql/src/change-notes/released/1.7.3.md new file mode 100644 index 00000000000..a629082e215 --- /dev/null +++ b/python/ql/src/change-notes/released/1.7.3.md @@ -0,0 +1,3 @@ +## 1.7.3 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index fbc11aa62b7..9f9661b1e77 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.8 +lastReleaseVersion: 1.7.3 diff --git a/python/ql/src/experimental/Security/CWE-094/Js2Py.ql b/python/ql/src/experimental/Security/CWE-094/Js2Py.ql index 53c919d9732..2ed3c37da37 100644 --- a/python/ql/src/experimental/Security/CWE-094/Js2Py.ql +++ b/python/ql/src/experimental/Security/CWE-094/Js2Py.ql @@ -1,5 +1,5 @@ /** - * @name JavaScript code execution. + * @name JavaScript code execution * @description Passing user supplied arguments to a Javascript to Python translation engine such as Js2Py can lead to remote code execution. * @problem.severity error * @security-severity 9.3 diff --git a/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql b/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql index a0fadbff3f3..fdbda943921 100644 --- a/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql +++ b/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql @@ -1,5 +1,5 @@ /** - * @name Unsafe usage of v1 version of Azure Storage client-side encryption. + * @name Unsafe usage of v1 version of Azure Storage client-side encryption * @description Using version v1 of Azure Storage client-side encryption is insecure, and may enable an attacker to decrypt encrypted data * @kind path-problem * @tags security diff --git a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFAlgorithm.ql b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFAlgorithm.ql index 0f30571385a..c3dde29952d 100644 --- a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFAlgorithm.ql +++ b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFAlgorithm.ql @@ -1,5 +1,5 @@ /** - * @name Weak KDF algorithm. + * @name Weak KDF algorithm * @description Approved KDF algorithms must one of the following * ["PBKDF2" , "PBKDF2HMAC", "KBKDF", "KBKDFHMAC", "CONCATKDF", "CONCATKDFHASH"] * @assumption The value being used to derive a key (either a key or a password) is correct for the algorithm (i.e., a key is used for KBKDF and a password for PBKDF). diff --git a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFKeyLength.ql b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFKeyLength.ql index a7c83f9e62e..6a5a48a4fe5 100644 --- a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFKeyLength.ql +++ b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFKeyLength.ql @@ -1,5 +1,5 @@ /** - * @name Small KDF derived key length. + * @name Small KDF derived key length * @description KDF derived keys should be a minimum of 128 bits (16 bytes). * @assumption If the key length is not explicitly provided (e.g., it is None or otherwise not specified) assumes the length is derived from the hash length. * @kind problem diff --git a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltGen.ql b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltGen.ql index 9d312583912..4d3cd7b1dfd 100644 --- a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltGen.ql +++ b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltGen.ql @@ -1,5 +1,5 @@ /** - * @name Weak KDF salt generation. + * @name Weak KDF salt generation * @description KDF salts must be generated by an approved random number generator (os.urandom) * @kind problem * @id py/kdf-weak-salt-gen diff --git a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltSize.ql b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltSize.ql index 54f72de0594..7477391a738 100644 --- a/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltSize.ql +++ b/python/ql/src/experimental/cryptography/example_alerts/WeakKDFSaltSize.ql @@ -1,5 +1,5 @@ /** - * @name Small KDF salt length. + * @name Small KDF salt length * @description KDF salts should be a minimum of 128 bits (16 bytes). * * This alerts if a constant traces to to a salt length sink less than 128-bits or diff --git a/python/ql/src/meta/alerts/RemoteFlowSourcesReach.ql b/python/ql/src/meta/alerts/RemoteFlowSourcesReach.ql index 7921121fb3a..d6d91a888d4 100644 --- a/python/ql/src/meta/alerts/RemoteFlowSourcesReach.ql +++ b/python/ql/src/meta/alerts/RemoteFlowSourcesReach.ql @@ -38,5 +38,5 @@ module RemoteFlowSourceReachConfig implements DataFlow::ConfigSig { module RemoteFlowSourceReachFlow = TaintTracking::Global; from DataFlow::Node reachable -where RemoteFlowSourceReachFlow::flow(_, reachable) +where RemoteFlowSourceReachFlow::flowTo(reachable) select reachable, prettyNode(reachable) diff --git a/python/ql/src/meta/analysis-quality/CallGraphQuality.qll b/python/ql/src/meta/analysis-quality/CallGraphQuality.qll index a8e7a3b340a..679b39ddc8d 100644 --- a/python/ql/src/meta/analysis-quality/CallGraphQuality.qll +++ b/python/ql/src/meta/analysis-quality/CallGraphQuality.qll @@ -5,6 +5,7 @@ import python import meta.MetaMetrics +private import LegacyPointsTo newtype TTarget = TFunction(Function func) or diff --git a/python/ql/src/meta/debug/DebugStats.ql b/python/ql/src/meta/debug/DebugStats.ql index 5ebbe963943..03ecaae27e2 100644 --- a/python/ql/src/meta/debug/DebugStats.ql +++ b/python/ql/src/meta/debug/DebugStats.ql @@ -1,15 +1,15 @@ import python +private import LegacyPointsTo from string msg, int cnt, int sort where sort = 0 and msg = "Lines of code in DB" and - cnt = sum(Module m | | m.getMetrics().getNumberOfLinesOfCode()) + cnt = sum(ModuleMetrics m | | m.getNumberOfLinesOfCode()) or sort = 1 and msg = "Lines of code in repo" and - cnt = - sum(Module m | exists(m.getFile().getRelativePath()) | m.getMetrics().getNumberOfLinesOfCode()) + cnt = sum(ModuleMetrics m | exists(m.getFile().getRelativePath()) | m.getNumberOfLinesOfCode()) or sort = 2 and msg = "Files" and diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 7280bbcb67c..cc3a6b25740 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.6.9-dev +version: 1.7.4-dev groups: - python - queries diff --git a/python/ql/test/2/extractor-tests/import_depth/test.ql b/python/ql/test/2/extractor-tests/import_depth/test.ql index ef626455fad..4f007e99468 100644 --- a/python/ql/test/2/extractor-tests/import_depth/test.ql +++ b/python/ql/test/2/extractor-tests/import_depth/test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m /* Exclude the builtins module as it has a different name under 2 and 3. */ diff --git a/python/ql/test/2/extractor-tests/normalise/Numbers.ql b/python/ql/test/2/extractor-tests/normalise/Numbers.ql index 2a770600279..9447141ab6a 100644 --- a/python/ql/test/2/extractor-tests/normalise/Numbers.ql +++ b/python/ql/test/2/extractor-tests/normalise/Numbers.ql @@ -7,10 +7,11 @@ */ import python +private import LegacyPointsTo from NumericObject n where - exists(IntegerLiteral i | i.getLiteralObject() = n | + exists(IntegerLiteral i | getLiteralObject(i) = n | i.getEnclosingModule().getFile().getShortName() = "test.py" ) select n.toString(), n.repr() diff --git a/python/ql/test/2/extractor-tests/object_hash/Success.ql b/python/ql/test/2/extractor-tests/object_hash/Success.ql index 9cff9ee4b73..55e38e56b93 100644 --- a/python/ql/test/2/extractor-tests/object_hash/Success.ql +++ b/python/ql/test/2/extractor-tests/object_hash/Success.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo where exists(theSysModuleObject()) select 1 diff --git a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.ql b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.ql index 620944de5b9..a8bc92db331 100644 --- a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.ql +++ b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.ql @@ -1,5 +1,6 @@ import python +private import LegacyPointsTo -from ExceptFlowNode ex, Value val +from ExceptFlowNodeWithPointsTo ex, Value val where ex.handledException(val, _, _) select ex.getLocation().getStartLine(), ex.toString(), val.toString() diff --git a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.ql b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.ql index 56498054f51..b773a172ee3 100644 --- a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.ql +++ b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r select r.getLocation().getStartLine(), r.toString(), r.getARaisedType().toString() diff --git a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Likely.ql b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Likely.ql index f8e4a4b7dac..00cf5a7d2af 100644 --- a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Likely.ql +++ b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Likely.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ControlFlowNode r, ControlFlowNode s where diff --git a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.ql b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.ql index 29bad86bf0f..fe0fa6b0158 100644 --- a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.ql +++ b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r where r.raisesUnknownType() diff --git a/python/ql/test/2/library-tests/PointsTo/import_time/Pruned.ql b/python/ql/test/2/library-tests/PointsTo/import_time/Pruned.ql index e77849860c7..ba8df441caf 100644 --- a/python/ql/test/2/library-tests/PointsTo/import_time/Pruned.ql +++ b/python/ql/test/2/library-tests/PointsTo/import_time/Pruned.ql @@ -1,6 +1,5 @@ import python -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo from ControlFlowNode f, Location l, Context c where diff --git a/python/ql/test/2/library-tests/PointsTo/metaclass/test.ql b/python/ql/test/2/library-tests/PointsTo/metaclass/test.ql index 68eec976105..0644e4cdf74 100644 --- a/python/ql/test/2/library-tests/PointsTo/metaclass/test.ql +++ b/python/ql/test/2/library-tests/PointsTo/metaclass/test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls where not cls.isC() diff --git a/python/ql/test/2/library-tests/classes/attr/class_attr.ql b/python/ql/test/2/library-tests/classes/attr/class_attr.ql index 197ab1a1e5e..1c9c5513a1d 100644 --- a/python/ql/test/2/library-tests/classes/attr/class_attr.ql +++ b/python/ql/test/2/library-tests/classes/attr/class_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name, Object obj where diff --git a/python/ql/test/2/library-tests/classes/attr/class_has_attr.ql b/python/ql/test/2/library-tests/classes/attr/class_has_attr.ql index be8272d1bd6..24724f4d859 100644 --- a/python/ql/test/2/library-tests/classes/attr/class_has_attr.ql +++ b/python/ql/test/2/library-tests/classes/attr/class_has_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name where diff --git a/python/ql/test/2/library-tests/classes/attr/list_attr.ql b/python/ql/test/2/library-tests/classes/attr/list_attr.ql index c38694d5883..ad708711df4 100644 --- a/python/ql/test/2/library-tests/classes/attr/list_attr.ql +++ b/python/ql/test/2/library-tests/classes/attr/list_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, string name, Object what where diff --git a/python/ql/test/2/library-tests/classes/mro/mro.ql b/python/ql/test/2/library-tests/classes/mro/mro.ql index 0c4cf077adb..6a4d21921a1 100644 --- a/python/ql/test/2/library-tests/classes/mro/mro.ql +++ b/python/ql/test/2/library-tests/classes/mro/mro.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, ClassObject l, ClassObject r where diff --git a/python/ql/test/2/library-tests/modules/general/moduleobject_test.ql b/python/ql/test/2/library-tests/modules/general/moduleobject_test.ql index 50f79a57aed..27394e03096 100644 --- a/python/ql/test/2/library-tests/modules/general/moduleobject_test.ql +++ b/python/ql/test/2/library-tests/modules/general/moduleobject_test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where m.getName() = "package" or m.getName() = "confused_elements" diff --git a/python/ql/test/2/library-tests/modules/package_members/module_attributes.ql b/python/ql/test/2/library-tests/modules/package_members/module_attributes.ql index 6c16450f313..f7755b92e12 100644 --- a/python/ql/test/2/library-tests/modules/package_members/module_attributes.ql +++ b/python/ql/test/2/library-tests/modules/package_members/module_attributes.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where not m.isC() diff --git a/python/ql/test/2/library-tests/modules/package_members/module_exports.ql b/python/ql/test/2/library-tests/modules/package_members/module_exports.ql index bcfc0c60bfb..d04ef3bc9f3 100644 --- a/python/ql/test/2/library-tests/modules/package_members/module_exports.ql +++ b/python/ql/test/2/library-tests/modules/package_members/module_exports.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where not m.isC() and m.exports(name) diff --git a/python/ql/test/2/library-tests/modules/package_members/module_import_as.ql b/python/ql/test/2/library-tests/modules/package_members/module_import_as.ql index 50ded7b4124..97cc2e86665 100644 --- a/python/ql/test/2/library-tests/modules/package_members/module_import_as.ql +++ b/python/ql/test/2/library-tests/modules/package_members/module_import_as.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where not m.isC() and m.importedAs(name) diff --git a/python/ql/test/2/library-tests/modules/usage/ModuleUsage.ql b/python/ql/test/2/library-tests/modules/usage/ModuleUsage.ql index 5f776e2374e..0469f804ab3 100644 --- a/python/ql/test/2/library-tests/modules/usage/ModuleUsage.ql +++ b/python/ql/test/2/library-tests/modules/usage/ModuleUsage.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleValue mv, string usage where diff --git a/python/ql/test/2/library-tests/objects/Literals.ql b/python/ql/test/2/library-tests/objects/Literals.ql index a7f10b358ff..d5aee013f25 100644 --- a/python/ql/test/2/library-tests/objects/Literals.ql +++ b/python/ql/test/2/library-tests/objects/Literals.ql @@ -1,5 +1,6 @@ /* Test that there are no literals that do not have a corresponding object. */ import python +private import LegacyPointsTo string repr(Expr e) { result = e.(Num).getN() or @@ -8,5 +9,5 @@ string repr(Expr e) { } from ImmutableLiteral l -where not exists(l.getLiteralObject()) +where not exists(getLiteralObject(l)) select l.getLocation().getStartLine(), repr(l) diff --git a/python/ql/test/2/library-tests/types/classes/mro_test.ql b/python/ql/test/2/library-tests/types/classes/mro_test.ql index fa2ac44d4d2..8d68b5b08fe 100644 --- a/python/ql/test/2/library-tests/types/classes/mro_test.ql +++ b/python/ql/test/2/library-tests/types/classes/mro_test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls where not cls.isC() diff --git a/python/ql/test/2/library-tests/types/classes/new_style.ql b/python/ql/test/2/library-tests/types/classes/new_style.ql index 2af40565329..fdd8fac80a8 100644 --- a/python/ql/test/2/library-tests/types/classes/new_style.ql +++ b/python/ql/test/2/library-tests/types/classes/new_style.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string style where diff --git a/python/ql/test/2/library-tests/types/exceptions/ExitRaises.ql b/python/ql/test/2/library-tests/types/exceptions/ExitRaises.ql index 415db290a05..5bf1ae1da00 100644 --- a/python/ql/test/2/library-tests/types/exceptions/ExitRaises.ql +++ b/python/ql/test/2/library-tests/types/exceptions/ExitRaises.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r, Scope s, ClassObject cls where r.viableExceptionalExit_objectapi(s, cls) diff --git a/python/ql/test/2/library-tests/types/exceptions/Raises.ql b/python/ql/test/2/library-tests/types/exceptions/Raises.ql index 2415c707967..e4f9a6664d5 100644 --- a/python/ql/test/2/library-tests/types/exceptions/Raises.ql +++ b/python/ql/test/2/library-tests/types/exceptions/Raises.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PyFunctionObject f, string type where diff --git a/python/ql/test/2/library-tests/types/functions/Calls.ql b/python/ql/test/2/library-tests/types/functions/Calls.ql index 6fc188753e5..5eaeb4559b0 100644 --- a/python/ql/test/2/library-tests/types/functions/Calls.ql +++ b/python/ql/test/2/library-tests/types/functions/Calls.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from FunctionObject func, ControlFlowNode call where func.getACall() = call diff --git a/python/ql/test/2/library-tests/types/functions/Never.ql b/python/ql/test/2/library-tests/types/functions/Never.ql index 1e43ead7dce..932121d058e 100644 --- a/python/ql/test/2/library-tests/types/functions/Never.ql +++ b/python/ql/test/2/library-tests/types/functions/Never.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from FunctionObject func where func.neverReturns() diff --git a/python/ql/test/2/library-tests/types/functions/ReturnTypes.ql b/python/ql/test/2/library-tests/types/functions/ReturnTypes.ql index beb955e1188..d35deea34bf 100644 --- a/python/ql/test/2/library-tests/types/functions/ReturnTypes.ql +++ b/python/ql/test/2/library-tests/types/functions/ReturnTypes.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PyFunctionObject func, ClassObject ret_type where func.getAnInferredReturnType() = ret_type diff --git a/python/ql/test/2/library-tests/types/properties/BuiltinProperties.ql b/python/ql/test/2/library-tests/types/properties/BuiltinProperties.ql index 24766db9f2e..9ab0b5e4bbd 100644 --- a/python/ql/test/2/library-tests/types/properties/BuiltinProperties.ql +++ b/python/ql/test/2/library-tests/types/properties/BuiltinProperties.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string name, BuiltinPropertyObject p where diff --git a/python/ql/test/3/extractor-tests/import_depth/test.ql b/python/ql/test/3/extractor-tests/import_depth/test.ql index ef626455fad..4f007e99468 100644 --- a/python/ql/test/3/extractor-tests/import_depth/test.ql +++ b/python/ql/test/3/extractor-tests/import_depth/test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m /* Exclude the builtins module as it has a different name under 2 and 3. */ diff --git a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.ql b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.ql index 620944de5b9..a8bc92db331 100644 --- a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.ql +++ b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.ql @@ -1,5 +1,6 @@ import python +private import LegacyPointsTo -from ExceptFlowNode ex, Value val +from ExceptFlowNodeWithPointsTo ex, Value val where ex.handledException(val, _, _) select ex.getLocation().getStartLine(), ex.toString(), val.toString() diff --git a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.ql b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.ql index 56498054f51..b773a172ee3 100644 --- a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.ql +++ b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r select r.getLocation().getStartLine(), r.toString(), r.getARaisedType().toString() diff --git a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Likely.ql b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Likely.ql index f8e4a4b7dac..00cf5a7d2af 100644 --- a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Likely.ql +++ b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Likely.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ControlFlowNode r, ControlFlowNode s where diff --git a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.ql b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.ql index 29bad86bf0f..fe0fa6b0158 100644 --- a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.ql +++ b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r where r.raisesUnknownType() diff --git a/python/ql/test/3/library-tests/PointsTo/consts/BooleanConstants.ql b/python/ql/test/3/library-tests/PointsTo/consts/BooleanConstants.ql index 4299e11d660..242fb5bc781 100644 --- a/python/ql/test/3/library-tests/PointsTo/consts/BooleanConstants.ql +++ b/python/ql/test/3/library-tests/PointsTo/consts/BooleanConstants.ql @@ -1,5 +1,5 @@ import python -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo from ControlFlowNode f, Context c, boolean b where diff --git a/python/ql/test/3/library-tests/PointsTo/inheritance/Calls.ql b/python/ql/test/3/library-tests/PointsTo/inheritance/Calls.ql index f91d207fc70..3f111d6e08a 100644 --- a/python/ql/test/3/library-tests/PointsTo/inheritance/Calls.ql +++ b/python/ql/test/3/library-tests/PointsTo/inheritance/Calls.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from Call c, FunctionObject f where f.getACall().getNode() = c diff --git a/python/ql/test/3/library-tests/PointsTo/metaclass/test.ql b/python/ql/test/3/library-tests/PointsTo/metaclass/test.ql index 68eec976105..0644e4cdf74 100644 --- a/python/ql/test/3/library-tests/PointsTo/metaclass/test.ql +++ b/python/ql/test/3/library-tests/PointsTo/metaclass/test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls where not cls.isC() diff --git a/python/ql/test/3/library-tests/PointsTo/regressions/subprocess-assert/ClassValue.ql b/python/ql/test/3/library-tests/PointsTo/regressions/subprocess-assert/ClassValue.ql index bc666b4f206..479ae6e5965 100644 --- a/python/ql/test/3/library-tests/PointsTo/regressions/subprocess-assert/ClassValue.ql +++ b/python/ql/test/3/library-tests/PointsTo/regressions/subprocess-assert/ClassValue.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo // as used in semmle.python.filters.Tests from ClassValue c, string base diff --git a/python/ql/test/3/library-tests/classes/attr/class_attr.ql b/python/ql/test/3/library-tests/classes/attr/class_attr.ql index 197ab1a1e5e..1c9c5513a1d 100644 --- a/python/ql/test/3/library-tests/classes/attr/class_attr.ql +++ b/python/ql/test/3/library-tests/classes/attr/class_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name, Object obj where diff --git a/python/ql/test/3/library-tests/classes/attr/class_has_attr.ql b/python/ql/test/3/library-tests/classes/attr/class_has_attr.ql index be8272d1bd6..24724f4d859 100644 --- a/python/ql/test/3/library-tests/classes/attr/class_has_attr.ql +++ b/python/ql/test/3/library-tests/classes/attr/class_has_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name where diff --git a/python/ql/test/3/library-tests/classes/meta/meta_obj.ql b/python/ql/test/3/library-tests/classes/meta/meta_obj.ql index e85127a9305..af46400ce00 100644 --- a/python/ql/test/3/library-tests/classes/meta/meta_obj.ql +++ b/python/ql/test/3/library-tests/classes/meta/meta_obj.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls where not cls.isC() diff --git a/python/ql/test/3/library-tests/classes/mro/mro.ql b/python/ql/test/3/library-tests/classes/mro/mro.ql index 576d6a75afd..86934f52c11 100644 --- a/python/ql/test/3/library-tests/classes/mro/mro.ql +++ b/python/ql/test/3/library-tests/classes/mro/mro.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, ClassObject l, ClassObject r where diff --git a/python/ql/test/3/library-tests/classes/mro/mro_index.ql b/python/ql/test/3/library-tests/classes/mro/mro_index.ql index da40776044e..6a65d27b716 100644 --- a/python/ql/test/3/library-tests/classes/mro/mro_index.ql +++ b/python/ql/test/3/library-tests/classes/mro/mro_index.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, ClassObject sup, int index where diff --git a/python/ql/test/3/library-tests/modules/general/moduleobject_test.ql b/python/ql/test/3/library-tests/modules/general/moduleobject_test.ql index a3a1ac6b185..db5b72e4dc4 100644 --- a/python/ql/test/3/library-tests/modules/general/moduleobject_test.ql +++ b/python/ql/test/3/library-tests/modules/general/moduleobject_test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where not m.isC() and not m.getName() = "__future__" diff --git a/python/ql/test/3/library-tests/modules/package_members/module_attributes.ql b/python/ql/test/3/library-tests/modules/package_members/module_attributes.ql index 6c16450f313..f7755b92e12 100644 --- a/python/ql/test/3/library-tests/modules/package_members/module_attributes.ql +++ b/python/ql/test/3/library-tests/modules/package_members/module_attributes.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where not m.isC() diff --git a/python/ql/test/3/library-tests/modules/package_members/module_exports.ql b/python/ql/test/3/library-tests/modules/package_members/module_exports.ql index bcfc0c60bfb..d04ef3bc9f3 100644 --- a/python/ql/test/3/library-tests/modules/package_members/module_exports.ql +++ b/python/ql/test/3/library-tests/modules/package_members/module_exports.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where not m.isC() and m.exports(name) diff --git a/python/ql/test/3/library-tests/modules/package_members/module_import_as.ql b/python/ql/test/3/library-tests/modules/package_members/module_import_as.ql index 50ded7b4124..97cc2e86665 100644 --- a/python/ql/test/3/library-tests/modules/package_members/module_import_as.ql +++ b/python/ql/test/3/library-tests/modules/package_members/module_import_as.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleObject m, string name where not m.isC() and m.importedAs(name) diff --git a/python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql index 5f776e2374e..0469f804ab3 100644 --- a/python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql +++ b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleValue mv, string usage where diff --git a/python/ql/test/3/library-tests/types/classes/mro_test.ql b/python/ql/test/3/library-tests/types/classes/mro_test.ql index 04b65ae2bef..4dc9bc153a2 100644 --- a/python/ql/test/3/library-tests/types/classes/mro_test.ql +++ b/python/ql/test/3/library-tests/types/classes/mro_test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, ClassObject sup where not cls.isC() diff --git a/python/ql/test/3/library-tests/types/exceptions/Raises.ql b/python/ql/test/3/library-tests/types/exceptions/Raises.ql index 2415c707967..e4f9a6664d5 100644 --- a/python/ql/test/3/library-tests/types/exceptions/Raises.ql +++ b/python/ql/test/3/library-tests/types/exceptions/Raises.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PyFunctionObject f, string type where diff --git a/python/ql/test/3/library-tests/types/exceptions/Viable.ql b/python/ql/test/3/library-tests/types/exceptions/Viable.ql index bf00a0675d6..589e2630bb9 100644 --- a/python/ql/test/3/library-tests/types/exceptions/Viable.ql +++ b/python/ql/test/3/library-tests/types/exceptions/Viable.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r, ControlFlowNode n, ClassObject ex where r.viableExceptionEdge_objectapi(n, ex) diff --git a/python/ql/test/3/library-tests/types/functions/Calls.ql b/python/ql/test/3/library-tests/types/functions/Calls.ql index 6fc188753e5..5eaeb4559b0 100644 --- a/python/ql/test/3/library-tests/types/functions/Calls.ql +++ b/python/ql/test/3/library-tests/types/functions/Calls.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from FunctionObject func, ControlFlowNode call where func.getACall() = call diff --git a/python/ql/test/3/library-tests/types/functions/Never.ql b/python/ql/test/3/library-tests/types/functions/Never.ql index 1e43ead7dce..932121d058e 100644 --- a/python/ql/test/3/library-tests/types/functions/Never.ql +++ b/python/ql/test/3/library-tests/types/functions/Never.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from FunctionObject func where func.neverReturns() diff --git a/python/ql/test/3/library-tests/types/functions/ReturnTypes.ql b/python/ql/test/3/library-tests/types/functions/ReturnTypes.ql index beb955e1188..d35deea34bf 100644 --- a/python/ql/test/3/library-tests/types/functions/ReturnTypes.ql +++ b/python/ql/test/3/library-tests/types/functions/ReturnTypes.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PyFunctionObject func, ClassObject ret_type where func.getAnInferredReturnType() = ret_type diff --git a/python/ql/test/3/library-tests/types/namespaces/NameSpace.ql b/python/ql/test/3/library-tests/types/namespaces/NameSpace.ql index 38241e8fabc..f41d977d47b 100644 --- a/python/ql/test/3/library-tests/types/namespaces/NameSpace.ql +++ b/python/ql/test/3/library-tests/types/namespaces/NameSpace.ql @@ -6,6 +6,7 @@ */ import python +private import LegacyPointsTo from Scope s, string name, Object val where diff --git a/python/ql/test/3/library-tests/types/properties/BuiltinProperties.ql b/python/ql/test/3/library-tests/types/properties/BuiltinProperties.ql index 24766db9f2e..9ab0b5e4bbd 100644 --- a/python/ql/test/3/library-tests/types/properties/BuiltinProperties.ql +++ b/python/ql/test/3/library-tests/types/properties/BuiltinProperties.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string name, BuiltinPropertyObject p where diff --git a/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.ql b/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.ql index 1771727dbbc..5cdbd9e6a4e 100644 --- a/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.ql +++ b/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.ql @@ -1,6 +1,7 @@ import python import utils.test.InlineExpectationsTest private import semmle.python.dataflow.new.internal.DataFlowDispatch as TT +private import LegacyPointsTo /** Holds when `call` is resolved to `callable` using points-to based call-graph. */ predicate pointsToCallEdge(CallNode call, Function callable) { diff --git a/python/ql/test/experimental/query-tests/Security/CWE-409/DecompressionBombs.expected b/python/ql/test/experimental/query-tests/Security/CWE-409/DecompressionBombs.expected index 12d1b8282c7..87b07df086f 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-409/DecompressionBombs.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-409/DecompressionBombs.expected @@ -1,23 +1,23 @@ edges | test.py:10:16:10:24 | ControlFlowNode for file_path | test.py:11:21:11:29 | ControlFlowNode for file_path | provenance | | | test.py:11:5:11:35 | ControlFlowNode for Attribute() | test.py:11:5:11:52 | ControlFlowNode for Attribute() | provenance | Config | -| test.py:11:21:11:29 | ControlFlowNode for file_path | test.py:11:5:11:35 | ControlFlowNode for Attribute() | provenance | MaD:85 | +| test.py:11:21:11:29 | ControlFlowNode for file_path | test.py:11:5:11:35 | ControlFlowNode for Attribute() | provenance | MaD:86 | | test.py:11:21:11:29 | ControlFlowNode for file_path | test.py:11:5:11:52 | ControlFlowNode for Attribute() | provenance | Config | | test.py:11:21:11:29 | ControlFlowNode for file_path | test.py:12:21:12:29 | ControlFlowNode for file_path | provenance | | | test.py:12:5:12:35 | ControlFlowNode for Attribute() | test.py:12:5:12:48 | ControlFlowNode for Attribute() | provenance | Config | -| test.py:12:21:12:29 | ControlFlowNode for file_path | test.py:12:5:12:35 | ControlFlowNode for Attribute() | provenance | MaD:85 | +| test.py:12:21:12:29 | ControlFlowNode for file_path | test.py:12:5:12:35 | ControlFlowNode for Attribute() | provenance | MaD:86 | | test.py:12:21:12:29 | ControlFlowNode for file_path | test.py:12:5:12:48 | ControlFlowNode for Attribute() | provenance | Config | | test.py:12:21:12:29 | ControlFlowNode for file_path | test.py:14:26:14:34 | ControlFlowNode for file_path | provenance | | | test.py:14:10:14:35 | ControlFlowNode for Attribute() | test.py:15:14:15:29 | ControlFlowNode for Attribute() | provenance | Config | -| test.py:14:26:14:34 | ControlFlowNode for file_path | test.py:14:10:14:35 | ControlFlowNode for Attribute() | provenance | MaD:85 | +| test.py:14:26:14:34 | ControlFlowNode for file_path | test.py:14:10:14:35 | ControlFlowNode for Attribute() | provenance | MaD:86 | | test.py:14:26:14:34 | ControlFlowNode for file_path | test.py:15:14:15:29 | ControlFlowNode for Attribute() | provenance | Config | | test.py:14:26:14:34 | ControlFlowNode for file_path | test.py:18:26:18:34 | ControlFlowNode for file_path | provenance | | | test.py:18:10:18:35 | ControlFlowNode for Attribute() | test.py:19:14:19:39 | ControlFlowNode for Attribute() | provenance | Config | -| test.py:18:26:18:34 | ControlFlowNode for file_path | test.py:18:10:18:35 | ControlFlowNode for Attribute() | provenance | MaD:85 | +| test.py:18:26:18:34 | ControlFlowNode for file_path | test.py:18:10:18:35 | ControlFlowNode for Attribute() | provenance | MaD:86 | | test.py:18:26:18:34 | ControlFlowNode for file_path | test.py:19:14:19:39 | ControlFlowNode for Attribute() | provenance | Config | | test.py:18:26:18:34 | ControlFlowNode for file_path | test.py:22:21:22:29 | ControlFlowNode for file_path | provenance | | | test.py:22:5:22:30 | ControlFlowNode for Attribute() | test.py:22:5:22:60 | ControlFlowNode for Attribute() | provenance | Config | -| test.py:22:21:22:29 | ControlFlowNode for file_path | test.py:22:5:22:30 | ControlFlowNode for Attribute() | provenance | MaD:85 | +| test.py:22:21:22:29 | ControlFlowNode for file_path | test.py:22:5:22:30 | ControlFlowNode for Attribute() | provenance | MaD:86 | | test.py:22:21:22:29 | ControlFlowNode for file_path | test.py:22:5:22:60 | ControlFlowNode for Attribute() | provenance | Config | | test.py:22:21:22:29 | ControlFlowNode for file_path | test.py:24:18:24:26 | ControlFlowNode for file_path | provenance | | | test.py:24:18:24:26 | ControlFlowNode for file_path | test.py:24:5:24:52 | ControlFlowNode for Attribute() | provenance | Config | diff --git a/python/ql/test/extractor-tests/double-import/ModuleNames.ql b/python/ql/test/extractor-tests/double-import/ModuleNames.ql index 54aa78e23a3..6d25cf91f70 100644 --- a/python/ql/test/extractor-tests/double-import/ModuleNames.ql +++ b/python/ql/test/extractor-tests/double-import/ModuleNames.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from Container path, string name where exists(ModuleValue m | m.getPath() = path and m.getName() = name) diff --git a/python/ql/test/extractor-tests/unicode_decoding/test.ql b/python/ql/test/extractor-tests/unicode_decoding/test.ql index b2d51b10d22..4e0937a07c4 100644 --- a/python/ql/test/extractor-tests/unicode_decoding/test.ql +++ b/python/ql/test/extractor-tests/unicode_decoding/test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from Object o, string s where diff --git a/python/ql/test/library-tests/ControlFlow/general/Comments.ql b/python/ql/test/library-tests/ControlFlow/general/Comments.ql index 71d00f1a8d4..7fe0545c795 100644 --- a/python/ql/test/library-tests/ControlFlow/general/Comments.ql +++ b/python/ql/test/library-tests/ControlFlow/general/Comments.ql @@ -1,5 +1,6 @@ import python +private import LegacyPointsTo -from Module m, int n -where n = m.getMetrics().getNumberOfLinesOfComments() +from ModuleMetrics m, int n +where n = m.getNumberOfLinesOfComments() select m.toString(), n diff --git a/python/ql/test/library-tests/ControlFlow/general/Cyclo.ql b/python/ql/test/library-tests/ControlFlow/general/Cyclo.ql index fb801a29002..a36375b7f3d 100644 --- a/python/ql/test/library-tests/ControlFlow/general/Cyclo.ql +++ b/python/ql/test/library-tests/ControlFlow/general/Cyclo.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo -from Function func -select func.toString(), func.getMetrics().getCyclomaticComplexity() +from FunctionMetrics func +select func.toString(), func.getCyclomaticComplexity() diff --git a/python/ql/test/library-tests/ControlFlow/general/Lines.ql b/python/ql/test/library-tests/ControlFlow/general/Lines.ql index ca6e7715538..2e861691fbb 100644 --- a/python/ql/test/library-tests/ControlFlow/general/Lines.ql +++ b/python/ql/test/library-tests/ControlFlow/general/Lines.ql @@ -1,8 +1,9 @@ import python +private import LegacyPointsTo from Scope s, int n where - exists(Function f | f = s | n = f.getMetrics().getNumberOfLines()) + exists(FunctionMetrics f | f = s | n = f.getNumberOfLines()) or - exists(Module m | m = s | n = m.getMetrics().getNumberOfLines()) + exists(ModuleMetrics m | m = s | n = m.getNumberOfLines()) select s.toString(), n diff --git a/python/ql/test/library-tests/ControlFlow/ssa/undefined/test.ql b/python/ql/test/library-tests/ControlFlow/ssa/undefined/test.ql index 41b08ec0591..c161c5d3f5e 100644 --- a/python/ql/test/library-tests/ControlFlow/ssa/undefined/test.ql +++ b/python/ql/test/library-tests/ControlFlow/ssa/undefined/test.ql @@ -1,5 +1,6 @@ import python +private import LegacyPointsTo -from SsaVariable var +from SsaVariableWithPointsTo var where var.maybeUndefined() select var.getDefinition().getLocation().getStartLine(), var.toString() diff --git a/python/ql/test/library-tests/PointsTo/api/ClassValue.ql b/python/ql/test/library-tests/PointsTo/api/ClassValue.ql index 230cc487ea4..65a4c73d4a6 100644 --- a/python/ql/test/library-tests/PointsTo/api/ClassValue.ql +++ b/python/ql/test/library-tests/PointsTo/api/ClassValue.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassValue cls, string description where diff --git a/python/ql/test/library-tests/PointsTo/api/Constants.ql b/python/ql/test/library-tests/PointsTo/api/Constants.ql index 151f6b9ce9c..a6072a1d8e8 100644 --- a/python/ql/test/library-tests/PointsTo/api/Constants.ql +++ b/python/ql/test/library-tests/PointsTo/api/Constants.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from string txt, Value val where diff --git a/python/ql/test/library-tests/PointsTo/api/QualifedNames.ql b/python/ql/test/library-tests/PointsTo/api/QualifedNames.ql index daafad0492b..c756265295b 100644 --- a/python/ql/test/library-tests/PointsTo/api/QualifedNames.ql +++ b/python/ql/test/library-tests/PointsTo/api/QualifedNames.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from FunctionValue v, string name where diff --git a/python/ql/test/library-tests/PointsTo/api/Value.ql b/python/ql/test/library-tests/PointsTo/api/Value.ql index 9c6e0739461..fadf008f6ea 100644 --- a/python/ql/test/library-tests/PointsTo/api/Value.ql +++ b/python/ql/test/library-tests/PointsTo/api/Value.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from Value val, string name where diff --git a/python/ql/test/library-tests/PointsTo/calls/GetACall.ql b/python/ql/test/library-tests/PointsTo/calls/GetACall.ql index 84f2ab4fb4a..8c6cc76c031 100644 --- a/python/ql/test/library-tests/PointsTo/calls/GetACall.ql +++ b/python/ql/test/library-tests/PointsTo/calls/GetACall.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ControlFlowNode call, Value func where call = func.getACall() diff --git a/python/ql/test/library-tests/PointsTo/calls/getArgumentForCall.ql b/python/ql/test/library-tests/PointsTo/calls/getArgumentForCall.ql index 7c76b9e0ce5..d388f96783c 100644 --- a/python/ql/test/library-tests/PointsTo/calls/getArgumentForCall.ql +++ b/python/ql/test/library-tests/PointsTo/calls/getArgumentForCall.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from CallNode call, CallableValue callable, int i select call.getLocation().getStartLine(), call.toString(), callable.toString(), i, diff --git a/python/ql/test/library-tests/PointsTo/calls/getNamedArgumentForCall.ql b/python/ql/test/library-tests/PointsTo/calls/getNamedArgumentForCall.ql index 4cb3fbdf335..7fa39194deb 100644 --- a/python/ql/test/library-tests/PointsTo/calls/getNamedArgumentForCall.ql +++ b/python/ql/test/library-tests/PointsTo/calls/getNamedArgumentForCall.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from CallNode call, CallableValue callable, string name select call.getLocation().getStartLine(), call.toString(), callable.toString(), name, diff --git a/python/ql/test/library-tests/PointsTo/calls/getParameter.ql b/python/ql/test/library-tests/PointsTo/calls/getParameter.ql index 07f12cce36f..1cabfeb45bc 100644 --- a/python/ql/test/library-tests/PointsTo/calls/getParameter.ql +++ b/python/ql/test/library-tests/PointsTo/calls/getParameter.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from CallableValue callable, int i select callable.toString(), i, callable.getParameter(i).toString() diff --git a/python/ql/test/library-tests/PointsTo/calls/getParameterByName.ql b/python/ql/test/library-tests/PointsTo/calls/getParameterByName.ql index d4766b680f7..20c4c77f121 100644 --- a/python/ql/test/library-tests/PointsTo/calls/getParameterByName.ql +++ b/python/ql/test/library-tests/PointsTo/calls/getParameterByName.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from CallableValue callable, string name select callable.toString(), name, callable.getParameterByName(name).toString() diff --git a/python/ql/test/library-tests/PointsTo/decorators/Values.ql b/python/ql/test/library-tests/PointsTo/decorators/Values.ql index fc7a08db20b..fe4b6d080f4 100644 --- a/python/ql/test/library-tests/PointsTo/decorators/Values.ql +++ b/python/ql/test/library-tests/PointsTo/decorators/Values.ql @@ -1,6 +1,5 @@ import python -import semmle.python.pointsto.PointsTo -import semmle.python.objects.ObjectInternal +private import LegacyPointsTo from NameNode f, Context ctx, ObjectInternal v where diff --git a/python/ql/test/library-tests/PointsTo/functions/Calls.ql b/python/ql/test/library-tests/PointsTo/functions/Calls.ql index 5bc29b5aaf3..659ba4143f6 100644 --- a/python/ql/test/library-tests/PointsTo/functions/Calls.ql +++ b/python/ql/test/library-tests/PointsTo/functions/Calls.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from CallNode call, FunctionObject func, string kind where diff --git a/python/ql/test/library-tests/PointsTo/functions/NeverReturns.ql b/python/ql/test/library-tests/PointsTo/functions/NeverReturns.ql index c576651a8e6..0a20f8e1b1f 100644 --- a/python/ql/test/library-tests/PointsTo/functions/NeverReturns.ql +++ b/python/ql/test/library-tests/PointsTo/functions/NeverReturns.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from FunctionObject f where f.neverReturns() diff --git a/python/ql/test/library-tests/PointsTo/functions/test.ql b/python/ql/test/library-tests/PointsTo/functions/test.ql index f85e95f5fe4..01f8416c8dc 100644 --- a/python/ql/test/library-tests/PointsTo/functions/test.ql +++ b/python/ql/test/library-tests/PointsTo/functions/test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from Call c, FunctionObject f where diff --git a/python/ql/test/library-tests/PointsTo/general/GlobalPointsTo.ql b/python/ql/test/library-tests/PointsTo/general/GlobalPointsTo.ql index e90674bab2e..a0b7e8979f3 100644 --- a/python/ql/test/library-tests/PointsTo/general/GlobalPointsTo.ql +++ b/python/ql/test/library-tests/PointsTo/general/GlobalPointsTo.ql @@ -1,5 +1,6 @@ import python private import LegacyPointsTo +private import semmle.python.types.ImportTime import interesting from int line, ControlFlowNodeWithPointsTo f, Object o, ImportTimeScope n diff --git a/python/ql/test/library-tests/PointsTo/general/Util.qll b/python/ql/test/library-tests/PointsTo/general/Util.qll index 1c26d7d830b..289e71a9e6c 100644 --- a/python/ql/test/library-tests/PointsTo/general/Util.qll +++ b/python/ql/test/library-tests/PointsTo/general/Util.qll @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo string repr(Object o) { not o instanceof StringObject and not o = theBoundMethodType() and result = o.toString() diff --git a/python/ql/test/library-tests/PointsTo/global/Global.ql b/python/ql/test/library-tests/PointsTo/global/Global.ql index f9f52b12641..4dc6d16d379 100644 --- a/python/ql/test/library-tests/PointsTo/global/Global.ql +++ b/python/ql/test/library-tests/PointsTo/global/Global.ql @@ -1,7 +1,5 @@ import python -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext -import semmle.python.objects.ObjectInternal +private import LegacyPointsTo from ControlFlowNode f, PointsToContext ctx, Value obj, ControlFlowNode orig where diff --git a/python/ql/test/library-tests/PointsTo/inheritance/BaseTypes.ql b/python/ql/test/library-tests/PointsTo/inheritance/BaseTypes.ql index f1201eba0dc..01f69d8bb12 100644 --- a/python/ql/test/library-tests/PointsTo/inheritance/BaseTypes.ql +++ b/python/ql/test/library-tests/PointsTo/inheritance/BaseTypes.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, ClassObject base, int n where diff --git a/python/ql/test/library-tests/PointsTo/inheritance/Calls.ql b/python/ql/test/library-tests/PointsTo/inheritance/Calls.ql index f91d207fc70..3f111d6e08a 100644 --- a/python/ql/test/library-tests/PointsTo/inheritance/Calls.ql +++ b/python/ql/test/library-tests/PointsTo/inheritance/Calls.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from Call c, FunctionObject f where f.getACall().getNode() = c diff --git a/python/ql/test/library-tests/PointsTo/inheritance/Declares.ql b/python/ql/test/library-tests/PointsTo/inheritance/Declares.ql index a2c762be860..2fe61ca2d7f 100644 --- a/python/ql/test/library-tests/PointsTo/inheritance/Declares.ql +++ b/python/ql/test/library-tests/PointsTo/inheritance/Declares.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string name where class_declares_attribute(cls, name) diff --git a/python/ql/test/library-tests/PointsTo/inheritance/MetaClass.ql b/python/ql/test/library-tests/PointsTo/inheritance/MetaClass.ql index 0ca90782119..a487c16e953 100644 --- a/python/ql/test/library-tests/PointsTo/inheritance/MetaClass.ql +++ b/python/ql/test/library-tests/PointsTo/inheritance/MetaClass.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, ClassObject meta where diff --git a/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.ql b/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.ql index 338ea118ac1..c3156eb1fa0 100644 --- a/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.ql +++ b/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, ClassObject sup where diff --git a/python/ql/test/library-tests/PointsTo/metaclass/Failed.ql b/python/ql/test/library-tests/PointsTo/metaclass/Failed.ql index a5d2afd4241..4129c99666b 100644 --- a/python/ql/test/library-tests/PointsTo/metaclass/Failed.ql +++ b/python/ql/test/library-tests/PointsTo/metaclass/Failed.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string reason where diff --git a/python/ql/test/library-tests/PointsTo/metaclass/Style.ql b/python/ql/test/library-tests/PointsTo/metaclass/Style.ql index f29ba3a8b7c..7ab5b4a329f 100644 --- a/python/ql/test/library-tests/PointsTo/metaclass/Style.ql +++ b/python/ql/test/library-tests/PointsTo/metaclass/Style.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string style where diff --git a/python/ql/test/library-tests/PointsTo/metaclass/test.ql b/python/ql/test/library-tests/PointsTo/metaclass/test.ql index d08f4e37fa6..471c01599d6 100644 --- a/python/ql/test/library-tests/PointsTo/metaclass/test.ql +++ b/python/ql/test/library-tests/PointsTo/metaclass/test.ql @@ -1,5 +1,5 @@ import python -private import semmle.python.objects.ObjectInternal +private import LegacyPointsTo /** An unknown type. Not usually visible. */ class UnknownType extends UnknownClassInternal { diff --git a/python/ql/test/library-tests/PointsTo/new/Call.ql b/python/ql/test/library-tests/PointsTo/new/Call.ql index f014001f315..e924398ca40 100644 --- a/python/ql/test/library-tests/PointsTo/new/Call.ql +++ b/python/ql/test/library-tests/PointsTo/new/Call.ql @@ -1,5 +1,6 @@ import python import Util +private import LegacyPointsTo from ControlFlowNode call, FunctionObject func where call = func.getACall() diff --git a/python/ql/test/library-tests/PointsTo/new/ClassMethod.ql b/python/ql/test/library-tests/PointsTo/new/ClassMethod.ql index 17f73420e05..9eac6e3fea2 100644 --- a/python/ql/test/library-tests/PointsTo/new/ClassMethod.ql +++ b/python/ql/test/library-tests/PointsTo/new/ClassMethod.ql @@ -1,5 +1,6 @@ import python import Util +private import LegacyPointsTo from ClassMethodObject cm, CallNode call where call = cm.getACall() diff --git a/python/ql/test/library-tests/PointsTo/new/NameSpace.ql b/python/ql/test/library-tests/PointsTo/new/NameSpace.ql index 5d099f78b61..6150b94aee1 100644 --- a/python/ql/test/library-tests/PointsTo/new/NameSpace.ql +++ b/python/ql/test/library-tests/PointsTo/new/NameSpace.ql @@ -1,5 +1,6 @@ import python import Util +private import LegacyPointsTo from Scope s, string name, Object val where diff --git a/python/ql/test/library-tests/PointsTo/new/PointsToMissing.ql b/python/ql/test/library-tests/PointsTo/new/PointsToMissing.ql index 9e744591df2..271f35db996 100644 --- a/python/ql/test/library-tests/PointsTo/new/PointsToMissing.ql +++ b/python/ql/test/library-tests/PointsTo/new/PointsToMissing.ql @@ -1,6 +1,6 @@ import python import Util -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo /* This test should return _no_ results. */ predicate relevant_node(ControlFlowNode n) { diff --git a/python/ql/test/library-tests/PointsTo/new/PointsToUnknown.ql b/python/ql/test/library-tests/PointsTo/new/PointsToUnknown.ql index cb91e18dafe..2526819b76a 100644 --- a/python/ql/test/library-tests/PointsTo/new/PointsToUnknown.ql +++ b/python/ql/test/library-tests/PointsTo/new/PointsToUnknown.ql @@ -1,6 +1,6 @@ import python import Util -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo from ControlFlowNode f, ControlFlowNode x where PointsTo::pointsTo(f, _, ObjectInternal::unknown(), x) diff --git a/python/ql/test/library-tests/PointsTo/new/PointsToWithContext.ql b/python/ql/test/library-tests/PointsTo/new/PointsToWithContext.ql index dbed1a9a7f6..bad7589d0a2 100644 --- a/python/ql/test/library-tests/PointsTo/new/PointsToWithContext.ql +++ b/python/ql/test/library-tests/PointsTo/new/PointsToWithContext.ql @@ -1,7 +1,6 @@ import python import Util -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo from ControlFlowNode f, Object o, ClassObject c, ControlFlowNode x, PointsToContext ctx where PointsTo::points_to(f, ctx, o, c, x) diff --git a/python/ql/test/library-tests/PointsTo/new/PointsToWithType.ql b/python/ql/test/library-tests/PointsTo/new/PointsToWithType.ql index 5747ce18fd5..20a23abced7 100644 --- a/python/ql/test/library-tests/PointsTo/new/PointsToWithType.ql +++ b/python/ql/test/library-tests/PointsTo/new/PointsToWithType.ql @@ -1,6 +1,6 @@ import python import Util -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo from ControlFlowNode f, Object o, ClassObject c, ControlFlowNode x where PointsTo::points_to(f, _, o, c, x) diff --git a/python/ql/test/library-tests/PointsTo/new/Reachable.ql b/python/ql/test/library-tests/PointsTo/new/Reachable.ql index f8b2f0585eb..2376f13c752 100644 --- a/python/ql/test/library-tests/PointsTo/new/Reachable.ql +++ b/python/ql/test/library-tests/PointsTo/new/Reachable.ql @@ -1,5 +1,5 @@ import python -private import semmle.python.pointsto.PointsTo +private import LegacyPointsTo import Util from ControlFlowNode f, Context ctx diff --git a/python/ql/test/library-tests/PointsTo/new/SSA.ql b/python/ql/test/library-tests/PointsTo/new/SSA.ql index 7b41f3c427e..c919e1d4856 100644 --- a/python/ql/test/library-tests/PointsTo/new/SSA.ql +++ b/python/ql/test/library-tests/PointsTo/new/SSA.ql @@ -1,6 +1,5 @@ import python -private import semmle.python.pointsto.PointsTo -private import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo import Util predicate ssa_variable_points_to( diff --git a/python/ql/test/library-tests/PointsTo/new/SourceEdgeDefinitions.ql b/python/ql/test/library-tests/PointsTo/new/SourceEdgeDefinitions.ql index 8cf0b4c15a6..117afe8100e 100644 --- a/python/ql/test/library-tests/PointsTo/new/SourceEdgeDefinitions.ql +++ b/python/ql/test/library-tests/PointsTo/new/SourceEdgeDefinitions.ql @@ -1,5 +1,4 @@ import python -import semmle.python.pointsto.PointsTo import Util from SsaSourceVariable var, ControlFlowNode use, BasicBlock pred diff --git a/python/ql/test/library-tests/PointsTo/new/SourceNodeDefinitions.ql b/python/ql/test/library-tests/PointsTo/new/SourceNodeDefinitions.ql index 77f6ab0923b..2c5867f9c4f 100644 --- a/python/ql/test/library-tests/PointsTo/new/SourceNodeDefinitions.ql +++ b/python/ql/test/library-tests/PointsTo/new/SourceNodeDefinitions.ql @@ -1,5 +1,4 @@ import python -import semmle.python.pointsto.PointsTo import Util from SsaSourceVariable var, ControlFlowNode defn, string kind diff --git a/python/ql/test/library-tests/PointsTo/new/SsaAttr.ql b/python/ql/test/library-tests/PointsTo/new/SsaAttr.ql index 67d85c2e3bd..c9b136f0c02 100644 --- a/python/ql/test/library-tests/PointsTo/new/SsaAttr.ql +++ b/python/ql/test/library-tests/PointsTo/new/SsaAttr.ql @@ -1,6 +1,5 @@ import python -private import semmle.python.pointsto.PointsTo -private import semmle.python.objects.ObjectInternal +private import LegacyPointsTo import Util from EssaVariable var, string name, ObjectInternal o, Context ctx diff --git a/python/ql/test/library-tests/PointsTo/new/SsaUses.ql b/python/ql/test/library-tests/PointsTo/new/SsaUses.ql index 2a8e8f1e750..9a250b6610f 100644 --- a/python/ql/test/library-tests/PointsTo/new/SsaUses.ql +++ b/python/ql/test/library-tests/PointsTo/new/SsaUses.ql @@ -1,5 +1,4 @@ import python -import semmle.python.pointsto.PointsTo import Util from EssaVariable var, ControlFlowNode use diff --git a/python/ql/test/library-tests/PointsTo/new/TestEvaluate.ql b/python/ql/test/library-tests/PointsTo/new/TestEvaluate.ql index d473e4e804a..1132f04df07 100644 --- a/python/ql/test/library-tests/PointsTo/new/TestEvaluate.ql +++ b/python/ql/test/library-tests/PointsTo/new/TestEvaluate.ql @@ -1,6 +1,5 @@ import python -import semmle.python.pointsto.PointsTo -import semmle.python.pointsto.PointsToContext +private import LegacyPointsTo import Util from diff --git a/python/ql/test/library-tests/PointsTo/new/Util.qll b/python/ql/test/library-tests/PointsTo/new/Util.qll index b83ad89d1c8..23c5aa8df7c 100644 --- a/python/ql/test/library-tests/PointsTo/new/Util.qll +++ b/python/ql/test/library-tests/PointsTo/new/Util.qll @@ -1,5 +1,5 @@ import python -import semmle.python.objects.ObjectInternal +private import LegacyPointsTo bindingset[which] string locate(Location l, string which) { diff --git a/python/ql/test/library-tests/PointsTo/new/VarUses.ql b/python/ql/test/library-tests/PointsTo/new/VarUses.ql index 58de54d7a3d..50b07d03be0 100644 --- a/python/ql/test/library-tests/PointsTo/new/VarUses.ql +++ b/python/ql/test/library-tests/PointsTo/new/VarUses.ql @@ -1,5 +1,5 @@ import python -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo import Util from SsaSourceVariable var, ControlFlowNode use diff --git a/python/ql/test/library-tests/PointsTo/regressions/missing/metaclass/getACall.ql b/python/ql/test/library-tests/PointsTo/regressions/missing/metaclass/getACall.ql index e555c927d6a..5ca3c9518d6 100644 --- a/python/ql/test/library-tests/PointsTo/regressions/missing/metaclass/getACall.ql +++ b/python/ql/test/library-tests/PointsTo/regressions/missing/metaclass/getACall.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PythonFunctionValue func select func, func.getACall() diff --git a/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/LocalModuleWithRef.ql b/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/LocalModuleWithRef.ql index 5bdb99415b2..f6bc97bf1f0 100644 --- a/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/LocalModuleWithRef.ql +++ b/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/LocalModuleWithRef.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleValue mv, ControlFlowNode ref, string local_external where diff --git a/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/ModuleWithLocalRef.ql b/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/ModuleWithLocalRef.ql index 030211ba0bf..1422d5731fd 100644 --- a/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/ModuleWithLocalRef.ql +++ b/python/ql/test/library-tests/PointsTo/regressions/wrong/module-imports/conflict-stdlib/ModuleWithLocalRef.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ModuleValue mv, ControlFlowNode ref, string in_stdlib, string local_external, string is_missing where diff --git a/python/ql/test/library-tests/PointsTo/returns/Test.ql b/python/ql/test/library-tests/PointsTo/returns/Test.ql index 8546de90f24..928e4c9672f 100644 --- a/python/ql/test/library-tests/PointsTo/returns/Test.ql +++ b/python/ql/test/library-tests/PointsTo/returns/Test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PyFunctionObject f select f.toString(), f.getAnInferredReturnType().toString() diff --git a/python/ql/test/library-tests/PointsTo/subclass/Checks.ql b/python/ql/test/library-tests/PointsTo/subclass/Checks.ql index a82002b1d5f..f9deaabbc88 100644 --- a/python/ql/test/library-tests/PointsTo/subclass/Checks.ql +++ b/python/ql/test/library-tests/PointsTo/subclass/Checks.ql @@ -1,5 +1,5 @@ import python -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo from Value sup, Value cls where Expressions::requireSubClass(cls, sup) diff --git a/python/ql/test/library-tests/attributes/SelfAttribute.ql b/python/ql/test/library-tests/attributes/SelfAttribute.ql index 66993121241..79ceff3a08a 100644 --- a/python/ql/test/library-tests/attributes/SelfAttribute.ql +++ b/python/ql/test/library-tests/attributes/SelfAttribute.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from SelfAttributeRead sa, int line, string g, string l where diff --git a/python/ql/test/library-tests/classes/abstract/Abstract.ql b/python/ql/test/library-tests/classes/abstract/Abstract.ql index bd2f98034cb..02c76421126 100644 --- a/python/ql/test/library-tests/classes/abstract/Abstract.ql +++ b/python/ql/test/library-tests/classes/abstract/Abstract.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string abstract where diff --git a/python/ql/test/library-tests/classes/attr/class_attr.ql b/python/ql/test/library-tests/classes/attr/class_attr.ql index 197ab1a1e5e..1c9c5513a1d 100644 --- a/python/ql/test/library-tests/classes/attr/class_attr.ql +++ b/python/ql/test/library-tests/classes/attr/class_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name, Object obj where diff --git a/python/ql/test/library-tests/classes/attr/class_defined_attr.ql b/python/ql/test/library-tests/classes/attr/class_defined_attr.ql index d7583e689c4..4fc6f7b67d2 100644 --- a/python/ql/test/library-tests/classes/attr/class_defined_attr.ql +++ b/python/ql/test/library-tests/classes/attr/class_defined_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name, Object obj where diff --git a/python/ql/test/library-tests/classes/attr/class_defines_attr.ql b/python/ql/test/library-tests/classes/attr/class_defines_attr.ql index 6b266a0d40f..71dee836a9f 100644 --- a/python/ql/test/library-tests/classes/attr/class_defines_attr.ql +++ b/python/ql/test/library-tests/classes/attr/class_defines_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name where diff --git a/python/ql/test/library-tests/classes/attr/class_has_attr.ql b/python/ql/test/library-tests/classes/attr/class_has_attr.ql index be8272d1bd6..24724f4d859 100644 --- a/python/ql/test/library-tests/classes/attr/class_has_attr.ql +++ b/python/ql/test/library-tests/classes/attr/class_has_attr.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, string name where diff --git a/python/ql/test/library-tests/classes/attr/hash.ql b/python/ql/test/library-tests/classes/attr/hash.ql index 19ac8933f69..3708e62ccdd 100644 --- a/python/ql/test/library-tests/classes/attr/hash.ql +++ b/python/ql/test/library-tests/classes/attr/hash.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, int line, Object obj where diff --git a/python/ql/test/library-tests/classes/mro/C3.ql b/python/ql/test/library-tests/classes/mro/C3.ql index 981a55893c2..60b4b0c1e1b 100644 --- a/python/ql/test/library-tests/classes/mro/C3.ql +++ b/python/ql/test/library-tests/classes/mro/C3.ql @@ -1,5 +1,6 @@ import python import semmle.python.pointsto.MRO +private import LegacyPointsTo from ClassValue cls where not cls.isBuiltin() diff --git a/python/ql/test/library-tests/dependencies/Dependencies.ql b/python/ql/test/library-tests/dependencies/Dependencies.ql index 12378a567d2..6f0f6cb3bb7 100644 --- a/python/ql/test/library-tests/dependencies/Dependencies.ql +++ b/python/ql/test/library-tests/dependencies/Dependencies.ql @@ -1,5 +1,6 @@ import python import semmle.python.dependencies.Dependencies +private import LegacyPointsTo from DependencyKind dk, AstNode src, Object target where dk.isADependency(src, target) diff --git a/python/ql/test/library-tests/descriptors/Descriptors.ql b/python/ql/test/library-tests/descriptors/Descriptors.ql index e577d47b421..7a0f196f3f6 100644 --- a/python/ql/test/library-tests/descriptors/Descriptors.ql +++ b/python/ql/test/library-tests/descriptors/Descriptors.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string kind where diff --git a/python/ql/test/library-tests/descriptors/Methods.ql b/python/ql/test/library-tests/descriptors/Methods.ql index 3761ec5f7b5..49c8a3bbbff 100644 --- a/python/ql/test/library-tests/descriptors/Methods.ql +++ b/python/ql/test/library-tests/descriptors/Methods.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo int lineof(Object o) { result = o.getOrigin().getLocation().getStartLine() } diff --git a/python/ql/test/library-tests/descriptors/Properties.ql b/python/ql/test/library-tests/descriptors/Properties.ql index 29f9e2577a0..349d0a242f9 100644 --- a/python/ql/test/library-tests/descriptors/Properties.ql +++ b/python/ql/test/library-tests/descriptors/Properties.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PropertyValue p, string method_name, FunctionValue method where diff --git a/python/ql/test/library-tests/exceptions/Handles.ql b/python/ql/test/library-tests/exceptions/Handles.ql index 620944de5b9..a8bc92db331 100644 --- a/python/ql/test/library-tests/exceptions/Handles.ql +++ b/python/ql/test/library-tests/exceptions/Handles.ql @@ -1,5 +1,6 @@ import python +private import LegacyPointsTo -from ExceptFlowNode ex, Value val +from ExceptFlowNodeWithPointsTo ex, Value val where ex.handledException(val, _, _) select ex.getLocation().getStartLine(), ex.toString(), val.toString() diff --git a/python/ql/test/library-tests/exceptions/Legal.ql b/python/ql/test/library-tests/exceptions/Legal.ql index bfe47717d23..5b10854c1e1 100644 --- a/python/ql/test/library-tests/exceptions/Legal.ql +++ b/python/ql/test/library-tests/exceptions/Legal.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string legal where diff --git a/python/ql/test/library-tests/frameworks/socketio/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/socketio/ConceptsTest.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/library-tests/frameworks/socketio/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/socketio/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/socketio/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/socketio/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/socketio/InlineTaintTest.expected new file mode 100644 index 00000000000..020c338fd19 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/socketio/InlineTaintTest.expected @@ -0,0 +1,3 @@ +argumentToEnsureNotTaintedNotMarkedAsSpurious +untaintedArgumentToEnsureTaintedNotMarkedAsMissing +testFailures diff --git a/python/ql/test/library-tests/frameworks/socketio/InlineTaintTest.ql b/python/ql/test/library-tests/frameworks/socketio/InlineTaintTest.ql new file mode 100644 index 00000000000..8524da5fe7d --- /dev/null +++ b/python/ql/test/library-tests/frameworks/socketio/InlineTaintTest.ql @@ -0,0 +1,2 @@ +import experimental.meta.InlineTaintTest +import MakeInlineTaintTest diff --git a/python/ql/test/library-tests/frameworks/socketio/taint_test.py b/python/ql/test/library-tests/frameworks/socketio/taint_test.py new file mode 100644 index 00000000000..07d109aa9a2 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/socketio/taint_test.py @@ -0,0 +1,69 @@ +import sys +import socketio + +def ensure_tainted(*args): + print("tainted", args) + +def ensure_not_tainted(*args): + print("not tainted", args) + +sio = socketio.Server() + +@sio.event +def connect(sid, environ, auth): # $ requestHandler routedParameter=environ routedParameter=auth + ensure_not_tainted(sid) + ensure_tainted(environ, # $ tainted + auth) # $ tainted + +@sio.event +def event1(sid, data): # $ requestHandler routedParameter=data + ensure_not_tainted(sid) + ensure_tainted(data) # $ tainted + res = sio.call("e1", sid=sid) + ensure_tainted(res) # $ tainted + sio.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + sio.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + +class MyNamespace(socketio.Namespace): + def on_event2(self, sid, data): # $ requestHandler routedParameter=data + ensure_not_tainted(self, sid) + ensure_tainted(data) # $ tainted + res = self.call("e1", sid=sid) + ensure_tainted(res) # $ tainted + self.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + self.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + +sio.register_namespace(MyNamespace("/ns")) + +asio = socketio.AsyncServer(async_mode='asgi') + +@asio.event +async def event3(sid, data): # $ requestHandler routedParameter=data + ensure_not_tainted(sid) + ensure_tainted(data) # $ tainted + res = await asio.call("e1", sid=sid) + ensure_tainted(res) # $ tainted + await asio.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + await asio.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + +class MyAsyncNamespace(socketio.AsyncNamespace): + async def on_event4(self, sid, data): # $ requestHandler routedParameter=data + ensure_not_tainted(self, sid) + ensure_tainted(data) # $ tainted + res = await self.call("e1", sid=sid) + ensure_tainted(res) # $ tainted + await self.emit("e2", "hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + await self.send("hi", to=sid, callback=lambda x: ensure_tainted(x)) # $ tainted $ requestHandler routedParameter=x + +asio.register_namespace(MyAsyncNamespace("/ns")) + +if __name__ == "__main__": + + if "--async" in sys.argv: # $ threatModelSource[commandargs]=sys.argv + import uvicorn + app = socketio.ASGIApp(asio) + uvicorn.run(app, host='127.0.0.1', port=8000) + else: + import eventlet + app = socketio.WSGIApp(sio) + eventlet.wsgi.server(eventlet.listen(('', 8000)), app) \ No newline at end of file diff --git a/python/ql/test/library-tests/frameworks/socketio/test.py b/python/ql/test/library-tests/frameworks/socketio/test.py new file mode 100644 index 00000000000..f603edd3111 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/socketio/test.py @@ -0,0 +1,29 @@ +import socketio + +sio = socketio.Server() + +@sio.on("connect") +def connect(sid, environ, auth): # $ requestHandler routedParameter=environ routedParameter=auth + print("connect", sid, environ, auth) + +@sio.on("event1") +def handle(sid, data): # $ requestHandler routedParameter=data + print("e1", sid, data) + +@sio.event +def event2(sid, data): # $ requestHandler routedParameter=data + print("e2", sid, data) + +def event3(sid, data): # $ requestHandler routedParameter=data + print("e3", sid, data) + +sio.on("event3", handler=event3) + +sio.on("event4", lambda sid,data: print("e4", sid, data)) # $ requestHandler routedParameter=data + + + +if __name__ == "__main__": + app = socketio.WSGIApp(sio) + import eventlet + eventlet.wsgi.server(eventlet.listen(('', 8000)), app) \ No newline at end of file diff --git a/python/ql/test/library-tests/frameworks/tornado/routing_test.py b/python/ql/test/library-tests/frameworks/tornado/routing_test.py index 2b596c20ce5..1cff63921da 100644 --- a/python/ql/test/library-tests/frameworks/tornado/routing_test.py +++ b/python/ql/test/library-tests/frameworks/tornado/routing_test.py @@ -1,5 +1,6 @@ import tornado.web import tornado.routing +import tornado.websocket class FooHandler(tornado.web.RequestHandler): @@ -54,6 +55,26 @@ class PossiblyNotRouted(tornado.web.RequestHandler): def get(self): # $ requestHandler self.write("NotRouted") # $ HttpResponse +class WebSocket(tornado.websocket.WebSocketHandler): + def open(self, x): # $ requestHandler routedParameter=x + self.write_message("WebSocket open {}".format(x)) # $ MISSING: HttpResponse + + def on_message(self, data): # $ requestHandler routedParameter=data + self.write_message("WebSocket on_message {}".format(data)) # $ MISSING: HttpResponse + + def on_ping(self, data): # $ requestHandler routedParameter=data + print("ping", data) + + def on_pong(self, data): # $ requestHandler routedParameter=data + print("pong", data) + + def select_subprotocol(self, subs): # $ requestHandler routedParameter=subs + print("select_subprotocol", subs) + + def check_origin(self, origin): # $ requestHandler routedParameter=origin + print("check_origin", origin) + return True + def make_app(): # see https://www.tornadoweb.org/en/stable/routing.html for even more examples @@ -74,6 +95,7 @@ def make_app(): (tornado.routing.HostMatches(r"(localhost|127\.0\.0\.1)"), [ ("/only-localhost", OnlyLocalhost) # $ routeSetup="/only-localhost" ]), + (r"/websocket/([0-9]+)", WebSocket), # $ routeSetup="/websocket/([0-9]+)" ], debug=True, diff --git a/python/ql/test/library-tests/modules/duplicate_name/Modules.ql b/python/ql/test/library-tests/modules/duplicate_name/Modules.ql index a6477c7d6af..af3df6f6eca 100644 --- a/python/ql/test/library-tests/modules/duplicate_name/Modules.ql +++ b/python/ql/test/library-tests/modules/duplicate_name/Modules.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from string name, int mcnt where mcnt = strictcount(Module m | m.getName() = name) and mcnt > 1 diff --git a/python/ql/test/library-tests/objects/Literals.ql b/python/ql/test/library-tests/objects/Literals.ql index a7f10b358ff..d5aee013f25 100644 --- a/python/ql/test/library-tests/objects/Literals.ql +++ b/python/ql/test/library-tests/objects/Literals.ql @@ -1,5 +1,6 @@ /* Test that there are no literals that do not have a corresponding object. */ import python +private import LegacyPointsTo string repr(Expr e) { result = e.(Num).getN() or @@ -8,5 +9,5 @@ string repr(Expr e) { } from ImmutableLiteral l -where not exists(l.getLiteralObject()) +where not exists(getLiteralObject(l)) select l.getLocation().getStartLine(), repr(l) diff --git a/python/ql/test/library-tests/objects/Name.ql b/python/ql/test/library-tests/objects/Name.ql index c274ed34554..e4bac8bba65 100644 --- a/python/ql/test/library-tests/objects/Name.ql +++ b/python/ql/test/library-tests/objects/Name.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from Object o, string name where diff --git a/python/ql/test/library-tests/overrides/FunctionOverrides.ql b/python/ql/test/library-tests/overrides/FunctionOverrides.ql index c719006665d..a30ca89d6cc 100644 --- a/python/ql/test/library-tests/overrides/FunctionOverrides.ql +++ b/python/ql/test/library-tests/overrides/FunctionOverrides.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PythonFunctionValue f, string overriding, string overridden where diff --git a/python/ql/test/library-tests/state_tracking/Test.ql b/python/ql/test/library-tests/state_tracking/Test.ql index a0a12e8615d..706dc73191a 100644 --- a/python/ql/test/library-tests/state_tracking/Test.ql +++ b/python/ql/test/library-tests/state_tracking/Test.ql @@ -1,5 +1,6 @@ import python import Lib +private import LegacyPointsTo from ControlFlowNode f, TrackableState state, Context ctx, boolean sense where diff --git a/python/ql/test/library-tests/taint/config/TaintLib.qll b/python/ql/test/library-tests/taint/config/TaintLib.qll index 35eebe8ffa6..82bc4afa72e 100644 --- a/python/ql/test/library-tests/taint/config/TaintLib.qll +++ b/python/ql/test/library-tests/taint/config/TaintLib.qll @@ -1,5 +1,6 @@ import python import semmle.python.dataflow.TaintTracking +private import LegacyPointsTo class SimpleTest extends TaintKind { SimpleTest() { this = "simple.test" } diff --git a/python/ql/test/library-tests/taint/config/TaintedArgument.ql b/python/ql/test/library-tests/taint/config/TaintedArgument.ql index b8753b3fe00..e3689bca0d8 100644 --- a/python/ql/test/library-tests/taint/config/TaintedArgument.ql +++ b/python/ql/test/library-tests/taint/config/TaintedArgument.ql @@ -2,6 +2,7 @@ import python import semmle.python.dataflow.TaintTracking import TaintLib import semmle.python.dataflow.Implementation +private import LegacyPointsTo from TaintTrackingImplementation config, TaintTrackingNode src, CallNode call, diff --git a/python/ql/test/library-tests/taint/general/ModuleAttribute.ql b/python/ql/test/library-tests/taint/general/ModuleAttribute.ql index 6a4349b4100..8da8cb5048e 100644 --- a/python/ql/test/library-tests/taint/general/ModuleAttribute.ql +++ b/python/ql/test/library-tests/taint/general/ModuleAttribute.ql @@ -1,6 +1,7 @@ import python import semmle.python.dataflow.Implementation import TaintLib +private import LegacyPointsTo from ModuleValue m, string name, TaintedNode origin, TaintTrackingImplementation impl where impl.moduleAttributeTainted(m, name, origin) diff --git a/python/ql/test/library-tests/taint/general/TaintLib.qll b/python/ql/test/library-tests/taint/general/TaintLib.qll index af3799c3b95..eb55093ad09 100644 --- a/python/ql/test/library-tests/taint/general/TaintLib.qll +++ b/python/ql/test/library-tests/taint/general/TaintLib.qll @@ -1,5 +1,6 @@ import python import semmle.python.dataflow.TaintTracking +private import LegacyPointsTo class SimpleTest extends TaintKind { SimpleTest() { this = "simple.test" } diff --git a/python/ql/test/library-tests/types/attributes/Test.ql b/python/ql/test/library-tests/types/attributes/Test.ql index 9e066a6414b..ba2e8995dc2 100644 --- a/python/ql/test/library-tests/types/attributes/Test.ql +++ b/python/ql/test/library-tests/types/attributes/Test.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, ClassObject start, string name, Object val where not name.substring(0, 2) = "__" and val = cls.lookupMro(start, name) diff --git a/python/ql/test/library-tests/types/classattr/ClassAttribute.ql b/python/ql/test/library-tests/types/classattr/ClassAttribute.ql index d0633a36e3a..fc775ebf39b 100644 --- a/python/ql/test/library-tests/types/classattr/ClassAttribute.ql +++ b/python/ql/test/library-tests/types/classattr/ClassAttribute.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, string name, string kind where diff --git a/python/ql/test/library-tests/types/classattr/ClassMember.ql b/python/ql/test/library-tests/types/classattr/ClassMember.ql index d1e136a5108..54f1d1a5b02 100644 --- a/python/ql/test/library-tests/types/classattr/ClassMember.ql +++ b/python/ql/test/library-tests/types/classattr/ClassMember.ql @@ -5,6 +5,7 @@ */ import python +private import LegacyPointsTo from ClassObject cls, string name, string kind, Object o where diff --git a/python/ql/test/library-tests/types/classattr/SpecialAttribute.ql b/python/ql/test/library-tests/types/classattr/SpecialAttribute.ql index dc21b250c1e..375e9b9880e 100644 --- a/python/ql/test/library-tests/types/classattr/SpecialAttribute.ql +++ b/python/ql/test/library-tests/types/classattr/SpecialAttribute.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls, string name, string kind, Object o where diff --git a/python/ql/test/library-tests/types/classes/FailedInference.ql b/python/ql/test/library-tests/types/classes/FailedInference.ql index 192cf696fbf..feae8fdc5ee 100644 --- a/python/ql/test/library-tests/types/classes/FailedInference.ql +++ b/python/ql/test/library-tests/types/classes/FailedInference.ql @@ -1,5 +1,5 @@ import python -import semmle.python.pointsto.PointsTo +private import LegacyPointsTo from ClassValue cls, string reason where Types::failedInference(cls, reason) diff --git a/python/ql/test/library-tests/types/classes/duplicate_base.ql b/python/ql/test/library-tests/types/classes/duplicate_base.ql index 47e975c4560..7a32b545ae0 100644 --- a/python/ql/test/library-tests/types/classes/duplicate_base.ql +++ b/python/ql/test/library-tests/types/classes/duplicate_base.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ClassObject cls where cls.hasDuplicateBases() diff --git a/python/ql/test/library-tests/types/exceptions/ExitRaises.ql b/python/ql/test/library-tests/types/exceptions/ExitRaises.ql index 32ef268332c..6ad248f6612 100644 --- a/python/ql/test/library-tests/types/exceptions/ExitRaises.ql +++ b/python/ql/test/library-tests/types/exceptions/ExitRaises.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r, Scope s, ClassObject cls where r.viableExceptionalExit_objectapi(s, cls) diff --git a/python/ql/test/library-tests/types/exceptions/Handles.ql b/python/ql/test/library-tests/types/exceptions/Handles.ql index dfdf1f9d7b2..bec8767d6c5 100644 --- a/python/ql/test/library-tests/types/exceptions/Handles.ql +++ b/python/ql/test/library-tests/types/exceptions/Handles.ql @@ -1,5 +1,6 @@ import python +private import LegacyPointsTo -from ExceptFlowNode n, ClassObject cls +from ExceptFlowNodeWithPointsTo n, ClassObject cls where n.handles_objectapi(cls) select n.getLocation().getStartLine(), cls.toString() diff --git a/python/ql/test/library-tests/types/exceptions/Impossible.ql b/python/ql/test/library-tests/types/exceptions/Impossible.ql index 787ba8898f9..acdcbb8e84f 100644 --- a/python/ql/test/library-tests/types/exceptions/Impossible.ql +++ b/python/ql/test/library-tests/types/exceptions/Impossible.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r, ControlFlowNode n, string kind where diff --git a/python/ql/test/library-tests/types/exceptions/LineRaises.ql b/python/ql/test/library-tests/types/exceptions/LineRaises.ql index de8b834e520..94b54a27198 100644 --- a/python/ql/test/library-tests/types/exceptions/LineRaises.ql +++ b/python/ql/test/library-tests/types/exceptions/LineRaises.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r, string type where diff --git a/python/ql/test/library-tests/types/exceptions/Raises.ql b/python/ql/test/library-tests/types/exceptions/Raises.ql index 2415c707967..e4f9a6664d5 100644 --- a/python/ql/test/library-tests/types/exceptions/Raises.ql +++ b/python/ql/test/library-tests/types/exceptions/Raises.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PyFunctionObject f, string type where diff --git a/python/ql/test/library-tests/types/exceptions/Reraises.ql b/python/ql/test/library-tests/types/exceptions/Reraises.ql index 699eb325f8c..8a6ade33d5a 100644 --- a/python/ql/test/library-tests/types/exceptions/Reraises.ql +++ b/python/ql/test/library-tests/types/exceptions/Reraises.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from ReraisingNode r select r.getLocation().getStartLine(), r, r.getARaisedType().toString() diff --git a/python/ql/test/library-tests/types/exceptions/Viable.ql b/python/ql/test/library-tests/types/exceptions/Viable.ql index bf00a0675d6..589e2630bb9 100644 --- a/python/ql/test/library-tests/types/exceptions/Viable.ql +++ b/python/ql/test/library-tests/types/exceptions/Viable.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from RaisingNode r, ControlFlowNode n, ClassObject ex where r.viableExceptionEdge_objectapi(n, ex) diff --git a/python/ql/test/library-tests/types/properties/Deleters.ql b/python/ql/test/library-tests/types/properties/Deleters.ql index ad99ceb387d..ed98d02b3a8 100644 --- a/python/ql/test/library-tests/types/properties/Deleters.ql +++ b/python/ql/test/library-tests/types/properties/Deleters.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PythonPropertyObject p select p.toString(), p.getDeleter().toString() diff --git a/python/ql/test/library-tests/types/properties/Getters.ql b/python/ql/test/library-tests/types/properties/Getters.ql index 5f232858696..d8c54dbda09 100644 --- a/python/ql/test/library-tests/types/properties/Getters.ql +++ b/python/ql/test/library-tests/types/properties/Getters.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PythonPropertyObject p select p.toString(), p.getGetter().toString() diff --git a/python/ql/test/library-tests/types/properties/PythonProperties.ql b/python/ql/test/library-tests/types/properties/PythonProperties.ql index 858326d6ac0..4440c6df21e 100644 --- a/python/ql/test/library-tests/types/properties/PythonProperties.ql +++ b/python/ql/test/library-tests/types/properties/PythonProperties.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PythonPropertyObject p select p.toString() diff --git a/python/ql/test/library-tests/types/properties/Setters.ql b/python/ql/test/library-tests/types/properties/Setters.ql index 871e6f9145f..5180f58552a 100644 --- a/python/ql/test/library-tests/types/properties/Setters.ql +++ b/python/ql/test/library-tests/types/properties/Setters.ql @@ -1,4 +1,5 @@ import python +private import LegacyPointsTo from PythonPropertyObject p select p.toString(), p.getSetter().toString() diff --git a/python/ql/test/query-tests/Metrics/ratios/CodeRatio.ql b/python/ql/test/query-tests/Metrics/ratios/CodeRatio.ql index 745568f2405..a5c563b1123 100644 --- a/python/ql/test/query-tests/Metrics/ratios/CodeRatio.ql +++ b/python/ql/test/query-tests/Metrics/ratios/CodeRatio.ql @@ -1,6 +1,7 @@ import python +private import LegacyPointsTo -from Module m, ModuleMetrics mm -where mm = m.getMetrics() and mm.getNumberOfLines() > 0 -select m, 100.0 * (mm.getNumberOfLinesOfCode().(float) / mm.getNumberOfLines().(float)) as ratio +from ModuleMetrics mm +where mm.getNumberOfLines() > 0 +select mm, 100.0 * (mm.getNumberOfLinesOfCode().(float) / mm.getNumberOfLines().(float)) as ratio order by ratio desc diff --git a/python/ql/test/query-tests/Security/CWE-113-HeaderInjection/Tests1/HeaderInjection.expected b/python/ql/test/query-tests/Security/CWE-113-HeaderInjection/Tests1/HeaderInjection.expected index b5f4ff549c4..cea505fe39d 100644 --- a/python/ql/test/query-tests/Security/CWE-113-HeaderInjection/Tests1/HeaderInjection.expected +++ b/python/ql/test/query-tests/Security/CWE-113-HeaderInjection/Tests1/HeaderInjection.expected @@ -11,6 +11,16 @@ edges | flask_tests.py:31:5:31:14 | ControlFlowNode for rfs_header | flask_tests.py:33:11:33:20 | ControlFlowNode for rfs_header | provenance | | | flask_tests.py:31:5:31:14 | ControlFlowNode for rfs_header | flask_tests.py:35:12:35:21 | ControlFlowNode for rfs_header | provenance | | | flask_tests.py:31:18:31:24 | ControlFlowNode for request | flask_tests.py:31:5:31:14 | ControlFlowNode for rfs_header | provenance | AdditionalTaintStep | +| http_test.py:5:16:5:19 | ControlFlowNode for self | http_test.py:6:45:6:53 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | +| http_test.py:6:9:6:19 | ControlFlowNode for parsed_path | http_test.py:7:40:7:56 | ControlFlowNode for Attribute | provenance | AdditionalTaintStep | +| http_test.py:6:23:6:54 | ControlFlowNode for Attribute() | http_test.py:6:9:6:19 | ControlFlowNode for parsed_path | provenance | | +| http_test.py:6:45:6:53 | ControlFlowNode for Attribute | http_test.py:6:23:6:54 | ControlFlowNode for Attribute() | provenance | MaD:77 | +| http_test.py:7:9:7:14 | ControlFlowNode for params | http_test.py:8:23:8:28 | ControlFlowNode for params | provenance | | +| http_test.py:7:18:7:57 | ControlFlowNode for Attribute() | http_test.py:7:9:7:14 | ControlFlowNode for params | provenance | | +| http_test.py:7:40:7:56 | ControlFlowNode for Attribute | http_test.py:7:18:7:57 | ControlFlowNode for Attribute() | provenance | MaD:76 | +| http_test.py:8:9:8:19 | ControlFlowNode for input_value | http_test.py:12:40:12:50 | ControlFlowNode for input_value | provenance | | +| http_test.py:8:23:8:28 | ControlFlowNode for params | http_test.py:8:23:8:47 | ControlFlowNode for Attribute() | provenance | dict.get | +| http_test.py:8:23:8:47 | ControlFlowNode for Attribute() | http_test.py:8:9:8:19 | ControlFlowNode for input_value | provenance | | | wsgiref_tests.py:4:14:4:20 | ControlFlowNode for environ | wsgiref_tests.py:6:5:6:10 | ControlFlowNode for h_name | provenance | | | wsgiref_tests.py:4:14:4:20 | ControlFlowNode for environ | wsgiref_tests.py:7:5:7:9 | ControlFlowNode for h_val | provenance | | | wsgiref_tests.py:6:5:6:10 | ControlFlowNode for h_name | wsgiref_tests.py:8:17:8:22 | ControlFlowNode for h_name | provenance | | @@ -28,6 +38,17 @@ nodes | flask_tests.py:31:18:31:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | flask_tests.py:33:11:33:20 | ControlFlowNode for rfs_header | semmle.label | ControlFlowNode for rfs_header | | flask_tests.py:35:12:35:21 | ControlFlowNode for rfs_header | semmle.label | ControlFlowNode for rfs_header | +| http_test.py:5:16:5:19 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | +| http_test.py:6:9:6:19 | ControlFlowNode for parsed_path | semmle.label | ControlFlowNode for parsed_path | +| http_test.py:6:23:6:54 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| http_test.py:6:45:6:53 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| http_test.py:7:9:7:14 | ControlFlowNode for params | semmle.label | ControlFlowNode for params | +| http_test.py:7:18:7:57 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| http_test.py:7:40:7:56 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| http_test.py:8:9:8:19 | ControlFlowNode for input_value | semmle.label | ControlFlowNode for input_value | +| http_test.py:8:23:8:28 | ControlFlowNode for params | semmle.label | ControlFlowNode for params | +| http_test.py:8:23:8:47 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| http_test.py:12:40:12:50 | ControlFlowNode for input_value | semmle.label | ControlFlowNode for input_value | | wsgiref_tests.py:4:14:4:20 | ControlFlowNode for environ | semmle.label | ControlFlowNode for environ | | wsgiref_tests.py:6:5:6:10 | ControlFlowNode for h_name | semmle.label | ControlFlowNode for h_name | | wsgiref_tests.py:7:5:7:9 | ControlFlowNode for h_val | semmle.label | ControlFlowNode for h_val | @@ -39,5 +60,6 @@ subpaths | flask_tests.py:20:36:20:61 | ControlFlowNode for Subscript | flask_tests.py:1:29:1:35 | ControlFlowNode for ImportMember | flask_tests.py:20:36:20:61 | ControlFlowNode for Subscript | This HTTP header is constructed from a $@. | flask_tests.py:1:29:1:35 | ControlFlowNode for ImportMember | user-provided value | | flask_tests.py:33:11:33:20 | ControlFlowNode for rfs_header | flask_tests.py:1:29:1:35 | ControlFlowNode for ImportMember | flask_tests.py:33:11:33:20 | ControlFlowNode for rfs_header | This HTTP header is constructed from a $@. | flask_tests.py:1:29:1:35 | ControlFlowNode for ImportMember | user-provided value | | flask_tests.py:35:12:35:21 | ControlFlowNode for rfs_header | flask_tests.py:1:29:1:35 | ControlFlowNode for ImportMember | flask_tests.py:35:12:35:21 | ControlFlowNode for rfs_header | This HTTP header is constructed from a $@. | flask_tests.py:1:29:1:35 | ControlFlowNode for ImportMember | user-provided value | +| http_test.py:12:40:12:50 | ControlFlowNode for input_value | http_test.py:5:16:5:19 | ControlFlowNode for self | http_test.py:12:40:12:50 | ControlFlowNode for input_value | This HTTP header is constructed from a $@. | http_test.py:5:16:5:19 | ControlFlowNode for self | user-provided value | | wsgiref_tests.py:8:17:8:22 | ControlFlowNode for h_name | wsgiref_tests.py:4:14:4:20 | ControlFlowNode for environ | wsgiref_tests.py:8:17:8:22 | ControlFlowNode for h_name | This HTTP header is constructed from a $@. | wsgiref_tests.py:4:14:4:20 | ControlFlowNode for environ | user-provided value | | wsgiref_tests.py:8:42:8:46 | ControlFlowNode for h_val | wsgiref_tests.py:4:14:4:20 | ControlFlowNode for environ | wsgiref_tests.py:8:42:8:46 | ControlFlowNode for h_val | This HTTP header is constructed from a $@. | wsgiref_tests.py:4:14:4:20 | ControlFlowNode for environ | user-provided value | diff --git a/python/ql/test/query-tests/Security/CWE-113-HeaderInjection/Tests1/http_test.py b/python/ql/test/query-tests/Security/CWE-113-HeaderInjection/Tests1/http_test.py new file mode 100644 index 00000000000..cf46219fc59 --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-113-HeaderInjection/Tests1/http_test.py @@ -0,0 +1,22 @@ +from http.server import HTTPServer, BaseHTTPRequestHandler +import urllib.parse + +class VulnerableHandler(BaseHTTPRequestHandler): + def do_GET(self): + parsed_path = urllib.parse.urlparse(self.path) + params = urllib.parse.parse_qs(parsed_path.query) + input_value = params.get("input", [""])[0] + # Unsafe: Directly including user input in headers + self.send_response(200) + try: + self.send_header("X-Info", input_value) # BAD + except Exception as e: + print(f"[!] Header injection failed: {e}") + self.end_headers() + self.wfile.write(b"Hello world!") + + +# if __name__ == "__main__": +# print("Serving vulnerable app on http://127.0.0.1:8080") +# httpd = HTTPServer(("127.0.0.1", 8080), VulnerableHandler) +# httpd.serve_forever() diff --git a/ql/ql/src/queries/performance/DontUseGetAQlClass.ql b/ql/ql/src/queries/performance/DontUseGetAQlClass.ql index dbf31cad4c3..fcba654e175 100644 --- a/ql/ql/src/queries/performance/DontUseGetAQlClass.ql +++ b/ql/ql/src/queries/performance/DontUseGetAQlClass.ql @@ -1,5 +1,5 @@ /** - * @name Don't use getAQlClass. + * @name Don't use getAQlClass * @description Any use of getAQlClass causes both compile-time and runtime to be significantly slower. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/performance/VarUnusedInDisjunct.ql b/ql/ql/src/queries/performance/VarUnusedInDisjunct.ql index 2d85b872153..e6db3ad3d98 100644 --- a/ql/ql/src/queries/performance/VarUnusedInDisjunct.ql +++ b/ql/ql/src/queries/performance/VarUnusedInDisjunct.ql @@ -1,5 +1,5 @@ /** - * @name Var only used in one side of disjunct. + * @name Var only used in one side of disjunct * @description Only using a variable on one side of a disjunction can cause a cartesian product. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/AcronymsShouldBeCamelCase.ql b/ql/ql/src/queries/style/AcronymsShouldBeCamelCase.ql index e7d27efa66c..70c2955ff01 100644 --- a/ql/ql/src/queries/style/AcronymsShouldBeCamelCase.ql +++ b/ql/ql/src/queries/style/AcronymsShouldBeCamelCase.ql @@ -1,5 +1,5 @@ /** - * @name Acronyms should be PascalCase/camelCase. + * @name Acronyms should be PascalCase/camelCase * @description Acronyms should be PascalCase/camelCase instead of upper-casing all the letters. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/IfWithElseNone.ql b/ql/ql/src/queries/style/IfWithElseNone.ql index c563c28e9f8..0c1c4b8b17b 100644 --- a/ql/ql/src/queries/style/IfWithElseNone.ql +++ b/ql/ql/src/queries/style/IfWithElseNone.ql @@ -1,5 +1,5 @@ /** - * @name Use of 'if' with a 'none()' branch. + * @name Use of 'if' with a 'none()' branch * @description Using 'if p() then q() else none()' is bad style. It should be rewritten as 'p() and q()'. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/OverridingParameterName.ql b/ql/ql/src/queries/style/OverridingParameterName.ql index 723f4442fc2..1a5630f60a0 100644 --- a/ql/ql/src/queries/style/OverridingParameterName.ql +++ b/ql/ql/src/queries/style/OverridingParameterName.ql @@ -1,5 +1,5 @@ /** - * @name Using a different parameter name than used in the super-predicate. + * @name Using a different parameter name than used in the super-predicate * @description Using another parameter can be an indication of copy-pasted code, or a mistake. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/RedundantAssignment.ql b/ql/ql/src/queries/style/RedundantAssignment.ql index 83f62364d9f..8a741c190f8 100644 --- a/ql/ql/src/queries/style/RedundantAssignment.ql +++ b/ql/ql/src/queries/style/RedundantAssignment.ql @@ -1,5 +1,5 @@ /** - * @name Redundant assignment. + * @name Redundant assignment * @description Assigning the same value twice is redundant. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/SuperfluousExists.ql b/ql/ql/src/queries/style/SuperfluousExists.ql index 84380330fa8..b1993b4994f 100644 --- a/ql/ql/src/queries/style/SuperfluousExists.ql +++ b/ql/ql/src/queries/style/SuperfluousExists.ql @@ -1,5 +1,5 @@ /** - * @name Superfluous 'exists' conjunct. + * @name Superfluous 'exists' conjunct * @description Writing 'exists(x)' when the existence of X is implied by another conjunct is bad practice. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/SwappedParameterNames.ql b/ql/ql/src/queries/style/SwappedParameterNames.ql index c3b835f6ab8..766b798ffdd 100644 --- a/ql/ql/src/queries/style/SwappedParameterNames.ql +++ b/ql/ql/src/queries/style/SwappedParameterNames.ql @@ -1,5 +1,5 @@ /** - * @name Swapped parameter names in overriding predicate. + * @name Swapped parameter names in overriding predicate * @description Swapping the parameter names in an overriding method indicates an implementation mistake. * @kind problem * @problem.severity error diff --git a/ql/ql/src/queries/style/UseInstanceofExtension.ql b/ql/ql/src/queries/style/UseInstanceofExtension.ql index 33ceb5f1030..9cb7a1cd6b5 100644 --- a/ql/ql/src/queries/style/UseInstanceofExtension.ql +++ b/ql/ql/src/queries/style/UseInstanceofExtension.ql @@ -1,5 +1,5 @@ /** - * @name Suggest using non-extending subtype relationships. + * @name Suggest using non-extending subtype relationships * @description Non-extending subtypes ("instanceof extensions") are generally preferable to instanceof expressions in characteristic predicates. * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/docs/ClassDocs.ql b/ql/ql/src/queries/style/docs/ClassDocs.ql index f7e5d7ac8d8..675d8976f16 100644 --- a/ql/ql/src/queries/style/docs/ClassDocs.ql +++ b/ql/ql/src/queries/style/docs/ClassDocs.ql @@ -1,5 +1,5 @@ /** - * @name Class QLDoc style. + * @name Class QLDoc style * @description The QLDoc for a class should start with "A", "An", or "The". * @kind problem * @problem.severity warning diff --git a/ql/ql/src/queries/style/docs/PredicateDocs.ql b/ql/ql/src/queries/style/docs/PredicateDocs.ql index a8a271e7ab8..8ab415fec4a 100644 --- a/ql/ql/src/queries/style/docs/PredicateDocs.ql +++ b/ql/ql/src/queries/style/docs/PredicateDocs.ql @@ -1,5 +1,5 @@ /** - * @name Predicate QLDoc style. + * @name Predicate QLDoc style * @description The QLDoc for a predicate should start with "Gets" or "Holds". * @kind problem * @problem.severity warning diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index a99e4017789..7c3ccd16c8a 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,19 @@ +## 5.1.6 + +No user-facing changes. + +## 5.1.5 + +No user-facing changes. + +## 5.1.4 + +No user-facing changes. + +## 5.1.3 + +No user-facing changes. + ## 5.1.2 No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/5.1.3.md b/ruby/ql/lib/change-notes/released/5.1.3.md new file mode 100644 index 00000000000..9af1eab14f3 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.1.3.md @@ -0,0 +1,3 @@ +## 5.1.3 + +No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/5.1.4.md b/ruby/ql/lib/change-notes/released/5.1.4.md new file mode 100644 index 00000000000..0fb22ded7d9 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.1.4.md @@ -0,0 +1,3 @@ +## 5.1.4 + +No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/5.1.5.md b/ruby/ql/lib/change-notes/released/5.1.5.md new file mode 100644 index 00000000000..fa76be9d79a --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.1.5.md @@ -0,0 +1,3 @@ +## 5.1.5 + +No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/5.1.6.md b/ruby/ql/lib/change-notes/released/5.1.6.md new file mode 100644 index 00000000000..74ba63bd37a --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.1.6.md @@ -0,0 +1,3 @@ +## 5.1.6 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index d21c12fbe7f..5ddeeed69fc 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.1.2 +lastReleaseVersion: 5.1.6 diff --git a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll index c04a85487ac..80ec45a3cf1 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll @@ -62,6 +62,8 @@ * should be prefixed with a tilde character (`~`). For example, `~Bar` can be used to indicate that * the type is not intended to match a static type. */ +overlay[local?] +module; private import codeql.util.Unit private import ApiGraphModelsSpecific as Specific diff --git a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll index 4969da43be3..3f38c498f32 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll @@ -1,6 +1,8 @@ /** * Defines extensible predicates for contributing library models from data extensions. */ +overlay[local] +module; /** * Holds if the value at `(type, path)` should be seen as a flow diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 3a400018dec..6cc2814827c 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 5.1.3-dev +version: 5.1.7-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 282fd284635..ab000feb4a3 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,21 @@ +## 1.5.3 + +No user-facing changes. + +## 1.5.2 + +No user-facing changes. + +## 1.5.1 + +No user-facing changes. + +## 1.5.0 + +### Query Metadata Changes + +* Reduced the `security-severity` score of the `rb/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. + ## 1.4.8 No user-facing changes. diff --git a/ruby/ql/src/change-notes/2025-10-22-adjust-query-severity.md b/ruby/ql/src/change-notes/2025-10-22-adjust-query-severity.md deleted file mode 100644 index 4da73769e27..00000000000 --- a/ruby/ql/src/change-notes/2025-10-22-adjust-query-severity.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: queryMetadata ---- -* Reduced the `security-severity` score of the `rb/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. \ No newline at end of file diff --git a/ruby/ql/src/change-notes/released/1.5.0.md b/ruby/ql/src/change-notes/released/1.5.0.md new file mode 100644 index 00000000000..491a3bf9ee4 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.5.0.md @@ -0,0 +1,5 @@ +## 1.5.0 + +### Query Metadata Changes + +* Reduced the `security-severity` score of the `rb/overly-large-range` query from 5.0 to 4.0 to better reflect its impact. diff --git a/ruby/ql/src/change-notes/released/1.5.1.md b/ruby/ql/src/change-notes/released/1.5.1.md new file mode 100644 index 00000000000..7b24a64aca3 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.5.1.md @@ -0,0 +1,3 @@ +## 1.5.1 + +No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.5.2.md b/ruby/ql/src/change-notes/released/1.5.2.md new file mode 100644 index 00000000000..384c27833f1 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.5.2.md @@ -0,0 +1,3 @@ +## 1.5.2 + +No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.5.3.md b/ruby/ql/src/change-notes/released/1.5.3.md new file mode 100644 index 00000000000..2e9bcb5e663 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.5.3.md @@ -0,0 +1,3 @@ +## 1.5.3 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 16e6425ae7e..232224b0e26 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.8 +lastReleaseVersion: 1.5.3 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 37c9e4be522..833f85894e3 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.4.9-dev +version: 1.5.4-dev groups: - ruby - queries diff --git a/ruby/ql/src/queries/meta/TaintedNodes.ql b/ruby/ql/src/queries/meta/TaintedNodes.ql index 2ee6e83e0de..1594c59d3b0 100644 --- a/ruby/ql/src/queries/meta/TaintedNodes.ql +++ b/ruby/ql/src/queries/meta/TaintedNodes.ql @@ -28,5 +28,5 @@ private module BasicTaintConfig implements DataFlow::ConfigSig { private module BasicTaintFlow = TaintTracking::Global; from DataFlow::Node node -where BasicTaintFlow::flow(_, node) +where BasicTaintFlow::flowTo(node) select node, "Tainted node" diff --git a/ruby/ql/src/queries/security/cwe-327/WeakSensitiveDataHashing.qhelp b/ruby/ql/src/queries/security/cwe-327/WeakSensitiveDataHashing.qhelp index 422cbb83514..33d0c845a66 100644 --- a/ruby/ql/src/queries/security/cwe-327/WeakSensitiveDataHashing.qhelp +++ b/ruby/ql/src/queries/security/cwe-327/WeakSensitiveDataHashing.qhelp @@ -67,7 +67,7 @@ The following example shows two functions for checking whether the hash of a certificate matches a known value -- to prevent tampering. - The first function uses MD5 that is known to be vulnerable to collision attacks. + The first function uses SHA-1 that is known to be vulnerable to collision attacks. The second function uses SHA-256 that is a strong cryptographic hashing function.

    diff --git a/ruby/ql/src/queries/variables/UnusedParameter.ql b/ruby/ql/src/queries/variables/UnusedParameter.ql index d212ee883f7..2dc3e0b5341 100644 --- a/ruby/ql/src/queries/variables/UnusedParameter.ql +++ b/ruby/ql/src/queries/variables/UnusedParameter.ql @@ -1,5 +1,5 @@ /** - * @name Unused parameter. + * @name Unused parameter * @description A parameter that is not used later on, or whose value is always overwritten, * can be removed. * @kind problem diff --git a/ruby/ql/src/utils/modeleditor/FrameworkModeAccessPaths.ql b/ruby/ql/src/utils/modeleditor/FrameworkModeAccessPaths.ql index 039fcfbf1c9..160aed49040 100644 --- a/ruby/ql/src/utils/modeleditor/FrameworkModeAccessPaths.ql +++ b/ruby/ql/src/utils/modeleditor/FrameworkModeAccessPaths.ql @@ -1,5 +1,5 @@ /** - * @name Fetch a subset of valid access paths of input and output parameters of a method (framework mode). + * @name Fetch a subset of valid access paths of input and output parameters of a method (framework mode) * @description A list of access paths for input and output parameters of a method. Excludes test and generated code. * @kind table * @id ruby/utils/modeleditor/framework-mode-access-paths diff --git a/ruby/ql/test/library-tests/security/CryptoAlgorithms.expected b/ruby/ql/test/library-tests/security/CryptoAlgorithms.expected index eedddb2df9f..3f1ba8e12c6 100644 --- a/ruby/ql/test/library-tests/security/CryptoAlgorithms.expected +++ b/ruby/ql/test/library-tests/security/CryptoAlgorithms.expected @@ -34,6 +34,8 @@ strongHashingAlgorithms | SHA3256 | | SHA3384 | | SHA3512 | +| SHA512224 | +| SHA512256 | | SHAKE128 | | SHAKE256 | | SM3 | diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index 4b68c1d42a6..ddacc0d913e 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -15,6 +15,7 @@ use ungrammar::Grammar; fn class_name(type_name: &str) -> String { match type_name { + "Adt" => "TypeItem".to_owned(), "BinExpr" => "BinaryExpr".to_owned(), "ElseBranch" => "Expr".to_owned(), "Fn" => "Function".to_owned(), diff --git a/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/downgrade.ql b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/downgrade.ql new file mode 100644 index 00000000000..6df51a29ffe --- /dev/null +++ b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/downgrade.ql @@ -0,0 +1,73 @@ +class Element extends @element { + string toString() { none() } +} + +class Enum extends Element, @enum { } + +class Struct extends Element, @struct { } + +class Union extends Element, @union { } + +class Attr extends Element, @attr { } + +class GenericParamList extends Element, @generic_param_list { } + +class Name extends Element, @name { } + +class Visibility extends Element, @visibility { } + +class WhereClause extends Element, @where_clause { } + +query predicate new_enum_attrs(Enum enum, int index, Attr attr) { + type_item_attrs(enum, index, attr) +} + +query predicate new_enum_generic_param_lists(Enum enum, GenericParamList g) { + type_item_generic_param_lists(enum, g) +} + +query predicate new_enum_names(Enum enum, Name name) { type_item_names(enum, name) } + +query predicate new_enum_visibilities(Enum enum, Visibility visibility) { + type_item_visibilities(enum, visibility) +} + +query predicate new_enum_where_clauses(Enum enum, WhereClause whereClause) { + type_item_where_clauses(enum, whereClause) +} + +query predicate new_struct_attrs(Struct struct, int index, Attr attr) { + type_item_attrs(struct, index, attr) +} + +query predicate new_struct_generic_param_lists(Struct struct, GenericParamList g) { + type_item_generic_param_lists(struct, g) +} + +query predicate new_struct_names(Struct struct, Name name) { type_item_names(struct, name) } + +query predicate new_struct_visibilities(Struct struct, Visibility visibility) { + type_item_visibilities(struct, visibility) +} + +query predicate new_struct_where_clauses(Struct struct, WhereClause whereClause) { + type_item_where_clauses(struct, whereClause) +} + +query predicate new_union_attrs(Union union, int index, Attr attr) { + type_item_attrs(union, index, attr) +} + +query predicate new_union_generic_param_lists(Union union, GenericParamList g) { + type_item_generic_param_lists(union, g) +} + +query predicate new_union_names(Union union, Name name) { type_item_names(union, name) } + +query predicate new_union_visibilities(Union union, Visibility visibility) { + type_item_visibilities(union, visibility) +} + +query predicate new_union_where_clauses(Union union, WhereClause whereClause) { + type_item_where_clauses(union, whereClause) +} diff --git a/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/old.dbscheme b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/old.dbscheme new file mode 100644 index 00000000000..c467bf63916 --- /dev/null +++ b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/old.dbscheme @@ -0,0 +1,3562 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/rust.dbscheme b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/rust.dbscheme new file mode 100644 index 00000000000..e54d01f67a4 --- /dev/null +++ b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/rust.dbscheme @@ -0,0 +1,3624 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @adt +| @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +@adt = + @enum +| @struct +| @union +; + +#keyset[id, index] +adt_derive_macro_expansions( + int id: @adt ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id, index] +enum_attrs( + int id: @enum ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +enum_generic_param_lists( + int id: @enum ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +enum_names( + int id: @enum ref, + int name: @name ref +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +#keyset[id] +enum_visibilities( + int id: @enum ref, + int visibility: @visibility ref +); + +#keyset[id] +enum_where_clauses( + int id: @enum ref, + int where_clause: @where_clause ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id, index] +struct_attrs( + int id: @struct ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +#keyset[id] +struct_generic_param_lists( + int id: @struct ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +struct_names( + int id: @struct ref, + int name: @name ref +); + +#keyset[id] +struct_visibilities( + int id: @struct ref, + int visibility: @visibility ref +); + +#keyset[id] +struct_where_clauses( + int id: @struct ref, + int where_clause: @where_clause ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id, index] +union_attrs( + int id: @union ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +union_generic_param_lists( + int id: @union ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +union_names( + int id: @union ref, + int name: @name ref +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +#keyset[id] +union_visibilities( + int id: @union ref, + int visibility: @visibility ref +); + +#keyset[id] +union_where_clauses( + int id: @union ref, + int where_clause: @where_clause ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/upgrade.properties b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/upgrade.properties new file mode 100644 index 00000000000..e73d8c313cc --- /dev/null +++ b/rust/downgrades/c467bf63916002287b7bde8ce8b094c57579bd81/upgrade.properties @@ -0,0 +1,29 @@ +description: Renamed the `@type_item` union type to `@adt` and updated its relations +compatibility: full + +type_item_derive_macro_expansions.rel: delete +type_item_attrs.rel: delete +type_item_generic_param_lists.rel: delete +type_item_names.rel: delete +type_item_visibilities.rel: delete +type_item_where_clauses.rel: delete + +adt_derive_macro_expansions.rel: reorder type_item_derive_macro_expansions.rel (@type_item id, int index, @macro_items items) id index items + +enum_attrs.rel: run downgrade.ql new_enum_attrs +enum_generic_param_lists.rel: run downgrade.ql new_enum_generic_param_lists +enum_names.rel: run downgrade.ql new_enum_names +enum_visibilities.rel: run downgrade.ql new_enum_visibilities +enum_where_clauses.rel: run downgrade.ql new_enum_where_clauses + +struct_attrs.rel: run downgrade.ql new_struct_attrs +struct_generic_param_lists.rel: run downgrade.ql new_struct_generic_param_lists +struct_names.rel: run downgrade.ql new_struct_names +struct_visibilities.rel: run downgrade.ql new_struct_visibilities +struct_where_clauses.rel: run downgrade.ql new_struct_where_clauses + +union_attrs.rel: run downgrade.ql new_union_attrs +union_generic_param_lists.rel: run downgrade.ql new_union_generic_param_lists +union_names.rel: run downgrade.ql new_union_names +union_visibilities.rel: run downgrade.ql new_union_visibilities +union_where_clauses.rel: run downgrade.ql new_union_where_clauses \ No newline at end of file diff --git a/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/old.dbscheme b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/old.dbscheme new file mode 100644 index 00000000000..e54d01f67a4 --- /dev/null +++ b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/old.dbscheme @@ -0,0 +1,3624 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @adt +| @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +@adt = + @enum +| @struct +| @union +; + +#keyset[id, index] +adt_derive_macro_expansions( + int id: @adt ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id, index] +enum_attrs( + int id: @enum ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +enum_generic_param_lists( + int id: @enum ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +enum_names( + int id: @enum ref, + int name: @name ref +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +#keyset[id] +enum_visibilities( + int id: @enum ref, + int visibility: @visibility ref +); + +#keyset[id] +enum_where_clauses( + int id: @enum ref, + int where_clause: @where_clause ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id, index] +struct_attrs( + int id: @struct ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +#keyset[id] +struct_generic_param_lists( + int id: @struct ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +struct_names( + int id: @struct ref, + int name: @name ref +); + +#keyset[id] +struct_visibilities( + int id: @struct ref, + int visibility: @visibility ref +); + +#keyset[id] +struct_where_clauses( + int id: @struct ref, + int where_clause: @where_clause ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id, index] +union_attrs( + int id: @union ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +union_generic_param_lists( + int id: @union ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +union_names( + int id: @union ref, + int name: @name ref +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +#keyset[id] +union_visibilities( + int id: @union ref, + int visibility: @visibility ref +); + +#keyset[id] +union_where_clauses( + int id: @union ref, + int where_clause: @where_clause ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/rust.dbscheme b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/rust.dbscheme new file mode 100644 index 00000000000..30a0713e5bf --- /dev/null +++ b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/rust.dbscheme @@ -0,0 +1,3615 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr_base +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +@call_expr_base = + @call_expr +| @method_call_expr +; + +#keyset[id] +call_expr_base_arg_lists( + int id: @call_expr_base ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_base_attrs( + int id: @call_expr_base ref, + int index: int ref, + int attr: @attr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @adt +| @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +@adt = + @enum +| @struct +| @union +; + +#keyset[id, index] +adt_derive_macro_expansions( + int id: @adt ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id, index] +enum_attrs( + int id: @enum ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +enum_generic_param_lists( + int id: @enum ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +enum_names( + int id: @enum ref, + int name: @name ref +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +#keyset[id] +enum_visibilities( + int id: @enum ref, + int visibility: @visibility ref +); + +#keyset[id] +enum_where_clauses( + int id: @enum ref, + int where_clause: @where_clause ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id, index] +struct_attrs( + int id: @struct ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +#keyset[id] +struct_generic_param_lists( + int id: @struct ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +struct_names( + int id: @struct ref, + int name: @name ref +); + +#keyset[id] +struct_visibilities( + int id: @struct ref, + int visibility: @visibility ref +); + +#keyset[id] +struct_where_clauses( + int id: @struct ref, + int where_clause: @where_clause ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id, index] +union_attrs( + int id: @union ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +union_generic_param_lists( + int id: @union ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +union_names( + int id: @union ref, + int name: @name ref +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +#keyset[id] +union_visibilities( + int id: @union ref, + int visibility: @visibility ref +); + +#keyset[id] +union_where_clauses( + int id: @union ref, + int where_clause: @where_clause ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.properties b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.properties new file mode 100644 index 00000000000..d753a48ad74 --- /dev/null +++ b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.properties @@ -0,0 +1,10 @@ +description: Added the `@call_expr_base` union type +compatibility: backwards + +call_expr_arg_lists.rel: delete +call_expr_attrs.rel: delete +method_call_expr_arg_lists.rel: delete +method_call_expr_attrs.rel: delete + +call_expr_base_arg_lists.rel: run upgrade.ql call_expr_base_arg_lists +call_expr_base_attrs.rel: run upgrade.ql call_expr_base_attrs \ No newline at end of file diff --git a/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.ql b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.ql new file mode 100644 index 00000000000..0ebeae26038 --- /dev/null +++ b/rust/downgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.ql @@ -0,0 +1,19 @@ +class Element extends @element { + string toString() { none() } +} + +class ArgList extends Element, @arg_list { } + +class Attr extends Element, @attr { } + +query predicate call_expr_base_arg_lists(Element c, ArgList l) { + call_expr_base_arg_lists(c, l) + or + method_call_expr_arg_lists(c, l) +} + +query predicate call_expr_base_attrs(Element c, int i, Attr a) { + call_expr_attrs(c, i, a) + or + method_call_expr_attrs(c, i, a) +} diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index fa35ec65d4c..11f99621d16 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs 460e827738766301a137f1750be7cd3016e6b7e4e487c6c95972bd3e1d21b814 460e827738766301a137f1750be7cd3016e6b7e4e487c6c95972bd3e1d21b814 +top.rs 92ef55101899570ddcb197b872a5b6a38aed874bb8f0ad604af27b2fec00eba5 92ef55101899570ddcb197b872a5b6a38aed874bb8f0ad604af27b2fec00eba5 diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index 3c4b51c78e6..2365084bb82 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -4315,44 +4315,66 @@ impl From> for trap::Label { } #[derive(Debug)] -pub struct CallExprBase { - _unused: () +pub struct CallExpr { + pub id: trap::TrapId, + pub arg_list: Option>, + pub attrs: Vec>, + pub function: Option>, } -impl trap::TrapClass for CallExprBase { - fn class_name() -> &'static str { "CallExprBase" } +impl trap::TrapEntry for CallExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("call_exprs", vec![id.into()]); + if let Some(v) = self.arg_list { + out.add_tuple("call_expr_arg_lists", vec![id.into(), v.into()]); + } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("call_expr_attrs", vec![id.into(), i.into(), v.into()]); + } + if let Some(v) = self.function { + out.add_tuple("call_expr_functions", vec![id.into(), v.into()]); + } + } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExprBase is a subclass of Expr +impl trap::TrapClass for CallExpr { + fn class_name() -> &'static str { "CallExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of Expr unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExprBase is a subclass of AstNode +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of AstNode unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExprBase is a subclass of Locatable +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of Locatable unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExprBase is a subclass of Element +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of Element unsafe { Self::from_untyped(value.as_untyped()) } @@ -6430,6 +6452,81 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct MethodCallExpr { + pub id: trap::TrapId, + pub arg_list: Option>, + pub attrs: Vec>, + pub generic_arg_list: Option>, + pub identifier: Option>, + pub receiver: Option>, +} + +impl trap::TrapEntry for MethodCallExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("method_call_exprs", vec![id.into()]); + if let Some(v) = self.arg_list { + out.add_tuple("method_call_expr_arg_lists", vec![id.into(), v.into()]); + } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("method_call_expr_attrs", vec![id.into(), i.into(), v.into()]); + } + if let Some(v) = self.generic_arg_list { + out.add_tuple("method_call_expr_generic_arg_lists", vec![id.into(), v.into()]); + } + if let Some(v) = self.identifier { + out.add_tuple("method_call_expr_identifiers", vec![id.into(), v.into()]); + } + if let Some(v) = self.receiver { + out.add_tuple("method_call_expr_receivers", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for MethodCallExpr { + fn class_name() -> &'static str { "MethodCallExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct NameRef { pub id: trap::TrapId, @@ -8909,82 +9006,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct Adt { - _unused: () -} - -impl Adt { - pub fn emit_derive_macro_expansion(id: trap::Label, i: usize, value: trap::Label, out: &mut trap::Writer) { - out.add_tuple("adt_derive_macro_expansions", vec![id.into(), i.into(), value.into()]); - } - - pub fn emit_derive_macro_expansions(id: trap::Label, values: impl IntoIterator>, out: &mut trap::Writer) { - values - .into_iter() - .enumerate() - .for_each(|(i, value)| Self::emit_derive_macro_expansion(id, i, value, out)); - } -} - -impl trap::TrapClass for Adt { - fn class_name() -> &'static str { "Adt" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Adt is a subclass of Item - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Adt is a subclass of Stmt - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Adt is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Adt is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Adt is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Adt is a subclass of Addressable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct AsmExpr { pub id: trap::TrapId, @@ -9242,82 +9263,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct CallExpr { - pub id: trap::TrapId, - pub arg_list: Option>, - pub attrs: Vec>, - pub function: Option>, -} - -impl trap::TrapEntry for CallExpr { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("call_exprs", vec![id.into()]); - if let Some(v) = self.arg_list { - out.add_tuple("call_expr_base_arg_lists", vec![id.into(), v.into()]); - } - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("call_expr_base_attrs", vec![id.into(), i.into(), v.into()]); - } - if let Some(v) = self.function { - out.add_tuple("call_expr_functions", vec![id.into(), v.into()]); - } - } -} - -impl trap::TrapClass for CallExpr { - fn class_name() -> &'static str { "CallExpr" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of CallExprBase - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of Expr - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CallExpr is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct ExternBlock { pub id: trap::TrapId, @@ -9908,90 +9853,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct MethodCallExpr { - pub id: trap::TrapId, - pub arg_list: Option>, - pub attrs: Vec>, - pub generic_arg_list: Option>, - pub identifier: Option>, - pub receiver: Option>, -} - -impl trap::TrapEntry for MethodCallExpr { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("method_call_exprs", vec![id.into()]); - if let Some(v) = self.arg_list { - out.add_tuple("call_expr_base_arg_lists", vec![id.into(), v.into()]); - } - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("call_expr_base_attrs", vec![id.into(), i.into(), v.into()]); - } - if let Some(v) = self.generic_arg_list { - out.add_tuple("method_call_expr_generic_arg_lists", vec![id.into(), v.into()]); - } - if let Some(v) = self.identifier { - out.add_tuple("method_call_expr_identifiers", vec![id.into(), v.into()]); - } - if let Some(v) = self.receiver { - out.add_tuple("method_call_expr_receivers", vec![id.into(), v.into()]); - } - } -} - -impl trap::TrapClass for MethodCallExpr { - fn class_name() -> &'static str { "MethodCallExpr" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of CallExprBase - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of Expr - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MethodCallExpr is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct Module { pub id: trap::TrapId, @@ -10368,6 +10229,82 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct TypeItem { + _unused: () +} + +impl TypeItem { + pub fn emit_derive_macro_expansion(id: trap::Label, i: usize, value: trap::Label, out: &mut trap::Writer) { + out.add_tuple("type_item_derive_macro_expansions", vec![id.into(), i.into(), value.into()]); + } + + pub fn emit_derive_macro_expansions(id: trap::Label, values: impl IntoIterator>, out: &mut trap::Writer) { + values + .into_iter() + .enumerate() + .for_each(|(i, value)| Self::emit_derive_macro_expansion(id, i, value, out)); + } +} + +impl trap::TrapClass for TypeItem { + fn class_name() -> &'static str { "TypeItem" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TypeItem is a subclass of Item + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TypeItem is a subclass of Stmt + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TypeItem is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TypeItem is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TypeItem is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TypeItem is a subclass of Addressable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct Use { pub id: trap::TrapId, @@ -10584,9 +10521,9 @@ pub struct Enum { pub attrs: Vec>, pub generic_param_list: Option>, pub name: Option>, - pub variant_list: Option>, pub visibility: Option>, pub where_clause: Option>, + pub variant_list: Option>, } impl trap::TrapEntry for Enum { @@ -10597,23 +10534,23 @@ impl trap::TrapEntry for Enum { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("enums", vec![id.into()]); for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("enum_attrs", vec![id.into(), i.into(), v.into()]); + out.add_tuple("type_item_attrs", vec![id.into(), i.into(), v.into()]); } if let Some(v) = self.generic_param_list { - out.add_tuple("enum_generic_param_lists", vec![id.into(), v.into()]); + out.add_tuple("type_item_generic_param_lists", vec![id.into(), v.into()]); } if let Some(v) = self.name { - out.add_tuple("enum_names", vec![id.into(), v.into()]); + out.add_tuple("type_item_names", vec![id.into(), v.into()]); + } + if let Some(v) = self.visibility { + out.add_tuple("type_item_visibilities", vec![id.into(), v.into()]); + } + if let Some(v) = self.where_clause { + out.add_tuple("type_item_where_clauses", vec![id.into(), v.into()]); } if let Some(v) = self.variant_list { out.add_tuple("enum_variant_lists", vec![id.into(), v.into()]); } - if let Some(v) = self.visibility { - out.add_tuple("enum_visibilities", vec![id.into(), v.into()]); - } - if let Some(v) = self.where_clause { - out.add_tuple("enum_where_clauses", vec![id.into(), v.into()]); - } } } @@ -10621,9 +10558,9 @@ impl trap::TrapClass for Enum { fn class_name() -> &'static str { "Enum" } } -impl From> for trap::Label { +impl From> for trap::Label { fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Enum is a subclass of Adt + // SAFETY: this is safe because in the dbscheme Enum is a subclass of TypeItem unsafe { Self::from_untyped(value.as_untyped()) } @@ -11253,11 +11190,11 @@ impl From> for trap::Label { pub struct Struct { pub id: trap::TrapId, pub attrs: Vec>, - pub field_list: Option>, pub generic_param_list: Option>, pub name: Option>, pub visibility: Option>, pub where_clause: Option>, + pub field_list: Option>, } impl trap::TrapEntry for Struct { @@ -11268,23 +11205,23 @@ impl trap::TrapEntry for Struct { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("structs", vec![id.into()]); for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("struct_attrs", vec![id.into(), i.into(), v.into()]); + out.add_tuple("type_item_attrs", vec![id.into(), i.into(), v.into()]); + } + if let Some(v) = self.generic_param_list { + out.add_tuple("type_item_generic_param_lists", vec![id.into(), v.into()]); + } + if let Some(v) = self.name { + out.add_tuple("type_item_names", vec![id.into(), v.into()]); + } + if let Some(v) = self.visibility { + out.add_tuple("type_item_visibilities", vec![id.into(), v.into()]); + } + if let Some(v) = self.where_clause { + out.add_tuple("type_item_where_clauses", vec![id.into(), v.into()]); } if let Some(v) = self.field_list { out.add_tuple("struct_field_lists_", vec![id.into(), v.into()]); } - if let Some(v) = self.generic_param_list { - out.add_tuple("struct_generic_param_lists", vec![id.into(), v.into()]); - } - if let Some(v) = self.name { - out.add_tuple("struct_names", vec![id.into(), v.into()]); - } - if let Some(v) = self.visibility { - out.add_tuple("struct_visibilities", vec![id.into(), v.into()]); - } - if let Some(v) = self.where_clause { - out.add_tuple("struct_where_clauses", vec![id.into(), v.into()]); - } } } @@ -11292,9 +11229,9 @@ impl trap::TrapClass for Struct { fn class_name() -> &'static str { "Struct" } } -impl From> for trap::Label { +impl From> for trap::Label { fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Struct is a subclass of Adt + // SAFETY: this is safe because in the dbscheme Struct is a subclass of TypeItem unsafe { Self::from_untyped(value.as_untyped()) } @@ -11484,9 +11421,9 @@ pub struct Union { pub attrs: Vec>, pub generic_param_list: Option>, pub name: Option>, - pub struct_field_list: Option>, pub visibility: Option>, pub where_clause: Option>, + pub struct_field_list: Option>, } impl trap::TrapEntry for Union { @@ -11497,23 +11434,23 @@ impl trap::TrapEntry for Union { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("unions", vec![id.into()]); for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("union_attrs", vec![id.into(), i.into(), v.into()]); + out.add_tuple("type_item_attrs", vec![id.into(), i.into(), v.into()]); } if let Some(v) = self.generic_param_list { - out.add_tuple("union_generic_param_lists", vec![id.into(), v.into()]); + out.add_tuple("type_item_generic_param_lists", vec![id.into(), v.into()]); } if let Some(v) = self.name { - out.add_tuple("union_names", vec![id.into(), v.into()]); + out.add_tuple("type_item_names", vec![id.into(), v.into()]); + } + if let Some(v) = self.visibility { + out.add_tuple("type_item_visibilities", vec![id.into(), v.into()]); + } + if let Some(v) = self.where_clause { + out.add_tuple("type_item_where_clauses", vec![id.into(), v.into()]); } if let Some(v) = self.struct_field_list { out.add_tuple("union_struct_field_lists", vec![id.into(), v.into()]); } - if let Some(v) = self.visibility { - out.add_tuple("union_visibilities", vec![id.into(), v.into()]); - } - if let Some(v) = self.where_clause { - out.add_tuple("union_where_clauses", vec![id.into(), v.into()]); - } } } @@ -11521,9 +11458,9 @@ impl trap::TrapClass for Union { fn class_name() -> &'static str { "Union" } } -impl From> for trap::Label { +impl From> for trap::Label { fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme Union is a subclass of Adt + // SAFETY: this is safe because in the dbscheme Union is a subclass of TypeItem unsafe { Self::from_untyped(value.as_untyped()) } diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index ee26da665b2..a3a0b3c9133 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -674,7 +674,7 @@ impl<'a> Translator<'a> { pub(crate) fn emit_derive_expansion( &mut self, node: &(impl Into + Clone), - label: impl Into> + Copy, + label: impl Into> + Copy, ) { let Some(semantics) = self.semantics else { return; @@ -686,7 +686,7 @@ impl<'a> Translator<'a> { .flatten() .filter_map(|expanded| self.process_item_macro_expansion(&node, expanded)) .collect::>(); - generated::Adt::emit_derive_macro_expansions( + generated::TypeItem::emit_derive_macro_expansions( label.into(), expansions, &mut self.trap.writer, diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 5ed2894e273..de0cdb6224f 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,7 +1,6 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 11c7521ec2231a4d0447f30fc3d0bb14aebb659bd8cf75935af1050673a3b1d6 d0a77b572a032e43f1c47622315c0cdfe17e68c2b057534b9322fc528029fb40 +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 1eac5a95247dec5cf51a453788b5bdebcf612590014b1e28f6b6f7e841c96a20 d4d8c9664ca406c3fd14d96a488eea97c42401e2791f41d7248ee5d3f299805c lib/codeql/rust/elements/Abi.qll 485a2e79f6f7bfd1c02a6e795a71e62dede3c3e150149d5f8f18b761253b7208 6159ba175e7ead0dd2e3f2788f49516c306ee11b1a443bd4bdc00b7017d559bd lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be -lib/codeql/rust/elements/Adt.qll c2afed4ac2e17039ccd98f74ea22111f4d765c4e232c50ccd3128da0d26da837 1380bde2eb667c6ec2ef5f8710aa24e926851c9e321ebc72ba514fa92c369dc3 lib/codeql/rust/elements/ArgList.qll 3d2f6f5542340b80a4c6e944ac17aba0d00727588bb66e501453ac0f80c82f83 afd52700bf5a337f19827846667cd0fb1fea5abbbcbc353828e292a727ea58c9 lib/codeql/rust/elements/ArrayExpr.qll e4e7cff3518c50ec908271906dd46c1fbe9098faa1e8cd06a27f0a6e8d165ed1 fe02a4f4197f57ecd1e8e82d6c9384148ec29d8b106d7f696795b2f325e4a71b lib/codeql/rust/elements/ArrayListExpr.qll 451aedcecb479c385ff497588c7a07fda304fd5b873270223a4f2c804e96b245 a8cb008f6f732215623b5626c84b37b651ca01ccafb2cf4c835df35d5140c6ad @@ -32,8 +31,7 @@ lib/codeql/rust/elements/BinaryExpr.qll 394522da3bc3a716fc7bc40c3560143ca840f5d2 lib/codeql/rust/elements/BlockExpr.qll b5cf57119b15f27d0bc258dfa375b0ef2730c157870ff543f0dc7a8cfe514182 f6a01999606b010c81ef9c6ff1385e6640632b6f5ce067ffeb0ef0af0a0aeb92 lib/codeql/rust/elements/BoxPat.qll 1b2c3fff171aa6aa238c9460b122f26c79e04577cea67fa856de99842ba873d4 0caf8d23ed6e0997a6b8751def27641582151fba6e24fccf798712a4690b42f1 lib/codeql/rust/elements/BreakExpr.qll 7ca3807a20e9a9a988d1fd7abebf240325ed422fcb45c719ba46272f031f94db dffb7379d3f3ba220acfbd05eb7bb6cfd9cfda211e9c8b1f5240ca5fa61be3fc -lib/codeql/rust/elements/CallExpr.qll f336500ca7a611b164d48b90e80edb0c0d3816792b0ececce659ac1ff1ffeb3e f99a9c55466418ef53860c44d9f2d6161af4b492178ddd9e5870dff742b70ae5 -lib/codeql/rust/elements/CallExprBase.qll 2846202b5208b541977500286951d96487bf555838c6c16cdd006a71e383745a c789d412bf099c624329379e0c7d94fa0d23ae2edea7a25a2ea0f3c0042ccf62 +lib/codeql/rust/elements/CallExpr.qll ee3997f265dc1b6b2fc7134548dd88d509b6bcbc26cf65061a31980f9900ae26 7e86e0ab24ce78c3f592a5614eac083d00f331664f021a438f74e2e0785f4609 lib/codeql/rust/elements/Callable.qll 08a46e987b8fde29069795a536fcd1ad1a96f60341f72293e4d07e20334d554f cfc2be9287000718e5ff3c2a35bb45ffc93fd36d97f2e034888e9aa2ae9af555 lib/codeql/rust/elements/CastExpr.qll 2fe1f36ba31fa29de309baf0a665cfcae67b61c73345e8f9bbd41e8c235fec45 c5b4c1e9dc24eb2357799defcb2df25989075e3a80e8663b74204a1c1b70e29a lib/codeql/rust/elements/ClosureExpr.qll 69e0b7a7c7a4c348fcada5ad4da22dd2f51747109f856be239cede315a56d695 93400650282e2d4e682b826e9f5f844aa893dda126548e41ea1c703d2bf209ca @@ -46,7 +44,7 @@ lib/codeql/rust/elements/ContinueExpr.qll 9f27c5d5c819ad0ebc5bd10967ba8d33a9dc95 lib/codeql/rust/elements/Crate.qll 1426960e6f36195e42ea5ea321405c1a72fccd40cd6c0a33673c321c20302d8d 1571a89f89dab43c5291b71386de7aadf52730755ba10f9d696db9ad2f760aff lib/codeql/rust/elements/DynTraitTypeRepr.qll e4d27112d27ae93c621defd2c976fd4e90663ab7f6115e83ae4fe8106cb5e015 eb9fde89698588f3b7116f62388c54e937f99559b22c93d11a5596e754560072 lib/codeql/rust/elements/Element.qll 0b62d139fef54ed2cf2e2334806aa9bfbc036c9c2085d558f15a42cc3fa84c48 24b999b93df79383ef27ede46e38da752868c88a07fe35fcff5d526684ba7294 -lib/codeql/rust/elements/Enum.qll 55d5a4a775f07d9c1d5183af76f9d8de1d700bfe1dea427cc7ff3083f39e13de f00a585596f1d0ab34e6f2b7cdaba6d4a89005820478f810e8685478cf88100e +lib/codeql/rust/elements/Enum.qll 13c1a3bddfff6c9cc644902652883aefc7721bc94bd8084a1a49acc156996d12 17a898434329437479de4fef27ce11f5996b1953168066bd6d51f93594cc79d1 lib/codeql/rust/elements/Expr.qll e5d65e805ccf440d64d331e55df4c4144ab8c8f63f367382494714087659ffe8 2bbc1e5d3a65f413ec33d9822fa451fbdbe32349158db58cc0bfcfafb0e21bda lib/codeql/rust/elements/ExprStmt.qll 00ac4c7d0192b9e8b0f28d5ae59c27729ff5a831ca11938ea3e677a262337a64 7cc02aa5346cd7c50d75ca63cd6501097b0a3979eb2ed838adff114fe17d35a3 lib/codeql/rust/elements/ExternBlock.qll 96c70d0761ec385fe17aa7228e15fd1711949d5abba5877a1c2f4c180d202125 38ad458868a368d437b2dda44307d788a85c887f45ea76c99adbfc9a53f14d81 @@ -103,7 +101,7 @@ lib/codeql/rust/elements/MatchArmList.qll f221c5e344814fa44db06ab897afdc249e8e88 lib/codeql/rust/elements/MatchExpr.qll e9ef1664f020823b6f4bb72d906a9dc0c1ee6432d4a9a13f7dbdbab2b2b1ee4d 38d71e5c487abcb5682293c573343be66e499a6e131bb630604c120d34b7777b lib/codeql/rust/elements/MatchGuard.qll 58256689a90f24b16401543452c2a32f00d619ddac6c0fe8b65a8cd3e46401bb 8efb2ac03c69a9db687e382331085d7a6cfbf8eca559174ba2727a9549ec7ddd lib/codeql/rust/elements/Meta.qll b17d7bf605bd0cf4f6d6c6cf4f39a16cfc431d256d45b93663a7569181d36168 815cdfef06231de4b4b1c85e321b8ccb3e22379e5a4e111df9cc9ca6be593841 -lib/codeql/rust/elements/MethodCallExpr.qll 91b411e0fb1a0547dcad8726db460dccc61bed972741598d5cb3740593fe75a7 538d23b6db115bb699389d29a1829bb0449c08424a1fff80377828eb7ceb2563 +lib/codeql/rust/elements/MethodCallExpr.qll 914633f304c587addced988a7f161a1a4b3297ce370f6a959b7a042b1c04dace 289a0854d6323df915ee5f268523ee597ba20a37c646bbb2a79c9ed1f7aa2260 lib/codeql/rust/elements/Missing.qll 70e6ac9790314752849c9888443c98223ccfc93a193998b7ce350b2c6ebe8ea4 e2f0623511acaa76b091f748d417714137a8b94f1f2bdbbd177f1c682c786dad lib/codeql/rust/elements/Module.qll 0bc85019177709256f8078d9de2a36f62f848d476225bff7bba1e35f249875c7 3fbb70e0c417a644dd0cada2c364c6e6876cfa16f37960e219c87e49c966c94e lib/codeql/rust/elements/Name.qll af41479d4260fe931d46154dda15484e4733c952b98f0e370106e6e9e8ce398b e188a0d0309dd1b684c0cb88df435b38e306eb94d6b66a2b748e75252f15e095 @@ -145,7 +143,7 @@ lib/codeql/rust/elements/SourceFile.qll 0b6a3e58767c07602b19975009a2ad53ecf1fd72 lib/codeql/rust/elements/Static.qll 9dca6d4fb80fb4ead49a3de89bec2b02bae6f96fbc2601dde35a2aa69a9bfdb0 70f67bc75d7799dab04ea7a7fd13286bb76bbe514be16d23149c59dfb31fd0c9 lib/codeql/rust/elements/Stmt.qll 532b12973037301246daf7d8c0177f734202f43d9261c7a4ca6f5080eea8ca64 b838643c4f2b4623d2c816cddad0e68ca3e11f2879ab7beaece46f489ec4b1f3 lib/codeql/rust/elements/StmtList.qll 8bad277dfd88735195b8fd43bb1395cb2393c488d89304d6a6e6d8ec3eb24b73 cd1d483aecb8bb1876b8153a872f680febc2ef6c315d661c85ec1b2fa07e4fc0 -lib/codeql/rust/elements/Struct.qll 297d3ea732fc7fbb8b8fb5479c1873ce84705146853ff752c84a6f70af12b923 3df0e5fd50a910a0b5611c3a860a1d7c318f6925c3a0727006d91840caf04812 +lib/codeql/rust/elements/Struct.qll e60a859c0112b7a7ce4a4752e936e0d58f413ceb895db25d77ece2fcc9d8881c 8bf69f80bb9ef54644d9540b8be7d331f73ba362817508489ff91619718bee6b lib/codeql/rust/elements/StructExpr.qll 84f384ef74c723796e514186037a91dd9666556f62c717f133ce22e9dda4425f 176497835252cfdfe110e58ebde9fbde553d03e44e07d3e4d8041e835dbf31b9 lib/codeql/rust/elements/StructExprField.qll 3eb9f17ecd1ad38679689eb4ecc169d3a0b5b7a3fc597ae5a957a7aea2f74e4f 8fcd26f266f203004899a60447ba16e7eae4e3a654fbec7f54e26857730ede93 lib/codeql/rust/elements/StructExprFieldList.qll 6efb2ec4889b38556dc679bb89bbd4bd76ed6a60014c41f8e232288fc23b2d52 dc867a0a4710621e04b36bbec7d317d6f360e0d6ac68b79168c8b714babde31d @@ -160,8 +158,8 @@ lib/codeql/rust/elements/Trait.qll f78a917c2f2e5a0dfcd7c36e95ad67b1fa218484ee509 lib/codeql/rust/elements/TraitAlias.qll 1d82d043f24dbac04baa7aa3882c6884b8ffbc5d9b97669ce8efb7e2c8d3d2c8 505ba5426e87b3c49721f440fbc9ad6b0e7d89d1b1a51ca3fa3a6cc2d36f8b82 lib/codeql/rust/elements/TryExpr.qll cb452f53292a1396139f64a35f05bb11501f6b363f8affc9f2d5f1945ad4a647 d60ad731bfe256d0f0b688bdc31708759a3d990c11dee4f1d85ccc0d9e07bec9 lib/codeql/rust/elements/TupleExpr.qll 1b1be270198f9d3db1c28c4caaa4a7fe9b5ae14651f1a10e2891a7d78d6ad18b 4f585aa684dfbff753e342903ddd60ee4d7c374b8bddeb645784d10903c90ae0 -lib/codeql/rust/elements/TupleField.qll e20a991f7f1322cc7c05b2a8946d5017edb119812efa3e44daa94a5dff2d0c7b 8c25c9577fef8b5b9a4b285ceb7cfffcd8d89448035b1967cd7fda1503adfe13 -lib/codeql/rust/elements/TupleFieldList.qll b67cd2dec918d09e582467e5db7a38c8fa18350af591b43a1b450cd2026dbb67 22fdd1e77c16e3be4627ee7a45985b94785492d36056eeeff2c94b43450b48c8 +lib/codeql/rust/elements/TupleField.qll 8d6288fd79959d5ef3732397c0a05a47fcb09091383058d1dba7268a950f8c32 1518cdd0fd9746d09fcdbecabc2a3ce6b36b6d983883850beed3f55c2bdf2c16 +lib/codeql/rust/elements/TupleFieldList.qll 2fa47599f78aa4639a40239cf49bc2f97d84118125b949c71fec4390589caaf0 3f71a86e38bdc6fe9f0c082a43d763c4f34b4bdab99c383cdc5d8b59e887cee0 lib/codeql/rust/elements/TuplePat.qll 028cdea43868b0fdd2fc4c31ff25b6bbb40813e8aaccf72186051a280db7632e 38c56187971671e6a9dd0c6ccccb2ee4470aa82852110c6b89884496eb4abc64 lib/codeql/rust/elements/TupleStructPat.qll da398a23eb616bf7dd586b2a87f4ab00f28623418f081cd7b1cc3de497ef1819 6573bf3f8501c30af3aeb23d96db9f5bea7ab73e2b7ef3473095c03e96c20a5c lib/codeql/rust/elements/TupleTypeRepr.qll 1ac5abf6281ea31680a4098407fbe55459d08f92a50dec20d1f8b93d498eee41 6d9625cce4e4abf6b6e6c22e47880fbd23740d07b621137bd7fa0a2ee13badd9 @@ -169,12 +167,13 @@ lib/codeql/rust/elements/TypeAlias.qll b59f24488f0d7de8d4046a9e0ca1e1f54d1d5c11e lib/codeql/rust/elements/TypeArg.qll e91dbb399d2ab7cf7af9dd5f743a551d0bf91dba3cfb76cea9e2d42ada0f9f2e c67d64e20e35a9bba5092651e0f82c75ba53b8c165e823bc81d67975107ae375 lib/codeql/rust/elements/TypeBound.qll 33583aed81734348c5097851cde3568668f259c000ccde901c75a3f2eef30237 3c9e541d47c5cfbcb0b1c5806f5d9abd7f51382d1efc1328742439e11285ab32 lib/codeql/rust/elements/TypeBoundList.qll 61a861e89b3de23801c723531cd3331a61214817a230aaae74d91cb60f0e096f d54e3d830bb550c5ba082ccd09bc0dc4e6e44e8d11066a7afba5a7172aa687a8 +lib/codeql/rust/elements/TypeItem.qll 5676a801adccd2685c6beff4e2587b6da595ecaa9befb88dc29428eb53988a86 3bfdeb9d0cd4f79a9eb85829e9572bd1e4d0971e67cd3952ae5b811a955b26b5 lib/codeql/rust/elements/TypeParam.qll 0787c1cc0c121e5b46f7d8e25153fd1b181bd3432eb040cf3b4ae3ed9ac2f28c 50092950f52a4e3bfd961dff4ffd8a719ef66ca1a0914bd33e26fed538321999 lib/codeql/rust/elements/TypeRepr.qll ea41b05ef0aaac71da460f9a6a8331cf98166f2c388526068ddacbd67488c892 11a01e42dab9183bac14de1ca49131788ede99e75b0ef759efcbc7cf08524184 lib/codeql/rust/elements/UnderscoreExpr.qll 233661b82b87c8cda16d8f2e17965658c3dc6b69efb23cb8eb9c4f50c68521e0 8edff8e80aac2ecf83a6b58f310cab688cbaeea0a0e68a298b644e565960cc74 lib/codeql/rust/elements/Unextracted.qll 12e60c79ef5b94d72b579b19970622e7b73822ebc13fbcfedfe953527ab1ac36 ec015db2eb12c3c82693ddc71d32d9ab9ef7a958e741e2510681bb707ceca23e lib/codeql/rust/elements/Unimplemented.qll bf624d28163e5c99accda16c0c99f938bec4a3b1b920a463e86fc8529ff5ff02 013bc7777298d250338f835cd494b5a8accea2d6a4f9561851f283ac129a446b -lib/codeql/rust/elements/Union.qll 13f7f62e98b117d18e79db5f6e6535447bc069ebb08f7cdb390b012678b7e085 bd8c37bc0ff09926753bc250e1848ed25923f224829d0136afc27b749eaddd1f +lib/codeql/rust/elements/Union.qll e23ca528f8573e77dfa7eca71457e2022c92f22292ce84d021d304e52820ee66 eed20ac3797faaa248bc47ef81fa79a5d5c372b4c6289a075d041a84dd8bd6f4 lib/codeql/rust/elements/Use.qll fdcf70574403c2f219353211b6930f2f9bc79f41c2594e07548de5a8c6cbb24d e41f2b689fcbeb7b84c7ba8d09592f7561626559318642b73574bbac83f74546 lib/codeql/rust/elements/UseBoundGenericArg.qll f16903f8fff676d3700eaad5490804624391141472ecc3166ccb1f70c794c120 5efda98088d096b42f53ceccae78c05f15c6953525b514d849681cb2cf65b147 lib/codeql/rust/elements/UseBoundGenericArgs.qll 841913cfbb84de14aab1820a5433eae978bbadbb8e6d413b8ba70780c7328335 c9ec9d086cff91d15c3aea64f1080b22b41cdaf64e3c8b192aaaec17604a5d10 @@ -191,7 +190,6 @@ lib/codeql/rust/elements/YeetExpr.qll 4172bf70de31cab17639da6eed4a12a7afcefd7aa9 lib/codeql/rust/elements/YieldExpr.qll de2dc096a077f6c57bba9d1c2b2dcdbecce501333753b866d77c3ffbe06aa516 1f3e8949689c09ed356ff4777394fe39f2ed2b1e6c381fd391790da4f5d5c76a lib/codeql/rust/elements/internal/AbiConstructor.qll 4484538db49d7c1d31c139f0f21879fceb48d00416e24499a1d4b1337b4141ac 460818e397f2a1a8f2e5466d9551698b0e569d4640fcb87de6c4268a519b3da1 lib/codeql/rust/elements/internal/AbiImpl.qll 28a2b6bdb38fd626e5d7d1ed29b839b95976c3a03717d840669eb17c4d6f0c7a 8e83877855abe760f3be8f45c2cf91c1f6e810ec0301313910b8104b2474d9cf -lib/codeql/rust/elements/internal/AdtImpl.qll 2dc727a14a0fc775512d35e224eab7955884ec143dbd7dbf4cada9a1f5516df4 f3991cea544c5537b0a810492979a317b47685e1c0e58b948df2a957c7a18fdc lib/codeql/rust/elements/internal/ArgListConstructor.qll a73685c8792ae23a2d628e7357658efb3f6e34006ff6e9661863ef116ec0b015 0bee572a046e8dfc031b1216d729843991519d94ae66280f5e795d20aea07a22 lib/codeql/rust/elements/internal/ArgListImpl.qll 0903b2ca31b3e5439f631582d12f17d77721d63fdb54dc41372d19b742881ce4 2c71c153ccca4b4988e6a25c37e58dc8ecb5a7483273afff563a8542f33e7949 lib/codeql/rust/elements/internal/ArrayExprInternal.qll 07a219b3d3fba3ff8b18e77686b2f58ab01acd99e0f5d5cad5d91af937e228f5 7528fc0e2064c481f0d6cbff3835950a044e429a2cd00c4d8442d2e132560d37 @@ -235,7 +233,6 @@ lib/codeql/rust/elements/internal/AwaitExprConstructor.qll 44ff1653e73d5b9f6885c lib/codeql/rust/elements/internal/BecomeExprConstructor.qll ba073aaa256cb8827a0307c3128d50f62b11aac0b1f324e48c95f30351a9b942 3a787ded505c3158fa4f4923f66e8ecdcb7b5f86f27f64c5412dc32dca031f18 lib/codeql/rust/elements/internal/BinaryExprConstructor.qll 7f9b17757f78b9fb7c46e21d2040a77fa50083bef4911c8464991c3d1ad91d87 a59390cd8e896c0bfbdc9ba0674e06d980ffcefa710fbc9886be52ed427e9717 lib/codeql/rust/elements/internal/BlockExprConstructor.qll 438337c807645e98a01440f3f4610d68b0567ba15c8f51dc43bf5a30c9af3696 48ce7a546910c884619762349b8ada9836284f8008298fdb0070a38f7ddf25a0 -lib/codeql/rust/elements/internal/BlockExprImpl.qll 36ac09e4a6eeeec22919b62b1d004bdb5bb2527e67932c308aec383a770768d6 3b4b2a2014f6fe075c63a2d633b297566b548ef2e4343cadf067a9edbcadc876 lib/codeql/rust/elements/internal/BoxPatConstructor.qll 153f110ba25fd6c889092bfd16f73bb610fa60d6e0c8965d5f44d2446fcd48a2 9324cf0d8aa29945551bf8ab64801d598f57aab8cd4e19bcd4e9ef8a4a4e06eb lib/codeql/rust/elements/internal/BreakExprConstructor.qll 356be043c28e0b34fdf925a119c945632ee883c6f5ebb9a27003c6a8d250afd9 bb77e66b04bb9489340e7506931559b94285c6904b6f9d2f83b214cba4f3cfd5 lib/codeql/rust/elements/internal/CallExprConstructor.qll 742b38e862e2cf82fd1ecc4d4fc5b4782a9c7c07f031452b2bae7aa59d5aa13a cad6e0a8be21d91b20ac2ec16cab9c30eae810b452c0f1992ed87d5c7f4144dc @@ -407,7 +404,7 @@ lib/codeql/rust/elements/internal/TupleExprConstructor.qll 71c38786723225d3d9039 lib/codeql/rust/elements/internal/TupleExprImpl.qll daabbc7dd36c615cdd8d3b59e06f4992a302b26554115711f733508836887abe 4c43a26e5f8b68d9d032bb5cd0af88cf9ac9b4b4e40af47dc85dd931ce9db6f8 lib/codeql/rust/elements/internal/TupleFieldConstructor.qll 89d3cf2540235044ed5a89706cfbdebc5cdf9180fd5b6d3376c79a1b2c0430c0 16861fe089aac8e42a5a90d81dd48d5015391d0a06c78ca02bd876d65378699f lib/codeql/rust/elements/internal/TupleFieldListConstructor.qll 4335ba2061b6e4968db9ec05c0b4d3e6a564db89a2df69e036f317672a7900b1 0b8dded875dbf696cf588e8c21acc27332a2ff66ced7bfabdfc1ad621991f888 -lib/codeql/rust/elements/internal/TupleFieldListImpl.qll 74869e92a3cbdd7895adaaa418d29d5e97387daf46c17315f219ad967af15d76 5815e4b37db958663df1f6fedc9667a11b261c9c2133e3f983a3aedc452c01fc +lib/codeql/rust/elements/internal/TupleFieldListImpl.qll 2e5141d5894d1cebadef9cd3afe7585779327c4e24390201e1ef05a29401caf8 bbfa1e0b513393012bf2ae43a3aa0e33fce6ea4d110d1be0f039562071f3c547 lib/codeql/rust/elements/internal/TuplePatConstructor.qll 2a5e83ad5b8713a732e610128aeddf14e9b344402d6cf30ff0b43aa39e838418 6d467f7141307523994f03ed7b8e8b1a5bcf860963c9934b90e54582ea38096a lib/codeql/rust/elements/internal/TupleStructPatConstructor.qll 9d68f67a17a5cec0e78907a53eccfa7696be5b0571da4b486c8184274e56344a 3ffa29f546cd6c644be4fecc7415477a3a4dc00d69b8764be9119abe4c6d8b9e lib/codeql/rust/elements/internal/TupleTypeReprConstructor.qll 80c31c25fd27e330690fb500d757a4bbd33f226186d88ea73bfe4cf29a7db508 d572a72fa361990a3d0a3f9b81d1e966e2ba1ac0a60314ec824c1b8b2814c857 @@ -417,6 +414,7 @@ lib/codeql/rust/elements/internal/TypeArgConstructor.qll 51d621e170fdf5f91497f8c lib/codeql/rust/elements/internal/TypeArgImpl.qll 77886af8b2c045463c4c34d781c8f618eec5f5143098548047730f73c7e4a34a 6be6c519b71f9196e0559958e85efe8a78fbce7a90ca2401d7c402e46bc865c9 lib/codeql/rust/elements/internal/TypeBoundConstructor.qll ba99616e65cf2811187016ff23e5b0005cfd0f1123622e908ff8b560aaa5847f fde78432b55b31cf68a3acb7093256217df37539f942c4441d1b1e7bf9271d89 lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll 4b634b3a4ca8909ce8c0d172d9258168c5271435474089902456c2e3e47ae1c5 3af74623ced55b3263c096810a685517d36b75229431b81f3bb8101294940025 +lib/codeql/rust/elements/internal/TypeItemImpl.qll e439593cfbf8fb647b69151b7a0ef2b60b7dfa4603d1a0d911b0f924997acd0c 72caab93da71a88df1c0890ae70e866dc607ce61b177243ee60afa555881c72b lib/codeql/rust/elements/internal/TypeParamConstructor.qll a6e57cccd6b54fa68742d7b8ce70678a79ac133ea8c1bfa89d60b5f74ad07e05 0e5f45d250d736aaf40387be22e55288543bdb55bbb20ecb43f2f056e8be8b09 lib/codeql/rust/elements/internal/TypeReprImpl.qll 504b137313407be57c93fe0acee31716a02f91e23ce417e7c67bae2ae9937564 28fa8b680d5cd782c5c5fb048a9deb9b9debd196e3bc7df1129843e61eb342ea lib/codeql/rust/elements/internal/UnderscoreExprConstructor.qll 8dc27831adb49c1a47b9f8997d6065e82b4e48e41e3c35bd8d35255cea459905 6c5a5272d37f83f1c1b17475f8adb7d867e95025d201320e20a32dab1f69f7bf @@ -435,7 +433,6 @@ lib/codeql/rust/elements/internal/VariantConstructor.qll 0297d4a9a9b32448d6d6063 lib/codeql/rust/elements/internal/VariantListConstructor.qll c841fb345eb46ea3978a0ed7a689f8955efc9178044b140b74d98a6bcd0c926a c9e52d112abdba2b60013fa01a944c8770766bf7368f9878e6b13daaa4eed446 lib/codeql/rust/elements/internal/VariantListImpl.qll 4ceeda617696eb547c707589ba26103cf4c5c3d889955531be24cbf224e79dff 4258196c126fd2fad0e18068cb3d570a67034a8b26e2f13f8223d7f1a246d1a4 lib/codeql/rust/elements/internal/VisibilityConstructor.qll 1fd30663d87945f08d15cfaca54f586a658f26b7a98ea45ac73a35d36d4f65d0 6ddaf11742cc8fbbe03af2aa578394041ae077911e62d2fa6c885ae0543ba53a -lib/codeql/rust/elements/internal/VisibilityImpl.qll 85c1e75d6a7f9246cfef5c261e2aea40891c016724de49b3d6632623ccc30dcf 278be4648a8aefb0d926480c4d98e1605196ad64d1e4dbad42aa58499e6d485d lib/codeql/rust/elements/internal/WhereClauseConstructor.qll 6d6f0f0376cf45fac37ea0c7c4345d08718d2a3d6d913e591de1de9e640317c9 ff690f3d4391e5f1fae6e9014365810105e8befe9d6b52a82625994319af9ffd lib/codeql/rust/elements/internal/WhereClauseImpl.qll 006e330df395183d15896e5f81128e24b8274d849fe45afb5040444e4b764226 ed5e8317b5f33104e5c322588dc400755c8852bbb77ef835177b13af7480fd43 lib/codeql/rust/elements/internal/WherePredConstructor.qll f331c37085792a01159e8c218e9ef827e80e99b7c3d5978b6489808f05bd11f8 179cad3e4c5aaaf27755891694ef3569322fcf34c5290e6af49e5b5e3f8aa732 @@ -448,7 +445,6 @@ lib/codeql/rust/elements/internal/YieldExprConstructor.qll 8cbfa6405acb151ee31cc lib/codeql/rust/elements/internal/YieldExprImpl.qll af184649a348ddd0be16dee9daae307240bf123ace09243950342e9d71ededd9 17df90f67dd51623e8a5715b344ccd8740c8fc415af092469f801b99caacb70d lib/codeql/rust/elements/internal/generated/Abi.qll f5a22afe5596c261b4409395056ce3227b25d67602d51d0b72734d870f614df3 06d1c242ccd31f1cc90212823077e1a7a9e93cd3771a14ebe2f0659c979f3dd1 lib/codeql/rust/elements/internal/generated/Addressable.qll 624c380d385af6563885417d1e8ecd5d9b7abf1435c0ab79a1b9a405387874a3 e2755dc2155d6f2bc0e2d54006da0e62ee359440592db9d6a8b73202ef28e64f -lib/codeql/rust/elements/internal/generated/Adt.qll 155f4025a26c3d2d5d3c42dfce9274a10f0862ea0574843c5d276179de421569 17138b271eea81d3ee2697c82cccfd7af752cd18cd925dd5fa20d7fce0e2432f lib/codeql/rust/elements/internal/generated/ArgList.qll e41f48258082876a8ceac9107209d94fdd00a62d2e4c632987a01a8394c4aff6 bf1982d14f8cd55fa0c3da2c6aab56fc73b15a3572ffc72d9a94f2c860f8f3b7 lib/codeql/rust/elements/internal/generated/ArrayExpr.qll 73806a0de8168b38a9436fa6b8c6d68c92eeab3d64a1ae7edfff82f871929992 7ad998cdd8f4fed226473517ad7a5765cb35608033047aad53bf8aa3969fd03b lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll 67a7b0fae04b11cf771727ff39a123fb2d5ce6e2d650d32478fcb33a26ed5688 15833405fa85f6abe0e5146dac283cb5a142a07f08300ccc15a1dae30ed88942 @@ -480,8 +476,7 @@ lib/codeql/rust/elements/internal/generated/BinaryExpr.qll 64e9bd9c571edd6e5f3e7 lib/codeql/rust/elements/internal/generated/BlockExpr.qll 5a5ddbe34bc478a7bd9b0d07d3b6f017c2d1f20581d859251a963314e6514d1f 9804c30b8b279038b864c52557535f854bd012bacdfe8e5840f1f777c74e52df lib/codeql/rust/elements/internal/generated/BoxPat.qll 597bed52f7489e0addce3266f7bee5be7c53d2d1263eceec3a252d041ca0908f b8ccf363ca5f1a988547caf1fd266a55aec7cbf8623578deea99765d264b0151 lib/codeql/rust/elements/internal/generated/BreakExpr.qll 0f428a8b2f4209b134c2ffc3e1c93c30bc6b0e9c9172f140cefa88c1f77d8690 957b39f38ff6befe9061f55bc0b403c2f1c366dd0cf63b874bae6f8216576d76 -lib/codeql/rust/elements/internal/generated/CallExpr.qll f1b8dae487077cc9d1dccf8c3cd61fd17afe860585f17ce8b860be4859be7ca4 6034fc03778e38802cdf3a6e460364b74e92912622581b31e6179951022bbbd6 -lib/codeql/rust/elements/internal/generated/CallExprBase.qll 2268e01d65015014c05166161bb28e5a1e78164d525ca16fc1e3106866cf231d b2f9b912153ba4d3e3612df4f74ac0e83077c31d5b31383bd277974081417a56 +lib/codeql/rust/elements/internal/generated/CallExpr.qll 6096035ba2ef1ce3e6254d5b8497dcb6cd7570253423c778a9dd7e158f928644 e56caf9ba094ddfc4952ed5072c5f6f139db8029fa6bd6328d1a118e96a1d5fe lib/codeql/rust/elements/internal/generated/Callable.qll 12368b998c771c6b80f54123cea4d3600af7432ab34c9e571bc0bf3894ceb17e 273a9fd9cdae56cf2edbdc9c49b15da49cd5ad04be70acbbe2475c9c50200183 lib/codeql/rust/elements/internal/generated/CastExpr.qll ddc20054b0b339ad4d40298f3461490d25d00af87c876da5ffbc6a11c0832295 f4247307afcd74d80e926f29f8c57e78c50800984483e6b6003a44681e4a71f3 lib/codeql/rust/elements/internal/generated/ClosureExpr.qll 818aff75d86821c670d8ba0720c3270681b3e070140a9c41beab2a811b43eee6 9bf2d1d38f6c4a99d7c058f8ed096141f5ba6a75d2d26a464f0d65ed4e554222 @@ -494,7 +489,7 @@ lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83 lib/codeql/rust/elements/internal/generated/Crate.qll 37f3760d7c0c1c3ca809d07daf7215a8eae6053eda05e88ed7db6e07f4db0781 649a3d7cd7ee99f95f8a4d3d3c41ea2fa848ce7d8415ccbac62977dfc9a49d35 lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll b2e0e728b6708923b862d9d8d6104d13f572da17e393ec1485b8465e4bfdc206 4a87ea9669c55c4905ce4e781b680f674989591b0cb56af1e9fa1058c13300b3 lib/codeql/rust/elements/internal/generated/Element.qll d56d22c060fa929464f837b1e16475a4a2a2e42d68235a014f7369bcb48431db 0e48426ca72179f675ac29aa49bbaadb8b1d27b08ad5cbc72ec5a005c291848e -lib/codeql/rust/elements/internal/generated/Enum.qll 477eaa102c1268f0fa7603ecd88f1b83db1388c17c25e3719d4113ea980256f7 2d60db61ba4a385218f0a01e366e04ba1e7dad386b7e6a027c31f32fb730cca2 +lib/codeql/rust/elements/internal/generated/Enum.qll 3ed69005ab7cf68745a67cc9891bd68a83f6ab927febf077de9e4092cb373b0b 604fd03d1c46884b3c93e5bff3951ec41593320e1f7382c1a7143a64063827bc lib/codeql/rust/elements/internal/generated/Expr.qll 5fa34f2ed21829a1509417440dae42d416234ff43433002974328e7aabb8f30f 46f3972c7413b7db28a3ea8acb5a50a74b6dd9b658e8725f6953a8829ac912f8 lib/codeql/rust/elements/internal/generated/ExprStmt.qll d1112230015fbeb216b43407a268dc2ccd0f9e0836ab2dca4800c51b38fa1d7d 4a80562dcc55efa5e72c6c3b1d6747ab44fe494e76faff2b8f6e9f10a4b08b5b lib/codeql/rust/elements/internal/generated/ExternBlock.qll e7faac92297a53ac6e0420eec36255a54f360eeb962bf663a00da709407832dd 5ff32c54ec7097d43cc3311492090b9b90f411eead3bc849f258858f29405e81 @@ -552,7 +547,7 @@ lib/codeql/rust/elements/internal/generated/MatchArmList.qll 12d969ecb267a749918 lib/codeql/rust/elements/internal/generated/MatchExpr.qll b686842e7000fd61e3a0598bf245fb4e18167b99eca9162fdfdff0b0963def22 00f1743b1b0f1a92c5a687f5260fda02d80cc5871694cad0d5e7d94bac7fe977 lib/codeql/rust/elements/internal/generated/MatchGuard.qll 58fa1d6979ef22de2bd68574c7ffcf4a021d7543445f68834d879ff8cee3abcb 072f22a7929df3c0e764b2a770b4cdf03504b3053067d9b9008d6655fb5837e1 lib/codeql/rust/elements/internal/generated/Meta.qll 15e98e8d38f5618b7053057a629b135aae5e105fbf72731833a644fb695244c0 2977b6a0781c89383e87c595b14a39851f27b2508296f3e77466eea44c916188 -lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll 0cd0f84147e5f3887d609cc58246eb493d3461aee00ff37e7d26282c835f73af 6f4c5dc1decbce54fc12300d34798b890a85129208b25565130205c9d8ee2e29 +lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll ffce98a6a1921822b12ead721cff0878553eb3e049c5d2184a7abce32b6615b4 d1408a0f47ee5764fe7b484494daf6e1f99b1c6a505274c48545b3e650ef8baf lib/codeql/rust/elements/internal/generated/Missing.qll 16735d91df04a4e1ae52fae25db5f59a044e540755734bbab46b5fbb0fe6b0bd 28ca4e49fb7e6b4734be2f2f69e7c224c570344cc160ef80c5a5cd413e750dad lib/codeql/rust/elements/internal/generated/Module.qll ebae5d8963c9fd569c0fbad1d7770abd3fd2479437f236cbce0505ba9f9af52c fa3c382115fed18a26f1a755d8749a201b9489f82c09448a88fb8e9e1435fe5f lib/codeql/rust/elements/internal/generated/Name.qll e6bd6240a051383a52b21ab539bc204ce7bcd51a1a4379e497dff008d4eef5b4 578a3b45e70f519d57b3e3a3450f6272716c849940daee49889717c7aaa85fc9 @@ -567,7 +562,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47e lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 -lib/codeql/rust/elements/internal/generated/ParentChild.qll f04ca3d02170f7e532a480cc81748cf04f1b022d5e0e32ffcdf0f15c8f1961aa 999104d69a5435c9cab594e04b82ed26ae38b1b1d2ac1dbbb315a433c586f941 +lib/codeql/rust/elements/internal/generated/ParentChild.qll 2a7dd6ec90e4d557b36704a04bb9eb4191469126f960c52827e12c90e51c5343 37781e023a93982be30c9d80aee7c6d87d52cc934705db66f838604563391f95 lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd @@ -582,7 +577,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 14758dc2e2a9af251f24e24516eab0fc95d334c1da06f418ea5da3c5521642c9 a8b6637f57293a85714cc8761f8fd1e23780d58f3873acaa3c77acd9cbfcf19f +lib/codeql/rust/elements/internal/generated/Raw.qll 22bb3aa871d1dcac60bfa46393da911f95467065e52bb78981d17469c7854c93 3ccc518319d79f3c8d9e9901a5665ab4c889253781edf76fcbc3de64dff91069 lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -598,7 +593,7 @@ lib/codeql/rust/elements/internal/generated/SourceFile.qll 4bc95c88b49868d1da1a8 lib/codeql/rust/elements/internal/generated/Static.qll 1a6c87d3c5602e3d02268ebe2463a4ac64614ad25e8966a9bdb9c0ef58991365 cc1fe16d70cdce41a12e41a8f80cc38bdd7efa49c1544e35342fcf3cd26b8219 lib/codeql/rust/elements/internal/generated/Stmt.qll 8473ff532dd5cc9d7decaddcd174b94d610f6ca0aec8e473cc051dad9f3db917 6ef7d2b5237c2dbdcacbf7d8b39109d4dc100229f2b28b5c9e3e4fbf673ba72b lib/codeql/rust/elements/internal/generated/StmtList.qll 834b87cd93f0c5b41736fb52a6c25fd0e3bdce41d5a64cb3d0810c54e90507f4 ec42f2dfa322044ceaaf90d278f0e7e751d63710facbaf3f5ee69ca3c64ecd06 -lib/codeql/rust/elements/internal/generated/Struct.qll 999da1b46e40d6e03fd2338fea02429462877c329c5d1338618cbd886a81567e daa7ff7bd32c554462e0a1502d8319cb5e734e056d0564e06596e416e2b88e9d +lib/codeql/rust/elements/internal/generated/Struct.qll 56775b98f793c108bd0eb8f35dbbc4983c170138e92c7378c24f45d2e612ca39 7bd83f2686f2f7a6b55b82156028c1951fde4c3ac9fc0248b1bb28f35b949fd4 lib/codeql/rust/elements/internal/generated/StructExpr.qll e77702890561102af38f52d836729e82569c964f8d4c7e680b27992c1ff0f141 23dc51f68107ab0e5c9dd88a6bcc85bb66e8e0f4064cb4d416f50f2ba5db698c lib/codeql/rust/elements/internal/generated/StructExprField.qll 6bdc52ed325fd014495410c619536079b8c404e2247bd2435aa7685dd56c3833 501a30650cf813176ff325a1553da6030f78d14be3f84fea6d38032f4262c6b0 lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll 298d33442d1054922d2f97133a436ee559f1f35b7708523284d1f7eee7ebf443 7febe38a79fadf3dcb53fb8f8caf4c2780f5df55a1f8336269c7b674d53c6272 @@ -607,7 +602,7 @@ lib/codeql/rust/elements/internal/generated/StructFieldList.qll 5da528a51a6a5db9 lib/codeql/rust/elements/internal/generated/StructPat.qll c76fa005c2fd0448a8803233e1e8818c4123301eb66ac5cf69d0b9eaafc61e98 6e0dffccdce24bca20e87d5ba0f0995c9a1ae8983283e71e7dbfcf6fffc67a58 lib/codeql/rust/elements/internal/generated/StructPatField.qll 5b5c7302dbc4a902ca8e69ff31875c867e295a16a626ba3cef29cd0aa248f179 4e192a0df79947f5cb0d47fdbbba7986137a6a40a1be92ae119873e2fad67edf lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll 1a95a1bd9f64fb18e9571657cf2d02a8b13c747048a1f0f74baf31b91f0392ad fc274e414ff4ed54386046505920de92755ad0b4d39a7523cdffa4830bd53b37 -lib/codeql/rust/elements/internal/generated/Synth.qll a8ea364358a2bc3a9226d451c0867e89c29509a0f54dd88ed23c77045db2c85a a44de5e84a63cb5a1bfa66b0df33bf28c9f8b6628393d0f3b2f6215dabee47bd +lib/codeql/rust/elements/internal/generated/Synth.qll 00f19e9d0a03b9d8e42caceda06da69d67280be16f67f3459f0adec8f9f8cacd ebcc049fe946540277893bf095787c061cd119c9d4eb708cec9df93257780e8d lib/codeql/rust/elements/internal/generated/SynthConstructors.qll f41abfc73415b7accb38da7c107faebfe6843c270ad54e0e54a96e930dfe479a f41abfc73415b7accb38da7c107faebfe6843c270ad54e0e54a96e930dfe479a lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b lib/codeql/rust/elements/internal/generated/TokenTree.qll 1a3c4f5f30659738641abdd28cb793dab3cfde484196b59656fc0a2767e53511 de2ebb210c7759ef7a6f7ee9f805e1cac879221287281775fc80ba34a5492edf @@ -615,8 +610,8 @@ lib/codeql/rust/elements/internal/generated/Trait.qll 8fa41b50fa0f68333534f2b66b lib/codeql/rust/elements/internal/generated/TraitAlias.qll 40a296cf89eceaf02a32db90acb42bdc90df10e717bae3ab95bc09d842360a5b af85cf1f8fa46a8b04b763cdcacc6643b83c074c58c1344e485157d2ceb26306 lib/codeql/rust/elements/internal/generated/TryExpr.qll 73052d7d309427a30019ad962ee332d22e7e48b9cc98ee60261ca2df2f433f93 d9dd70bf69eaa22475acd78bea504341e3574742a51ad9118566f39038a02d85 lib/codeql/rust/elements/internal/generated/TupleExpr.qll 98f10bc72d09f98e3be87f41b1a3cbf037f4a7e3d3560dfa6d5759905a8177a5 6a9eb5568c518876b2912371e2b7b774cf5245097c5a0206eda35b749995f00b -lib/codeql/rust/elements/internal/generated/TupleField.qll d546b4e0c1a0b243c2bf88b371377cf9a396ca497cd5e78915e0e552910b6093 c0a754d15e0de590ee15139d8d366e4d7e4d33882c943e6ea8fa5fa8dce790e3 -lib/codeql/rust/elements/internal/generated/TupleFieldList.qll fb76d1a395326361859177c05e90e5bbb22d37518758752e9d89906006fb683e f31508b120c36f569cc7dcae06c9e55cf875abfb2fbe54a64ec12d8b3d2db108 +lib/codeql/rust/elements/internal/generated/TupleField.qll 121f7b35e28b86592f83e00993f9041acbe7ab636db894d03055149c7f15fd32 b1ba9e1182307a44bb5afc11e92d62e7eb2c819ccdfb28ef54943b6fec676827 +lib/codeql/rust/elements/internal/generated/TupleFieldList.qll e7874518ce353f58312b02fb646f19eb109b3d868f8b550c84b7d6fc3a85fd5a f4bff793bbdbc252688296953116146f5c9a0894e14a7d3e4883a5ac211c122f lib/codeql/rust/elements/internal/generated/TuplePat.qll 4e13b509e1c9dd1581a9dc50d38e0a6e36abc1254ea9c732b5b3e6503335afeb 298028df9eb84e106e625ed09d6b20038ad47bfc2faf634a0ffea50b17b5805d lib/codeql/rust/elements/internal/generated/TupleStructPat.qll 6539d0edbdc16e7df849514d51980d4cd1a2c9cbb58ca9e5273851f96df4eb36 45a13bae5220d5737cbd04713a17af5b33d8bb4cfdf17ddd64b298ab0c1eea24 lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll 1756cdbad56d634bf4726bc39c768386754e62650492d7d6344012038236a05b 3ac0997a47f95f28cc70c782173ce345fcb5b073be10f3c0b414d1df8443e04c @@ -624,12 +619,13 @@ lib/codeql/rust/elements/internal/generated/TypeAlias.qll 0d0c97d9e9213b8f0390b3 lib/codeql/rust/elements/internal/generated/TypeArg.qll 80245e4b52bef30e5033d4c765c72531324385deea1435dc623290271ff05b1d 097926e918dcd897ea1609010c5490dbf45d4d8f4cffb9166bcadf316a2f1558 lib/codeql/rust/elements/internal/generated/TypeBound.qll ed27681b76b8f3ad790daad4a08f3bc243452821246bcb240b1d925bc1c362a3 8fdc0caf91f1894d8711d68547185eb029446898b66f60fc0d10ef862cd6292e lib/codeql/rust/elements/internal/generated/TypeBoundList.qll c5d43dc27075a0d5370ba4bc56b4e247357af5d2989625deff284e7846a3a48b c33c87d080e6eb6df01e98b8b0031d780472fcaf3a1ed156a038669c0e05bf0a +lib/codeql/rust/elements/internal/generated/TypeItem.qll 940b197a06b11621db980ae8ff8c0c6684cebeff62987ad8267f3838aa768d0a ab0e3b6e23acd1970ea4e2a32bef3cced27072ec9c5d16428626ec2632b33d14 lib/codeql/rust/elements/internal/generated/TypeParam.qll 81a8d39f1e227de031187534e5d8e2c34f42ad3433061d686cadfbdd0df54285 893795d62b5b89997574e9057701d308bea2c4dca6053042c5308c512137e697 lib/codeql/rust/elements/internal/generated/TypeRepr.qll 1e7b9d2ddab86e35dad7c31a6453a2a60747420f8bc2e689d5163cab4fec71bb eb80e3947649e511e7f3555ffc1fd87199e7a32624449ca80ffad996cdf9e2f3 lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll b3780c99c5d57159bef4c6bd2fd8ec44ebd1854c892c1ca776c740f71249e58c 2fd451cbf0a779e8042e439882e7d9cadc19d1e596df3bbb086d16f2596407c7 lib/codeql/rust/elements/internal/generated/Unextracted.qll 01563dfd769d6dc3c6b8a40d9a4dc0d99a3b6a0c6725c180d2bf4d7633929a17 a93ce90f8c03f4305e59de9c63f089fc7935298fc9a73d091d76933cf63e790c lib/codeql/rust/elements/internal/generated/Unimplemented.qll a3eb304781991bff1227de1e4422b68bf91e7b344e4f6c9e874b324e82a35e60 6bc4839fda3850a56dc993b79ef9ba921008395c8432b184e14438fba4566f21 -lib/codeql/rust/elements/internal/generated/Union.qll 456504e6a32991ba17ca65f97636f4dfb86c758c7f8509aaca1b0d0432231dfe c96068edfec3e0755a7726426a10996455ee9f0f2d678af258719f1943a3063e +lib/codeql/rust/elements/internal/generated/Union.qll 4df8fc632f7bcc0cbd564cd1c148c1a2438f26e6a83cd6470e15870120f677fe c74dea0a4ddfd581b9208d7907ea134219cafd217294315acf5c595de38a61f3 lib/codeql/rust/elements/internal/generated/Use.qll cf95b5c4756b25bee74113207786e37464ffbc0fb5f776a04c651300afc53753 1fe26b3904db510184cb688cb0eeb0a8dbac7ac15e27a3b572d839743c738393 lib/codeql/rust/elements/internal/generated/UseBoundGenericArg.qll 69162794e871291545ea04f61259b2d000671a96f7ca129f7dd9ed6e984067c4 31de9ebc0634b38e2347e0608b4ea888892f1f2732a2892464078cd8a07b4ee8 lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll cedde7ccf689e3a2a246113be94544c206c56fb1c01b83b074e1f6edd3acfced f022ea4c653d1b5f311917efde8e59be27394ce7f6abf2561bb1e42f93f74adf @@ -644,7 +640,7 @@ lib/codeql/rust/elements/internal/generated/WhileExpr.qll 0353aab87c49569e1fbf58 lib/codeql/rust/elements/internal/generated/WildcardPat.qll d74b70b57a0a66bfae017a329352a5b27a6b9e73dd5521d627f680e810c6c59e 4b913b548ba27ff3c82fcd32cf996ff329cb57d176d3bebd0fcef394486ea499 lib/codeql/rust/elements/internal/generated/YeetExpr.qll cac328200872a35337b4bcb15c851afb4743f82c080f9738d295571eb01d7392 94af734eea08129b587fed849b643e7572800e8330c0b57d727d41abda47930b lib/codeql/rust/elements/internal/generated/YieldExpr.qll 37e5f0c1e373a22bbc53d8b7f2c0e1f476e5be5080b8437c5e964f4e83fad79a 4a9a68643401637bf48e5c2b2f74a6bf0ddcb4ff76f6bffb61d436b685621e85 -lib/codeql/rust/elements.qll d3beb3a35f2b5ea47d60aeefd86fb0d6406dd0a1b7cd89aecbb2732b4e72da38 d3beb3a35f2b5ea47d60aeefd86fb0d6406dd0a1b7cd89aecbb2732b4e72da38 +lib/codeql/rust/elements.qll 47adb2b43274ce791299d1e94299e560f392f75d2cc4d4ace02e29f31a7db4af 47adb2b43274ce791299d1e94299e560f392f75d2cc4d4ace02e29f31a7db4af test/extractor-tests/generated/Abi/Abi.ql 086ed104ab1a7e7fe5c1ed29e03f1719a797c7096c738868bf6ebe872ab8fdaa fe23fe67ab0d9201e1177ea3f844b18ed428e13e3ce77381bf2b6910adfa3a0e test/extractor-tests/generated/ArgList/ArgList.ql da97b5b25418b2aa8cb8df793f48870c89fa00759cdade8ddba60d7f1f4bbc01 acfd5d2caf67282ad2d57b961068472100482d0f770a52a3c00214c647d18c75 test/extractor-tests/generated/ArrayListExpr/ArrayListExpr.ql 42b365276aa43e2cad588338463542d3ce1dd0db3a428621554584b07a1431d5 08a66a8b69af35ee3bc64c35c453a19a6c9881cc6cc7e65275d1fff056121270 @@ -670,7 +666,7 @@ test/extractor-tests/generated/BinaryExpr/BinaryExpr.ql 4e849e6eaae581f487aa74d0 test/extractor-tests/generated/BlockExpr/BlockExpr.ql cd6ef66de9e56ebb74964e59617d47999fb8c9081e885acece17a3b747a35ae1 6766844c1b87e518688565f2469575af5ca4e0ff4eb0c0b620df73a451d86a0b test/extractor-tests/generated/BoxPat/BoxPat.ql 854c9ba4e045dbe7ea1666866c1c443a92597df0ce02f4ca5993142925941c39 a22c17cce0bff7d1df51b817d2cb1a61045357f91be14465166971efa5f5daad test/extractor-tests/generated/BreakExpr/BreakExpr.ql c2181211da3dfe983cfca93ead32d5d211e91181899b9477152c58124eaa846d 57e57b926e14db2efb2e88e04699608b2ba9797ee4f6c4f710135b6858982256 -test/extractor-tests/generated/CallExpr/CallExpr.ql 2a1cd4485ccd8d4eb24a75889e832612adef9bb7feae414c90572796380bc6d7 95060b92aa04d7ad1fc6603c5ec14a275a5788ecb5a19932732e28105607a3b7 +test/extractor-tests/generated/CallExpr/CallExpr.ql 16d85d6e5cb68384d0b932fb4506c1855019b819f2c5faa39a4472f39427623a 14df8383948cedaff88f514f7239c1ec8c424720d24e3546cbcd0b689acecdb1 test/extractor-tests/generated/CastExpr/CastExpr.ql 3480ec51072399409b7553ab6139c832db6ed4ca991f3a7a2282a39afe07c6f2 614c8ea7a2fe30d57583dbf84ed7a12743c2aba49d8c6252d31af3ed10853a39 test/extractor-tests/generated/ClosureExpr/ClosureExpr.ql 675ae07193241fbd710ece4f74f86e9b00f47841299b1c5934f55dbf13a4b4af 21fb0664619c9c889e9491bfd651c2814dcf0f158dd6269937bd0acc18be6b0e test/extractor-tests/generated/Comment/Comment.ql 0e0454911d2cf2e7ef5c6d860b84c57b9d490090914ebcf4fa0e8a70f777f066 cbd1c195276ef163f8d3c122344738c884dc9fb70eb2f9b7067829d735d48c4c @@ -681,7 +677,7 @@ test/extractor-tests/generated/ConstParam/ConstParam.ql 6facb2402e1cbf23d836f619 test/extractor-tests/generated/ContinueExpr/ContinueExpr.ql 58b5046a4da06a4cd2d942720603313126888b2249b218bef6f7c44ca469ccfa eeb84a04deb4c4496b7f9b38798cc7fdc179a486c8beaa0b33bf87e7f9482b1a test/extractor-tests/generated/Crate/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.ql ff54195d2e09424faaac4e145a40208bf0e57acc57dfa8247b3751862a317c4b 583d5b98aa31a9af6ad73df000ca529f57f67aa6daaa50ca5673a56eb57bf507 -test/extractor-tests/generated/Enum/Enum.ql 64ed7f25aaf5eff67687cd3aa2690017fb6f9651c959aed7b655d486be0e0c5b 1df131d8e12c4594715ed31191e960792c21727b403dce59207c514671e88d62 +test/extractor-tests/generated/Enum/Enum.ql 9a612c818952e867e2665d8c919905d563bb76191f3f522370c7344863589205 c32cf1973082f5d519e3eb04fca0309b3dd9637cf34e58c10a8e34cd9fe36d2d test/extractor-tests/generated/ExprStmt/ExprStmt.ql 7c62a97f7f910ae6e0e9aff7fdd78b369d21257ccab52afe6307ddea2e15dad1 2d32a366c4acbea3136ff1f9f9dadf76b148f82ad1d7170f02efd977d8a07ae9 test/extractor-tests/generated/ExternBlock/ExternBlock.ql b61e37f1c387bc91be127b5425089f9f1d687f4f1708cad334c0bb00dba5bae3 dc03f0f0912b2cfbce74c3bc31d261cdbea740847212ac3472ecf719d8eb71f7 test/extractor-tests/generated/ExternCrate/ExternCrate.ql 55d2d9d32cb5e894cc2ee5242d688aaa8428ba7757cccea67d1c064db6de2514 46a2c57660a42ee6eaa532b0c86f4cc2d3de795c33ee7cadbff650bd0f23206b @@ -729,7 +725,7 @@ test/extractor-tests/generated/MatchArmList/MatchArmList.ql bbc679fe6d8dedf9131d test/extractor-tests/generated/MatchExpr/MatchExpr.ql b75a5936401bb5ca38686f1413f5c8267ad685722560a2e9041dacf2f8d54abc 7da57118fe5b1f7f5cbe8d6b5f3ae70816fd4837b1c2e6401b98175b36ca233f test/extractor-tests/generated/MatchGuard/MatchGuard.ql 91de18a0a18d120db568b2c329e5cb26f83e327cf22c5825c555ea17249d7d23 0bcdb25895362128517227c860b9dad76851215c2cdf9b2d0e5cc3534278f4ec test/extractor-tests/generated/Meta/Meta.ql 43dd1cd669099b38396b316616992af6d84b0c1cee953b19235a00ab3d3bb43c 80b1885809aa074357e21707d1f8c6dca19f0b968ccff43229bb0d5c6fffb2b2 -test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql 05ca29fdab8ce600469728b964c369368e5097b2a5eb35b84a7630ef044ac6b6 aa45fdbb7fba8afee9f6cef10d337622429d3f0fb71f7fbf861afb4906bdef71 +test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql 9d5af6b4771a8725fa5b56ccb3e2a33158b18c876546b88e6dc63da1f887910a 494c8c2fe5584aac45c828b38d8bb20c113927a1e909773d4a2dbd3965d26170 test/extractor-tests/generated/Module/Module.ql d7c442fd1b1f4f00da87e2228fc1aeeab0bb86648b2aa06a9dd6f40dbae1ee28 3229388727d14048e87238bcda5fde1bed503e5cac088922381e5833cfc32fa9 test/extractor-tests/generated/Name/Name.ql b2fe417f7c816f71d12622b4f84ece74eba3c128c806266a55b53f8120fa4fb3 8bc65bbf3f2909637485f5db7830d6fc110a94c9b12eefe12d7627f41eae2256 test/extractor-tests/generated/NameRef/NameRef.ql 210a70e0957f3444195eed3a3dfbb5806e349238c0b390dc00597e6b8b05fcec d74fbce3c71aa7b08ae4cb646ccb114335767cb4fe000322f9dd371c1bb3784f @@ -765,7 +761,7 @@ test/extractor-tests/generated/SliceTypeRepr/SliceTypeRepr.ql a009f2ba47f3b082db test/extractor-tests/generated/SourceFile/SourceFile.ql 19ae5570a88b9e2d82db66685a31b01cc8e0c86c622a4bfaabe8c5b397b27eea 60e2ba5eb82518d6408254fb4ec01277b6c6c0e4316d4f3cdc809da9c32c4a57 test/extractor-tests/generated/Static/Static.ql ec2e5cf081453bbae16216d1250f5d8324be81d1d6ad8744e969934d2ef21b0d 7bde1afbafdc16f9c999e902626c77dc0efe3f1b3d687e9fe1a3e9db6b1f62a9 test/extractor-tests/generated/StmtList/StmtList.ql 4c6b9d5d8fd7535f97d81b968d4f67fc50e10c5d0f980e7c2704bbf5cd07481e ad972adb8d9a7892e6f8a12d96649340441f947afc99e633ea438c4d5c795ce4 -test/extractor-tests/generated/Struct/Struct.ql 846ef41cb4dfbe94f495fd68de26a68609e7b5ab0830d6ee844a67afea3ac591 6799a1246da45ecbf1f1040ffb7d1a5578ab9e236cce3029e6cc17c93b3bf138 +test/extractor-tests/generated/Struct/Struct.ql 57e837e3c665d24870d99492c8874441ce1445b314863ae405cc6f721d2ac14c ddeee05945e91356a1dc66976ef4830230b1c024ace02f974ff42c8193fd3464 test/extractor-tests/generated/StructExpr/StructExpr.ql 3b98205260e750cc7adc42b318deef2854cc3b4f921cbcfffc6d701553af3903 368bccf01db2fa069dca30d9fb0878f8e6a88d4ce58b333b24a18620933e4c91 test/extractor-tests/generated/StructExprField/StructExprField.ql b65375963aa24f0d1dd4c10784e32ab8c337ad431462ea1d081a0e456fbb1362 7f5a49e8df03ed0890b51c2e941d636fbbf70445a53d3af2c0f34a04f26bc6ef test/extractor-tests/generated/StructExprFieldList/StructExprFieldList.ql 01dc3ef66d79836a3d372464f05454015648ab093f9547c5d9c5d55271acb718 83625301c097fa38d4e6021ea28b8adc6338076c8c2aa88a86a22aac412839f6 @@ -791,7 +787,7 @@ test/extractor-tests/generated/TypeBound/TypeBound.ql 41d0a7b6538de12797c5aa4152 test/extractor-tests/generated/TypeBoundList/TypeBoundList.ql 6827529eca62f5e7be87538af6231099f5932f39d8694f7a76369273b93f28ea 539dac4ccda7e51b7ae1a9e05d8a56a98176d9de25d5ed4347ebe2fbea8adeb1 test/extractor-tests/generated/TypeParam/TypeParam.ql c5f8f62f2877c719c3cf069f9d0ca83cebc14f7611c6c2dce86c85114ea2635c 751c630986f35a8d0d32fbeb61ca6ff801c96cd1829dbccc874fbf5f5158e98d test/extractor-tests/generated/UnderscoreExpr/UnderscoreExpr.ql a7b7a93104fff28515154cf8e79045d3eea2494b5c46f1caf36639c53b1c64a7 070ee2e1664e3291646ea56681b5c93331f94dcc519deb28622beca3e26e16f3 -test/extractor-tests/generated/Union/Union.ql 71e367ea4b541ee4ae831c69d0dfa2d1ba0c2d3dd9e9aba770dd00fd1f546ef8 61dbc6364a9f486d0de8c27cacbb9d1027282d92f89058e93e2c376588d809f9 +test/extractor-tests/generated/Union/Union.ql 427757ef5aa4e95fde8f5047263cbbbc7e2614f9efabc51c9a5f9ba8d9b68310 d1d8840a4324e5727e1ecf6e696741e902b807b39ec82686b94211803eb2d0ba test/extractor-tests/generated/Use/Use.ql 1f084f3b49c910c6e01d2a81be2443e84c2836a5855b89874965efaf25d17511 d5bf37ba65f4d280312ca798bae22d2735c00cf91ff05ed6321f69b76b4551bc test/extractor-tests/generated/UseBoundGenericArgs/UseBoundGenericArgs.ql 46ff2cf0fc8b561b21f8dff3230550f2feafbe52a7ea8b28bf183abef94ff241 92646f3bd15a8cf4c23ee9de4d857ac5c147e570ef0eb223423a109b4b79aedf test/extractor-tests/generated/UseTree/UseTree.ql 3c2bc924b54b9af5c95784023d4098924571ba464c5982124acea712c3ce0e93 8d9f963b61a9a8a83efd93438ce8b43d4aa763493338ad9afd2a3dc7a440892d diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index bde61270e6a..dd6ca829eed 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -3,7 +3,6 @@ /lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll linguist-generated /lib/codeql/rust/elements/Abi.qll linguist-generated /lib/codeql/rust/elements/Addressable.qll linguist-generated -/lib/codeql/rust/elements/Adt.qll linguist-generated /lib/codeql/rust/elements/ArgList.qll linguist-generated /lib/codeql/rust/elements/ArrayExpr.qll linguist-generated /lib/codeql/rust/elements/ArrayListExpr.qll linguist-generated @@ -35,7 +34,6 @@ /lib/codeql/rust/elements/BoxPat.qll linguist-generated /lib/codeql/rust/elements/BreakExpr.qll linguist-generated /lib/codeql/rust/elements/CallExpr.qll linguist-generated -/lib/codeql/rust/elements/CallExprBase.qll linguist-generated /lib/codeql/rust/elements/Callable.qll linguist-generated /lib/codeql/rust/elements/CastExpr.qll linguist-generated /lib/codeql/rust/elements/ClosureExpr.qll linguist-generated @@ -171,6 +169,7 @@ /lib/codeql/rust/elements/TypeArg.qll linguist-generated /lib/codeql/rust/elements/TypeBound.qll linguist-generated /lib/codeql/rust/elements/TypeBoundList.qll linguist-generated +/lib/codeql/rust/elements/TypeItem.qll linguist-generated /lib/codeql/rust/elements/TypeParam.qll linguist-generated /lib/codeql/rust/elements/TypeRepr.qll linguist-generated /lib/codeql/rust/elements/UnderscoreExpr.qll linguist-generated @@ -193,7 +192,6 @@ /lib/codeql/rust/elements/YieldExpr.qll linguist-generated /lib/codeql/rust/elements/internal/AbiConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/AbiImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/AdtImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArgListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ArgListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayExprInternal.qll linguist-generated @@ -237,7 +235,6 @@ /lib/codeql/rust/elements/internal/BecomeExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BinaryExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BlockExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/BlockExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/BoxPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BreakExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CallExprConstructor.qll linguist-generated @@ -419,6 +416,7 @@ /lib/codeql/rust/elements/internal/TypeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TypeItemImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeParamConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnderscoreExprConstructor.qll linguist-generated @@ -437,7 +435,6 @@ /lib/codeql/rust/elements/internal/VariantListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/VariantListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/VisibilityConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/VisibilityImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WhereClauseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WhereClauseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WherePredConstructor.qll linguist-generated @@ -450,7 +447,6 @@ /lib/codeql/rust/elements/internal/YieldExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Abi.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Addressable.qll linguist-generated -/lib/codeql/rust/elements/internal/generated/Adt.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ArgList.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ArrayExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll linguist-generated @@ -483,7 +479,6 @@ /lib/codeql/rust/elements/internal/generated/BoxPat.qll linguist-generated /lib/codeql/rust/elements/internal/generated/BreakExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/CallExpr.qll linguist-generated -/lib/codeql/rust/elements/internal/generated/CallExprBase.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Callable.qll linguist-generated /lib/codeql/rust/elements/internal/generated/CastExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ClosureExpr.qll linguist-generated @@ -626,6 +621,7 @@ /lib/codeql/rust/elements/internal/generated/TypeArg.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TypeBound.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TypeBoundList.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/TypeItem.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TypeParam.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll linguist-generated diff --git a/rust/ql/consistency-queries/PathResolutionConsistency.ql b/rust/ql/consistency-queries/PathResolutionConsistency.ql index 3b2165b712f..bc1f572eedb 100644 --- a/rust/ql/consistency-queries/PathResolutionConsistency.ql +++ b/rust/ql/consistency-queries/PathResolutionConsistency.ql @@ -15,8 +15,8 @@ class SourceLocatable extends Locatable { SourceLocatable() { this.fromSource() } } -query predicate multipleCallTargets(SourceLocatable a) { - PathResolutionConsistency::multipleCallTargets(a, _) +query predicate multipleResolvedTargets(SourceLocatable a) { + PathResolutionConsistency::multipleResolvedTargets(a, _) } query predicate multiplePathResolutions(SourceLocatable a) { diff --git a/rust/ql/examples/qlpack.lock.yml b/rust/ql/examples/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/rust/ql/examples/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/rust/ql/examples/qlpack.yml b/rust/ql/examples/qlpack.yml new file mode 100644 index 00000000000..41adabd2c70 --- /dev/null +++ b/rust/ql/examples/qlpack.yml @@ -0,0 +1,7 @@ +name: codeql/rust-examples +groups: + - rust + - examples +dependencies: + codeql/rust-all: ${workspace} +warnOnImplicitThis: true diff --git a/rust/ql/examples/snippets/empty_if.ql b/rust/ql/examples/snippets/empty_if.ql new file mode 100644 index 00000000000..f2183945979 --- /dev/null +++ b/rust/ql/examples/snippets/empty_if.ql @@ -0,0 +1,18 @@ +/** + * @name Empty 'if' expression + * @description Finds 'if' expressions where the "then" branch is empty and no + * "else" branch exists. + * @id rust/examples/empty-if + * @tags example + */ + +import rust + +// find 'if' expressions... +from IfExpr ifExpr +where + // where the 'then' branch is empty + ifExpr.getThen().getStmtList().getNumberOfStmtOrExpr() = 0 and + // and no 'else' branch exists + not ifExpr.hasElse() +select ifExpr, "This 'if' expression is redundant." diff --git a/rust/ql/examples/snippets/simple_constant_password.ql b/rust/ql/examples/snippets/simple_constant_password.ql new file mode 100644 index 00000000000..e43238cedd4 --- /dev/null +++ b/rust/ql/examples/snippets/simple_constant_password.ql @@ -0,0 +1,48 @@ +/** + * @name Constant password + * @description Finds places where a string literal is used in a function call + * argument that looks like a password. + * @id rust/examples/simple-constant-password + * @tags example + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking + +/** + * A data flow configuration for tracking flow from a string literal to a function + * call argument that looks like a password. For example: + * ``` + * fn set_password(password: &str) { ... } + * + * ... + * + * let pwd = "123456"; // source + * set_password(pwd); // sink (argument 0) + * ``` + */ +module ConstantPasswordConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { + // `node` is a string literal + node.asExpr() instanceof StringLiteralExpr + } + + predicate isSink(DataFlow::Node node) { + // `node` is an argument whose corresponding parameter name matches the pattern "pass%" + exists(Call call, Function target, int argIndex, Variable v | + call.getStaticTarget() = target and + v.getParameter() = target.getParam(argIndex) and + v.getText().matches("pass%") and + call.getPositionalArgument(argIndex) = node.asExpr() + ) + } +} + +// instantiate the data flow configuration as a global taint tracking module +module ConstantPasswordFlow = TaintTracking::Global; + +// report flows from sources to sinks +from DataFlow::Node sourceNode, DataFlow::Node sinkNode +where ConstantPasswordFlow::flow(sourceNode, sinkNode) +select sinkNode, "The value $@ is used as a constant password.", sourceNode, sourceNode.toString() diff --git a/rust/ql/examples/snippets/simple_sql_injection.ql b/rust/ql/examples/snippets/simple_sql_injection.ql new file mode 100644 index 00000000000..251ab604402 --- /dev/null +++ b/rust/ql/examples/snippets/simple_sql_injection.ql @@ -0,0 +1,39 @@ +/** + * @name Database query built from user-controlled sources + * @description Finds places where a value from a remote or local user input + * is used as the first argument of a call to `sqlx_core::query::query`. + * @id rust/examples/simple-sql-injection + * @tags example + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.Concepts + +/** + * A data flow configuration for tracking flow from a user input (threat model + * source) to the first argument of a call to `sqlx_core::query::query`. + */ +module SqlInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { + // `node` is a user input (threat model source) + node instanceof ActiveThreatModelSource + } + + predicate isSink(DataFlow::Node node) { + // `node` is the first argument of a call to `sqlx_core::query::query` + exists(Call call | + call.getStaticTarget().getCanonicalPath() = "sqlx_core::query::query" and + call.getPositionalArgument(0) = node.asExpr() + ) + } +} + +// instantiate the data flow configuration as a global taint tracking module +module SqlInjectionFlow = TaintTracking::Global; + +// report flows from sources to sinks +from DataFlow::Node sourceNode, DataFlow::Node sinkNode +where SqlInjectionFlow::flow(sourceNode, sinkNode) +select sinkNode, "This query depends on a $@.", sourceNode, "user-provided value" diff --git a/rust/ql/integration-tests/hello-workspace/exe/src/main.rs b/rust/ql/integration-tests/hello-workspace/exe/src/main.rs index 5bb9375719e..63670ff63a3 100644 --- a/rust/ql/integration-tests/hello-workspace/exe/src/main.rs +++ b/rust/ql/integration-tests/hello-workspace/exe/src/main.rs @@ -7,4 +7,5 @@ mod a_module; fn main() { my_macro2!(); // $ item=my_macro2 hello(); // $ item=HELLO + lib::extern_crate_alias::a_module::hello(); // $ item=HELLO } diff --git a/rust/ql/integration-tests/hello-workspace/functions.expected b/rust/ql/integration-tests/hello-workspace/functions.expected index 6d8aa73cd83..b6d54fa07d3 100644 --- a/rust/ql/integration-tests/hello-workspace/functions.expected +++ b/rust/ql/integration-tests/hello-workspace/functions.expected @@ -1,2 +1,2 @@ -| exe/src/main.rs:7:1:10:1 | fn main | +| exe/src/main.rs:7:1:11:1 | fn main | | lib/src/a_module/mod.rs:1:1:4:1 | fn hello | diff --git a/rust/ql/integration-tests/hello-workspace/lib/src/lib.rs b/rust/ql/integration-tests/hello-workspace/lib/src/lib.rs index f313f76edad..7999517c72d 100644 --- a/rust/ql/integration-tests/hello-workspace/lib/src/lib.rs +++ b/rust/ql/integration-tests/hello-workspace/lib/src/lib.rs @@ -15,3 +15,5 @@ mod macros { } pub mod a_module; + +pub extern crate self as extern_crate_alias; diff --git a/rust/ql/integration-tests/hello-workspace/path-resolution.ql b/rust/ql/integration-tests/hello-workspace/path-resolution.ql index 9ec97b61eeb..574a9553155 100644 --- a/rust/ql/integration-tests/hello-workspace/path-resolution.ql +++ b/rust/ql/integration-tests/hello-workspace/path-resolution.ql @@ -2,7 +2,7 @@ import rust import codeql.rust.internal.PathResolution import utils.test.PathResolutionInlineExpectationsTest -query predicate resolveDollarCrate(RelevantPath p, Crate c) { +query predicate resolveDollarCrate(PathExt p, Crate c) { c = resolvePath(p) and p.isDollarCrate() and p.fromSource() and diff --git a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected index cb07b66d437..11fba34f901 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected @@ -9,8 +9,8 @@ | Inconsistencies - Path resolution | 0 | | Inconsistencies - SSA | 0 | | Inconsistencies - data flow | 0 | -| Lines of code extracted | 21 | -| Lines of user code extracted | 21 | +| Lines of code extracted | 23 | +| Lines of user code extracted | 23 | | Macro calls - resolved | 10 | | Macro calls - total | 10 | | Macro calls - unresolved | 0 | diff --git a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected index cb07b66d437..11fba34f901 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected @@ -9,8 +9,8 @@ | Inconsistencies - Path resolution | 0 | | Inconsistencies - SSA | 0 | | Inconsistencies - data flow | 0 | -| Lines of code extracted | 21 | -| Lines of user code extracted | 21 | +| Lines of code extracted | 23 | +| Lines of user code extracted | 23 | | Macro calls - resolved | 10 | | Macro calls - total | 10 | | Macro calls - unresolved | 0 | diff --git a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected index 70e1bcb1064..9b10079767b 100644 --- a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected @@ -10,7 +10,9 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql +ql/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.ql ql/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected index 596fdef3b20..4059cb40ab6 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected @@ -10,8 +10,10 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-117/LogInjection.ql +ql/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.ql ql/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected index 102c63e7942..2d660d4f3a3 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected @@ -10,8 +10,10 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-117/LogInjection.ql +ql/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.ql ql/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index 7e8575b03be..e2aeb59f40b 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,27 @@ +## 0.2.2 + +No user-facing changes. + +## 0.2.1 + +No user-facing changes. + +## 0.2.0 + +### Breaking Changes + +* The type `DataFlow::Node` is now based directly on the AST instead of the CFG, which means that predicates like `asExpr()` return AST nodes instead of CFG nodes. + +### Minor Analysis Improvements + +* Added more detailed models for `std::fs` and `std::path`. + +## 0.1.20 + +### Minor Analysis Improvements + +* Added models for cookie methods in the `poem` crate. + ## 0.1.19 ### Major Analysis Improvements diff --git a/rust/ql/lib/change-notes/2025-12-03-type-inference-raw-pointers.md b/rust/ql/lib/change-notes/2025-12-03-type-inference-raw-pointers.md new file mode 100644 index 00000000000..a24f86ad897 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-12-03-type-inference-raw-pointers.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Improved type inference for raw pointers (`*const` and `*mut`). This includes type inference for the raw borrow operators (`&raw const` and `&raw mut`) and dereferencing of raw pointers. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2025-12-05-trait-function-dispatch.md b/rust/ql/lib/change-notes/2025-12-05-trait-function-dispatch.md new file mode 100644 index 00000000000..5a6f0991161 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-12-05-trait-function-dispatch.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The call graph is now more precise for calls that target a trait function with a default implemention. This reduces the number of false positives for data flow queries. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2025-12-11-read-as-taint.md b/rust/ql/lib/change-notes/2025-12-11-read-as-taint.md new file mode 100644 index 00000000000..3e1cabd75f7 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-12-11-read-as-taint.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Reading content of a value now carries taint if the value itself is tainted. For instance, if `s` is tainted then `s.field` is also tainted. This generally improves taint flow. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2025-12-16-axum-models.md b/rust/ql/lib/change-notes/2025-12-16-axum-models.md new file mode 100644 index 00000000000..baa5910d799 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-12-16-axum-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added models for the Axum web application framework. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2025-12-17-adt-rename.md b/rust/ql/lib/change-notes/2025-12-17-adt-rename.md new file mode 100644 index 00000000000..0b66b4664a1 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-12-17-adt-rename.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Renamed the `Adt` class to `TypeItem` and moved common predicates from `Struct`, `Enum`, and `Union` to `TypeItem`. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2025-11-05-poem.md b/rust/ql/lib/change-notes/released/0.1.20.md similarity index 55% rename from rust/ql/lib/change-notes/2025-11-05-poem.md rename to rust/ql/lib/change-notes/released/0.1.20.md index b71e52a8139..12d4a7a3d5a 100644 --- a/rust/ql/lib/change-notes/2025-11-05-poem.md +++ b/rust/ql/lib/change-notes/released/0.1.20.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 0.1.20 + +### Minor Analysis Improvements + * Added models for cookie methods in the `poem` crate. diff --git a/rust/ql/lib/change-notes/released/0.2.0.md b/rust/ql/lib/change-notes/released/0.2.0.md new file mode 100644 index 00000000000..a419eea1874 --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.2.0.md @@ -0,0 +1,9 @@ +## 0.2.0 + +### Breaking Changes + +* The type `DataFlow::Node` is now based directly on the AST instead of the CFG, which means that predicates like `asExpr()` return AST nodes instead of CFG nodes. + +### Minor Analysis Improvements + +* Added more detailed models for `std::fs` and `std::path`. diff --git a/rust/ql/lib/change-notes/released/0.2.1.md b/rust/ql/lib/change-notes/released/0.2.1.md new file mode 100644 index 00000000000..3dbfc85fe11 --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.2.1.md @@ -0,0 +1,3 @@ +## 0.2.1 + +No user-facing changes. diff --git a/rust/ql/lib/change-notes/released/0.2.2.md b/rust/ql/lib/change-notes/released/0.2.2.md new file mode 100644 index 00000000000..98e69fd0772 --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.2.2.md @@ -0,0 +1,3 @@ +## 0.2.2 + +No user-facing changes. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index de6e4c49068..16a06790aa8 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.19 +lastReleaseVersion: 0.2.2 diff --git a/rust/ql/lib/codeql/rust/Concepts.qll b/rust/ql/lib/codeql/rust/Concepts.qll index 20247e08875..2e2220430e1 100644 --- a/rust/ql/lib/codeql/rust/Concepts.qll +++ b/rust/ql/lib/codeql/rust/Concepts.qll @@ -4,14 +4,13 @@ * provide concrete subclasses. */ +private import rust private import codeql.rust.dataflow.DataFlow private import codeql.rust.dataflow.internal.DataFlowImpl private import codeql.Locations private import codeql.threatmodels.ThreatModels private import codeql.rust.Frameworks private import codeql.rust.dataflow.FlowSource -private import codeql.rust.controlflow.ControlFlowGraph as Cfg -private import codeql.rust.controlflow.CfgNodes as CfgNodes private import codeql.concepts.ConceptsShared private module ConceptsShared = ConceptsMake; @@ -345,16 +344,16 @@ module Path { SafeAccessCheck() { this = DataFlow::BarrierGuard::getABarrierNode() } } - private predicate safeAccessCheck(CfgNodes::AstCfgNode g, Cfg::CfgNode node, boolean branch) { - g.(SafeAccessCheck::Range).checks(node, branch) + private predicate safeAccessCheck(AstNode g, Expr e, boolean branch) { + g.(SafeAccessCheck::Range).checks(e, branch) } /** Provides a class for modeling new path safety checks. */ module SafeAccessCheck { /** A data-flow node that checks that a path is safe to access in some way, for example by having a controlled prefix. */ - abstract class Range extends CfgNodes::AstCfgNode { - /** Holds if this guard validates `node` upon evaluating to `branch`. */ - abstract predicate checks(Cfg::CfgNode node, boolean branch); + abstract class Range extends AstNode { + /** Holds if this guard validates `e` upon evaluating to `branch`. */ + abstract predicate checks(Expr e, boolean branch); } } } diff --git a/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll index 96ae6f8fdbc..eeed7086546 100644 --- a/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll @@ -4,7 +4,6 @@ */ private import rust -private import codeql.rust.elements.Call private import ControlFlowGraph private import internal.ControlFlowGraphImpl as CfgImpl private import internal.CfgNodes @@ -200,20 +199,6 @@ final class BreakExprCfgNode extends Nodes::BreakExprCfgNode { } } -/** - * A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. - */ -final class CallExprBaseCfgNode extends Nodes::CallExprBaseCfgNode { - private CallExprBaseChildMapping node; - - CallExprBaseCfgNode() { node = this.getAstNode() } - - /** Gets the `i`th argument of this call. */ - ExprCfgNode getArgument(int i) { - any(ChildMapping mapping).hasCfgChild(node, node.getArgList().getArg(i), this, result) - } -} - /** * A method call expression. For example: * ```rust @@ -221,7 +206,16 @@ final class CallExprBaseCfgNode extends Nodes::CallExprBaseCfgNode { * x.foo::(42); * ``` */ -final class MethodCallExprCfgNode extends CallExprBaseCfgNode, Nodes::MethodCallExprCfgNode { } +final class MethodCallExprCfgNode extends Nodes::MethodCallExprCfgNode { + private MethodCallExprChildMapping node; + + MethodCallExprCfgNode() { node = this.getAstNode() } + + /** Gets the `i`th argument of this call. */ + ExprCfgNode getPositionalArgument(int i) { + any(ChildMapping mapping).hasCfgChild(node, node.getPositionalArgument(i), this, result) + } +} /** * A CFG node that calls a function. @@ -238,7 +232,7 @@ final class CallCfgNode extends ExprCfgNode { /** Gets the receiver of this call if it is a method call. */ ExprCfgNode getReceiver() { - any(ChildMapping mapping).hasCfgChild(node, node.getReceiver(), this, result) + any(ChildMapping mapping).hasCfgChild(node, node.(MethodCall).getReceiver(), this, result) } /** Gets the `i`th argument of this call, if any. */ @@ -248,15 +242,26 @@ final class CallCfgNode extends ExprCfgNode { } /** - * A function call expression. For example: + * An expression with parenthesized arguments. For example: * ```rust * foo(42); * foo::(42); * foo[0](42); * foo(1) = 4; + * Option::Some(42); * ``` */ -final class CallExprCfgNode extends CallExprBaseCfgNode, Nodes::CallExprCfgNode { } +final class CallExprCfgNode extends Nodes::CallExprCfgNode { + private CallExprChildMapping node; + + CallExprCfgNode() { node = this.getAstNode() } + + /** Gets the `i`th argument of this call. */ + ExprCfgNode getSyntacticArgument(int i) { + any(ChildMapping mapping) + .hasCfgChild(node, node.getSyntacticPositionalArgument(i), this, result) + } +} /** * A FormatArgsExpr. For example: diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/CfgNodes.qll index eb4d665436e..ee1c0e6ab6b 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/CfgNodes.qll @@ -57,8 +57,12 @@ class BreakExprTargetChildMapping extends ParentAstNode, Expr { override predicate relevantChild(AstNode child) { child.(BreakExpr).getTarget() = this } } -class CallExprBaseChildMapping extends ParentAstNode, CallExprBase { - override predicate relevantChild(AstNode child) { child = this.getAnArg() } +class CallExprChildMapping extends ParentAstNode, CallExpr { + override predicate relevantChild(AstNode child) { child = this.getArgList().getAnArg() } +} + +class MethodCallExprChildMapping extends ParentAstNode, MethodCallExpr { + override predicate relevantChild(AstNode child) { child = this.getArgList().getAnArg() } } class StructExprChildMapping extends ParentAstNode, StructExpr { diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll b/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll index 0250f1cbc43..33da4db473e 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll @@ -1,5 +1,6 @@ private import codeql.util.Boolean private import codeql.rust.controlflow.ControlFlowGraph +private import codeql.rust.elements.internal.VariableImpl::Impl as VariableImpl private import rust newtype TCompletion = @@ -123,13 +124,7 @@ class BooleanCompletion extends ConditionalCompletion, TBooleanCompletion { */ private predicate cannotCauseMatchFailure(Pat pat) { pat instanceof RangePat or - // Identifier patterns that are in fact path patterns can cause failures. For - // instance `None`. Only if an `@ ...` part is present can we be sure that - // it's an actual identifier pattern. As a heuristic, if the identifier starts - // with a lower case letter, then we assume that it's an identifier. This - // works for code that follows the Rust naming convention for enums and - // constants. - pat = any(IdentPat p | p.hasPat() or p.getName().getText().charAt(0).isLowercase()) or + pat = any(IdentPat p | p.hasPat() or VariableImpl::variableDecl(_, p.getName(), _)) or pat instanceof WildcardPat or pat instanceof RestPat or pat instanceof RefPat or diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll index c3fb15ec0e7..522e5741795 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll @@ -210,13 +210,17 @@ module ExprTrees { override AstNode getChildNode(int i) { i = 0 and result = super.getExpr() } } - class BinaryOpExprTree extends StandardPostOrderTree instanceof BinaryExpr { - BinaryOpExprTree() { not this instanceof BinaryLogicalOperation } + class InvocationExprTree extends StandardPostOrderTree instanceof InvocationExpr { + InvocationExprTree() { + not this instanceof CallExpr and + not this instanceof BinaryLogicalOperation + } override AstNode getChildNode(int i) { - i = 0 and result = super.getLhs() + i = 0 and + result = super.getSyntacticReceiver() or - i = 1 and result = super.getRhs() + result = super.getSyntacticPositionalArgument(i - 1) } } @@ -296,7 +300,7 @@ module ExprTrees { override AstNode getChildNode(int i) { i = 0 and result = super.getFunction() or - result = super.getArgList().getArg(i - 1) + result = super.getSyntacticPositionalArgument(i - 1) } } @@ -371,14 +375,6 @@ module ExprTrees { } } - class IndexExprTree extends StandardPostOrderTree instanceof IndexExpr { - override AstNode getChildNode(int i) { - i = 0 and result = super.getBase() - or - i = 1 and result = super.getIndex() - } - } - class LetExprTree extends StandardPostOrderTree, LetExpr { override AstNode getChildNode(int i) { i = 0 and @@ -510,12 +506,6 @@ module ExprTrees { } } - class MethodCallExprTree extends StandardPostOrderTree, MethodCallExpr { - override AstNode getChildNode(int i) { - if i = 0 then result = this.getReceiver() else result = this.getArg(i - 1) - } - } - class OffsetOfExprTree extends LeafTree instanceof OffsetOfExpr { } class ParenExprTree extends ControlFlowTree, ParenExpr { @@ -534,10 +524,6 @@ module ExprTrees { class PathExprTree extends LeafTree instanceof PathExpr { } - class PrefixExprTree extends StandardPostOrderTree instanceof PrefixExpr { - override AstNode getChildNode(int i) { i = 0 and result = super.getExpr() } - } - class RangeExprTree extends StandardPostOrderTree instanceof RangeExpr { override AstNode getChildNode(int i) { i = 0 and result = super.getStart() @@ -552,10 +538,6 @@ module ExprTrees { } } - class RefExprTree extends StandardPostOrderTree instanceof RefExpr { - override AstNode getChildNode(int i) { i = 0 and result = super.getExpr() } - } - class ReturnExprTree extends StandardPostOrderTree instanceof ReturnExpr { override AstNode getChildNode(int i) { i = 0 and result = super.getExpr() } } diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index 9ce771983a3..016217e0a46 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -654,15 +654,18 @@ module MakeCfgNodes Input> { } /** - * A function call expression. For example: + * NOTE: Consider using `Call` instead, as that excludes call expressions that are + * instantiations of tuple structs and tuple variants. + * + * A call expression. For example: * ```rust * foo(42); * foo::(42); * foo[0](42); - * foo(1) = 4; + * Option::Some(42); // tuple variant instantiation * ``` */ - final class CallExprCfgNode extends CfgNodeFinal, CallExprBaseCfgNode { + final class CallExprCfgNode extends CfgNodeFinal, ExprCfgNode { private CallExpr node; CallExprCfgNode() { node = this.getAstNode() } @@ -670,6 +673,31 @@ module MakeCfgNodes Input> { /** Gets the underlying `CallExpr`. */ CallExpr getCallExpr() { result = node } + /** + * Gets the argument list of this call expression, if it exists. + */ + ArgList getArgList() { result = node.getArgList() } + + /** + * Holds if `getArgList()` exists. + */ + predicate hasArgList() { exists(this.getArgList()) } + + /** + * Gets the `index`th attr of this call expression (0-based). + */ + Attr getAttr(int index) { result = node.getAttr(index) } + + /** + * Gets any of the attrs of this call expression. + */ + Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this call expression. + */ + int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + /** * Gets the function of this call expression, if it exists. */ @@ -683,62 +711,6 @@ module MakeCfgNodes Input> { predicate hasFunction() { exists(this.getFunction()) } } - final private class ParentCallExprBase extends ParentAstNode, CallExprBase { - override predicate relevantChild(AstNode child) { none() } - } - - /** - * A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. - */ - final class CallExprBaseCfgNode extends CfgNodeFinal, ExprCfgNode { - private CallExprBase node; - - CallExprBaseCfgNode() { node = this.getAstNode() } - - /** Gets the underlying `CallExprBase`. */ - CallExprBase getCallExprBase() { result = node } - - /** - * Gets the argument list of this call expression base, if it exists. - */ - ArgList getArgList() { result = node.getArgList() } - - /** - * Holds if `getArgList()` exists. - */ - predicate hasArgList() { exists(this.getArgList()) } - - /** - * Gets the `index`th attr of this call expression base (0-based). - */ - Attr getAttr(int index) { result = node.getAttr(index) } - - /** - * Gets any of the attrs of this call expression base. - */ - Attr getAnAttr() { result = this.getAttr(_) } - - /** - * Gets the number of attrs of this call expression base. - */ - int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } - - /** - * Gets the `index`th argument of this call expression base (0-based). - */ - Expr getArg(int index) { result = node.getArg(index) } - - /** - * Gets any of the arguments of this call expression base. - */ - Expr getAnArg() { result = this.getArg(_) } - - /** - * Gets the number of arguments of this call expression base. - */ - int getNumberOfArgs() { result = count(int i | exists(this.getArg(i))) } - } - final private class ParentCastExpr extends ParentAstNode, CastExpr { override predicate relevantChild(AstNode child) { none() @@ -2071,13 +2043,17 @@ module MakeCfgNodes Input> { } /** + * NOTE: Consider using `MethodCall` instead, as that also includes calls to methods using + * call syntax (such as `Foo::method(x)`), operation syntax (such as `x + y`), and + * indexing syntax (such as `x[y]`). + * * A method call expression. For example: * ```rust * x.foo(42); * x.foo::(42); * ``` */ - final class MethodCallExprCfgNode extends CfgNodeFinal, CallExprBaseCfgNode { + final class MethodCallExprCfgNode extends CfgNodeFinal, ExprCfgNode { private MethodCallExpr node; MethodCallExprCfgNode() { node = this.getAstNode() } @@ -2085,6 +2061,31 @@ module MakeCfgNodes Input> { /** Gets the underlying `MethodCallExpr`. */ MethodCallExpr getMethodCallExpr() { result = node } + /** + * Gets the argument list of this method call expression, if it exists. + */ + ArgList getArgList() { result = node.getArgList() } + + /** + * Holds if `getArgList()` exists. + */ + predicate hasArgList() { exists(this.getArgList()) } + + /** + * Gets the `index`th attr of this method call expression (0-based). + */ + Attr getAttr(int index) { result = node.getAttr(index) } + + /** + * Gets any of the attrs of this method call expression. + */ + Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this method call expression. + */ + int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + /** * Gets the generic argument list of this method call expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/dataflow/DataFlow.qll b/rust/ql/lib/codeql/rust/dataflow/DataFlow.qll index cfcea9eaa2d..c299671ec6d 100644 --- a/rust/ql/lib/codeql/rust/dataflow/DataFlow.qll +++ b/rust/ql/lib/codeql/rust/dataflow/DataFlow.qll @@ -8,8 +8,6 @@ private import codeql.dataflow.DataFlow private import internal.DataFlowImpl as DataFlowImpl private import internal.Node as Node private import internal.Content as Content -private import codeql.rust.controlflow.ControlFlowGraph as Cfg -private import codeql.rust.controlflow.CfgNodes as CfgNodes /** * Provides classes for performing local (intra-procedural) and global @@ -68,7 +66,7 @@ module DataFlow { * For example, the guard `g` might be a call `isSafe(x)` and the expression `e` * the argument `x`. */ - signature predicate guardChecksSig(CfgNodes::AstCfgNode g, Cfg::CfgNode e, boolean branch); + signature predicate guardChecksSig(AstNode g, Expr e, boolean branch); /** * Provides a set of barrier nodes for a guard that validates an expression. diff --git a/rust/ql/lib/codeql/rust/dataflow/Ssa.qll b/rust/ql/lib/codeql/rust/dataflow/Ssa.qll index badbef9e420..52e7d35e3b4 100644 --- a/rust/ql/lib/codeql/rust/dataflow/Ssa.qll +++ b/rust/ql/lib/codeql/rust/dataflow/Ssa.qll @@ -9,7 +9,6 @@ module Ssa { private import rust private import codeql.rust.controlflow.BasicBlocks private import codeql.rust.controlflow.ControlFlowGraph - private import codeql.rust.controlflow.CfgNodes private import codeql.rust.controlflow.internal.ControlFlowGraphImpl as CfgImpl private import internal.SsaImpl as SsaImpl @@ -51,7 +50,7 @@ module Ssa { * } * ``` */ - final CfgNode getARead() { result = SsaImpl::getARead(this) } + final Expr getARead() { result = SsaImpl::getARead(this) } /** * Gets a first control flow node that reads the value of this SSA definition. @@ -80,7 +79,7 @@ module Ssa { * } * ``` */ - final CfgNode getAFirstRead() { SsaImpl::firstRead(this, result) } + final Expr getAFirstRead() { SsaImpl::firstRead(this, result) } /** * Holds if `read1` and `read2` are adjacent reads of this SSA definition. @@ -108,7 +107,7 @@ module Ssa { * } * ``` */ - final predicate hasAdjacentReads(CfgNode read1, CfgNode read2) { + final predicate hasAdjacentReads(Expr read1, Expr read2) { SsaImpl::adjacentReadPair(this, read1, read2) } @@ -168,28 +167,28 @@ module Ssa { * ``` */ class WriteDefinition extends Definition, SsaImpl::WriteDefinition { - private CfgNode write; + private AstNode write; WriteDefinition() { - exists(BasicBlock bb, int i, Variable v, CfgNode n | + exists(BasicBlock bb, int i, Variable v, AstNode n | this.definesAt(v, bb, i) and - SsaImpl::variableWriteActual(bb, i, v, n) + SsaImpl::variableWriteActual(bb, i, v, n.getACfgNode()) | - write.(VariableAccessCfgNode).getAccess().getVariable() = v and + write.(VariableAccess).getVariable() = v and ( - write = n.(AssignmentExprCfgNode).getAWriteAccess() + write = n.(AssignmentExpr).getAWriteAccess() or - write = n.(CompoundAssignmentExprCfgNode).getLhs() + write = n.(CompoundAssignmentExpr).getLhs() ) or - not n instanceof AssignmentExprCfgNode and - not n instanceof CompoundAssignmentExprCfgNode and + not n instanceof AssignmentExpr and + not n instanceof CompoundAssignmentExpr and write = n ) } /** Gets the underlying write access. */ - final CfgNode getWriteAccess() { result = write } + final AstNode getWriteAccess() { result = write } /** * Holds if this SSA definition assigns `value` to the underlying @@ -199,19 +198,19 @@ module Ssa { * `let` statement, `let x = value`. Note that patterns on the lhs. are * currently not supported. */ - predicate assigns(ExprCfgNode value) { - exists(AssignmentExprCfgNode ae | + predicate assigns(Expr value) { + exists(AssignmentExpr ae | ae.getLhs() = write and ae.getRhs() = value ) or - exists(IdentPatCfgNode pat | pat.getName() = write | - exists(LetStmtCfgNode ls | + exists(IdentPat pat | pat.getName() = write | + exists(LetStmt ls | pat = ls.getPat() and ls.getInitializer() = value ) or - exists(LetExprCfgNode le | + exists(LetExpr le | pat = le.getPat() and le.getScrutinee() = value ) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/Content.qll b/rust/ql/lib/codeql/rust/dataflow/internal/Content.qll index 95a5fa98bb4..a072edef612 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/Content.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/Content.qll @@ -3,8 +3,9 @@ */ private import rust -private import codeql.rust.controlflow.CfgNodes +private import codeql.rust.frameworks.stdlib.Builtins private import DataFlowImpl +private import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl /** * A path to a value contained in an object. For example a field name of a struct. @@ -21,14 +22,18 @@ abstract class Content extends TContent { abstract class FieldContent extends Content { /** Gets an access to this field. */ pragma[nomagic] - abstract FieldExprCfgNode getAnAccess(); + abstract FieldExpr getAnAccess(); } /** A tuple field belonging to either a variant or a struct. */ class TupleFieldContent extends FieldContent, TTupleFieldContent { private TupleField field; - TupleFieldContent() { this = TTupleFieldContent(field) } + TupleFieldContent() { + this = TTupleFieldContent(field) and + // tuples are handled using the special `TupleContent` type + not field = any(TupleType tt).getATupleField() + } /** Holds if this field belongs to an enum variant. */ predicate isVariantField(Variant v, int pos) { field.isVariantField(v, pos) } @@ -36,7 +41,7 @@ class TupleFieldContent extends FieldContent, TTupleFieldContent { /** Holds if this field belongs to a struct. */ predicate isStructField(Struct s, int pos) { field.isStructField(s, pos) } - override FieldExprCfgNode getAnAccess() { field = result.getFieldExpr().getTupleField() } + override FieldExpr getAnAccess() { field = result.getTupleField() } final override string toString() { exists(Variant v, int pos, string vname | @@ -69,7 +74,7 @@ class StructFieldContent extends FieldContent, TStructFieldContent { /** Holds if this field belongs to a struct. */ predicate isStructField(Struct s, string name) { field.isStructField(s, name) } - override FieldExprCfgNode getAnAccess() { field = result.getFieldExpr().getStructField() } + override FieldExpr getAnAccess() { field = result.getStructField() } final override string toString() { exists(Variant v, string name, string vname | @@ -148,7 +153,7 @@ final class TuplePositionContent extends FieldContent, TTuplePositionContent { /** Gets the index of this tuple position. */ int getPosition() { result = pos } - override FieldExprCfgNode getAnAccess() { + override FieldExpr getAnAccess() { // TODO: limit to tuple types result.getIdentifier().getText().toInt() = pos } @@ -159,7 +164,7 @@ final class TuplePositionContent extends FieldContent, TTuplePositionContent { } /** - * A content for the index of an argument to at function call. + * A content for the index of an argument to at closure call. * * Used by the model generator to create flow summaries for higher-order * functions. @@ -266,7 +271,7 @@ newtype TContent = } or TFunctionCallReturnContent() or TFunctionCallArgumentContent(int pos) { - pos in [0 .. any(CallExpr c).getArgList().getNumberOfArgs() - 1] + pos in [0 .. any(CallExprImpl::DynamicCallExpr c).getNumberOfPositionalArguments()] } or TCapturedVariableContent(VariableCapture::CapturedVariable v) or TReferenceContent() diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll index d544ff888d5..ca6c0747ba3 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll @@ -19,27 +19,12 @@ private module Input implements InputSig { predicate postWithInFlowExclude(RustDataFlow::Node n) { n instanceof Node::FlowSummaryNode or - // We allow flow into post-update node for receiver expressions (from the - // synthetic post receiever node). - n.(Node::PostUpdateNode).getPreUpdateNode().asExpr() = any(Node::ReceiverNode r).getReceiver() - or n.(Node::PostUpdateNode).getPreUpdateNode().asExpr() = getPostUpdateReverseStep(_, _) or FlowSummaryImpl::Private::Steps::sourceLocalStep(_, n, _) } predicate missingLocationExclude(RustDataFlow::Node n) { not exists(n.asExpr().getLocation()) } - - predicate multipleArgumentCallExclude(Node::ArgumentNode arg, DataFlowCall call) { - // An argument such as `x` in `if !x { ... }` has two successors (and hence - // two calls); one for each Boolean outcome of `x`. - exists(CfgNodes::ExprCfgNode n | - arg.isArgumentOf(call, _) and - n = call.asCallCfgNode() and - arg.asExpr().getASuccessor(any(ConditionalSuccessor c)).getASuccessor*() = n and - n.getASplit() instanceof ConditionalCompletionSplitting::ConditionalCompletionSplit - ) - } } import MakeConsistency diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 9fa0f0a5a83..fc84c8f0bc6 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -8,13 +8,11 @@ private import codeql.util.Boolean private import codeql.dataflow.DataFlow private import codeql.dataflow.internal.DataFlowImpl private import rust -private import codeql.rust.elements.Call private import SsaImpl as SsaImpl private import codeql.rust.controlflow.internal.Scope as Scope +private import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl private import codeql.rust.internal.PathResolution -private import codeql.rust.internal.TypeInference as TypeInference private import codeql.rust.controlflow.ControlFlowGraph -private import codeql.rust.controlflow.CfgNodes private import codeql.rust.dataflow.Ssa private import codeql.rust.dataflow.FlowSummary private import Node @@ -59,8 +57,8 @@ final class DataFlowCallable extends TDataFlowCallable { } final class DataFlowCall extends TDataFlowCall { - /** Gets the underlying call in the CFG, if any. */ - CallCfgNode asCallCfgNode() { this = TCall(result) } + /** Gets the underlying call, if any. */ + Call asCall() { this = TCall(result) } predicate isSummaryCall( FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver @@ -69,13 +67,13 @@ final class DataFlowCall extends TDataFlowCall { } DataFlowCallable getEnclosingCallable() { - result.asCfgScope() = this.asCallCfgNode().getExpr().getEnclosingCfgScope() + result.asCfgScope() = this.asCall().getEnclosingCfgScope() or this.isSummaryCall(result.asSummarizedCallable(), _) } string toString() { - result = this.asCallCfgNode().toString() + result = this.asCall().toString() or exists( FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver @@ -85,75 +83,14 @@ final class DataFlowCall extends TDataFlowCall { ) } - Location getLocation() { result = this.asCallCfgNode().getLocation() } -} - -/** - * The position of a parameter in a function. - * - * In Rust there is a 1-to-1 correspondence between parameter positions and - * arguments positions, so we use the same underlying type for both. - */ -final class ParameterPosition extends TParameterPosition { - /** Gets the underlying integer position, if any. */ - int getPosition() { this = TPositionalParameterPosition(result) } - - predicate hasPosition() { exists(this.getPosition()) } - - /** Holds if this position represents the `self` position. */ - predicate isSelf() { this = TSelfParameterPosition() } - - /** - * Holds if this position represents a reference to a closure itself. Only - * used for tracking flow through captured variables. - */ - predicate isClosureSelf() { this = TClosureSelfParameterPosition() } - - /** Gets a textual representation of this position. */ - string toString() { - result = this.getPosition().toString() - or - result = "self" and this.isSelf() - or - result = "closure self" and this.isClosureSelf() - } - - ParamBase getParameterIn(ParamList ps) { - result = ps.getParam(this.getPosition()) - or - result = ps.getSelfParam() and this.isSelf() - } -} - -/** - * The position of an argument in a call. - * - * In Rust there is a 1-to-1 correspondence between parameter positions and - * arguments positions, so we use the same underlying type for both. - */ -final class ArgumentPosition extends ParameterPosition { - /** Gets the argument of `call` at this position, if any. */ - Expr getArgument(Call call) { - result = call.getPositionalArgument(this.getPosition()) - or - result = call.getReceiver() and this.isSelf() - } + Location getLocation() { result = this.asCall().getLocation() } } /** * Holds if `arg` is an argument of `call` at the position `pos`. - * - * Note that this does not hold for the receiever expression of a method call - * as the synthetic `ReceiverNode` is the argument for the `self` parameter. */ -predicate isArgumentForCall(ExprCfgNode arg, CallCfgNode call, ParameterPosition pos) { - // TODO: Handle index expressions as calls in data flow. - not call.getCall() instanceof IndexExpr and - ( - call.getPositionalArgument(pos.getPosition()) = arg - or - call.getReceiver() = arg and pos.isSelf() and not call.getCall().receiverImplicitlyBorrowed() - ) +predicate isArgumentForCall(Expr arg, Call call, RustDataFlow::ArgumentPosition pos) { + arg = pos.getArgument(call) } /** Provides logic related to SSA. */ @@ -181,19 +118,24 @@ module SsaFlow { } /** - * Gets a node that may execute last in `n`, and which, when it executes last, - * will be the value of `n`. + * Gets a node that may execute last in `e`, and which, when it executes last, + * will be the value of `e`. */ -private ExprCfgNode getALastEvalNode(ExprCfgNode e) { - e = any(IfExprCfgNode n | result = [n.getThen(), n.getElse()]) or - result = e.(LoopExprCfgNode).getLoopBody() or - result = e.(ReturnExprCfgNode).getExpr() or - result = e.(BreakExprCfgNode).getExpr() or - result = e.(BlockExprCfgNode).getTailExpr() or - result = e.(MacroBlockExprCfgNode).getTailExpr() or - result = e.(MatchExprCfgNode).getArmExpr(_) or - result = e.(MacroExprCfgNode).getMacroCall().(MacroCallCfgNode).getExpandedNode() or - result.(BreakExprCfgNode).getTarget() = e +private Expr getALastEvalNode(Expr e) { + e = any(IfExpr n | result = [n.getThen(), n.getElse()]) or + result = e.(LoopExpr).getLoopBody() or + result = e.(ReturnExpr).getExpr() or + result = e.(BreakExpr).getExpr() or + e = + any(BlockExpr be | + not be.isAsync() and + result = be.getTailExpr() + ) or + result = e.(MacroBlockExpr).getTailExpr() or + result = e.(MatchExpr).getAnArm().getExpr() or + result = e.(MacroExpr).getMacroCall().getMacroCallExpansion() or + result.(BreakExpr).getTarget() = e or + result = e.(ParenExpr).getExpr() } /** @@ -211,11 +153,11 @@ private ExprCfgNode getALastEvalNode(ExprCfgNode e) { * we add a reverse flow step from `[post] { foo(); &mut a}` to `[post] &mut a`, * in order for the side-effect of `set_data` to reach `&mut a`. */ -ExprCfgNode getPostUpdateReverseStep(ExprCfgNode e, boolean preservesValue) { +Expr getPostUpdateReverseStep(Expr e, boolean preservesValue) { result = getALastEvalNode(e) and preservesValue = true or - result = e.(CastExprCfgNode).getExpr() and + result = e.(CastExpr).getExpr() and preservesValue = false } @@ -236,56 +178,51 @@ module LocalFlow { pragma[nomagic] predicate localFlowStepCommon(Node nodeFrom, Node nodeTo) { - nodeFrom.getCfgNode() = getALastEvalNode(nodeTo.getCfgNode()) + nodeFrom.asExpr() = getALastEvalNode(nodeTo.asExpr()) or // An edge from the right-hand side of a let statement to the left-hand side. - exists(LetStmtCfgNode s | - nodeFrom.getCfgNode() = s.getInitializer() and - nodeTo.getCfgNode() = s.getPat() + exists(LetStmt s | + nodeFrom.asExpr() = s.getInitializer() and + nodeTo.asPat() = s.getPat() ) or // An edge from the right-hand side of a let expression to the left-hand side. - exists(LetExprCfgNode e | - nodeFrom.getCfgNode() = e.getScrutinee() and - nodeTo.getCfgNode() = e.getPat() + exists(LetExpr e | + nodeFrom.asExpr() = e.getScrutinee() and + nodeTo.asPat() = e.getPat() ) or - exists(IdentPatCfgNode p | + exists(IdentPat p | not p.isRef() and - nodeFrom.getCfgNode() = p and - nodeTo.getCfgNode() = p.getName() + nodeFrom.asPat() = p and + nodeTo.(NameNode).getName() = p.getName() ) or - exists(SelfParamCfgNode self | - nodeFrom.getCfgNode() = self and - nodeTo.getCfgNode() = self.getName() + exists(SelfParam self | + nodeFrom.asParameter() = self and + nodeTo.(NameNode).getName() = self.getName() ) or // An edge from a pattern/expression to its corresponding SSA definition. - nodeFrom.(AstCfgFlowNode).getCfgNode() = - nodeTo.(SsaNode).asDefinition().(Ssa::WriteDefinition).getWriteAccess() - or - nodeFrom.(SourceParameterNode).getParameter().(ParamCfgNode).getPat() = nodeTo.asPat() - or - exists(AssignmentExprCfgNode a | - a.getRhs() = nodeFrom.getCfgNode() and - a.getLhs() = nodeTo.getCfgNode() + exists(AstNode n | + n = nodeTo.(SsaNode).asDefinition().(Ssa::WriteDefinition).getWriteAccess() and + n = nodeFrom.(AstNodeNode).getAstNode() and + not n = any(CompoundAssignmentExpr cae).getLhs() ) or - exists(MatchExprCfgNode match | + nodeFrom.(SourceParameterNode).getParameter().(Param).getPat() = nodeTo.asPat() + or + exists(AssignmentExpr a | + a.getRhs() = nodeFrom.asExpr() and + a.getLhs() = nodeTo.asExpr() + ) + or + exists(MatchExpr match | nodeFrom.asExpr() = match.getScrutinee() and - nodeTo.asPat() = match.getArmPat(_) + nodeTo.asPat() = match.getAnArm().getPat() ) or - nodeFrom.asPat().(OrPatCfgNode).getAPat() = nodeTo.asPat() - or - // Simple value step from receiver expression to receiver node, in case - // there is no implicit deref or borrow operation. - nodeFrom.asExpr() = nodeTo.(ReceiverNode).getReceiver() - or - // The dual step of the above, for the post-update nodes. - nodeFrom.(PostUpdateNode).getPreUpdateNode().(ReceiverNode).getReceiver() = - nodeTo.(PostUpdateNode).getPreUpdateNode().asExpr() + nodeFrom.asPat().(OrPat).getAPat() = nodeTo.asPat() or nodeTo.(PostUpdateNode).getPreUpdateNode().asExpr() = getPostUpdateReverseStep(nodeFrom.(PostUpdateNode).getPreUpdateNode().asExpr(), true) @@ -305,12 +242,8 @@ predicate lambdaCreationExpr(Expr creation) { * Holds if `call` is a lambda call of kind `kind` where `receiver` is the * invoked expression. */ -predicate lambdaCallExpr(CallExprCfgNode call, LambdaCallKind kind, ExprCfgNode receiver) { +predicate lambdaCallExpr(CallExprImpl::DynamicCallExpr call, LambdaCallKind kind, Expr receiver) { receiver = call.getFunction() and - // All calls to complex expressions and local variable accesses are lambda call. - exists(Expr f | f = receiver.getExpr() | - f instanceof PathExpr implies f = any(Variable v).getAnAccess() - ) and exists(kind) } @@ -322,10 +255,6 @@ private module Aliases { class DataFlowCallAlias = DataFlowCall; - class ParameterPositionAlias = ParameterPosition; - - class ArgumentPositionAlias = ArgumentPosition; - class ContentAlias = Content; class ContentSetAlias = ContentSet; @@ -333,6 +262,30 @@ private module Aliases { class LambdaCallKindAlias = LambdaCallKind; } +/** + * Index assignments like `a[i] = rhs` are treated as `*a.index_mut(i) = rhs`, + * so they should in principle be handled by `referenceAssignment`. + * + * However, this would require support for [generalized reverse flow][1], which + * is not yet implemented, so instead we simulate reverse flow where it would + * have applied via the model for `<_ as core::ops::index::IndexMut>::index_mut`. + * + * The same is the case for compound assignments like `a[i] += rhs`, which are + * treated as `(*a.index_mut(i)).add_assign(rhs)`. + * + * [1]: https://github.com/github/codeql/pull/18109 + */ +predicate indexAssignment( + AssignmentOperation assignment, IndexExpr index, Node rhs, PostUpdateNode base, Content c +) { + assignment.getLhs() = index and + rhs.asExpr() = assignment.getRhs() and + base.getPreUpdateNode().asExpr() = index.getBase() and + c instanceof ElementContent and + // simulate that the flow summary applies + not index.getResolvedTarget().fromSource() +} + module RustDataFlow implements InputSig { private import Aliases private import codeql.rust.dataflow.DataFlow @@ -357,6 +310,58 @@ module RustDataFlow implements InputSig { final class CastNode = Node::CastNode; + /** + * The position of a parameter in a function. + * + * In Rust there is a 1-to-1 correspondence between parameter positions and + * arguments positions, so we use the same underlying type for both. + */ + final class ParameterPosition extends TParameterPosition { + /** Gets the underlying integer position, if any. */ + int getPosition() { this = TPositionalParameterPosition(result) } + + predicate hasPosition() { exists(this.getPosition()) } + + /** Holds if this position represents the `self` position. */ + predicate isSelf() { this = TSelfParameterPosition() } + + /** + * Holds if this position represents a reference to a closure itself. Only + * used for tracking flow through captured variables. + */ + predicate isClosureSelf() { this = TClosureSelfParameterPosition() } + + /** Gets a textual representation of this position. */ + string toString() { + result = this.getPosition().toString() + or + result = "self" and this.isSelf() + or + result = "closure self" and this.isClosureSelf() + } + + ParamBase getParameterIn(ParamList ps) { + result = ps.getParam(this.getPosition()) + or + result = ps.getSelfParam() and this.isSelf() + } + } + + /** + * The position of an argument in a call. + * + * In Rust there is a 1-to-1 correspondence between parameter positions and + * arguments positions, so we use the same underlying type for both. + */ + final class ArgumentPosition extends ParameterPosition { + /** Gets the argument of `call` at this position, if any. */ + Expr getArgument(Call call) { + result = call.getPositionalArgument(this.getPosition()) + or + result = call.(MethodCall).getReceiver() and this.isSelf() + } + } + /** Holds if `p` is a parameter of `c` at the position `pos`. */ predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition pos) { p.isParameterOf(c, pos) @@ -378,20 +383,30 @@ module RustDataFlow implements InputSig { node.(FlowSummaryNode).getSummaryNode().isHidden() or node instanceof CaptureNode or node instanceof ClosureParameterNode or - node instanceof ReceiverNode or - node instanceof ReceiverPostUpdateNode + node instanceof DerefBorrowNode or + node instanceof DerefOutNode or + node instanceof IndexOutNode or + node.asExpr() instanceof ParenExpr or + nodeIsHidden(node.(PostUpdateNode).getPreUpdateNode()) + } + + private Expr stripParens(Expr e) { + not e instanceof ParenExpr and + result = e + or + result = stripParens(e.(ParenExpr).getExpr()) } predicate neverSkipInPathGraph(Node node) { - node.(Node::Node).getCfgNode() = any(LetStmtCfgNode s).getPat() + node.(Node::Node).asPat() = any(LetStmt s).getPat() or - node.(Node::Node).getCfgNode() = any(LetExprCfgNode e).getPat() + node.(Node::Node).asPat() = any(LetExpr e).getPat() or - node.(Node::Node).getCfgNode() = any(AssignmentExprCfgNode a).getLhs() + node.(Node::Node).asExpr() = stripParens(any(AssignmentExpr a).getLhs()) or - exists(MatchExprCfgNode match | - node.asExpr() = match.getScrutinee() or - node.asExpr() = match.getArmPat(_) + exists(MatchExpr match | + node.asExpr() = stripParens(match.getScrutinee()) or + node.asPat() = match.getAnArm().getPat() ) or FlowSummaryImpl::Private::Steps::sourceLocalStep(_, node, _) @@ -399,7 +414,7 @@ module RustDataFlow implements InputSig { FlowSummaryImpl::Private::Steps::sinkLocalStep(node, _, _) } - class DataFlowExpr = ExprCfgNode; + class DataFlowExpr = Expr; /** Gets the node corresponding to `e`. */ Node exprNode(DataFlowExpr e) { result.asExpr() = e } @@ -410,14 +425,35 @@ module RustDataFlow implements InputSig { final class ReturnKind = ReturnKindAlias; + private Function getStaticTargetExt(Call c) { + result = c.getStaticTarget() + or + // If the static target of an overloaded operation cannot be resolved, we fall + // back to the trait method as the target. This ensures that the flow models + // still apply. + not exists(c.getStaticTarget()) and + exists(TraitItemNode t, string methodName | + c.(Operation).isOverloaded(t, methodName, _) and + result = t.getAssocItem(methodName) + ) + } + /** Gets a viable implementation of the target of the given `Call`. */ DataFlowCallable viableCallable(DataFlowCall call) { - exists(Call c | c = call.asCallCfgNode().getCall() | + exists(Call c | c = call.asCall() | result.asCfgScope() = c.getARuntimeTarget() or exists(SummarizedCallable sc, Function staticTarget | - staticTarget = c.getStaticTarget() and - sc = result.asSummarizedCallable() + staticTarget = getStaticTargetExt(c) and + sc = result.asSummarizedCallable() and + // Only use summarized callables with generated summaries in case + // the static call target is not in the source code. + // Note that if `applyGeneratedModel` holds it implies that there doesn't + // exist a manual model. + not ( + staticTarget.fromSource() and + sc.applyGeneratedModel() + ) | sc = staticTarget or @@ -457,10 +493,6 @@ module RustDataFlow implements InputSig { ContentApprox getContentApprox(Content c) { result = c } - class ParameterPosition = ParameterPositionAlias; - - class ArgumentPosition = ArgumentPositionAlias; - /** * Holds if the parameter position `ppos` matches the argument position * `apos`. @@ -510,86 +542,94 @@ module RustDataFlow implements InputSig { } pragma[nomagic] - private predicate implicitDerefToReceiver(Node node1, ReceiverNode node2, ReferenceContent c) { - TypeInference::receiverHasImplicitDeref(node1.asExpr().getExpr()) and - node1.asExpr() = node2.getReceiver() and + private predicate implicitDeref(Node node1, DerefBorrowNode node2, ReferenceContent c) { + not node2.isBorrow() and + node1.asExpr() = node2.getNode() and exists(c) } pragma[nomagic] - private predicate implicitBorrowToReceiver(Node node1, ReceiverNode node2, ReferenceContent c) { - TypeInference::receiverHasImplicitBorrow(node1.asExpr().getExpr()) and - node1.asExpr() = node2.getReceiver() and + private predicate implicitBorrow(Node node1, DerefBorrowNode node2, ReferenceContent c) { + node2.isBorrow() and + node1.asExpr() = node2.getNode() and exists(c) } pragma[nomagic] private predicate referenceExprToExpr(Node node1, Node node2, ReferenceContent c) { - node1.asExpr() = node2.asExpr().(RefExprCfgNode).getExpr() and + node1.asExpr() = node2.asExpr().(RefExpr).getExpr() and exists(c) } + private Node getFieldExprContainerNode(FieldExpr fe) { + exists(Expr container | container = fe.getContainer() | + not any(DerefBorrowNode n).getNode() = container and + result.asExpr() = container + or + result.(DerefBorrowNode).getNode() = container + ) + } + pragma[nomagic] additional predicate readContentStep(Node node1, Content c, Node node2) { - exists(TupleStructPatCfgNode pat, int pos | + exists(TupleStructPat pat, int pos | pat = node1.asPat() and node2.asPat() = pat.getField(pos) and - c = TTupleFieldContent(pat.getTupleStructPat().getTupleField(pos)) + c = TTupleFieldContent(pat.getTupleField(pos)) ) or - exists(TuplePatCfgNode pat, int pos | + exists(TuplePat pat, int pos | pos = c.(TuplePositionContent).getPosition() and node1.asPat() = pat and node2.asPat() = pat.getField(pos) ) or - exists(StructPatCfgNode pat, string field | + exists(StructPat pat, string field | pat = node1.asPat() and - c = TStructFieldContent(pat.getStructPat().getStructField(field)) and - node2.asPat() = pat.getFieldPat(field) + c = TStructFieldContent(pat.getStructField(field)) and + node2.asPat() = pat.getPatField(field).getPat() ) or c instanceof ReferenceContent and - node1.asPat().(RefPatCfgNode).getPat() = node2.asPat() + node1.asPat().(RefPat).getPat() = node2.asPat() or - exists(FieldExprCfgNode access | - node1.asExpr() = access.getContainer() and + exists(FieldExpr access | + node1 = getFieldExprContainerNode(access) and node2.asExpr() = access and access = c.(FieldContent).getAnAccess() ) or - exists(IndexExprCfgNode arr | - c instanceof ElementContent and - node1.asExpr() = arr.getBase() and - node2.asExpr() = arr - ) - or - exists(ForExprCfgNode for | + exists(ForExpr for | c instanceof ElementContent and node1.asExpr() = for.getIterable() and node2.asPat() = for.getPat() ) or - exists(SlicePatCfgNode pat | + exists(SlicePat pat | c instanceof ElementContent and node1.asPat() = pat and node2.asPat() = pat.getAPat() ) or - exists(TryExprCfgNode try | + exists(TryExpr try | node1.asExpr() = try.getExpr() and node2.asExpr() = try and c.(TupleFieldContent) .isVariantField([any(OptionEnum o).getSome(), any(ResultEnum r).getOk()], 0) ) or - exists(PrefixExprCfgNode deref | + exists(DerefExpr deref | c instanceof ReferenceContent and - deref.getOperatorName() = "*" and - node1.asExpr() = deref.getExpr() and + node1.(DerefOutNode).getDerefExpr() = deref and node2.asExpr() = deref ) or + exists(IndexExpr index | + c instanceof ReferenceContent and + node1.(IndexOutNode).getIndexExpr() = index and + node2.asExpr() = index + ) + or // Read from function return exists(DataFlowCall call | lambdaCall(call, _, node1) and @@ -597,7 +637,7 @@ module RustDataFlow implements InputSig { c instanceof FunctionCallReturnContent ) or - exists(AwaitExprCfgNode await | + exists(AwaitExpr await | c instanceof FutureContent and node1.asExpr() = await.getExpr() and node2.asExpr() = await @@ -606,13 +646,21 @@ module RustDataFlow implements InputSig { referenceExprToExpr(node2.(PostUpdateNode).getPreUpdateNode(), node1.(PostUpdateNode).getPreUpdateNode(), c) or - // Step from receiver expression to receiver node, in case of an implicit - // dereference. - implicitDerefToReceiver(node1, node2, c) + implicitDeref(node1, node2, c) or // A read step dual to the store step for implicit borrows. - implicitBorrowToReceiver(node2.(PostUpdateNode).getPreUpdateNode(), - node1.(PostUpdateNode).getPreUpdateNode(), c) + exists(Node n | implicitBorrow(n, node1.(PostUpdateNode).getPreUpdateNode(), c) | + node2.(PostUpdateNode).getPreUpdateNode() = n + or + // For compound assignments into variables like `x += y`, we do not want flow into + // `[post] x`, as that would create spurious flow when `x` is a parameter. Instead, + // we add the step directly into the SSA definition for `x` after the update. + exists(CompoundAssignmentExpr cae, Expr lhs | + lhs = cae.getLhs() and + lhs = node2.(SsaNode).asDefinition().(Ssa::WriteDefinition).getWriteAccess() and + n = TExprNode(lhs) + ) + ) or VariableCapture::readStep(node1, c, node2) } @@ -644,40 +692,58 @@ module RustDataFlow implements InputSig { pragma[nomagic] private predicate fieldAssignment(Node node1, Node node2, FieldContent c) { - exists(AssignmentExprCfgNode assignment, FieldExprCfgNode access | + exists(AssignmentExpr assignment, FieldExpr access | assignment.getLhs() = access and node1.asExpr() = assignment.getRhs() and - node2.asExpr() = access.getContainer() and + node2 = getFieldExprContainerNode(access) and access = c.getAnAccess() ) } pragma[nomagic] - private predicate referenceAssignment(Node node1, Node node2, ReferenceContent c) { - exists(AssignmentExprCfgNode assignment, PrefixExprCfgNode deref | - assignment.getLhs() = deref and - deref.getOperatorName() = "*" and + private predicate referenceAssignment( + Node node1, Node node2, Expr e, boolean clears, ReferenceContent c + ) { + exists(AssignmentExpr assignment, Expr lhs | + assignment.getLhs() = lhs and node1.asExpr() = assignment.getRhs() and - node2.asExpr() = deref.getExpr() and exists(c) + | + lhs = + any(DerefExpr de | + de = node2.(DerefOutNode).getDerefExpr() and + e = de.getExpr() + ) and + clears = true + or + lhs = + any(IndexExpr ie | + ie = node2.(IndexOutNode).getIndexExpr() and + e = ie.getBase() and + clears = false + ) ) } pragma[nomagic] additional predicate storeContentStep(Node node1, Content c, Node node2) { - exists(CallExprCfgNode call, int pos | - node1.asExpr() = call.getArgument(pragma[only_bind_into](pos)) and - node2.asExpr() = call and - c = TTupleFieldContent(call.getCallExpr().getTupleField(pragma[only_bind_into](pos))) + exists(CallExpr ce, TupleField tf, int pos | + node1.asExpr() = ce.getSyntacticPositionalArgument(pos) and + node2.asExpr() = ce and + c = TTupleFieldContent(tf) + | + tf = ce.(TupleStructExpr).getTupleField(pos) + or + tf = ce.(TupleVariantExpr).getTupleField(pos) ) or - exists(StructExprCfgNode re, string field | - c = TStructFieldContent(re.getStructExpr().getStructField(field)) and - node1.asExpr() = re.getFieldExpr(field) and + exists(StructExpr re, string field | + c = TStructFieldContent(re.getStructField(field)) and + node1.asExpr() = re.getFieldExpr(field).getExpr() and node2.asExpr() = re ) or - exists(TupleExprCfgNode tuple | + exists(TupleExpr tuple | node1.asExpr() = tuple.getField(c.(TuplePositionContent).getPosition()) and node2.asExpr() = tuple ) @@ -685,28 +751,28 @@ module RustDataFlow implements InputSig { c instanceof ElementContent and node1.asExpr() = [ - node2.asExpr().(ArrayRepeatExprCfgNode).getRepeatOperand(), - node2.asExpr().(ArrayListExprCfgNode).getAnExpr() + node2.asExpr().(ArrayRepeatExpr).getRepeatOperand(), + node2.asExpr().(ArrayListExpr).getAnExpr() ] or // Store from a `ref` identifier pattern into the contained name. - exists(IdentPatCfgNode p | + exists(IdentPat p | c instanceof ReferenceContent and p.isRef() and node1.asPat() = p and - node2.(NameNode).asName() = p.getName() + node2.(NameNode).getName() = p.getName() ) or fieldAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c) or - referenceAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c) + referenceAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), _, _, c) or - exists(AssignmentExprCfgNode assignment, IndexExprCfgNode index | - c instanceof ElementContent and - assignment.getLhs() = index and - node1.asExpr() = assignment.getRhs() and - node2.(PostUpdateNode).getPreUpdateNode().asExpr() = index.getBase() - ) + indexAssignment(any(AssignmentExpr ae), _, node1, node2, c) + or + // Compund assignment like `a[i] += rhs` are modeled as a store step from `rhs` + // to `[post] a[i]`, followed by a taint step into `[post] a`. + indexAssignment(any(CompoundAssignmentExpr cae), + node2.(PostUpdateNode).getPreUpdateNode().asExpr(), node1, _, c) or referenceExprToExpr(node1, node2, c) or @@ -719,9 +785,7 @@ module RustDataFlow implements InputSig { or VariableCapture::storeStep(node1, c, node2) or - // Step from receiver expression to receiver node, in case of an implicit - // borrow. - implicitBorrowToReceiver(node1, node2, c) + implicitBorrow(node1, node2, c) } /** @@ -745,7 +809,7 @@ module RustDataFlow implements InputSig { predicate clearsContent(Node n, ContentSet cs) { fieldAssignment(_, n, cs.(SingletonContentSet).getContent()) or - referenceAssignment(_, n, cs.(SingletonContentSet).getContent()) + referenceAssignment(_, _, n.asExpr(), true, cs.(SingletonContentSet).getContent()) or FlowSummaryImpl::Private::Steps::summaryClearsContent(n.(FlowSummaryNode).getSummaryNode(), cs) or @@ -808,7 +872,7 @@ module RustDataFlow implements InputSig { /** Holds if `creation` is an expression that creates a lambda of kind `kind` for `c`. */ predicate lambdaCreation(Node creation, LambdaCallKind kind, DataFlowCallable c) { exists(kind) and - exists(Expr e | e = creation.asExpr().getExpr() | + exists(Expr e | e = creation.asExpr() | lambdaCreationExpr(e) and e = c.asCfgScope() or // A path expression, that resolves to a function, evaluates to a function @@ -825,11 +889,7 @@ module RustDataFlow implements InputSig { */ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { ( - receiver.asExpr() = call.asCallCfgNode().(CallExprCfgNode).getFunction() and - // All calls to complex expressions and local variable accesses are lambda call. - exists(Expr f | f = receiver.asExpr().getExpr() | - f instanceof PathExpr implies f = any(Variable v).getAnAccess() - ) + receiver.asExpr() = call.asCall().(CallExprImpl::DynamicCallExpr).getFunction() or call.isSummaryCall(_, receiver.(FlowSummaryNode).getSummaryNode()) ) and @@ -854,7 +914,7 @@ module VariableCapture { private import codeql.dataflow.VariableCapture as SharedVariableCapture private import codeql.rust.controlflow.BasicBlocks as BasicBlocks - private predicate closureFlowStep(ExprCfgNode e1, ExprCfgNode e2) { + private predicate closureFlowStep(Expr e1, Expr e2) { Stages::DataFlowStage::ref() and e1 = getALastEvalNode(e2) or @@ -883,48 +943,48 @@ module VariableCapture { CapturedParameter() { p = this.getParameter() } - SourceParameterNode getParameterNode() { result.getParameter().getParamBase() = p } + SourceParameterNode getParameterNode() { result.getParameter() = p } } - class Expr extends CfgNode { - predicate hasCfgNode(BasicBlocks::BasicBlock bb, int i) { this = bb.getNode(i) } + class Expr extends AstNode { + predicate hasCfgNode(BasicBlocks::BasicBlock bb, int i) { this = bb.getNode(i).getAstNode() } } class VariableWrite extends Expr { - ExprCfgNode source; + Expr source; CapturedVariable v; VariableWrite() { - exists(AssignmentExprCfgNode assign, Variable::VariableWriteAccess write | + exists(AssignmentExpr assign, Variable::VariableWriteAccess write | this = assign and v = write.getVariable() and - assign.getLhs().getExpr() = write and + assign.getLhs() = write and assign.getRhs() = source ) or - exists(LetStmtCfgNode ls | - this = ls and - v.getPat() = ls.getPat().getPat() and - ls.getInitializer() = source - ) + this = + any(LetStmt ls | + v.getPat() = ls.getPat() and + ls.getInitializer() = source + ) or - exists(LetExprCfgNode le | - this = le and - v.getPat() = le.getPat().getPat() and - le.getScrutinee() = source - ) + this = + any(LetExpr le | + v.getPat() = le.getPat() and + le.getScrutinee() = source + ) } CapturedVariable getVariable() { result = v } - ExprCfgNode getSource() { result = source } + Expr getSource() { result = source } } - class VariableRead extends Expr instanceof ExprCfgNode { + class VariableRead extends Expr { CapturedVariable v; VariableRead() { - exists(VariableAccess read | this.getExpr() = read and v = read.getVariable() | + exists(VariableAccess read | this = read and v = read.getVariable() | read instanceof VariableReadAccess or read = any(RefExpr re).getExpr() @@ -934,10 +994,10 @@ module VariableCapture { CapturedVariable getVariable() { result = v } } - class ClosureExpr extends Expr instanceof ExprCfgNode { - ClosureExpr() { lambdaCreationExpr(super.getExpr()) } + class ClosureExpr extends Expr { + ClosureExpr() { lambdaCreationExpr(this) } - predicate hasBody(Callable body) { body = super.getExpr() } + predicate hasBody(Callable body) { body = this } predicate hasAliasedAccess(Expr f) { closureFlowStep+(this, f) and not closureFlowStep(f, _) } } @@ -991,10 +1051,9 @@ private module Cached { cached newtype TDataFlowCall = - TCall(CallCfgNode c) { + TCall(Call call) { Stages::DataFlowStage::ref() and - // TODO: Handle index expressions as calls in data flow. - not c.getCall() instanceof IndexExpr + call.hasEnclosingCfgScope() } or TSummaryCall( FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll index 2763908ae02..582e5861235 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll @@ -9,22 +9,34 @@ private import codeql.rust.dataflow.internal.DataFlowImpl private import codeql.rust.internal.PathResolution private import codeql.rust.dataflow.FlowSummary private import codeql.rust.dataflow.Ssa -private import codeql.rust.controlflow.CfgNodes private import Content +predicate encodeContentTupleField(TupleFieldContent c, string arg) { + exists(Addressable a, int pos, string prefix | + arg = prefix + "(" + pos + ")" and prefix = a.getCanonicalPath() + | + c.isStructField(a, pos) or c.isVariantField(a, pos) + ) +} + +predicate encodeContentStructField(StructFieldContent c, string arg) { + exists(Addressable a, string field | arg = a.getCanonicalPath() + "::" + field | + c.isStructField(a, field) or c.isVariantField(a, field) + ) +} + module Input implements InputSig { - private import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprBaseImpl private import codeql.rust.frameworks.stdlib.Stdlib class SummarizedCallableBase = Function; abstract private class SourceSinkBase extends AstNode { /** Gets the associated call. */ - abstract CallExprBase getCall(); + abstract Call getCall(); /** Holds if the associated call resolves to `path`. */ final predicate callResolvesTo(string path) { - path = this.getCall().getStaticTarget().(Addressable).getCanonicalPath() + path = this.getCall().getResolvedTarget().getCanonicalPath() } } @@ -37,7 +49,7 @@ module Input implements InputSig { CallExprFunction() { this = call.getFunction() } - override CallExpr getCall() { result = call } + override Call getCall() { result = call } } private class MethodCallExprNameRef extends SourceBase, SinkBase { @@ -52,34 +64,19 @@ module Input implements InputSig { ReturnKind getStandardReturnValueKind() { result = TNormalReturnKind() } - string encodeParameterPosition(ParameterPosition pos) { result = pos.toString() } + string encodeParameterPosition(RustDataFlow::ParameterPosition pos) { result = pos.toString() } - string encodeArgumentPosition(RustDataFlow::ArgumentPosition pos) { - result = encodeParameterPosition(pos) - } + string encodeArgumentPosition(RustDataFlow::ArgumentPosition pos) { result = pos.toString() } string encodeContent(ContentSet cs, string arg) { exists(Content c | cs = TSingletonContentSet(c) | result = "Field" and ( - exists(Addressable a, int pos, string prefix | - arg = prefix + "(" + pos + ")" and prefix = a.getCanonicalPath() - | - c.(TupleFieldContent).isStructField(a, pos) - or - c.(TupleFieldContent).isVariantField(a, pos) - ) + encodeContentTupleField(c, arg) or - exists(Addressable a, string field | arg = a.getCanonicalPath() + "::" + field | - c.(StructFieldContent).isStructField(a, field) - or - c.(StructFieldContent).isVariantField(a, field) - ) + encodeContentStructField(c, arg) or - exists(int pos | - c = TTuplePositionContent(pos) and - arg = pos.toString() - ) + exists(int pos | c = TTuplePositionContent(pos) and arg = pos.toString()) ) or result = "Reference" and @@ -109,7 +106,9 @@ module Input implements InputSig { string encodeWithContent(ContentSet c, string arg) { result = "With" + encodeContent(c, arg) } bindingset[token] - ParameterPosition decodeUnknownParameterPosition(AccessPath::AccessPathTokenBase token) { + RustDataFlow::ParameterPosition decodeUnknownParameterPosition( + AccessPath::AccessPathTokenBase token + ) { // needed to support `Argument[x..y]` ranges token.getName() = "Argument" and result.getPosition() = AccessPath::parseInt(token.getAnArgument()) @@ -132,13 +131,11 @@ module Input implements InputSig { private import Make as Impl private module StepsInput implements Impl::Private::StepsInputSig { - DataFlowCall getACall(Public::SummarizedCallable sc) { - result.asCallCfgNode().getCall().getStaticTarget() = sc - } + DataFlowCall getACall(Public::SummarizedCallable sc) { result.asCall().getStaticTarget() = sc } /** Gets the argument of `source` described by `sc`, if any. */ private Expr getSourceNodeArgument(Input::SourceBase source, Impl::Private::SummaryComponent sc) { - exists(ArgumentPosition pos | + exists(RustDataFlow::ArgumentPosition pos | sc = Impl::Private::SummaryComponent::argument(pos) and result = pos.getArgument(source.getCall()) ) @@ -151,10 +148,9 @@ private module StepsInput implements Impl::Private::StepsInputSig { result = expr.(ClosureExpr) or // The expression is an SSA read of an assignment of a closure - exists(Ssa::Definition def, ExprCfgNode value | - def.getARead().getAstNode() = expr and - def.getAnUltimateDefinition().(Ssa::WriteDefinition).assigns(value) and - result = value.getExpr().(ClosureExpr) + exists(Ssa::Definition def | + def.getARead() = expr and + def.getAnUltimateDefinition().(Ssa::WriteDefinition).assigns(result.(ClosureExpr)) ) } @@ -164,21 +160,21 @@ private module StepsInput implements Impl::Private::StepsInputSig { RustDataFlow::Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { s.head() = Impl::Private::SummaryComponent::return(_) and - result.asExpr().getExpr() = source.getCall() + result.asExpr() = source.getCall() or - exists(ArgumentPosition pos, Expr arg | + exists(RustDataFlow::ArgumentPosition pos, Expr arg | s.head() = Impl::Private::SummaryComponent::parameter(pos) and arg = getSourceNodeArgument(source, s.tail().headOfSingleton()) and result.asParameter() = getCallable(arg).getParam(pos.getPosition()) ) or - result.(RustDataFlow::PostUpdateNode).getPreUpdateNode().asExpr().getExpr() = + result.(RustDataFlow::PostUpdateNode).getPreUpdateNode().asExpr() = getSourceNodeArgument(source, s.headOfSingleton()) } RustDataFlow::Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { - exists(CallExprBase call, Expr arg, ArgumentPosition pos | - result.asExpr().getExpr() = arg and + exists(InvocationExpr call, Expr arg, RustDataFlow::ArgumentPosition pos | + result.asExpr() = arg and sc = Impl::Private::SummaryComponent::argument(pos) and call = sink.getCall() and arg = pos.getArgument(call) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index 067ef98b2fc..12dec7d5bd0 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -47,7 +47,6 @@ private import rust private import codeql.rust.dataflow.FlowSummary private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink -private import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprBaseImpl /** * Holds if in a call to the function with canonical path `path`, the value referred @@ -124,12 +123,15 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { summaryModel(path, _, _, _, provenance, _) } + private predicate hasManualModel() { summaryModel(path, _, _, _, "manual", _) } + override predicate propagatesFlow( string input, string output, boolean preservesValue, string model ) { - exists(string kind, QlBuiltins::ExtensionId madId | - summaryModel(path, input, output, kind, _, madId) and - model = "MaD:" + madId.toString() + exists(string kind, string provenance, QlBuiltins::ExtensionId madId | + summaryModel(path, input, output, kind, provenance, madId) and + model = "MaD:" + madId.toString() and + (provenance = "manual" or not this.hasManualModel()) | kind = "value" and preservesValue = true diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll index e46b4375c04..f2f6fa1b0d8 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll @@ -14,6 +14,7 @@ private import codeql.rust.controlflow.ControlFlowGraph private import codeql.rust.controlflow.CfgNodes private import codeql.rust.dataflow.Ssa private import codeql.rust.dataflow.FlowSummary +private import codeql.rust.internal.TypeInference as TypeInference private import Node as Node private import DataFlowImpl private import FlowSummaryImpl as FlowSummaryImpl @@ -35,17 +36,17 @@ class NodePublic extends TNode { /** * Gets the expression that corresponds to this node, if any. */ - final ExprCfgNode asExpr() { this = TExprNode(result) } + final Expr asExpr() { this = TExprNode(result) } /** * Gets the parameter that corresponds to this node, if any. */ - ParamBase asParameter() { result = this.(SourceParameterNode).getParameter().getParamBase() } + ParamBase asParameter() { result = this.(SourceParameterNode).getParameter() } /** * Gets the pattern that corresponds to this node, if any. */ - final PatCfgNode asPat() { this = TPatNode(result) } + final Pat asPat() { this = TPatNode(result) } } abstract class Node extends NodePublic { @@ -56,9 +57,9 @@ abstract class Node extends NodePublic { abstract CfgScope getCfgScope(); /** - * Gets the control flow node that corresponds to this data flow node. + * Gets the AST node that corresponds to this data flow node, if any. */ - CfgNode getCfgNode() { none() } + AstNode getAstNode() { none() } } /** A data flow node used to model flow summaries. */ @@ -118,17 +119,17 @@ class FlowSummaryNode extends Node, TFlowSummaryNode { } } -/** A data flow node that corresponds directly to a CFG node for an AST node. */ -abstract class AstCfgFlowNode extends Node { - AstCfgNode n; +/** A data flow node that corresponds directly to an AST node. */ +abstract class AstNodeNode extends Node { + AstNode n; - final override CfgNode getCfgNode() { result = n } + final override AstNode getAstNode() { result = n } - final override CfgScope getCfgScope() { result = n.getAstNode().getEnclosingCfgScope() } + final override CfgScope getCfgScope() { result = n.getEnclosingCfgScope() } - final override Location getLocation() { result = n.getAstNode().getLocation() } + final override Location getLocation() { result = n.getLocation() } - final override string toString() { result = n.getAstNode().toString() } + final override string toString() { result = n.toString() } } /** @@ -139,25 +140,25 @@ abstract class AstCfgFlowNode extends Node { * to multiple `ExprNode`s, just like it may correspond to multiple * `ControlFlow::Node`s. */ -class ExprNode extends AstCfgFlowNode, TExprNode { - override ExprCfgNode n; +class ExprNode extends AstNodeNode, TExprNode { + override Expr n; ExprNode() { this = TExprNode(n) } } -final class PatNode extends AstCfgFlowNode, TPatNode { - override PatCfgNode n; +final class PatNode extends AstNodeNode, TPatNode { + override Pat n; PatNode() { this = TPatNode(n) } } /** A data flow node that corresponds to a name node in the CFG. */ -final class NameNode extends AstCfgFlowNode, TNameNode { - override NameCfgNode n; +final class NameNode extends AstNodeNode, TNameNode { + override Name n; NameNode() { this = TNameNode(n) } - NameCfgNode asName() { result = n } + Name getName() { result = n } } /** @@ -166,34 +167,34 @@ final class NameNode extends AstCfgFlowNode, TNameNode { */ abstract class ParameterNode extends Node { /** Holds if this node is a parameter of `c` at position `pos`. */ - abstract predicate isParameterOf(DataFlowCallable c, ParameterPosition pos); + abstract predicate isParameterOf(DataFlowCallable c, RustDataFlow::ParameterPosition pos); } -final class SourceParameterNode extends AstCfgFlowNode, ParameterNode, TSourceParameterNode { - override ParamBaseCfgNode n; +final class SourceParameterNode extends AstNodeNode, ParameterNode, TSourceParameterNode { + override ParamBase n; SourceParameterNode() { this = TSourceParameterNode(n) } - override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { - n.getAstNode() = pos.getParameterIn(c.asCfgScope().(Callable).getParamList()) + override predicate isParameterOf(DataFlowCallable c, RustDataFlow::ParameterPosition pos) { + n = pos.getParameterIn(c.asCfgScope().(Callable).getParamList()) } /** Get the parameter position of this parameter. */ - ParameterPosition getPosition() { this.isParameterOf(_, result) } + RustDataFlow::ParameterPosition getPosition() { this.isParameterOf(_, result) } /** Gets the parameter in the CFG that this node corresponds to. */ - ParamBaseCfgNode getParameter() { result = n } + ParamBase getParameter() { result = n } } /** A parameter for a library callable with a flow summary. */ final class SummaryParameterNode extends ParameterNode, FlowSummaryNode { - private ParameterPosition pos_; + private RustDataFlow::ParameterPosition pos_; SummaryParameterNode() { FlowSummaryImpl::Private::summaryParameterNode(this.getSummaryNode(), pos_) } - override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { + override predicate isParameterOf(DataFlowCallable c, RustDataFlow::ParameterPosition pos) { this.getSummarizedCallable() = c.asSummarizedCallable() and pos = pos_ } } @@ -209,7 +210,7 @@ final class ClosureParameterNode extends ParameterNode, TClosureSelfReferenceNod final override CfgScope getCfgScope() { result = cfgScope } - override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { + override predicate isParameterOf(DataFlowCallable c, RustDataFlow::ParameterPosition pos) { cfgScope = c.asCfgScope() and pos.isClosureSelf() } @@ -223,38 +224,56 @@ abstract class ArgumentNode extends Node { } final class ExprArgumentNode extends ArgumentNode, ExprNode { - private CallCfgNode call_; + private Call call_; private RustDataFlow::ArgumentPosition pos_; - ExprArgumentNode() { isArgumentForCall(n, call_, pos_) } + ExprArgumentNode() { + isArgumentForCall(n, call_, pos_) and + not TypeInference::implicitDeref(n) and + not TypeInference::implicitBorrow(n, _) + } override predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos) { - call.asCallCfgNode() = call_ and pos = pos_ + call.asCall() = call_ and pos = pos_ } } /** - * The receiver of a method call _after_ any implicit borrow or dereferencing - * has taken place. + * A node that represents the value of an expression _after_ implicit dereferencing + * or borrowing. */ -final class ReceiverNode extends ArgumentNode, TReceiverNode { - private CallCfgNode n; +class DerefBorrowNode extends Node, TDerefBorrowNode { + AstNode n; + boolean isBorrow; - ReceiverNode() { this = TReceiverNode(n, false) } + DerefBorrowNode() { this = TDerefBorrowNode(n, isBorrow, false) } - ExprCfgNode getReceiver() { result = n.getReceiver() } + AstNode getNode() { result = n } - MethodCallExprCfgNode getMethodCall() { result = n } + predicate isBorrow() { isBorrow = true } + + override CfgScope getCfgScope() { result = n.getEnclosingCfgScope() } + + override Location getLocation() { result = n.getLocation() } + + override string toString() { + if isBorrow = true then result = n + " [borrowed]" else result = n + " [dereferenced]" + } +} + +/** + * A node that represents the value of an argument of a call _after_ implicit + * dereferencing or borrowing. + */ +final class DerefBorrowArgNode extends DerefBorrowNode, ArgumentNode { + private DataFlowCall call_; + private RustDataFlow::ArgumentPosition pos_; + + DerefBorrowArgNode() { isArgumentForCall(n, call_.asCall(), pos_) } override predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos) { - call.asCallCfgNode() = n and pos = TSelfParameterPosition() + call = call_ and pos = pos_ } - - override CfgScope getCfgScope() { result = n.getAstNode().getEnclosingCfgScope() } - - override Location getLocation() { result = this.getReceiver().getLocation() } - - override string toString() { result = "receiver for " + this.getReceiver() } } final class SummaryArgumentNode extends FlowSummaryNode, ArgumentNode { @@ -275,13 +294,12 @@ final class SummaryArgumentNode extends FlowSummaryNode, ArgumentNode { * passed into the closure body at an invocation. */ final class ClosureArgumentNode extends ArgumentNode, ExprNode { - private CallExprCfgNode call_; + private Call call_; ClosureArgumentNode() { lambdaCallExpr(call_, _, this.asExpr()) } override predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos) { - call.asCallCfgNode() = call_ and - pos.isClosureSelf() + call.asCall() = call_ and pos.isClosureSelf() } } @@ -309,7 +327,7 @@ abstract class ReturnNode extends Node { } final class ExprReturnNode extends ExprNode, ReturnNode { - ExprReturnNode() { this.getCfgNode().getASuccessor() instanceof AnnotatedExitCfgNode } + ExprReturnNode() { n.getACfgNode().getASuccessor() instanceof AnnotatedExitCfgNode } override ReturnKind getKind() { result = TNormalReturnKind() } } @@ -329,15 +347,73 @@ abstract class OutNode extends Node { } final private class ExprOutNode extends ExprNode, OutNode { - ExprOutNode() { this.asExpr() instanceof CallCfgNode } + ExprOutNode() { + exists(Call call | + call = this.asExpr() and + not call instanceof DerefExpr and // Handled by `DerefOutNode` + not call instanceof IndexExpr // Handled by `IndexOutNode` + ) + } - /** Gets the underlying call CFG node that includes this out node. */ + /** Gets the underlying call node that includes this out node. */ override DataFlowCall getCall(ReturnKind kind) { - result.asCallCfgNode() = this.getCfgNode() and + result.asCall() = n and kind = TNormalReturnKind() } } +/** + * A node that represents the value of a `*` expression _before_ implicit + * dereferencing: + * + * `*v` equivalent to `*Deref::deref(&v)`, and this node represents the + * `Deref::deref(&v)` part. + */ +class DerefOutNode extends OutNode, TDerefOutNode { + DerefExpr de; + + DerefOutNode() { this = TDerefOutNode(de, false) } + + DerefExpr getDerefExpr() { result = de } + + override CfgScope getCfgScope() { result = de.getEnclosingCfgScope() } + + override DataFlowCall getCall(ReturnKind kind) { + result.asCall() = de and + kind = TNormalReturnKind() + } + + override Location getLocation() { result = de.getLocation() } + + override string toString() { result = de.toString() + " [pre-dereferenced]" } +} + +/** + * A node that represents the value of a `x[y]` expression _before_ implicit + * dereferencing: + * + * `x[y]` equivalent to `*x.index(y)`, and this node represents the + * `x.index(y)` part. + */ +class IndexOutNode extends OutNode, TIndexOutNode { + IndexExpr ie; + + IndexOutNode() { this = TIndexOutNode(ie, false) } + + IndexExpr getIndexExpr() { result = ie } + + override CfgScope getCfgScope() { result = ie.getEnclosingCfgScope() } + + override DataFlowCall getCall(ReturnKind kind) { + result.asCall() = ie and + kind = TNormalReturnKind() + } + + override Location getLocation() { result = ie.getLocation() } + + override string toString() { result = ie.toString() + " [pre-dereferenced]" } +} + final class SummaryOutNode extends FlowSummaryNode, OutNode { private DataFlowCall call; private ReturnKind kind_; @@ -391,27 +467,52 @@ abstract class PostUpdateNode extends PostUpdateNodePublic, Node { } final class ExprPostUpdateNode extends PostUpdateNode, TExprPostUpdateNode { - private ExprCfgNode n; + private Expr e; - ExprPostUpdateNode() { this = TExprPostUpdateNode(n) } + ExprPostUpdateNode() { this = TExprPostUpdateNode(e) } - override Node getPreUpdateNode() { result = TExprNode(n) } + override Node getPreUpdateNode() { result = TExprNode(e) } - override CfgScope getCfgScope() { result = n.getScope() } + override CfgScope getCfgScope() { result = e.getEnclosingCfgScope() } - override Location getLocation() { result = n.getLocation() } + override Location getLocation() { result = e.getLocation() } } -final class ReceiverPostUpdateNode extends PostUpdateNode, TReceiverNode { - private CallCfgNode n; +final class DerefBorrowPostUpdateNode extends PostUpdateNode, TDerefBorrowNode { + private Expr arg; + private boolean isBorrow; - ReceiverPostUpdateNode() { this = TReceiverNode(n, true) } + DerefBorrowPostUpdateNode() { this = TDerefBorrowNode(arg, isBorrow, true) } - override Node getPreUpdateNode() { result = TReceiverNode(n, false) } + override DerefBorrowNode getPreUpdateNode() { result = TDerefBorrowNode(arg, isBorrow, false) } - override CfgScope getCfgScope() { result = n.getAstNode().getEnclosingCfgScope() } + override CfgScope getCfgScope() { result = arg.getEnclosingCfgScope() } - override Location getLocation() { result = n.getReceiver().getLocation() } + override Location getLocation() { result = arg.getLocation() } +} + +class DerefOutPostUpdateNode extends PostUpdateNode, TDerefOutNode { + DerefExpr de; + + DerefOutPostUpdateNode() { this = TDerefOutNode(de, true) } + + override DerefOutNode getPreUpdateNode() { result = TDerefOutNode(de, false) } + + override CfgScope getCfgScope() { result = de.getEnclosingCfgScope() } + + override Location getLocation() { result = de.getLocation() } +} + +class IndexOutPostUpdateNode extends PostUpdateNode, TIndexOutNode { + IndexExpr ie; + + IndexOutPostUpdateNode() { this = TIndexOutNode(ie, true) } + + override IndexOutNode getPreUpdateNode() { result = TIndexOutNode(ie, false) } + + override CfgScope getCfgScope() { result = ie.getEnclosingCfgScope() } + + override Location getLocation() { result = ie.getLocation() } } final class SummaryPostUpdateNode extends FlowSummaryNode, PostUpdateNode { @@ -445,38 +546,49 @@ final class CastNode extends ExprNode { cached newtype TNode = - TExprNode(ExprCfgNode n) { Stages::DataFlowStage::ref() } or - TSourceParameterNode(ParamBaseCfgNode p) or - TPatNode(PatCfgNode p) or - TNameNode(NameCfgNode n) { n.getName() = any(Variable v).getName() } or - TExprPostUpdateNode(ExprCfgNode e) { - isArgumentForCall(e, _, _) - or - lambdaCallExpr(_, _, e) - or - lambdaCreationExpr(e.getExpr()) - or - // Whenever `&mut e` has a post-update node we also create one for `e`. - // E.g., for `e` in `f(..., &mut e, ...)` or `*(&mut e) = ...`. - e = any(RefExprCfgNode ref | ref.isMut() and exists(TExprPostUpdateNode(ref))).getExpr() - or - e = - [ - any(IndexExprCfgNode i).getBase(), // - any(FieldExprCfgNode access).getContainer(), // - any(TryExprCfgNode try).getExpr(), // - any(PrefixExprCfgNode pe | pe.getOperatorName() = "*").getExpr(), // - any(AwaitExprCfgNode a).getExpr(), // - any(MethodCallExprCfgNode mc).getReceiver(), // - getPostUpdateReverseStep(any(PostUpdateNode n).getPreUpdateNode().asExpr(), _) - ] + TExprNode(Expr e) { e.hasEnclosingCfgScope() and Stages::DataFlowStage::ref() } or + TSourceParameterNode(ParamBase p) { p.hasEnclosingCfgScope() } or + TPatNode(Pat p) { p.hasEnclosingCfgScope() } or + TNameNode(Name n) { n = any(Variable v).getName() and n.hasEnclosingCfgScope() } or + TExprPostUpdateNode(Expr e) { + e.hasEnclosingCfgScope() and + ( + isArgumentForCall(e, _, _) and + // For compound assignments into variables like `x += y`, we do not want flow into + // `[post] x`, as that would create spurious flow when `x` is a parameter. + not (e = any(CompoundAssignmentExpr cae).getLhs() and e instanceof VariableAccess) + or + lambdaCallExpr(_, _, e) + or + lambdaCreationExpr(e) + or + // Whenever `&mut e` has a post-update node we also create one for `e`. + // E.g., for `e` in `f(..., &mut e, ...)` or `*(&mut e) = ...`. + e = any(RefExpr ref | ref.isMut() and exists(TExprPostUpdateNode(ref))).getExpr() + or + e = + [ + any(FieldExpr access).getContainer(), // + any(TryExpr try).getExpr(), // + any(AwaitExpr a).getExpr(), // + getPostUpdateReverseStep(any(PostUpdateNode n).getPreUpdateNode().asExpr(), _) + ] + ) } or - TReceiverNode(CallCfgNode mc, Boolean isPost) { - mc.getCall().receiverImplicitlyBorrowed() and - // TODO: Handle index expressions as calls in data flow. - not mc.getCall() instanceof IndexExpr + TDerefBorrowNode(AstNode n, boolean borrow, Boolean isPost) { + TypeInference::implicitDeref(n) and + borrow = false + or + TypeInference::implicitBorrow(n, _) and + borrow = true } or + TDerefOutNode(DerefExpr de, Boolean isPost) or + TIndexOutNode(IndexExpr ie, Boolean isPost) or TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or - TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) or + TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) { + forall(AstNode n | n = sn.getSinkElement() or n = sn.getSourceElement() | + n.hasEnclosingCfgScope() + ) + } or TClosureSelfReferenceNode(CfgScope c) { lambdaCreationExpr(c) } or TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll index 49b40474c98..03db7c35b4d 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll @@ -2,7 +2,6 @@ private import rust private import codeql.rust.controlflow.BasicBlocks as BasicBlocks private import BasicBlocks private import codeql.rust.controlflow.ControlFlowGraph as Cfg -private import codeql.rust.controlflow.CfgNodes as CfgNodes private import Cfg private import codeql.rust.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import codeql.ssa.Ssa as SsaImplCommon @@ -155,7 +154,7 @@ private predicate variableWriteInOuterScope(BasicBlock bb, int i, Variable v, Cf } /** Holds if evaluating `e` jumps to the evaluation of a different CFG scope. */ -private predicate isControlFlowJump(Expr e) { e instanceof CallExprBase or e instanceof AwaitExpr } +private predicate isControlFlowJump(Expr e) { e instanceof Call or e instanceof AwaitExpr } /** * Holds if the call `call` at index `i` in basic block `bb` may reach @@ -229,11 +228,11 @@ private module Cached { } cached - CfgNode getARead(Definition def) { + Expr getARead(Definition def) { exists(Variable v, BasicBlock bb, int i | Impl::ssaDefReachesRead(v, def, bb, i) and variableReadCertain(bb, i, v.getAnAccess(), v) and - result = bb.getNode(i) + result = bb.getNode(i).getAstNode() ) } @@ -247,8 +246,10 @@ private module Cached { * without passing through any other non-pseudo read. */ cached - predicate firstRead(Definition def, CfgNode read) { - exists(BasicBlock bb, int i | Impl::firstUse(def, bb, i, true) and read = bb.getNode(i)) + predicate firstRead(Definition def, Expr read) { + exists(BasicBlock bb, int i | + Impl::firstUse(def, bb, i, true) and read = bb.getNode(i).getAstNode() + ) } /** @@ -257,12 +258,12 @@ private module Cached { * passing through another non-pseudo read. */ cached - predicate adjacentReadPair(Definition def, CfgNode read1, CfgNode read2) { + predicate adjacentReadPair(Definition def, Expr read1, Expr read2) { exists(BasicBlock bb1, int i1, BasicBlock bb2, int i2, Variable v | Impl::ssaDefReachesRead(v, def, bb1, i1) and Impl::adjacentUseUse(bb1, i1, bb2, i2, v, true) and - read1 = bb1.getNode(i1) and - read2 = bb2.getNode(i2) + read1 = bb1.getNode(i1).getAstNode() and + read2 = bb2.getNode(i2).getAstNode() ) } @@ -287,7 +288,7 @@ private module Cached { DataFlowIntegrationImpl::localMustFlowStep(v, nodeFrom, nodeTo) } - signature predicate guardChecksSig(CfgNodes::AstCfgNode g, Cfg::CfgNode e, boolean branch); + signature predicate guardChecksSig(AstNode g, Expr e, boolean branch); cached // nothing is actually cached module BarrierGuard { @@ -310,47 +311,47 @@ private module Cached { import Cached private import codeql.rust.dataflow.Ssa +private class ExprAlias = Expr; + private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInputSig { private import codeql.rust.dataflow.internal.DataFlowImpl as DataFlowImpl private import codeql.util.Boolean - class Expr extends CfgNodes::AstCfgNode { - predicate hasCfgNode(BasicBlock bb, int i) { this = bb.getNode(i) } + class Expr extends ExprAlias { + predicate hasCfgNode(BasicBlock bb, int i) { this.getACfgNode() = bb.getNode(i) } } Expr getARead(Definition def) { result = Cached::getARead(def) } predicate ssaDefHasSource(WriteDefinition def) { none() } // handled in `DataFlowImpl.qll` instead - private predicate isArg(CfgNodes::CallExprBaseCfgNode call, CfgNodes::ExprCfgNode e) { - call.getArgument(_) = e + private predicate isArg(Call call, Expr e) { + call.getASyntacticArgument() = e or - call.(CfgNodes::MethodCallExprCfgNode).getReceiver() = e - or - exists(CfgNodes::ExprCfgNode mid | + exists(Expr mid | isArg(call, mid) and e = DataFlowImpl::getPostUpdateReverseStep(mid, _) ) } predicate allowFlowIntoUncertainDef(UncertainWriteDefinition def) { - exists(CfgNodes::CallExprBaseCfgNode call, Variable v, BasicBlock bb, int i | + exists(Variable v, BasicBlock bb, int i | def.definesAt(v, bb, i) and mutablyBorrows(bb.getNode(i).getAstNode(), v) and - isArg(call, bb.getNode(i)) + isArg(_, bb.getNode(i).getAstNode()) ) } class GuardValue = Boolean; - class Guard extends CfgNodes::AstCfgNode { + class Guard extends AstNode { /** * Holds if the evaluation of this guard to `branch` corresponds to the edge * from `bb1` to `bb2`. */ predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { exists(Cfg::ConditionalSuccessor s | - this = bb1.getANode() and + this = bb1.getANode().getAstNode() and bb2 = bb1.getASuccessor(s) and s.getValue() = branch ) @@ -369,7 +370,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue branch) { exists(ConditionBasicBlock conditionBlock, ConditionalSuccessor s | - guard = conditionBlock.getLastNode() and + guard = conditionBlock.getLastNode().getAstNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) ) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll index b702c514c1a..33d44501cfc 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll @@ -1,6 +1,5 @@ private import rust private import codeql.dataflow.TaintTracking -private import codeql.rust.controlflow.CfgNodes private import codeql.rust.dataflow.DataFlow private import codeql.rust.dataflow.FlowSummary private import DataFlowImpl @@ -8,6 +7,27 @@ private import Node as Node private import Content private import FlowSummaryImpl as FlowSummaryImpl private import codeql.rust.internal.CachedStages +private import codeql.rust.internal.TypeInference as TypeInference +private import codeql.rust.internal.Type as Type +private import codeql.rust.frameworks.stdlib.Builtins as Builtins + +/** + * Holds if the field `field` should, by default, be excluded from taint steps + * from the containing type to reads of the field. The models-as-data syntax + * used to denote the field is the same as for `Field[]` access path elements. + */ +extensible predicate excludeFieldTaintStep(string field); + +/** + * Holds if the content `c` corresponds to a field that has explicitly been + * excluded as a taint step. + */ +private predicate excludedTaintStepContent(Content c) { + exists(string arg | excludeFieldTaintStep(arg) | + FlowSummaryImpl::encodeContentStructField(c, arg) or + FlowSummaryImpl::encodeContentTupleField(c, arg) + ) +} module RustTaintTracking implements InputSig { predicate defaultTaintSanitizer(DataFlow::Node node) { none() } @@ -21,43 +41,48 @@ module RustTaintTracking implements InputSig { Stages::DataFlowStage::ref() and model = "" and ( - exists(BinaryExprCfgNode binary | - binary.getOperatorName() = ["+", "-", "*", "/", "%", "&", "|", "^", "<<", ">>"] and - pred.asExpr() = [binary.getLhs(), binary.getRhs()] and - succ.asExpr() = binary - ) + pred.asExpr() = succ.asExpr().(CastExpr).getExpr() or - exists(PrefixExprCfgNode prefix | - prefix.getOperatorName() = ["-", "!"] and - pred.asExpr() = prefix.getExpr() and - succ.asExpr() = prefix - ) - or - pred.asExpr() = succ.asExpr().(CastExprCfgNode).getExpr() - or - exists(IndexExprCfgNode index | - index.getIndex() instanceof RangeExprCfgNode and + exists(IndexExpr index | + index.getIndex() instanceof RangeExpr and pred.asExpr() = index.getBase() and succ.asExpr() = index ) or - // Although data flow through collections and references is modeled using - // stores/reads, we also allow taint to flow out of a tainted collection - // or reference. - // This is needed in order to support taint-tracking configurations where - // the source is a collection or reference. + // Read steps give rise to taint steps. This has the effect that if `foo` + // is tainted and an operation reads from `foo` (e.g., `foo.bar`) then + // taint is propagated. + exists(Content c | + RustDataFlow::readContentStep(pred, c, succ) and + not excludedTaintStepContent(c) + ) + or + // In addition to the above, for element and reference content we let + // _all_ read steps (including those from flow summaries and those that + // result in small primitive types) give rise to taint steps. exists(SingletonContentSet cs | RustDataFlow::readStep(pred, cs, succ) | cs.getContent() instanceof ElementContent or cs.getContent() instanceof ReferenceContent ) or - exists(FormatArgsExprCfgNode format | succ.asExpr() = format | - pred.asExpr() = [format.getArgumentExpr(_), format.getFormatTemplateVariableAccess(_)] + exists(FormatArgsExpr format | succ.asExpr() = format | + pred.asExpr() = format.getAnArg().getExpr() + or + pred.asExpr() = + any(FormatTemplateVariableAccess v | + exists(Format f | + f = format.getAFormat() and + v.getArgument() = [f.getArgumentRef(), f.getWidthArgument(), f.getPrecisionArgument()] + ) + ) ) or succ.(Node::PostUpdateNode).getPreUpdateNode().asExpr() = getPostUpdateReverseStep(pred.(Node::PostUpdateNode).getPreUpdateNode().asExpr(), false) + or + indexAssignment(any(CompoundAssignmentExpr cae), + pred.(Node::PostUpdateNode).getPreUpdateNode().asExpr(), _, succ, _) ) or FlowSummaryImpl::Private::Steps::summaryLocalStep(pred.(Node::FlowSummaryNode).getSummaryNode(), diff --git a/rust/ql/lib/codeql/rust/elements.qll b/rust/ql/lib/codeql/rust/elements.qll index b42a93efc6c..1377c543f78 100644 --- a/rust/ql/lib/codeql/rust/elements.qll +++ b/rust/ql/lib/codeql/rust/elements.qll @@ -6,7 +6,6 @@ import codeql.files.FileSystem import codeql.rust.elements.Abi import codeql.rust.elements.Addressable -import codeql.rust.elements.Adt import codeql.rust.elements.ArgList import codeql.rust.elements.ArrayExpr import codeql.rust.elements.ArrayListExpr @@ -38,7 +37,6 @@ import codeql.rust.elements.BlockExpr import codeql.rust.elements.BoxPat import codeql.rust.elements.BreakExpr import codeql.rust.elements.CallExpr -import codeql.rust.elements.CallExprBase import codeql.rust.elements.Callable import codeql.rust.elements.CastExpr import codeql.rust.elements.ClosureExpr @@ -174,6 +172,7 @@ import codeql.rust.elements.TypeAlias import codeql.rust.elements.TypeArg import codeql.rust.elements.TypeBound import codeql.rust.elements.TypeBoundList +import codeql.rust.elements.TypeItem import codeql.rust.elements.TypeParam import codeql.rust.elements.TypeRepr import codeql.rust.elements.UnderscoreExpr diff --git a/rust/ql/lib/codeql/rust/elements/Adt.qll b/rust/ql/lib/codeql/rust/elements/Adt.qll deleted file mode 100644 index c8fa30d743d..00000000000 --- a/rust/ql/lib/codeql/rust/elements/Adt.qll +++ /dev/null @@ -1,13 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the public class `Adt`. - */ - -private import internal.AdtImpl -import codeql.rust.elements.Item -import codeql.rust.elements.MacroItems - -/** - * An ADT (Abstract Data Type) definition, such as `Struct`, `Enum`, or `Union`. - */ -final class Adt = Impl::Adt; diff --git a/rust/ql/lib/codeql/rust/elements/AssignmentOperation.qll b/rust/ql/lib/codeql/rust/elements/AssignmentOperation.qll index a3ca1722b57..6fbbdf7cd81 100644 --- a/rust/ql/lib/codeql/rust/elements/AssignmentOperation.qll +++ b/rust/ql/lib/codeql/rust/elements/AssignmentOperation.qll @@ -25,6 +25,11 @@ final class AssignmentOperation = AssignmentOperationImpl; final class AssignmentExpr extends AssignmentOperationImpl { AssignmentExpr() { this.getOperatorName() = "=" } + /** + * Gets a write access that occurs in the left-hand side of this assignment expression. + */ + VariableWriteAccess getAWriteAccess() { this = result.getAssignmentExpr() } + override string getAPrimaryQlClass() { result = "AssignmentExpr" } } diff --git a/rust/ql/lib/codeql/rust/elements/Call.qll b/rust/ql/lib/codeql/rust/elements/Call.qll index 0fd7f1397e2..3a14425df1e 100644 --- a/rust/ql/lib/codeql/rust/elements/Call.qll +++ b/rust/ql/lib/codeql/rust/elements/Call.qll @@ -1,9 +1,11 @@ /** - * This module provides the public class `Call`. + * This module provides the public classes `Call` and `MethodCall`. */ +private import rust private import internal.CallImpl - -final class ArgumentPosition = Impl::ArgumentPosition; +private import internal.CallExprImpl::Impl as CallExprImpl final class Call = Impl::Call; + +final class MethodCall = Impl::MethodCall; diff --git a/rust/ql/lib/codeql/rust/elements/CallExpr.qll b/rust/ql/lib/codeql/rust/elements/CallExpr.qll index ab5631b07ca..1344af3a124 100644 --- a/rust/ql/lib/codeql/rust/elements/CallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/CallExpr.qll @@ -4,16 +4,20 @@ */ private import internal.CallExprImpl -import codeql.rust.elements.CallExprBase +import codeql.rust.elements.ArgList +import codeql.rust.elements.Attr import codeql.rust.elements.Expr /** - * A function call expression. For example: + * NOTE: Consider using `Call` instead, as that excludes call expressions that are + * instantiations of tuple structs and tuple variants. + * + * A call expression. For example: * ```rust * foo(42); * foo::(42); * foo[0](42); - * foo(1) = 4; + * Option::Some(42); // tuple variant instantiation * ``` */ final class CallExpr = Impl::CallExpr; diff --git a/rust/ql/lib/codeql/rust/elements/CallExprBase.qll b/rust/ql/lib/codeql/rust/elements/CallExprBase.qll deleted file mode 100644 index d59c4c705f7..00000000000 --- a/rust/ql/lib/codeql/rust/elements/CallExprBase.qll +++ /dev/null @@ -1,14 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the public class `CallExprBase`. - */ - -private import internal.CallExprBaseImpl -import codeql.rust.elements.ArgList -import codeql.rust.elements.Attr -import codeql.rust.elements.Expr - -/** - * A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. - */ -final class CallExprBase = Impl::CallExprBase; diff --git a/rust/ql/lib/codeql/rust/elements/Enum.qll b/rust/ql/lib/codeql/rust/elements/Enum.qll index 9d52b558f53..9bad986cef5 100644 --- a/rust/ql/lib/codeql/rust/elements/Enum.qll +++ b/rust/ql/lib/codeql/rust/elements/Enum.qll @@ -4,13 +4,8 @@ */ private import internal.EnumImpl -import codeql.rust.elements.Adt -import codeql.rust.elements.Attr -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.Name +import codeql.rust.elements.TypeItem import codeql.rust.elements.VariantList -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause /** * An enum declaration. diff --git a/rust/ql/lib/codeql/rust/elements/InvocationExpr.qll b/rust/ql/lib/codeql/rust/elements/InvocationExpr.qll new file mode 100644 index 00000000000..315c6bdef84 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/InvocationExpr.qll @@ -0,0 +1,9 @@ +/** + * This module provides the public classes `InvocationExpr` and `ArgumentPosition`. + */ + +private import internal.InvocationExprImpl + +final class InvocationExpr = Impl::InvocationExpr; + +final class ArgumentPosition = Impl::ArgumentPosition; diff --git a/rust/ql/lib/codeql/rust/elements/Method.qll b/rust/ql/lib/codeql/rust/elements/Method.qll new file mode 100644 index 00000000000..e29b7acae9c --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/Method.qll @@ -0,0 +1,22 @@ +/** + * This module provides the public class `Method`. + */ + +private import rust + +/** + * A method declaration. For example + * ```rust + * fn foo(self, x: u32) -> u64 { (x + 1).into() } + * ``` + * + * A method declaration within a trait might not have a body: + * ```rust + * trait Trait { + * fn bar(self); + * } + * ``` + */ +final class Method extends Function { + Method() { this.hasSelfParam() } +} diff --git a/rust/ql/lib/codeql/rust/elements/MethodCallExpr.qll b/rust/ql/lib/codeql/rust/elements/MethodCallExpr.qll index fca8b086134..3ac0fccc42d 100644 --- a/rust/ql/lib/codeql/rust/elements/MethodCallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/MethodCallExpr.qll @@ -4,12 +4,17 @@ */ private import internal.MethodCallExprImpl -import codeql.rust.elements.CallExprBase +import codeql.rust.elements.ArgList +import codeql.rust.elements.Attr import codeql.rust.elements.Expr import codeql.rust.elements.GenericArgList import codeql.rust.elements.NameRef /** + * NOTE: Consider using `MethodCall` instead, as that also includes calls to methods using + * call syntax (such as `Foo::method(x)`), operation syntax (such as `x + y`), and + * indexing syntax (such as `x[y]`). + * * A method call expression. For example: * ```rust * x.foo(42); diff --git a/rust/ql/lib/codeql/rust/elements/Struct.qll b/rust/ql/lib/codeql/rust/elements/Struct.qll index 7627f866f05..fb9bec418da 100644 --- a/rust/ql/lib/codeql/rust/elements/Struct.qll +++ b/rust/ql/lib/codeql/rust/elements/Struct.qll @@ -4,13 +4,8 @@ */ private import internal.StructImpl -import codeql.rust.elements.Adt -import codeql.rust.elements.Attr import codeql.rust.elements.FieldList -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.Name -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause +import codeql.rust.elements.TypeItem /** * A Struct. For example: diff --git a/rust/ql/lib/codeql/rust/elements/TupleField.qll b/rust/ql/lib/codeql/rust/elements/TupleField.qll index 9dcfaa4fb33..3e63f377aeb 100644 --- a/rust/ql/lib/codeql/rust/elements/TupleField.qll +++ b/rust/ql/lib/codeql/rust/elements/TupleField.qll @@ -10,7 +10,7 @@ import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility /** - * A field in a tuple struct or tuple enum variant. + * A field in a tuple struct or tuple variant. * * For example: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/TupleFieldList.qll b/rust/ql/lib/codeql/rust/elements/TupleFieldList.qll index 0c464944993..f2651228a78 100644 --- a/rust/ql/lib/codeql/rust/elements/TupleFieldList.qll +++ b/rust/ql/lib/codeql/rust/elements/TupleFieldList.qll @@ -8,7 +8,7 @@ import codeql.rust.elements.FieldList import codeql.rust.elements.TupleField /** - * A list of fields in a tuple struct or tuple enum variant. + * A list of fields in a tuple struct or tuple variant. * * For example: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/TupleStructExpr.qll b/rust/ql/lib/codeql/rust/elements/TupleStructExpr.qll new file mode 100644 index 00000000000..88da6aaa1cf --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/TupleStructExpr.qll @@ -0,0 +1,7 @@ +/** + * This module provides the public class `TupleStructExpr`. + */ + +private import internal.CallExprImpl + +final class TupleStructExpr = Impl::TupleStructExpr; diff --git a/rust/ql/lib/codeql/rust/elements/TupleVariantExpr.qll b/rust/ql/lib/codeql/rust/elements/TupleVariantExpr.qll new file mode 100644 index 00000000000..9afd18ea0d9 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/TupleVariantExpr.qll @@ -0,0 +1,7 @@ +/** + * This module provides the public class `TupleVariantExpr`. + */ + +private import internal.CallExprImpl + +final class TupleVariantExpr = Impl::TupleVariantExpr; diff --git a/rust/ql/lib/codeql/rust/elements/TypeItem.qll b/rust/ql/lib/codeql/rust/elements/TypeItem.qll new file mode 100644 index 00000000000..48d22478df0 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/TypeItem.qll @@ -0,0 +1,18 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `TypeItem`. + */ + +private import internal.TypeItemImpl +import codeql.rust.elements.Attr +import codeql.rust.elements.GenericParamList +import codeql.rust.elements.Item +import codeql.rust.elements.MacroItems +import codeql.rust.elements.Name +import codeql.rust.elements.Visibility +import codeql.rust.elements.WhereClause + +/** + * An item that defines a type. Either a `Struct`, `Enum`, or `Union`. + */ +final class TypeItem = Impl::TypeItem; diff --git a/rust/ql/lib/codeql/rust/elements/Union.qll b/rust/ql/lib/codeql/rust/elements/Union.qll index 988a1cf9799..4fc8584c9fe 100644 --- a/rust/ql/lib/codeql/rust/elements/Union.qll +++ b/rust/ql/lib/codeql/rust/elements/Union.qll @@ -4,13 +4,8 @@ */ private import internal.UnionImpl -import codeql.rust.elements.Adt -import codeql.rust.elements.Attr -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.Name import codeql.rust.elements.StructFieldList -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause +import codeql.rust.elements.TypeItem /** * A union declaration. diff --git a/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll index 69138190dba..554942f0fdd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AstNodeImpl.qll @@ -59,6 +59,9 @@ module Impl { ) } + /** Holds if this node is inside a CFG scope. */ + predicate hasEnclosingCfgScope() { exists(this.getEnclosingCfgScope()) } + /** Gets the block that encloses this node, if any. */ cached BlockExpr getEnclosingBlock() { diff --git a/rust/ql/lib/codeql/rust/elements/internal/BlockExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/BlockExprImpl.qll index 9011109b194..9e8576dc440 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/BlockExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/BlockExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `BlockExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.BlockExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A block expression. For example: * ```rust @@ -26,5 +26,10 @@ module Impl { * } * ``` */ - class BlockExpr extends Generated::BlockExpr { } + class BlockExpr extends Generated::BlockExpr { + /** + * Gets the tail expression of this block, if it exists. + */ + Expr getTailExpr() { result = this.getStmtList().getTailExpr() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll deleted file mode 100644 index 05d5aee7a06..00000000000 --- a/rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll +++ /dev/null @@ -1,27 +0,0 @@ -/** - * This module provides a hand-modifiable wrapper around the generated class `CallExprBase`. - * - * INTERNAL: Do not use. - */ - -private import codeql.rust.elements.internal.generated.CallExprBase - -/** - * INTERNAL: This module contains the customizable definition of `CallExprBase` and should not - * be referenced directly. - */ -module Impl { - private import rust - private import codeql.rust.internal.TypeInference as TypeInference - - // the following QLdoc is generated: if you need to edit it, do it in the schema file - /** - * A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. - */ - class CallExprBase extends Generated::CallExprBase { - /** Gets the static target (function or tuple struct/variant) of this call, if any. */ - final Addressable getStaticTarget() { result = TypeInference::resolveCallTarget(this) } - - override Expr getArg(int index) { result = this.getArgList().getArg(index) } - } -} diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll index 5723e1fdbb5..cad921640ef 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll @@ -5,7 +5,6 @@ */ private import codeql.rust.elements.internal.generated.CallExpr -private import codeql.rust.elements.PathExpr /** * INTERNAL: This module contains the customizable definition of `CallExpr` and should not @@ -13,7 +12,10 @@ private import codeql.rust.elements.PathExpr */ module Impl { private import rust + private import codeql.rust.elements.internal.InvocationExprImpl::Impl as InvocationExprImpl + private import codeql.rust.elements.internal.CallImpl::Impl as CallImpl private import codeql.rust.internal.PathResolution as PathResolution + private import codeql.rust.internal.TypeInference as TypeInference pragma[nomagic] Path getFunctionPath(CallExpr ce) { result = ce.getFunction().(PathExpr).getPath() } @@ -23,9 +25,31 @@ module Impl { result = PathResolution::resolvePath(getFunctionPath(ce)) } + private Expr getSyntacticArg(CallExpr ce, int i) { result = ce.getArgList().getArg(i) } + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * A function call expression. For example: + * NOTE: Consider using `Call` instead, as that excludes call expressions that are + * instantiations of tuple structs and tuple variants. + * + * A call expression. For example: + * ```rust + * foo(42); + * foo::(42); + * foo[0](42); + * Option::Some(42); // tuple variant instantiation + * ``` + */ + class CallExpr extends Generated::CallExpr, InvocationExprImpl::InvocationExpr { + override string toStringImpl() { result = this.getFunction().toAbbreviatedString() + "(...)" } + + override Expr getSyntacticPositionalArgument(int i) { result = getSyntacticArg(this, i) } + } + + /** + * A call expression that is _not_ an instantiation of a tuple struct or a tuple variant. + * + * For example: * ```rust * foo(42); * foo::(42); @@ -33,33 +57,102 @@ module Impl { * foo(1) = 4; * ``` */ - class CallExpr extends Generated::CallExpr { - override string toStringImpl() { result = this.getFunction().toAbbreviatedString() + "(...)" } - - /** Gets the struct that this call resolves to, if any. */ - Struct getStruct() { result = getResolvedFunction(this) } - - /** Gets the variant that this call resolves to, if any. */ - Variant getVariant() { result = getResolvedFunction(this) } - - pragma[nomagic] - private PathResolution::ItemNode getResolvedFunctionAndPos(int pos) { - result = getResolvedFunction(this) and - exists(this.getArg(pos)) + class CallExprCall extends CallExpr, CallImpl::Call { + CallExprCall() { + not this instanceof TupleStructExpr and + not this instanceof TupleVariantExpr } - /** - * Gets the tuple field that matches the `pos`th argument of this call, if any. - * - * For example, if this call is `Option::Some(42)`, then the tuple field matching - * `42` is the first field of `Option::Some`. - */ - pragma[nomagic] - TupleField getTupleField(int pos) { - exists(PathResolution::ItemNode i | i = this.getResolvedFunctionAndPos(pos) | - result.isStructField(i, pos) or - result.isVariantField(i, pos) + override Expr getPositionalArgument(int i) { result = getSyntacticArg(this, i) } + } + + /** + * A call expression that targets a closure (or any value that implements + * `Fn`, `FnMut`, or `FnOnce`). + * + * Dynamic calls never have a static target, and the set of potential + * run-time targets is only available internally to the data flow library. + */ + class DynamicCallExpr extends CallExprCall { + DynamicCallExpr() { + exists(Expr f | f = this.getFunction() | + // All calls to complex expressions and local variable accesses are lambda calls + f instanceof PathExpr implies f = any(Variable v).getAnAccess() ) } } + + /** + * A call expression that is a _potential_ method call. + * + * Note: In order to prevent the AST layer from relying on the type inference + * layer, we do not check that the resolved target is a method in the charpred, + * instead we check this in `getPositionalArgument` and `getReceiver`. + */ + class CallExprMethodCall extends CallImpl::MethodCall, CallExprCall { + CallExprMethodCall() { not this instanceof DynamicCallExpr } + + private predicate isInFactMethodCall() { this.getResolvedTarget() instanceof Method } + + override Expr getPositionalArgument(int i) { + if this.isInFactMethodCall() + then result = getSyntacticArg(this, i + 1) + else result = getSyntacticArg(this, i) + } + + override Expr getReceiver() { + this.isInFactMethodCall() and + result = getSyntacticArg(this, 0) + } + } + + /** + * A call expression that instantiates a tuple struct. + * + * For example: + * ```rust + * struct S(u32, u64); + * let s = S(42, 84); + * ``` + */ + class TupleStructExpr extends CallExpr { + private Struct struct; + + TupleStructExpr() { struct = getResolvedFunction(this) } + + /** Gets the struct that is instantiated. */ + Struct getStruct() { result = struct } + + /** Gets the `i`th tuple field of the instantiated struct. */ + pragma[nomagic] + TupleField getTupleField(int i) { result = this.getStruct().getTupleField(i) } + + override string getAPrimaryQlClass() { result = "TupleStructExpr" } + } + + /** + * A call expression that instantiates a tuple variant. + * + * For example: + * ```rust + * enum E { + * V(u32, u64), + * } + * let e = E::V(42, 84); + * ``` + */ + class TupleVariantExpr extends CallExpr { + private Variant variant; + + TupleVariantExpr() { variant = getResolvedFunction(this) } + + /** Gets the variant that is instantiated. */ + Variant getVariant() { result = variant } + + /** Gets the `i`th tuple field of the instantiated variant. */ + pragma[nomagic] + TupleField getTupleField(int i) { result = this.getVariant().getTupleField(i) } + + override string getAPrimaryQlClass() { result = "TupleVariantExpr" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll index 210820fd105..e35b932242c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll @@ -1,209 +1,109 @@ private import rust -private import codeql.rust.internal.PathResolution -private import codeql.rust.internal.TypeInference as TypeInference -private import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl -private import codeql.rust.elements.Operation module Impl { - newtype TArgumentPosition = - TPositionalArgumentPosition(int i) { - i in [0 .. max([any(ParamList l).getNumberOfParams(), any(ArgList l).getNumberOfArgs()]) - 1] - } or - TSelfArgumentPosition() - - /** An argument position in a call. */ - class ArgumentPosition extends TArgumentPosition { - /** Gets the index of the argument in the call, if this is a positional argument. */ - int asPosition() { this = TPositionalArgumentPosition(result) } - - /** Holds if this call position is a self argument. */ - predicate isSelf() { this instanceof TSelfArgumentPosition } - - /** Gets a string representation of this argument position. */ - string toString() { - result = this.asPosition().toString() - or - this.isSelf() and result = "self" - } - } + private import codeql.rust.internal.TypeInference as TypeInference + private import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl + private import codeql.rust.elements.internal.InvocationExprImpl::Impl as InvocationExprImpl /** - * An expression that calls a function. + * A call. * - * This class abstracts over the different ways in which a function can be - * called in Rust. + * Either + * + * - a `CallExpr` that is _not_ an instantiation of a tuple struct or a tuple variant, + * - a `MethodCallExpr`, + * - an `Operation` that targets an overloadable operator, or + * - an `IndexExpr`. */ - abstract class Call extends ExprImpl::Expr { - /** Holds if the receiver of this call is implicitly borrowed. */ - predicate receiverImplicitlyBorrowed() { this.implicitBorrowAt(TSelfArgumentPosition(), _) } + abstract class Call extends InvocationExprImpl::InvocationExpr { + /** + * Gets the argument at position `pos` of this call. + * + * Examples: + * ```rust + * foo(42, "bar"); // `42` is argument 0 and `"bar"` is argument 1 + * foo.bar(42); // `foo` is receiver and `42` is argument 0 + * Foo::bar(foo, 42); // `foo` is receiver and `42` is argument 0 + * x + y; // `x` is receiver and `y` is argument 0 + * -x; // `x` is receiver + * x[y]; // `x` is receiver and `y` is argument 0 + * ``` + */ + final Expr getArgument(ArgumentPosition pos) { + result = this.getPositionalArgument(pos.asPosition()) + or + pos.isSelf() and + result = this.(MethodCall).getReceiver() + } - /** Gets the trait targeted by this call, if any. */ - abstract Trait getTrait(); + /** Gets an argument of this call. */ + Expr getAnArgument() { result = this.getArgument(_) } - /** Holds if this call targets a trait. */ - predicate hasTrait() { exists(this.getTrait()) } + /** + * Gets the `i`th positional argument of this call. + * + * Examples: + * ```rust + * foo(42, "bar"); // `42` is argument 0 and `"bar"` is argument 1 + * foo.bar(42); // `42` is argument 0 + * Foo::bar(foo, 42); // `42` is argument 0 + * x + y; // `y` is argument 0 + * -x; // no positional arguments + * x[y]; // `y` is argument 0 + * ``` + */ + Expr getPositionalArgument(int i) { none() } - /** Gets the name of the method called if this call is a method call. */ - abstract string getMethodName(); + /** Gets a positional argument of this expression. */ + Expr getAPositionalArgument() { result = this.getPositionalArgument(_) } - /** Gets the argument at the given position, if any. */ - abstract Expr getArgument(ArgumentPosition pos); + /** Gets the number of positional arguments of this expression. */ + int getNumberOfPositionalArguments() { + result = count(Expr arg | arg = this.getPositionalArgument(_)) + } - /** Holds if the argument at `pos` might be implicitly borrowed. */ - abstract predicate implicitBorrowAt(ArgumentPosition pos, boolean certain); + /** Gets the resolved target of this call, if any. */ + Function getStaticTarget() { result = TypeInference::resolveCallTarget(this, _) } - /** Gets the number of arguments _excluding_ any `self` argument. */ - int getNumberOfArguments() { result = count(this.getArgument(TPositionalArgumentPosition(_))) } - - /** Gets the `i`th argument of this call, if any. */ - Expr getPositionalArgument(int i) { result = this.getArgument(TPositionalArgumentPosition(i)) } - - /** Gets the receiver of this call if it is a method call. */ - Expr getReceiver() { result = this.getArgument(TSelfArgumentPosition()) } - - /** Gets the static target of this call, if any. */ - Function getStaticTarget() { result = TypeInference::resolveCallTarget(this) } + /** Gets the name of the function called, if any. */ + string getTargetName() { result = this.getStaticTarget().getName().getText() } /** Gets a runtime target of this call, if any. */ pragma[nomagic] Function getARuntimeTarget() { result.hasImplementation() and ( - result = this.getStaticTarget() + result = TypeInference::resolveCallTarget(this, _) or - result.implements(this.getStaticTarget()) + result.implements(TypeInference::resolveCallTarget(this, true)) ) } } - private predicate callHasQualifier(CallExpr call, Path path, Path qualifier) { - path = call.getFunction().(PathExpr).getPath() and - qualifier = path.getQualifier() - } - - private predicate callHasTraitQualifier(CallExpr call, Trait qualifier) { - exists(RelevantPath qualifierPath | - callHasQualifier(call, _, qualifierPath) and - qualifier = resolvePath(qualifierPath) and - // When the qualifier is `Self` and resolves to a trait, it's inside a - // trait method's default implementation. This is not a dispatch whose - // target is inferred from the type of the receiver, but should always - // resolve to the function in the trait block as path resolution does. - not qualifierPath.isUnqualified("Self") - ) - } - - /** Holds if the call expression dispatches to a method. */ - private predicate callIsMethodCall( - CallExpr call, Path qualifier, string methodName, boolean selfIsRef - ) { - exists(Path path, Function f | - callHasQualifier(call, path, qualifier) and - f = resolvePath(path) and - path.getSegment().getIdentifier().getText() = methodName and - exists(SelfParam self | - self = f.getSelfParam() and - if self.isRef() then selfIsRef = true else selfIsRef = false - ) - ) - } - - class CallExprCall extends Call instanceof CallExpr { - CallExprCall() { not callIsMethodCall(this, _, _, _) } - - override string getMethodName() { none() } - - override Trait getTrait() { callHasTraitQualifier(this, result) } - - override predicate implicitBorrowAt(ArgumentPosition pos, boolean certain) { none() } - - override Expr getArgument(ArgumentPosition pos) { - result = super.getArgList().getArg(pos.asPosition()) - } - } - - class CallExprMethodCall extends Call instanceof CallExpr { - string methodName; - boolean selfIsRef; - - CallExprMethodCall() { callIsMethodCall(this, _, methodName, selfIsRef) } - + /** + * A method call. + * + * Either + * + * - a `CallExpr` where we can resolve the target as a method, + * - a `MethodCallExpr`, + * - an `Operation` that targets an overloadable operator, or + * - an `IndexExpr`. + */ + abstract class MethodCall extends Call { /** - * Holds if this call must have an explicit borrow for the `self` argument, - * because the corresponding parameter is `&self`. Explicit borrows are not - * needed when using method call syntax. + * Gets the receiver of this method call. + * + * Examples: + * ```rust + * foo(42, "bar"); // no receiver + * foo.bar(42); // `foo` is receiver + * Foo::bar(foo, 42); // `foo` is receiver + * x + y; // `x` is receiver + * -x; // `x` is receiver + * x[y]; // `x` is receiver + * ``` */ - predicate hasExplicitSelfBorrow() { selfIsRef = true } - - override string getMethodName() { result = methodName } - - override Trait getTrait() { callHasTraitQualifier(this, result) } - - override predicate implicitBorrowAt(ArgumentPosition pos, boolean certain) { none() } - - override Expr getArgument(ArgumentPosition pos) { - pos.isSelf() and result = super.getArgList().getArg(0) - or - result = super.getArgList().getArg(pos.asPosition() + 1) - } - } - - private class MethodCallExprCall extends Call instanceof MethodCallExpr { - override string getMethodName() { result = super.getIdentifier().getText() } - - override Trait getTrait() { none() } - - override predicate implicitBorrowAt(ArgumentPosition pos, boolean certain) { - pos.isSelf() and certain = false - } - - override Expr getArgument(ArgumentPosition pos) { - pos.isSelf() and result = this.(MethodCallExpr).getReceiver() - or - result = super.getArgList().getArg(pos.asPosition()) - } - } - - private class OperatorCall extends Call instanceof Operation { - Trait trait; - string methodName; - int borrows; - - OperatorCall() { super.isOverloaded(trait, methodName, borrows) } - - override string getMethodName() { result = methodName } - - override Trait getTrait() { result = trait } - - override predicate implicitBorrowAt(ArgumentPosition pos, boolean certain) { - ( - pos.isSelf() and borrows >= 1 - or - pos.asPosition() = 0 and borrows = 2 - ) and - certain = true - } - - override Expr getArgument(ArgumentPosition pos) { - pos.isSelf() and result = super.getOperand(0) - or - pos.asPosition() = 0 and result = super.getOperand(1) - } - } - - private class IndexCall extends Call instanceof IndexExpr { - override string getMethodName() { result = "index" } - - override Trait getTrait() { result.getCanonicalPath() = "core::ops::index::Index" } - - override predicate implicitBorrowAt(ArgumentPosition pos, boolean certain) { - pos.isSelf() and certain = true - } - - override Expr getArgument(ArgumentPosition pos) { - pos.isSelf() and result = super.getBase() - or - pos.asPosition() = 0 and result = super.getIndex() - } + Expr getReceiver() { none() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll index 0234f7cf730..44114674a56 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll @@ -5,6 +5,8 @@ */ private import codeql.rust.elements.internal.generated.Const +private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl +private import codeql.rust.elements.internal.IdentPatImpl::Impl as IdentPatImpl private import codeql.rust.elements.internal.PathExprImpl::Impl as PathExprImpl private import codeql.rust.internal.PathResolution @@ -36,14 +38,30 @@ module Impl { * } * ``` */ - class ConstAccess extends PathExprImpl::PathExpr { - private Const c; - - ConstAccess() { c = resolvePath(this.getPath()) } - + abstract class ConstAccess extends AstNodeImpl::AstNode { /** Gets the constant being accessed. */ - Const getConst() { result = c } + abstract Const getConst(); override string getAPrimaryQlClass() { result = "ConstAccess" } } + + private class PathExprConstAccess extends ConstAccess, PathExprImpl::PathExpr { + private Const c; + + PathExprConstAccess() { c = resolvePath(this.getPath()) } + + override Const getConst() { result = c } + + override string getAPrimaryQlClass() { result = ConstAccess.super.getAPrimaryQlClass() } + } + + private class IdentPatConstAccess extends ConstAccess, IdentPatImpl::IdentPat { + private Const c; + + IdentPatConstAccess() { c = resolvePath(this) } + + override Const getConst() { result = c } + + override string getAPrimaryQlClass() { result = ConstAccess.super.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll index f8aaf597ca2..df586df6424 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll @@ -46,7 +46,7 @@ module Impl { private predicate isMacroExpansion(AstNode macro, AstNode expansion) { expansion = macro.(MacroCall).getMacroCallExpansion() or - expansion = macro.(Adt).getDeriveMacroExpansion(_) + expansion = macro.(TypeItem).getDeriveMacroExpansion(_) or expansion = macro.(Item).getAttributeMacroExpansion() } @@ -105,7 +105,7 @@ module Impl { not isAttributeMacroExpansionSourceLocation(macro, n.getLocation()) ) or - isFromMacroExpansion(getImmediatelyEnclosingMacroInvocation(n)) + isFromMacroExpansion(pragma[only_bind_into](getImmediatelyEnclosingMacroInvocation(n))) } cached diff --git a/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll index e57a416fa72..3862cc42137 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll @@ -31,5 +31,23 @@ module Impl { result = this.getVariantList().getAVariant() and result.getName().getText() = name } + + /** + * Holds if this is a field-less enum, that is, an enum where no constructors contain fields. + * + * See: https://doc.rust-lang.org/reference/items/enumerations.html#r-items.enum.fieldless + */ + predicate isFieldless() { + forall(Variant v | v = this.getVariantList().getAVariant() | v.getNumberOfFields() = 0) + } + + /** + * Holds if this is a unit-only enum, that is, an enum where all constructors are unit variants. + * + * See: https://doc.rust-lang.org/reference/items/enumerations.html#r-items.enum.unit-only + */ + predicate isUnitOnly() { + forall(Variant v | v = this.getVariantList().getAVariant() | v.isUnit()) + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll index 2c037aa475a..469a8ccc05d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll @@ -23,10 +23,10 @@ module Impl { */ class FieldExpr extends Generated::FieldExpr { /** Gets the record field that this access references, if any. */ - StructField getStructField() { result = TypeInference::resolveStructFieldExpr(this) } + StructField getStructField() { result = TypeInference::resolveStructFieldExpr(this, _) } /** Gets the tuple field that this access references, if any. */ - TupleField getTupleField() { result = TypeInference::resolveTupleFieldExpr(this) } + TupleField getTupleField() { result = TypeInference::resolveTupleFieldExpr(this, _) } override string toStringImpl() { exists(string abbr, string name | diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessImpl.qll index adb12a35931..35154ae0acb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessImpl.qll @@ -31,6 +31,8 @@ module Impl { override string toStringImpl() { result = this.getName() } + override string getAPrimaryQlClass() { result = "FormatTemplateVariableAccess" } + /** Gets the name of the variable */ string getName() { result = argument.getName() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll index 66c33b4a0b1..f5336497e28 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll @@ -4,6 +4,7 @@ * INTERNAL: Do not use. */ +private import rust private import codeql.rust.elements.internal.generated.IndexExpr /** @@ -11,6 +12,8 @@ private import codeql.rust.elements.internal.generated.IndexExpr * be referenced directly. */ module Impl { + private import codeql.rust.elements.internal.CallImpl::Impl as CallImpl + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An index expression. For example: @@ -19,10 +22,20 @@ module Impl { * list[42] = 1; * ``` */ - class IndexExpr extends Generated::IndexExpr { + class IndexExpr extends Generated::IndexExpr, CallImpl::MethodCall { override string toStringImpl() { result = this.getBase().toAbbreviatedString() + "[" + this.getIndex().toAbbreviatedString() + "]" } + + override Expr getSyntacticPositionalArgument(int i) { + i = 0 and result = this.getBase() + or + i = 1 and result = this.getIndex() + } + + override Expr getPositionalArgument(int i) { i = 0 and result = this.getIndex() } + + override Expr getReceiver() { result = this.getBase() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/InvocationExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/InvocationExprImpl.qll new file mode 100644 index 00000000000..e1db44eb4d1 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/InvocationExprImpl.qll @@ -0,0 +1,99 @@ +private import rust + +module Impl { + private import codeql.rust.internal.TypeInference as TypeInference + private import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl + + private newtype TArgumentPosition = + TPositionalArgumentPosition(int i) { + i in [0 .. max([any(ParamList l).getNumberOfParams(), any(ArgList l).getNumberOfArgs()]) - 1] + } or + TSelfArgumentPosition() + + /** An argument position in a call. */ + class ArgumentPosition extends TArgumentPosition { + /** Gets the index of the argument in the call, if this is a positional argument. */ + int asPosition() { this = TPositionalArgumentPosition(result) } + + /** Holds if this call position is a self argument. */ + predicate isSelf() { this instanceof TSelfArgumentPosition } + + /** Gets a string representation of this argument position. */ + string toString() { + result = this.asPosition().toString() + or + this.isSelf() and result = "self" + } + } + + /** + * An expression with arguments. + * + * Either a `CallExpr`, a `MethodCallExpr`, an `Operation`, or an `IndexExpr`. + */ + abstract class InvocationExpr extends ExprImpl::Expr { + /** + * Gets the `i`th syntactical argument of this expression. + * + * Examples: + * ```rust + * foo(42, "bar"); // `42` is syntactic argument 0 and `"bar"` is syntactic argument 1 + * foo.bar(42); // `42` is syntactic argument 0 + * Foo::bar(foo, 42); // `foo` is syntactic argument 0 and `42` is syntactic argument 1 + * Option::Some(x); // `x` is syntactic argument 0 + * x + y; // `x` is syntactic argument 0 and `y` is syntactic argument 1 + * -x; // `x` is syntactic argument 0 + * x[y]; // `x` is syntactic argument 0 and `y` is syntactic argument 1 + * ``` + */ + Expr getSyntacticPositionalArgument(int i) { none() } + + /** + * Gets the syntactic receiver of this expression, if any. + * + * Examples: + * ```rust + * foo(42, "bar"); // no syntactic receiver + * foo.bar(42); // `foo` is syntactic receiver + * Foo::bar(foo, 42); // no syntactic receiver + * Option::Some(x); // no syntactic receiver + * x + y; // no syntactic receiver + * -x; // no syntactic receiver + * x[y]; // no syntactic receiver + * ``` + */ + Expr getSyntacticReceiver() { none() } + + /** + * Gets the argument at syntactic position `pos` of this expression. + * + * Examples: + * ```rust + * foo(42, "bar"); // `42` is syntactic argument 0 and `"bar"` is syntactic argument 1 + * foo.bar(42); // `foo` is syntactic receiver and `42` is syntactic argument 0 + * Foo::bar(foo, 42); // `foo` is syntactic argument 0 and `42` is syntactic argument 1 + * Option::Some(x); // `x` is syntactic argument 0 + * x + y; // `x` is syntactic argument 0 and `y` is syntactic argument 1 + * -x; // `x` is syntactic argument 0 + * x[y]; // `x` is syntactic argument 0 and `y` is syntactic argument 1 + * ``` + */ + final Expr getSyntacticArgument(ArgumentPosition pos) { + result = this.getSyntacticPositionalArgument(pos.asPosition()) + or + pos.isSelf() and + result = this.getSyntacticReceiver() + } + + /** Gets a syntactic argument of this expression. */ + Expr getASyntacticArgument() { result = this.getSyntacticArgument(_) } + + /** Gets the number of syntactic arguments of this expression. */ + int getNumberOfSyntacticArguments() { + result = count(Expr arg | arg = this.getSyntacticArgument(_)) + } + + /** Gets the resolved target (function or tuple struct/variant), if any. */ + Addressable getResolvedTarget() { result = TypeInference::resolveCallTarget(this, _) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll index a836a4c4075..45c18ac3a9d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll @@ -68,7 +68,7 @@ module Impl { * [1]: https://doc.rust-lang.org/reference/tokens.html#string-literals */ class StringLiteralExpr extends LiteralExpr { - StringLiteralExpr() { this.getTextValue().regexpMatch("r?#*\".*\"#*") } + StringLiteralExpr() { this.getTextValue().charAt(0) = ["\"", "r"] } override string getAPrimaryQlClass() { result = "StringLiteralExpr" } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll index 7617ae456bb..d5fa29b26b2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll @@ -12,15 +12,22 @@ private import codeql.rust.elements.internal.generated.MethodCallExpr * be referenced directly. */ module Impl { + private import codeql.rust.elements.internal.CallImpl::Impl as CallImpl + private import codeql.rust.elements.internal.InvocationExprImpl::Impl as InvocationExprImpl + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** + * NOTE: Consider using `MethodCall` instead, as that also includes calls to methods using + * call syntax (such as `Foo::method(x)`), operation syntax (such as `x + y`), and + * indexing syntax (such as `x[y]`). + * * A method call expression. For example: * ```rust * x.foo(42); * x.foo::(42); * ``` */ - class MethodCallExpr extends Generated::MethodCallExpr { + class MethodCallExpr extends Generated::MethodCallExpr, CallImpl::MethodCall { private string toStringPart(int index) { index = 0 and result = this.getReceiver().toAbbreviatedString() @@ -39,7 +46,12 @@ module Impl { result = strictconcat(int i | | this.toStringPart(i) order by i) } - /** Gets the static target of this method call, if any. */ - final Function getStaticTarget() { result = super.getStaticTarget() } + override Expr getSyntacticPositionalArgument(int i) { result = this.getArgList().getArg(i) } + + override Expr getSyntacticReceiver() { result = Generated::MethodCallExpr.super.getReceiver() } + + override Expr getPositionalArgument(int i) { result = this.getArgList().getArg(i) } + + override Expr getReceiver() { result = Generated::MethodCallExpr.super.getReceiver() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll index f22c95759d6..3cc84e71de9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/OperationImpl.qll @@ -7,100 +7,117 @@ private import rust private import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl -/** - * Holds if the operator `op` with arity `arity` is overloaded to a trait with - * the canonical path `path` and the method name `method`, and if it borrows its - * first `borrows` arguments. - */ -predicate isOverloaded(string op, int arity, string path, string method, int borrows) { - arity = 1 and - ( - // Negation - op = "-" and path = "core::ops::arith::Neg" and method = "neg" and borrows = 0 - or - // Not - op = "!" and path = "core::ops::bit::Not" and method = "not" and borrows = 0 - or - // Dereference - op = "*" and path = "core::ops::deref::Deref" and method = "deref" and borrows = 1 - ) - or - arity = 2 and - ( - // Comparison operators - op = "==" and path = "core::cmp::PartialEq" and method = "eq" and borrows = 2 - or - op = "!=" and path = "core::cmp::PartialEq" and method = "ne" and borrows = 2 - or - op = "<" and path = "core::cmp::PartialOrd" and method = "lt" and borrows = 2 - or - op = "<=" and path = "core::cmp::PartialOrd" and method = "le" and borrows = 2 - or - op = ">" and path = "core::cmp::PartialOrd" and method = "gt" and borrows = 2 - or - op = ">=" and path = "core::cmp::PartialOrd" and method = "ge" and borrows = 2 - or - // Arithmetic operators - op = "+" and path = "core::ops::arith::Add" and method = "add" and borrows = 0 - or - op = "-" and path = "core::ops::arith::Sub" and method = "sub" and borrows = 0 - or - op = "*" and path = "core::ops::arith::Mul" and method = "mul" and borrows = 0 - or - op = "/" and path = "core::ops::arith::Div" and method = "div" and borrows = 0 - or - op = "%" and path = "core::ops::arith::Rem" and method = "rem" and borrows = 0 - or - // Arithmetic assignment expressions - op = "+=" and path = "core::ops::arith::AddAssign" and method = "add_assign" and borrows = 1 - or - op = "-=" and path = "core::ops::arith::SubAssign" and method = "sub_assign" and borrows = 1 - or - op = "*=" and path = "core::ops::arith::MulAssign" and method = "mul_assign" and borrows = 1 - or - op = "/=" and path = "core::ops::arith::DivAssign" and method = "div_assign" and borrows = 1 - or - op = "%=" and path = "core::ops::arith::RemAssign" and method = "rem_assign" and borrows = 1 - or - // Bitwise operators - op = "&" and path = "core::ops::bit::BitAnd" and method = "bitand" and borrows = 0 - or - op = "|" and path = "core::ops::bit::BitOr" and method = "bitor" and borrows = 0 - or - op = "^" and path = "core::ops::bit::BitXor" and method = "bitxor" and borrows = 0 - or - op = "<<" and path = "core::ops::bit::Shl" and method = "shl" and borrows = 0 - or - op = ">>" and path = "core::ops::bit::Shr" and method = "shr" and borrows = 0 - or - // Bitwise assignment operators - op = "&=" and path = "core::ops::bit::BitAndAssign" and method = "bitand_assign" and borrows = 1 - or - op = "|=" and path = "core::ops::bit::BitOrAssign" and method = "bitor_assign" and borrows = 1 - or - op = "^=" and path = "core::ops::bit::BitXorAssign" and method = "bitxor_assign" and borrows = 1 - or - op = "<<=" and path = "core::ops::bit::ShlAssign" and method = "shl_assign" and borrows = 1 - or - op = ">>=" and path = "core::ops::bit::ShrAssign" and method = "shr_assign" and borrows = 1 - ) -} - /** * INTERNAL: This module contains the customizable definition of `Operation` and should not * be referenced directly. */ module Impl { + private import codeql.rust.elements.internal.CallImpl::Impl as CallImpl + private import codeql.rust.elements.internal.InvocationExprImpl::Impl as InvocationExprImpl + + /** + * Holds if the operator `op` with arity `arity` is overloaded to a trait with + * the canonical path `path` and the method name `method`, and if it borrows its + * first `borrows` arguments. + */ + predicate isOverloaded(string op, int arity, string path, string method, int borrows) { + arity = 1 and + ( + // Negation + op = "-" and path = "core::ops::arith::Neg" and method = "neg" and borrows = 0 + or + // Not + op = "!" and path = "core::ops::bit::Not" and method = "not" and borrows = 0 + or + // Dereference + // todo: handle `core::ops::deref::DerefMut` + op = "*" and path = "core::ops::deref::Deref" and method = "deref" and borrows = 1 + ) + or + arity = 2 and + ( + // Comparison operators + op = "==" and path = "core::cmp::PartialEq" and method = "eq" and borrows = 2 + or + op = "!=" and path = "core::cmp::PartialEq" and method = "ne" and borrows = 2 + or + op = "<" and path = "core::cmp::PartialOrd" and method = "lt" and borrows = 2 + or + op = "<=" and path = "core::cmp::PartialOrd" and method = "le" and borrows = 2 + or + op = ">" and path = "core::cmp::PartialOrd" and method = "gt" and borrows = 2 + or + op = ">=" and path = "core::cmp::PartialOrd" and method = "ge" and borrows = 2 + or + // Arithmetic operators + op = "+" and path = "core::ops::arith::Add" and method = "add" and borrows = 0 + or + op = "-" and path = "core::ops::arith::Sub" and method = "sub" and borrows = 0 + or + op = "*" and path = "core::ops::arith::Mul" and method = "mul" and borrows = 0 + or + op = "/" and path = "core::ops::arith::Div" and method = "div" and borrows = 0 + or + op = "%" and path = "core::ops::arith::Rem" and method = "rem" and borrows = 0 + or + // Arithmetic assignment expressions + op = "+=" and path = "core::ops::arith::AddAssign" and method = "add_assign" and borrows = 1 + or + op = "-=" and path = "core::ops::arith::SubAssign" and method = "sub_assign" and borrows = 1 + or + op = "*=" and path = "core::ops::arith::MulAssign" and method = "mul_assign" and borrows = 1 + or + op = "/=" and path = "core::ops::arith::DivAssign" and method = "div_assign" and borrows = 1 + or + op = "%=" and path = "core::ops::arith::RemAssign" and method = "rem_assign" and borrows = 1 + or + // Bitwise operators + op = "&" and path = "core::ops::bit::BitAnd" and method = "bitand" and borrows = 0 + or + op = "|" and path = "core::ops::bit::BitOr" and method = "bitor" and borrows = 0 + or + op = "^" and path = "core::ops::bit::BitXor" and method = "bitxor" and borrows = 0 + or + op = "<<" and path = "core::ops::bit::Shl" and method = "shl" and borrows = 0 + or + op = ">>" and path = "core::ops::bit::Shr" and method = "shr" and borrows = 0 + or + // Bitwise assignment operators + op = "&=" and + path = "core::ops::bit::BitAndAssign" and + method = "bitand_assign" and + borrows = 1 + or + op = "|=" and path = "core::ops::bit::BitOrAssign" and method = "bitor_assign" and borrows = 1 + or + op = "^=" and + path = "core::ops::bit::BitXorAssign" and + method = "bitxor_assign" and + borrows = 1 + or + op = "<<=" and path = "core::ops::bit::ShlAssign" and method = "shl_assign" and borrows = 1 + or + op = ">>=" and path = "core::ops::bit::ShrAssign" and method = "shr_assign" and borrows = 1 + ) + } + /** * An operation, for example `&&`, `+=`, `!` or `*`. + * + * Overloadable operations are syntatic sugar for method calls, where the + * first operand is the receiver. For example, `x + y` is syntactic sugar + * for `Add::add(x, y)`, and `x += y` is syntactic sugar for + * `AddAssign::add_assign(&mut x, y)`. */ - abstract class Operation extends ExprImpl::Expr { + abstract class Operation extends InvocationExprImpl::InvocationExpr { /** Gets the operator name of this operation, if it exists. */ abstract string getOperatorName(); /** Gets the `n`th operand of this operation, if any. */ abstract Expr getOperand(int n); + override Expr getSyntacticPositionalArgument(int i) { result = this.getOperand(i) } + /** * Gets the number of operands of this operation. * @@ -115,9 +132,18 @@ module Impl { * Holds if this operation is overloaded to the method `methodName` of the * trait `trait`. */ + pragma[nomagic] predicate isOverloaded(Trait trait, string methodName, int borrows) { isOverloaded(this.getOperatorName(), this.getNumberOfOperands(), trait.getCanonicalPath(), methodName, borrows) } } + + private class OperationMethodCall extends CallImpl::MethodCall instanceof Operation { + OperationMethodCall() { super.isOverloaded(_, _, _) } + + override Expr getPositionalArgument(int i) { result = super.getOperand(i + 1) and i >= 0 } + + override Expr getReceiver() { result = super.getOperand(0) } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll index e8c800bc9b8..f52fd3aa067 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll @@ -21,6 +21,24 @@ module Impl { * ``` */ class ParenExpr extends Generated::ParenExpr { - override string toStringImpl() { result = "(" + this.getExpr().toAbbreviatedString() + ")" } + override string toStringImpl() { + result = "(" + this.getExpr().toAbbreviatedString() + ")" + or + // In macro expansions such as + // + // ```rust + // [ + // "a", + // "b", + // #[cfg(target_os = "macos")] + // "c", + // ] + // ``` + // + // the last array element will give rise to an empty `ParenExpr` when not + // compiling for macos. + not exists(this.getExpr().toAbbreviatedString()) and + result = "(...)" + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll index 652dc68b3c9..cb2abc45e10 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll @@ -4,6 +4,7 @@ * INTERNAL: Do not use. */ +private import rust private import codeql.rust.elements.internal.generated.PathExpr /** @@ -25,5 +26,11 @@ module Impl { override string toStringImpl() { result = this.toAbbreviatedString() } override string toAbbreviatedString() { result = this.getPath().toStringImpl() } + + override string getAPrimaryQlClass() { + if this instanceof VariableAccess + then result = "VariableAccess" + else result = super.getAPrimaryQlClass() + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructExprImpl.qll index 5cbeb62c7a4..d7704894c49 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructExprImpl.qll @@ -27,6 +27,16 @@ module Impl { class StructExpr extends Generated::StructExpr { override string toStringImpl() { result = this.getPath().toStringImpl() + " {...}" } + private PathResolution::ItemNode getResolvedPath() { + result = PathResolution::resolvePath(this.getPath()) + } + + /** Gets the struct that is instantiated, if any. */ + Struct getStruct() { result = this.getResolvedPath() } + + /** Gets the variant that is instantiated, if any. */ + Variant getVariant() { result = this.getResolvedPath() } + /** Gets the record expression for the field `name`. */ pragma[nomagic] StructExprField getFieldExpr(string name) { @@ -34,19 +44,11 @@ module Impl { name = result.getFieldName() } - pragma[nomagic] - private PathResolution::ItemNode getResolvedPath(string name) { - result = PathResolution::resolvePath(this.getPath()) and - exists(this.getFieldExpr(name)) - } - - /** Gets the record field that matches the `name` field of this record expression. */ - pragma[nomagic] + /** Gets the record field named `name` of the instantiated struct or variant. */ StructField getStructField(string name) { - exists(PathResolution::ItemNode i | i = this.getResolvedPath(name) | - result.isStructField(i, name) or - result.isVariantField(i, name) - ) + result = this.getStruct().getStructField(name) + or + result = this.getVariant().getStructField(name) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructFieldImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructFieldImpl.qll index 4ed4466c2d9..c0e9a2f40db 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructFieldImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructFieldImpl.qll @@ -29,5 +29,19 @@ module Impl { /** Holds if this record field is named `name` and belongs to the struct `s`. */ predicate isStructField(Struct s, string name) { this = s.getStructField(name) } + + override string toStringImpl() { + result = strictconcat(int i | | this.toStringPart(i) order by i) + } + + private string toStringPart(int index) { + index = 0 and result = this.getVisibility().toAbbreviatedString() + " " + or + index = 1 and result = this.getName().getText() + or + index = 2 and result = ": " + or + index = 3 and result = this.getTypeRepr().toAbbreviatedString() + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll index 3b6fc1ee4ea..cb4121b7224 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll @@ -32,20 +32,25 @@ module Impl { result.getName().getText() = name } + /** Gets a record field, if any. */ + StructField getAStructField() { result = this.getStructField(_) } + /** Gets the `i`th tuple field, if any. */ pragma[nomagic] TupleField getTupleField(int i) { result = this.getFieldList().(TupleFieldList).getField(i) } + /** Gets a tuple field, if any. */ + TupleField getATupleField() { result = this.getTupleField(_) } + /** Holds if this struct uses tuple fields. */ pragma[nomagic] predicate isTuple() { this.getFieldList() instanceof TupleFieldList } - /** - * Holds if this struct uses record fields. - * - * Empty structs are considered to use record fields. - */ + /** Holds if this struct uses struct fields. */ pragma[nomagic] - predicate isStruct() { not this.isTuple() } + predicate isStruct() { this.getFieldList() instanceof StructFieldList } + + /** Holds if this struct does not have a field list. */ + predicate isUnit() { not this.hasFieldList() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll index 05d799b6047..f26c855e3cb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll @@ -15,7 +15,7 @@ module Impl { // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * A field in a tuple struct or tuple enum variant. + * A field in a tuple struct or tuple variant. * * For example: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll index 3b5964693f3..b52f0477987 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll @@ -13,7 +13,7 @@ private import codeql.rust.elements.internal.generated.TupleFieldList */ module Impl { /** - * A list of fields in a tuple struct or tuple enum variant. + * A list of fields in a tuple struct or tuple variant. * * For example: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/internal/AdtImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeItemImpl.qll similarity index 56% rename from rust/ql/lib/codeql/rust/elements/internal/AdtImpl.qll rename to rust/ql/lib/codeql/rust/elements/internal/TypeItemImpl.qll index 2243aed17a3..df7ebbcbbca 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AdtImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeItemImpl.qll @@ -1,19 +1,19 @@ // generated by codegen, remove this comment if you wish to edit this file /** - * This module provides a hand-modifiable wrapper around the generated class `Adt`. + * This module provides a hand-modifiable wrapper around the generated class `TypeItem`. * * INTERNAL: Do not use. */ -private import codeql.rust.elements.internal.generated.Adt +private import codeql.rust.elements.internal.generated.TypeItem /** - * INTERNAL: This module contains the customizable definition of `Adt` and should not + * INTERNAL: This module contains the customizable definition of `TypeItem` and should not * be referenced directly. */ module Impl { /** - * An ADT (Abstract Data Type) definition, such as `Struct`, `Enum`, or `Union`. + * An item that defines a type. Either a `Struct`, `Enum`, or `Union`. */ - class Adt extends Generated::Adt { } + class TypeItem extends Generated::TypeItem { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll index 61f022c8bfd..37a2e4dacc0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VariableImpl.qll @@ -1,8 +1,9 @@ private import rust private import codeql.rust.controlflow.ControlFlowGraph +private import codeql.rust.internal.PathResolution as PathResolution private import codeql.rust.elements.internal.generated.ParentChild as ParentChild +private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl private import codeql.rust.elements.internal.PathImpl::Impl as PathImpl -private import codeql.rust.elements.internal.PathExprBaseImpl::Impl as PathExprBaseImpl private import codeql.rust.elements.internal.FormatTemplateVariableAccessImpl::Impl as FormatTemplateVariableAccessImpl private import codeql.util.DenseRank @@ -98,7 +99,7 @@ module Impl { * pattern. */ cached - private predicate variableDecl(AstNode definingNode, Name name, string text) { + predicate variableDecl(AstNode definingNode, Name name, string text) { Cached::ref() and exists(SelfParam sp | name = sp.getName() and @@ -117,11 +118,7 @@ module Impl { not exists(getOutermostEnclosingOrPat(pat)) and definingNode = name ) and text = name.getText() and - // exclude for now anything starting with an uppercase character, which may be a reference to - // an enum constant (e.g. `None`). This excludes static and constant variables (UPPERCASE), - // which we don't appear to recognize yet anyway. This also assumes programmers follow the - // naming guidelines, which they generally do, but they're not enforced. - not text.charAt(0).isUppercase() and + not PathResolution::identPatIsResolvable(pat) and // exclude parameters from functions without a body as these are trait method declarations // without implementations not exists(Function f | not f.hasBody() and f.getAParam().getPat() = pat) and @@ -666,7 +663,7 @@ module Impl { } /** A variable access. */ - class VariableAccess extends PathExprBaseImpl::PathExprBase { + class VariableAccess extends PathExprBase { private string name; private Variable v; @@ -677,18 +674,14 @@ module Impl { /** Holds if this access is a capture. */ predicate isCapture() { this.getEnclosingCfgScope() != v.getEnclosingCfgScope() } - - override string toStringImpl() { result = name } - - override string getAPrimaryQlClass() { result = "VariableAccess" } } - /** Holds if `e` occurs in the LHS of an assignment or compound assignment. */ - private predicate assignmentExprDescendant(AssignmentExpr ae, Expr e) { - e = ae.getLhs() + /** Holds if `e` occurs in the LHS of an assignment operation. */ + predicate assignmentOperationDescendant(AssignmentOperation ao, Expr e) { + e = ao.getLhs() or exists(Expr mid | - assignmentExprDescendant(ae, mid) and + assignmentOperationDescendant(ao, mid) and getImmediateParentAdj(e) = mid and not mid instanceof DerefExpr and not mid instanceof FieldExpr and @@ -703,7 +696,7 @@ module Impl { cached VariableWriteAccess() { Cached::ref() and - assignmentExprDescendant(ae, this) + assignmentOperationDescendant(ae, this) } /** Gets the assignment expression that has this write access in the left-hand side. */ @@ -722,7 +715,7 @@ module Impl { } /** A nested function access. */ - class NestedFunctionAccess extends PathExprBaseImpl::PathExprBase { + class NestedFunctionAccess extends PathExprBase { private Function f; NestedFunctionAccess() { nestedFunctionAccess(_, f, this) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VariantImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VariantImpl.qll index d6b25b21e28..ed8b93f6c1d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VariantImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VariantImpl.qll @@ -36,17 +36,27 @@ module Impl { pragma[nomagic] TupleField getTupleField(int i) { result = this.getFieldList().(TupleFieldList).getField(i) } + /** Gets the number of fields of this variant. */ + int getNumberOfFields() { + not this.hasFieldList() and + result = 0 + or + result = this.getFieldList().(StructFieldList).getNumberOfFields() + or + result = this.getFieldList().(TupleFieldList).getNumberOfFields() + } + /** Holds if this variant uses tuple fields. */ pragma[nomagic] predicate isTuple() { this.getFieldList() instanceof TupleFieldList } - /** - * Holds if this variant uses struct fields. - * - * Empty variants are considered to use struct fields. - */ + /** Holds if this variant uses struct fields. */ pragma[nomagic] - predicate isStruct() { not this.isTuple() } + predicate isStruct() { this.getFieldList() instanceof StructFieldList } + + /** Holds if this variant does not have a field list. */ + pragma[nomagic] + predicate isUnit() { not this.hasFieldList() } /** Gets the enum that this variant belongs to. */ Enum getEnum() { this = result.getVariantList().getAVariant() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll index 21de0c88ca8..e2bc7140b59 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Visibility`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Visibility * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A visibility modifier. * @@ -21,5 +21,13 @@ module Impl { * //^^^ * ``` */ - class Visibility extends Generated::Visibility { } + class Visibility extends Generated::Visibility { + override string toStringImpl() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { + result = "pub(" + this.getPath().toAbbreviatedString() + ")" + or + not this.hasPath() and result = "pub" + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Adt.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Adt.qll deleted file mode 100644 index 385e3930fb8..00000000000 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Adt.qll +++ /dev/null @@ -1,45 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the generated definition of `Adt`. - * INTERNAL: Do not import directly. - */ - -private import codeql.rust.elements.internal.generated.Synth -private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.internal.ItemImpl::Impl as ItemImpl -import codeql.rust.elements.MacroItems - -/** - * INTERNAL: This module contains the fully generated definition of `Adt` and should not - * be referenced directly. - */ -module Generated { - /** - * An ADT (Abstract Data Type) definition, such as `Struct`, `Enum`, or `Union`. - * INTERNAL: Do not reference the `Generated::Adt` class directly. - * Use the subclass `Adt`, where the following predicates are available. - */ - class Adt extends Synth::TAdt, ItemImpl::Item { - /** - * Gets the `index`th derive macro expansion of this adt (0-based). - */ - MacroItems getDeriveMacroExpansion(int index) { - result = - Synth::convertMacroItemsFromRaw(Synth::convertAdtToRaw(this) - .(Raw::Adt) - .getDeriveMacroExpansion(index)) - } - - /** - * Gets any of the derive macro expansions of this adt. - */ - final MacroItems getADeriveMacroExpansion() { result = this.getDeriveMacroExpansion(_) } - - /** - * Gets the number of derive macro expansions of this adt. - */ - final int getNumberOfDeriveMacroExpansions() { - result = count(int i | exists(this.getDeriveMacroExpansion(i))) - } - } -} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll index 829de70510b..196b78c1bde 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll @@ -6,8 +6,10 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprBaseImpl +import codeql.rust.elements.ArgList +import codeql.rust.elements.Attr import codeql.rust.elements.Expr +import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl /** * INTERNAL: This module contains the fully generated definition of `CallExpr` and should not @@ -15,19 +17,53 @@ import codeql.rust.elements.Expr */ module Generated { /** - * A function call expression. For example: + * NOTE: Consider using `Call` instead, as that excludes call expressions that are + * instantiations of tuple structs and tuple variants. + * + * A call expression. For example: * ```rust * foo(42); * foo::(42); * foo[0](42); - * foo(1) = 4; + * Option::Some(42); // tuple variant instantiation * ``` * INTERNAL: Do not reference the `Generated::CallExpr` class directly. * Use the subclass `CallExpr`, where the following predicates are available. */ - class CallExpr extends Synth::TCallExpr, CallExprBaseImpl::CallExprBase { + class CallExpr extends Synth::TCallExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "CallExpr" } + /** + * Gets the argument list of this call expression, if it exists. + */ + ArgList getArgList() { + result = + Synth::convertArgListFromRaw(Synth::convertCallExprToRaw(this).(Raw::CallExpr).getArgList()) + } + + /** + * Holds if `getArgList()` exists. + */ + final predicate hasArgList() { exists(this.getArgList()) } + + /** + * Gets the `index`th attr of this call expression (0-based). + */ + Attr getAttr(int index) { + result = + Synth::convertAttrFromRaw(Synth::convertCallExprToRaw(this).(Raw::CallExpr).getAttr(index)) + } + + /** + * Gets any of the attrs of this call expression. + */ + final Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this call expression. + */ + final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + /** * Gets the function of this call expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExprBase.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CallExprBase.qll deleted file mode 100644 index 1d6364fb94f..00000000000 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExprBase.qll +++ /dev/null @@ -1,75 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the generated definition of `CallExprBase`. - * INTERNAL: Do not import directly. - */ - -private import codeql.rust.elements.internal.generated.Synth -private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.ArgList -import codeql.rust.elements.Attr -import codeql.rust.elements.Expr -import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl - -/** - * INTERNAL: This module contains the fully generated definition of `CallExprBase` and should not - * be referenced directly. - */ -module Generated { - /** - * A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. - * INTERNAL: Do not reference the `Generated::CallExprBase` class directly. - * Use the subclass `CallExprBase`, where the following predicates are available. - */ - class CallExprBase extends Synth::TCallExprBase, ExprImpl::Expr { - /** - * Gets the argument list of this call expression base, if it exists. - */ - ArgList getArgList() { - result = - Synth::convertArgListFromRaw(Synth::convertCallExprBaseToRaw(this) - .(Raw::CallExprBase) - .getArgList()) - } - - /** - * Holds if `getArgList()` exists. - */ - final predicate hasArgList() { exists(this.getArgList()) } - - /** - * Gets the `index`th attr of this call expression base (0-based). - */ - Attr getAttr(int index) { - result = - Synth::convertAttrFromRaw(Synth::convertCallExprBaseToRaw(this) - .(Raw::CallExprBase) - .getAttr(index)) - } - - /** - * Gets any of the attrs of this call expression base. - */ - final Attr getAnAttr() { result = this.getAttr(_) } - - /** - * Gets the number of attrs of this call expression base. - */ - final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } - - /** - * Gets the `index`th argument of this call expression base (0-based). - */ - Expr getArg(int index) { none() } - - /** - * Gets any of the arguments of this call expression base. - */ - final Expr getAnArg() { result = this.getArg(_) } - - /** - * Gets the number of arguments of this call expression base. - */ - final int getNumberOfArgs() { result = count(int i | exists(this.getArg(i))) } - } -} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll index b829ead848c..35ff29361bc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll @@ -6,13 +6,8 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.internal.AdtImpl::Impl as AdtImpl -import codeql.rust.elements.Attr -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.Name +import codeql.rust.elements.internal.TypeItemImpl::Impl as TypeItemImpl import codeql.rust.elements.VariantList -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause /** * INTERNAL: This module contains the fully generated definition of `Enum` and should not @@ -29,53 +24,9 @@ module Generated { * INTERNAL: Do not reference the `Generated::Enum` class directly. * Use the subclass `Enum`, where the following predicates are available. */ - class Enum extends Synth::TEnum, AdtImpl::Adt { + class Enum extends Synth::TEnum, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Enum" } - /** - * Gets the `index`th attr of this enum (0-based). - */ - Attr getAttr(int index) { - result = Synth::convertAttrFromRaw(Synth::convertEnumToRaw(this).(Raw::Enum).getAttr(index)) - } - - /** - * Gets any of the attrs of this enum. - */ - final Attr getAnAttr() { result = this.getAttr(_) } - - /** - * Gets the number of attrs of this enum. - */ - final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } - - /** - * Gets the generic parameter list of this enum, if it exists. - */ - GenericParamList getGenericParamList() { - result = - Synth::convertGenericParamListFromRaw(Synth::convertEnumToRaw(this) - .(Raw::Enum) - .getGenericParamList()) - } - - /** - * Holds if `getGenericParamList()` exists. - */ - final predicate hasGenericParamList() { exists(this.getGenericParamList()) } - - /** - * Gets the name of this enum, if it exists. - */ - Name getName() { - result = Synth::convertNameFromRaw(Synth::convertEnumToRaw(this).(Raw::Enum).getName()) - } - - /** - * Holds if `getName()` exists. - */ - final predicate hasName() { exists(this.getName()) } - /** * Gets the variant list of this enum, if it exists. */ @@ -88,31 +39,5 @@ module Generated { * Holds if `getVariantList()` exists. */ final predicate hasVariantList() { exists(this.getVariantList()) } - - /** - * Gets the visibility of this enum, if it exists. - */ - Visibility getVisibility() { - result = - Synth::convertVisibilityFromRaw(Synth::convertEnumToRaw(this).(Raw::Enum).getVisibility()) - } - - /** - * Holds if `getVisibility()` exists. - */ - final predicate hasVisibility() { exists(this.getVisibility()) } - - /** - * Gets the where clause of this enum, if it exists. - */ - WhereClause getWhereClause() { - result = - Synth::convertWhereClauseFromRaw(Synth::convertEnumToRaw(this).(Raw::Enum).getWhereClause()) - } - - /** - * Holds if `getWhereClause()` exists. - */ - final predicate hasWhereClause() { exists(this.getWhereClause()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll index 8908b71b7af..18d6803211b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll @@ -6,8 +6,10 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprBaseImpl +import codeql.rust.elements.ArgList +import codeql.rust.elements.Attr import codeql.rust.elements.Expr +import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl import codeql.rust.elements.GenericArgList import codeql.rust.elements.NameRef @@ -17,6 +19,10 @@ import codeql.rust.elements.NameRef */ module Generated { /** + * NOTE: Consider using `MethodCall` instead, as that also includes calls to methods using + * call syntax (such as `Foo::method(x)`), operation syntax (such as `x + y`), and + * indexing syntax (such as `x[y]`). + * * A method call expression. For example: * ```rust * x.foo(42); @@ -25,9 +31,44 @@ module Generated { * INTERNAL: Do not reference the `Generated::MethodCallExpr` class directly. * Use the subclass `MethodCallExpr`, where the following predicates are available. */ - class MethodCallExpr extends Synth::TMethodCallExpr, CallExprBaseImpl::CallExprBase { + class MethodCallExpr extends Synth::TMethodCallExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "MethodCallExpr" } + /** + * Gets the argument list of this method call expression, if it exists. + */ + ArgList getArgList() { + result = + Synth::convertArgListFromRaw(Synth::convertMethodCallExprToRaw(this) + .(Raw::MethodCallExpr) + .getArgList()) + } + + /** + * Holds if `getArgList()` exists. + */ + final predicate hasArgList() { exists(this.getArgList()) } + + /** + * Gets the `index`th attr of this method call expression (0-based). + */ + Attr getAttr(int index) { + result = + Synth::convertAttrFromRaw(Synth::convertMethodCallExprToRaw(this) + .(Raw::MethodCallExpr) + .getAttr(index)) + } + + /** + * Gets any of the attrs of this method call expression. + */ + final Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this method call expression. + */ + final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + /** * Gets the generic argument list of this method call expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index 233c29e0173..2b51f614619 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -1070,6 +1070,25 @@ private module Impl { ) } + private Element getImmediateChildOfCallExpr(CallExpr e, int index, string partialPredicateCall) { + exists(int n, int nArgList, int nAttr, int nFunction | + n = 0 and + nArgList = n + 1 and + nAttr = nArgList + e.getNumberOfAttrs() and + nFunction = nAttr + 1 and + ( + none() + or + index = n and result = e.getArgList() and partialPredicateCall = "ArgList()" + or + result = e.getAttr(index - nArgList) and + partialPredicateCall = "Attr(" + (index - nArgList).toString() + ")" + or + index = nAttr and result = e.getFunction() and partialPredicateCall = "Function()" + ) + ) + } + private Element getImmediateChildOfCastExpr(CastExpr e, int index, string partialPredicateCall) { exists(int n, int nAttr, int nExpr, int nTypeRepr | n = 0 and @@ -1563,6 +1582,37 @@ private module Impl { ) } + private Element getImmediateChildOfMethodCallExpr( + MethodCallExpr e, int index, string partialPredicateCall + ) { + exists(int n, int nArgList, int nAttr, int nGenericArgList, int nIdentifier, int nReceiver | + n = 0 and + nArgList = n + 1 and + nAttr = nArgList + e.getNumberOfAttrs() and + nGenericArgList = nAttr + 1 and + nIdentifier = nGenericArgList + 1 and + nReceiver = nIdentifier + 1 and + ( + none() + or + index = n and result = e.getArgList() and partialPredicateCall = "ArgList()" + or + result = e.getAttr(index - nArgList) and + partialPredicateCall = "Attr(" + (index - nArgList).toString() + ")" + or + index = nAttr and + result = e.getGenericArgList() and + partialPredicateCall = "GenericArgList()" + or + index = nGenericArgList and + result = e.getIdentifier() and + partialPredicateCall = "Identifier()" + or + index = nIdentifier and result = e.getReceiver() and partialPredicateCall = "Receiver()" + ) + ) + } + private Element getImmediateChildOfNameRef(NameRef e, int index, string partialPredicateCall) { none() } @@ -2228,25 +2278,6 @@ private module Impl { ) } - private Element getImmediateChildOfCallExpr(CallExpr e, int index, string partialPredicateCall) { - exists(int n, int nArgList, int nAttr, int nFunction | - n = 0 and - nArgList = n + 1 and - nAttr = nArgList + e.getNumberOfAttrs() and - nFunction = nAttr + 1 and - ( - none() - or - index = n and result = e.getArgList() and partialPredicateCall = "ArgList()" - or - result = e.getAttr(index - nArgList) and - partialPredicateCall = "Attr(" + (index - nArgList).toString() + ")" - or - index = nAttr and result = e.getFunction() and partialPredicateCall = "Function()" - ) - ) - } - private Element getImmediateChildOfExternBlock( ExternBlock e, int index, string partialPredicateCall ) { @@ -2421,37 +2452,6 @@ private module Impl { ) } - private Element getImmediateChildOfMethodCallExpr( - MethodCallExpr e, int index, string partialPredicateCall - ) { - exists(int n, int nArgList, int nAttr, int nGenericArgList, int nIdentifier, int nReceiver | - n = 0 and - nArgList = n + 1 and - nAttr = nArgList + e.getNumberOfAttrs() and - nGenericArgList = nAttr + 1 and - nIdentifier = nGenericArgList + 1 and - nReceiver = nIdentifier + 1 and - ( - none() - or - index = n and result = e.getArgList() and partialPredicateCall = "ArgList()" - or - result = e.getAttr(index - nArgList) and - partialPredicateCall = "Attr(" + (index - nArgList).toString() + ")" - or - index = nAttr and - result = e.getGenericArgList() and - partialPredicateCall = "GenericArgList()" - or - index = nGenericArgList and - result = e.getIdentifier() and - partialPredicateCall = "Identifier()" - or - index = nIdentifier and result = e.getReceiver() and partialPredicateCall = "Receiver()" - ) - ) - } - private Element getImmediateChildOfModule(Module e, int index, string partialPredicateCall) { exists( int n, int nAttributeMacroExpansion, int nAttr, int nItemList, int nName, int nVisibility @@ -2656,7 +2656,7 @@ private module Impl { private Element getImmediateChildOfEnum(Enum e, int index, string partialPredicateCall) { exists( int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, - int nGenericParamList, int nName, int nVariantList, int nVisibility, int nWhereClause + int nGenericParamList, int nName, int nVisibility, int nWhereClause, int nVariantList | n = 0 and nAttributeMacroExpansion = n + 1 and @@ -2664,9 +2664,9 @@ private module Impl { nAttr = nDeriveMacroExpansion + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and nName = nGenericParamList + 1 and - nVariantList = nName + 1 and - nVisibility = nVariantList + 1 and + nVisibility = nName + 1 and nWhereClause = nVisibility + 1 and + nVariantList = nWhereClause + 1 and ( none() or @@ -2687,15 +2687,15 @@ private module Impl { or index = nGenericParamList and result = e.getName() and partialPredicateCall = "Name()" or - index = nName and result = e.getVariantList() and partialPredicateCall = "VariantList()" - or - index = nVariantList and - result = e.getVisibility() and - partialPredicateCall = "Visibility()" + index = nName and result = e.getVisibility() and partialPredicateCall = "Visibility()" or index = nVisibility and result = e.getWhereClause() and partialPredicateCall = "WhereClause()" + or + index = nWhereClause and + result = e.getVariantList() and + partialPredicateCall = "VariantList()" ) ) } @@ -2862,18 +2862,18 @@ private module Impl { private Element getImmediateChildOfStruct(Struct e, int index, string partialPredicateCall) { exists( - int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, int nFieldList, - int nGenericParamList, int nName, int nVisibility, int nWhereClause + int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, + int nGenericParamList, int nName, int nVisibility, int nWhereClause, int nFieldList | n = 0 and nAttributeMacroExpansion = n + 1 and nDeriveMacroExpansion = nAttributeMacroExpansion + e.getNumberOfDeriveMacroExpansions() and nAttr = nDeriveMacroExpansion + e.getNumberOfAttrs() and - nFieldList = nAttr + 1 and - nGenericParamList = nFieldList + 1 and + nGenericParamList = nAttr + 1 and nName = nGenericParamList + 1 and nVisibility = nName + 1 and nWhereClause = nVisibility + 1 and + nFieldList = nWhereClause + 1 and ( none() or @@ -2888,9 +2888,7 @@ private module Impl { result = e.getAttr(index - nDeriveMacroExpansion) and partialPredicateCall = "Attr(" + (index - nDeriveMacroExpansion).toString() + ")" or - index = nAttr and result = e.getFieldList() and partialPredicateCall = "FieldList()" - or - index = nFieldList and + index = nAttr and result = e.getGenericParamList() and partialPredicateCall = "GenericParamList()" or @@ -2901,6 +2899,8 @@ private module Impl { index = nVisibility and result = e.getWhereClause() and partialPredicateCall = "WhereClause()" + or + index = nWhereClause and result = e.getFieldList() and partialPredicateCall = "FieldList()" ) ) } @@ -2955,7 +2955,7 @@ private module Impl { private Element getImmediateChildOfUnion(Union e, int index, string partialPredicateCall) { exists( int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, - int nGenericParamList, int nName, int nStructFieldList, int nVisibility, int nWhereClause + int nGenericParamList, int nName, int nVisibility, int nWhereClause, int nStructFieldList | n = 0 and nAttributeMacroExpansion = n + 1 and @@ -2963,9 +2963,9 @@ private module Impl { nAttr = nDeriveMacroExpansion + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and nName = nGenericParamList + 1 and - nStructFieldList = nName + 1 and - nVisibility = nStructFieldList + 1 and + nVisibility = nName + 1 and nWhereClause = nVisibility + 1 and + nStructFieldList = nWhereClause + 1 and ( none() or @@ -2986,17 +2986,15 @@ private module Impl { or index = nGenericParamList and result = e.getName() and partialPredicateCall = "Name()" or - index = nName and - result = e.getStructFieldList() and - partialPredicateCall = "StructFieldList()" - or - index = nStructFieldList and - result = e.getVisibility() and - partialPredicateCall = "Visibility()" + index = nName and result = e.getVisibility() and partialPredicateCall = "Visibility()" or index = nVisibility and result = e.getWhereClause() and partialPredicateCall = "WhereClause()" + or + index = nWhereClause and + result = e.getStructFieldList() and + partialPredicateCall = "StructFieldList()" ) ) } @@ -3167,6 +3165,8 @@ private module Impl { or result = getImmediateChildOfBreakExpr(e, index, partialAccessor) or + result = getImmediateChildOfCallExpr(e, index, partialAccessor) + or result = getImmediateChildOfCastExpr(e, index, partialAccessor) or result = getImmediateChildOfClosureExpr(e, index, partialAccessor) @@ -3227,6 +3227,8 @@ private module Impl { or result = getImmediateChildOfMatchExpr(e, index, partialAccessor) or + result = getImmediateChildOfMethodCallExpr(e, index, partialAccessor) + or result = getImmediateChildOfNameRef(e, index, partialAccessor) or result = getImmediateChildOfNeverTypeRepr(e, index, partialAccessor) @@ -3311,8 +3313,6 @@ private module Impl { or result = getImmediateChildOfBlockExpr(e, index, partialAccessor) or - result = getImmediateChildOfCallExpr(e, index, partialAccessor) - or result = getImmediateChildOfExternBlock(e, index, partialAccessor) or result = getImmediateChildOfExternCrate(e, index, partialAccessor) @@ -3325,8 +3325,6 @@ private module Impl { or result = getImmediateChildOfMacroRules(e, index, partialAccessor) or - result = getImmediateChildOfMethodCallExpr(e, index, partialAccessor) - or result = getImmediateChildOfModule(e, index, partialAccessor) or result = getImmediateChildOfPathExpr(e, index, partialAccessor) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index aff81e9b9ab..5cc81a8777b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -1808,7 +1808,7 @@ module Raw { /** * INTERNAL: Do not use. - * A field in a tuple struct or tuple enum variant. + * A field in a tuple struct or tuple variant. * * For example: * ```rust @@ -2942,23 +2942,57 @@ module Raw { /** * INTERNAL: Do not use. - * A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. + * NOTE: Consider using `Call` instead, as that excludes call expressions that are + * instantiations of tuple structs and tuple variants. + * + * A call expression. For example: + * ```rust + * foo(42); + * foo::(42); + * foo[0](42); + * Option::Some(42); // tuple variant instantiation + * ``` */ - class CallExprBase extends @call_expr_base, Expr { - /** - * Gets the argument list of this call expression base, if it exists. - */ - ArgList getArgList() { call_expr_base_arg_lists(this, result) } + class CallExpr extends @call_expr, Expr { + override string toString() { result = "CallExpr" } /** - * Gets the `index`th attr of this call expression base (0-based). + * Gets the argument list of this call expression, if it exists. */ - Attr getAttr(int index) { call_expr_base_attrs(this, index, result) } + ArgList getArgList() { call_expr_arg_lists(this, result) } /** - * Gets the number of attrs of this call expression base. + * Gets the `index`th attr of this call expression (0-based). */ - int getNumberOfAttrs() { result = count(int i | call_expr_base_attrs(this, i, _)) } + Attr getAttr(int index) { call_expr_attrs(this, index, result) } + + /** + * Gets the number of attrs of this call expression. + */ + int getNumberOfAttrs() { result = count(int i | call_expr_attrs(this, i, _)) } + + /** + * Gets the function of this call expression, if it exists. + */ + Expr getFunction() { call_expr_functions(this, result) } + } + + private Element getImmediateChildOfCallExpr(CallExpr e, int index) { + exists(int n, int nArgList, int nAttr, int nFunction | + n = 0 and + nArgList = n + 1 and + nAttr = nArgList + e.getNumberOfAttrs() and + nFunction = nAttr + 1 and + ( + none() + or + index = n and result = e.getArgList() + or + result = e.getAttr(index - nArgList) + or + index = nAttr and result = e.getFunction() + ) + ) } /** @@ -4345,6 +4379,76 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + * NOTE: Consider using `MethodCall` instead, as that also includes calls to methods using + * call syntax (such as `Foo::method(x)`), operation syntax (such as `x + y`), and + * indexing syntax (such as `x[y]`). + * + * A method call expression. For example: + * ```rust + * x.foo(42); + * x.foo::(42); + * ``` + */ + class MethodCallExpr extends @method_call_expr, Expr { + override string toString() { result = "MethodCallExpr" } + + /** + * Gets the argument list of this method call expression, if it exists. + */ + ArgList getArgList() { method_call_expr_arg_lists(this, result) } + + /** + * Gets the `index`th attr of this method call expression (0-based). + */ + Attr getAttr(int index) { method_call_expr_attrs(this, index, result) } + + /** + * Gets the number of attrs of this method call expression. + */ + int getNumberOfAttrs() { result = count(int i | method_call_expr_attrs(this, i, _)) } + + /** + * Gets the generic argument list of this method call expression, if it exists. + */ + GenericArgList getGenericArgList() { method_call_expr_generic_arg_lists(this, result) } + + /** + * Gets the identifier of this method call expression, if it exists. + */ + NameRef getIdentifier() { method_call_expr_identifiers(this, result) } + + /** + * Gets the receiver of this method call expression, if it exists. + */ + Expr getReceiver() { method_call_expr_receivers(this, result) } + } + + private Element getImmediateChildOfMethodCallExpr(MethodCallExpr e, int index) { + exists(int n, int nArgList, int nAttr, int nGenericArgList, int nIdentifier, int nReceiver | + n = 0 and + nArgList = n + 1 and + nAttr = nArgList + e.getNumberOfAttrs() and + nGenericArgList = nAttr + 1 and + nIdentifier = nGenericArgList + 1 and + nReceiver = nIdentifier + 1 and + ( + none() + or + index = n and result = e.getArgList() + or + result = e.getAttr(index - nArgList) + or + index = nAttr and result = e.getGenericArgList() + or + index = nGenericArgList and result = e.getIdentifier() + or + index = nIdentifier and result = e.getReceiver() + ) + ) + } + /** * INTERNAL: Do not use. * A reference to a name. @@ -5418,7 +5522,7 @@ module Raw { /** * INTERNAL: Do not use. - * A list of fields in a tuple struct or tuple enum variant. + * A list of fields in a tuple struct or tuple variant. * * For example: * ```rust @@ -5854,26 +5958,6 @@ module Raw { ) } - /** - * INTERNAL: Do not use. - * An ADT (Abstract Data Type) definition, such as `Struct`, `Enum`, or `Union`. - */ - class Adt extends @adt, Item { - /** - * Gets the `index`th derive macro expansion of this adt (0-based). - */ - MacroItems getDeriveMacroExpansion(int index) { - adt_derive_macro_expansions(this, index, result) - } - - /** - * Gets the number of derive macro expansions of this adt. - */ - int getNumberOfDeriveMacroExpansions() { - result = count(int i | adt_derive_macro_expansions(this, i, _)) - } - } - /** * INTERNAL: Do not use. * An inline assembly expression. For example: @@ -6033,43 +6117,6 @@ module Raw { ) } - /** - * INTERNAL: Do not use. - * A function call expression. For example: - * ```rust - * foo(42); - * foo::(42); - * foo[0](42); - * foo(1) = 4; - * ``` - */ - class CallExpr extends @call_expr, CallExprBase { - override string toString() { result = "CallExpr" } - - /** - * Gets the function of this call expression, if it exists. - */ - Expr getFunction() { call_expr_functions(this, result) } - } - - private Element getImmediateChildOfCallExpr(CallExpr e, int index) { - exists(int n, int nArgList, int nAttr, int nFunction | - n = 0 and - nArgList = n + 1 and - nAttr = nArgList + e.getNumberOfAttrs() and - nFunction = nAttr + 1 and - ( - none() - or - index = n and result = e.getArgList() - or - result = e.getAttr(index - nArgList) - or - index = nAttr and result = e.getFunction() - ) - ) - } - /** * INTERNAL: Do not use. * An extern block containing foreign function declarations. @@ -6467,57 +6514,6 @@ module Raw { ) } - /** - * INTERNAL: Do not use. - * A method call expression. For example: - * ```rust - * x.foo(42); - * x.foo::(42); - * ``` - */ - class MethodCallExpr extends @method_call_expr, CallExprBase { - override string toString() { result = "MethodCallExpr" } - - /** - * Gets the generic argument list of this method call expression, if it exists. - */ - GenericArgList getGenericArgList() { method_call_expr_generic_arg_lists(this, result) } - - /** - * Gets the identifier of this method call expression, if it exists. - */ - NameRef getIdentifier() { method_call_expr_identifiers(this, result) } - - /** - * Gets the receiver of this method call expression, if it exists. - */ - Expr getReceiver() { method_call_expr_receivers(this, result) } - } - - private Element getImmediateChildOfMethodCallExpr(MethodCallExpr e, int index) { - exists(int n, int nArgList, int nAttr, int nGenericArgList, int nIdentifier, int nReceiver | - n = 0 and - nArgList = n + 1 and - nAttr = nArgList + e.getNumberOfAttrs() and - nGenericArgList = nAttr + 1 and - nIdentifier = nGenericArgList + 1 and - nReceiver = nIdentifier + 1 and - ( - none() - or - index = n and result = e.getArgList() - or - result = e.getAttr(index - nArgList) - or - index = nAttr and result = e.getGenericArgList() - or - index = nGenericArgList and result = e.getIdentifier() - or - index = nIdentifier and result = e.getReceiver() - ) - ) - } - /** * INTERNAL: Do not use. * A module declaration. For example: @@ -6808,6 +6804,56 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + * An item that defines a type. Either a `Struct`, `Enum`, or `Union`. + */ + class TypeItem extends @type_item, Item { + /** + * Gets the `index`th derive macro expansion of this type item (0-based). + */ + MacroItems getDeriveMacroExpansion(int index) { + type_item_derive_macro_expansions(this, index, result) + } + + /** + * Gets the number of derive macro expansions of this type item. + */ + int getNumberOfDeriveMacroExpansions() { + result = count(int i | type_item_derive_macro_expansions(this, i, _)) + } + + /** + * Gets the `index`th attr of this type item (0-based). + */ + Attr getAttr(int index) { type_item_attrs(this, index, result) } + + /** + * Gets the number of attrs of this type item. + */ + int getNumberOfAttrs() { result = count(int i | type_item_attrs(this, i, _)) } + + /** + * Gets the generic parameter list of this type item, if it exists. + */ + GenericParamList getGenericParamList() { type_item_generic_param_lists(this, result) } + + /** + * Gets the name of this type item, if it exists. + */ + Name getName() { type_item_names(this, result) } + + /** + * Gets the visibility of this type item, if it exists. + */ + Visibility getVisibility() { type_item_visibilities(this, result) } + + /** + * Gets the where clause of this type item, if it exists. + */ + WhereClause getWhereClause() { type_item_where_clauses(this, result) } + } + /** * INTERNAL: Do not use. * A `use` statement. For example: @@ -6976,49 +7022,19 @@ module Raw { * enum E {A, B(i32), C {x: i32}} * ``` */ - class Enum extends @enum, Adt { + class Enum extends @enum, TypeItem { override string toString() { result = "Enum" } - /** - * Gets the `index`th attr of this enum (0-based). - */ - Attr getAttr(int index) { enum_attrs(this, index, result) } - - /** - * Gets the number of attrs of this enum. - */ - int getNumberOfAttrs() { result = count(int i | enum_attrs(this, i, _)) } - - /** - * Gets the generic parameter list of this enum, if it exists. - */ - GenericParamList getGenericParamList() { enum_generic_param_lists(this, result) } - - /** - * Gets the name of this enum, if it exists. - */ - Name getName() { enum_names(this, result) } - /** * Gets the variant list of this enum, if it exists. */ VariantList getVariantList() { enum_variant_lists(this, result) } - - /** - * Gets the visibility of this enum, if it exists. - */ - Visibility getVisibility() { enum_visibilities(this, result) } - - /** - * Gets the where clause of this enum, if it exists. - */ - WhereClause getWhereClause() { enum_where_clauses(this, result) } } private Element getImmediateChildOfEnum(Enum e, int index) { exists( int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, - int nGenericParamList, int nName, int nVariantList, int nVisibility, int nWhereClause + int nGenericParamList, int nName, int nVisibility, int nWhereClause, int nVariantList | n = 0 and nAttributeMacroExpansion = n + 1 and @@ -7026,9 +7042,9 @@ module Raw { nAttr = nDeriveMacroExpansion + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and nName = nGenericParamList + 1 and - nVariantList = nName + 1 and - nVisibility = nVariantList + 1 and + nVisibility = nName + 1 and nWhereClause = nVisibility + 1 and + nVariantList = nWhereClause + 1 and ( none() or @@ -7042,11 +7058,11 @@ module Raw { or index = nGenericParamList and result = e.getName() or - index = nName and result = e.getVariantList() - or - index = nVariantList and result = e.getVisibility() + index = nName and result = e.getVisibility() or index = nVisibility and result = e.getWhereClause() + or + index = nWhereClause and result = e.getVariantList() ) ) } @@ -7457,59 +7473,29 @@ module Raw { * } * ``` */ - class Struct extends @struct, Adt { + class Struct extends @struct, TypeItem { override string toString() { result = "Struct" } - /** - * Gets the `index`th attr of this struct (0-based). - */ - Attr getAttr(int index) { struct_attrs(this, index, result) } - - /** - * Gets the number of attrs of this struct. - */ - int getNumberOfAttrs() { result = count(int i | struct_attrs(this, i, _)) } - /** * Gets the field list of this struct, if it exists. */ FieldList getFieldList() { struct_field_lists_(this, result) } - - /** - * Gets the generic parameter list of this struct, if it exists. - */ - GenericParamList getGenericParamList() { struct_generic_param_lists(this, result) } - - /** - * Gets the name of this struct, if it exists. - */ - Name getName() { struct_names(this, result) } - - /** - * Gets the visibility of this struct, if it exists. - */ - Visibility getVisibility() { struct_visibilities(this, result) } - - /** - * Gets the where clause of this struct, if it exists. - */ - WhereClause getWhereClause() { struct_where_clauses(this, result) } } private Element getImmediateChildOfStruct(Struct e, int index) { exists( - int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, int nFieldList, - int nGenericParamList, int nName, int nVisibility, int nWhereClause + int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, + int nGenericParamList, int nName, int nVisibility, int nWhereClause, int nFieldList | n = 0 and nAttributeMacroExpansion = n + 1 and nDeriveMacroExpansion = nAttributeMacroExpansion + e.getNumberOfDeriveMacroExpansions() and nAttr = nDeriveMacroExpansion + e.getNumberOfAttrs() and - nFieldList = nAttr + 1 and - nGenericParamList = nFieldList + 1 and + nGenericParamList = nAttr + 1 and nName = nGenericParamList + 1 and nVisibility = nName + 1 and nWhereClause = nVisibility + 1 and + nFieldList = nWhereClause + 1 and ( none() or @@ -7519,15 +7505,15 @@ module Raw { or result = e.getAttr(index - nDeriveMacroExpansion) or - index = nAttr and result = e.getFieldList() - or - index = nFieldList and result = e.getGenericParamList() + index = nAttr and result = e.getGenericParamList() or index = nGenericParamList and result = e.getName() or index = nName and result = e.getVisibility() or index = nVisibility and result = e.getWhereClause() + or + index = nWhereClause and result = e.getFieldList() ) ) } @@ -7638,49 +7624,19 @@ module Raw { * union U { f1: u32, f2: f32 } * ``` */ - class Union extends @union, Adt { + class Union extends @union, TypeItem { override string toString() { result = "Union" } - /** - * Gets the `index`th attr of this union (0-based). - */ - Attr getAttr(int index) { union_attrs(this, index, result) } - - /** - * Gets the number of attrs of this union. - */ - int getNumberOfAttrs() { result = count(int i | union_attrs(this, i, _)) } - - /** - * Gets the generic parameter list of this union, if it exists. - */ - GenericParamList getGenericParamList() { union_generic_param_lists(this, result) } - - /** - * Gets the name of this union, if it exists. - */ - Name getName() { union_names(this, result) } - /** * Gets the struct field list of this union, if it exists. */ StructFieldList getStructFieldList() { union_struct_field_lists(this, result) } - - /** - * Gets the visibility of this union, if it exists. - */ - Visibility getVisibility() { union_visibilities(this, result) } - - /** - * Gets the where clause of this union, if it exists. - */ - WhereClause getWhereClause() { union_where_clauses(this, result) } } private Element getImmediateChildOfUnion(Union e, int index) { exists( int n, int nAttributeMacroExpansion, int nDeriveMacroExpansion, int nAttr, - int nGenericParamList, int nName, int nStructFieldList, int nVisibility, int nWhereClause + int nGenericParamList, int nName, int nVisibility, int nWhereClause, int nStructFieldList | n = 0 and nAttributeMacroExpansion = n + 1 and @@ -7688,9 +7644,9 @@ module Raw { nAttr = nDeriveMacroExpansion + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and nName = nGenericParamList + 1 and - nStructFieldList = nName + 1 and - nVisibility = nStructFieldList + 1 and + nVisibility = nName + 1 and nWhereClause = nVisibility + 1 and + nStructFieldList = nWhereClause + 1 and ( none() or @@ -7704,11 +7660,11 @@ module Raw { or index = nGenericParamList and result = e.getName() or - index = nName and result = e.getStructFieldList() - or - index = nStructFieldList and result = e.getVisibility() + index = nName and result = e.getVisibility() or index = nVisibility and result = e.getWhereClause() + or + index = nWhereClause and result = e.getStructFieldList() ) ) } @@ -7907,6 +7863,8 @@ module Raw { or result = getImmediateChildOfBreakExpr(e, index) or + result = getImmediateChildOfCallExpr(e, index) + or result = getImmediateChildOfCastExpr(e, index) or result = getImmediateChildOfClosureExpr(e, index) @@ -7967,6 +7925,8 @@ module Raw { or result = getImmediateChildOfMatchExpr(e, index) or + result = getImmediateChildOfMethodCallExpr(e, index) + or result = getImmediateChildOfNameRef(e, index) or result = getImmediateChildOfNeverTypeRepr(e, index) @@ -8047,8 +8007,6 @@ module Raw { or result = getImmediateChildOfBlockExpr(e, index) or - result = getImmediateChildOfCallExpr(e, index) - or result = getImmediateChildOfExternBlock(e, index) or result = getImmediateChildOfExternCrate(e, index) @@ -8059,8 +8017,6 @@ module Raw { or result = getImmediateChildOfMacroRules(e, index) or - result = getImmediateChildOfMethodCallExpr(e, index) - or result = getImmediateChildOfModule(e, index) or result = getImmediateChildOfPathExpr(e, index) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll index 8910d269169..07c4657c651 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll @@ -6,13 +6,8 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.internal.AdtImpl::Impl as AdtImpl -import codeql.rust.elements.Attr import codeql.rust.elements.FieldList -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.Name -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause +import codeql.rust.elements.internal.TypeItemImpl::Impl as TypeItemImpl /** * INTERNAL: This module contains the fully generated definition of `Struct` and should not @@ -30,27 +25,9 @@ module Generated { * INTERNAL: Do not reference the `Generated::Struct` class directly. * Use the subclass `Struct`, where the following predicates are available. */ - class Struct extends Synth::TStruct, AdtImpl::Adt { + class Struct extends Synth::TStruct, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Struct" } - /** - * Gets the `index`th attr of this struct (0-based). - */ - Attr getAttr(int index) { - result = - Synth::convertAttrFromRaw(Synth::convertStructToRaw(this).(Raw::Struct).getAttr(index)) - } - - /** - * Gets any of the attrs of this struct. - */ - final Attr getAnAttr() { result = this.getAttr(_) } - - /** - * Gets the number of attrs of this struct. - */ - final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } - /** * Gets the field list of this struct, if it exists. */ @@ -63,62 +40,5 @@ module Generated { * Holds if `getFieldList()` exists. */ final predicate hasFieldList() { exists(this.getFieldList()) } - - /** - * Gets the generic parameter list of this struct, if it exists. - */ - GenericParamList getGenericParamList() { - result = - Synth::convertGenericParamListFromRaw(Synth::convertStructToRaw(this) - .(Raw::Struct) - .getGenericParamList()) - } - - /** - * Holds if `getGenericParamList()` exists. - */ - final predicate hasGenericParamList() { exists(this.getGenericParamList()) } - - /** - * Gets the name of this struct, if it exists. - */ - Name getName() { - result = Synth::convertNameFromRaw(Synth::convertStructToRaw(this).(Raw::Struct).getName()) - } - - /** - * Holds if `getName()` exists. - */ - final predicate hasName() { exists(this.getName()) } - - /** - * Gets the visibility of this struct, if it exists. - */ - Visibility getVisibility() { - result = - Synth::convertVisibilityFromRaw(Synth::convertStructToRaw(this) - .(Raw::Struct) - .getVisibility()) - } - - /** - * Holds if `getVisibility()` exists. - */ - final predicate hasVisibility() { exists(this.getVisibility()) } - - /** - * Gets the where clause of this struct, if it exists. - */ - WhereClause getWhereClause() { - result = - Synth::convertWhereClauseFromRaw(Synth::convertStructToRaw(this) - .(Raw::Struct) - .getWhereClause()) - } - - /** - * Holds if `getWhereClause()` exists. - */ - final predicate hasWhereClause() { exists(this.getWhereClause()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll index 74b4a14460a..8b22dbbac9d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll @@ -688,11 +688,6 @@ module Synth { */ class TAddressable = TItem or TVariant; - /** - * INTERNAL: Do not use. - */ - class TAdt = TEnum or TStruct or TUnion; - /** * INTERNAL: Do not use. */ @@ -729,11 +724,6 @@ module Synth { TTypeBoundList or TTypeRepr or TUseBoundGenericArg or TUseBoundGenericArgs or TUseTree or TUseTreeList or TVariantList or TVisibility or TWhereClause or TWherePred; - /** - * INTERNAL: Do not use. - */ - class TCallExprBase = TCallExpr or TMethodCallExpr; - /** * INTERNAL: Do not use. */ @@ -744,11 +734,11 @@ module Synth { */ class TExpr = TArrayExpr or TArrayExprInternal or TAsmExpr or TAwaitExpr or TBecomeExpr or TBinaryExpr or - TBreakExpr or TCallExprBase or TCastExpr or TClosureExpr or TContinueExpr or TFieldExpr or + TBreakExpr or TCallExpr or TCastExpr or TClosureExpr or TContinueExpr or TFieldExpr or TFormatArgsExpr or TIfExpr or TIndexExpr or TLabelableExpr or TLetExpr or TLiteralExpr or - TMacroBlockExpr or TMacroExpr or TMatchExpr or TOffsetOfExpr or TParenExpr or - TPathExprBase or TPrefixExpr or TRangeExpr or TRefExpr or TReturnExpr or TStructExpr or - TTryExpr or TTupleExpr or TUnderscoreExpr or TYeetExpr or TYieldExpr; + TMacroBlockExpr or TMacroExpr or TMatchExpr or TMethodCallExpr or TOffsetOfExpr or + TParenExpr or TPathExprBase or TPrefixExpr or TRangeExpr or TRefExpr or TReturnExpr or + TStructExpr or TTryExpr or TTupleExpr or TUnderscoreExpr or TYeetExpr or TYieldExpr; /** * INTERNAL: Do not use. @@ -774,8 +764,8 @@ module Synth { * INTERNAL: Do not use. */ class TItem = - TAdt or TAsmExpr or TAssocItem or TExternBlock or TExternCrate or TExternItem or TImpl or - TMacroDef or TMacroRules or TModule or TTrait or TTraitAlias or TUse; + TAsmExpr or TAssocItem or TExternBlock or TExternCrate or TExternItem or TImpl or TMacroDef or + TMacroRules or TModule or TTrait or TTraitAlias or TTypeItem or TUse; /** * INTERNAL: Do not use. @@ -825,6 +815,11 @@ module Synth { */ class TToken = TComment; + /** + * INTERNAL: Do not use. + */ + class TTypeItem = TEnum or TStruct or TUnion; + /** * INTERNAL: Do not use. */ @@ -2037,18 +2032,6 @@ module Synth { result = convertVariantFromRaw(e) } - /** - * INTERNAL: Do not use. - * Converts a raw DB element to a synthesized `TAdt`, if possible. - */ - TAdt convertAdtFromRaw(Raw::Element e) { - result = convertEnumFromRaw(e) - or - result = convertStructFromRaw(e) - or - result = convertUnionFromRaw(e) - } - /** * INTERNAL: Do not use. * Converts a raw DB element to a synthesized `TArrayExpr`, if possible. @@ -2229,16 +2212,6 @@ module Synth { result = convertWherePredFromRaw(e) } - /** - * INTERNAL: Do not use. - * Converts a raw DB element to a synthesized `TCallExprBase`, if possible. - */ - TCallExprBase convertCallExprBaseFromRaw(Raw::Element e) { - result = convertCallExprFromRaw(e) - or - result = convertMethodCallExprFromRaw(e) - } - /** * INTERNAL: Do not use. * Converts a raw DB element to a synthesized `TCallable`, if possible. @@ -2282,7 +2255,7 @@ module Synth { or result = convertBreakExprFromRaw(e) or - result = convertCallExprBaseFromRaw(e) + result = convertCallExprFromRaw(e) or result = convertCastExprFromRaw(e) or @@ -2310,6 +2283,8 @@ module Synth { or result = convertMatchExprFromRaw(e) or + result = convertMethodCallExprFromRaw(e) + or result = convertOffsetOfExprFromRaw(e) or result = convertParenExprFromRaw(e) @@ -2392,8 +2367,6 @@ module Synth { * Converts a raw DB element to a synthesized `TItem`, if possible. */ TItem convertItemFromRaw(Raw::Element e) { - result = convertAdtFromRaw(e) - or result = convertAsmExprFromRaw(e) or result = convertAssocItemFromRaw(e) @@ -2416,6 +2389,8 @@ module Synth { or result = convertTraitAliasFromRaw(e) or + result = convertTypeItemFromRaw(e) + or result = convertUseFromRaw(e) } @@ -2547,6 +2522,18 @@ module Synth { */ TToken convertTokenFromRaw(Raw::Element e) { result = convertCommentFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TTypeItem`, if possible. + */ + TTypeItem convertTypeItemFromRaw(Raw::Element e) { + result = convertEnumFromRaw(e) + or + result = convertStructFromRaw(e) + or + result = convertUnionFromRaw(e) + } + /** * INTERNAL: Do not use. * Converts a raw DB element to a synthesized `TTypeRepr`, if possible. @@ -3613,18 +3600,6 @@ module Synth { result = convertVariantToRaw(e) } - /** - * INTERNAL: Do not use. - * Converts a synthesized `TAdt` to a raw DB element, if possible. - */ - Raw::Element convertAdtToRaw(TAdt e) { - result = convertEnumToRaw(e) - or - result = convertStructToRaw(e) - or - result = convertUnionToRaw(e) - } - /** * INTERNAL: Do not use. * Converts a synthesized `TArrayExpr` to a raw DB element, if possible. @@ -3805,16 +3780,6 @@ module Synth { result = convertWherePredToRaw(e) } - /** - * INTERNAL: Do not use. - * Converts a synthesized `TCallExprBase` to a raw DB element, if possible. - */ - Raw::Element convertCallExprBaseToRaw(TCallExprBase e) { - result = convertCallExprToRaw(e) - or - result = convertMethodCallExprToRaw(e) - } - /** * INTERNAL: Do not use. * Converts a synthesized `TCallable` to a raw DB element, if possible. @@ -3858,7 +3823,7 @@ module Synth { or result = convertBreakExprToRaw(e) or - result = convertCallExprBaseToRaw(e) + result = convertCallExprToRaw(e) or result = convertCastExprToRaw(e) or @@ -3886,6 +3851,8 @@ module Synth { or result = convertMatchExprToRaw(e) or + result = convertMethodCallExprToRaw(e) + or result = convertOffsetOfExprToRaw(e) or result = convertParenExprToRaw(e) @@ -3968,8 +3935,6 @@ module Synth { * Converts a synthesized `TItem` to a raw DB element, if possible. */ Raw::Element convertItemToRaw(TItem e) { - result = convertAdtToRaw(e) - or result = convertAsmExprToRaw(e) or result = convertAssocItemToRaw(e) @@ -3992,6 +3957,8 @@ module Synth { or result = convertTraitAliasToRaw(e) or + result = convertTypeItemToRaw(e) + or result = convertUseToRaw(e) } @@ -4123,6 +4090,18 @@ module Synth { */ Raw::Element convertTokenToRaw(TToken e) { result = convertCommentToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTypeItem` to a raw DB element, if possible. + */ + Raw::Element convertTypeItemToRaw(TTypeItem e) { + result = convertEnumToRaw(e) + or + result = convertStructToRaw(e) + or + result = convertUnionToRaw(e) + } + /** * INTERNAL: Do not use. * Converts a synthesized `TTypeRepr` to a raw DB element, if possible. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll index 43696098386..8d39a116f5c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll @@ -17,7 +17,7 @@ import codeql.rust.elements.Visibility */ module Generated { /** - * A field in a tuple struct or tuple enum variant. + * A field in a tuple struct or tuple variant. * * For example: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll index 56b1d505c3a..6d68797e64b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll @@ -15,7 +15,7 @@ import codeql.rust.elements.TupleField */ module Generated { /** - * A list of fields in a tuple struct or tuple enum variant. + * A list of fields in a tuple struct or tuple variant. * * For example: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeItem.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeItem.qll new file mode 100644 index 00000000000..5bc8bfb3c77 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeItem.qll @@ -0,0 +1,126 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `TypeItem`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.Attr +import codeql.rust.elements.GenericParamList +import codeql.rust.elements.internal.ItemImpl::Impl as ItemImpl +import codeql.rust.elements.MacroItems +import codeql.rust.elements.Name +import codeql.rust.elements.Visibility +import codeql.rust.elements.WhereClause + +/** + * INTERNAL: This module contains the fully generated definition of `TypeItem` and should not + * be referenced directly. + */ +module Generated { + /** + * An item that defines a type. Either a `Struct`, `Enum`, or `Union`. + * INTERNAL: Do not reference the `Generated::TypeItem` class directly. + * Use the subclass `TypeItem`, where the following predicates are available. + */ + class TypeItem extends Synth::TTypeItem, ItemImpl::Item { + /** + * Gets the `index`th derive macro expansion of this type item (0-based). + */ + MacroItems getDeriveMacroExpansion(int index) { + result = + Synth::convertMacroItemsFromRaw(Synth::convertTypeItemToRaw(this) + .(Raw::TypeItem) + .getDeriveMacroExpansion(index)) + } + + /** + * Gets any of the derive macro expansions of this type item. + */ + final MacroItems getADeriveMacroExpansion() { result = this.getDeriveMacroExpansion(_) } + + /** + * Gets the number of derive macro expansions of this type item. + */ + final int getNumberOfDeriveMacroExpansions() { + result = count(int i | exists(this.getDeriveMacroExpansion(i))) + } + + /** + * Gets the `index`th attr of this type item (0-based). + */ + Attr getAttr(int index) { + result = + Synth::convertAttrFromRaw(Synth::convertTypeItemToRaw(this).(Raw::TypeItem).getAttr(index)) + } + + /** + * Gets any of the attrs of this type item. + */ + final Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this type item. + */ + final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + + /** + * Gets the generic parameter list of this type item, if it exists. + */ + GenericParamList getGenericParamList() { + result = + Synth::convertGenericParamListFromRaw(Synth::convertTypeItemToRaw(this) + .(Raw::TypeItem) + .getGenericParamList()) + } + + /** + * Holds if `getGenericParamList()` exists. + */ + final predicate hasGenericParamList() { exists(this.getGenericParamList()) } + + /** + * Gets the name of this type item, if it exists. + */ + Name getName() { + result = + Synth::convertNameFromRaw(Synth::convertTypeItemToRaw(this).(Raw::TypeItem).getName()) + } + + /** + * Holds if `getName()` exists. + */ + final predicate hasName() { exists(this.getName()) } + + /** + * Gets the visibility of this type item, if it exists. + */ + Visibility getVisibility() { + result = + Synth::convertVisibilityFromRaw(Synth::convertTypeItemToRaw(this) + .(Raw::TypeItem) + .getVisibility()) + } + + /** + * Holds if `getVisibility()` exists. + */ + final predicate hasVisibility() { exists(this.getVisibility()) } + + /** + * Gets the where clause of this type item, if it exists. + */ + WhereClause getWhereClause() { + result = + Synth::convertWhereClauseFromRaw(Synth::convertTypeItemToRaw(this) + .(Raw::TypeItem) + .getWhereClause()) + } + + /** + * Holds if `getWhereClause()` exists. + */ + final predicate hasWhereClause() { exists(this.getWhereClause()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll index e42eed69263..5d31edafa11 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll @@ -6,13 +6,8 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.internal.AdtImpl::Impl as AdtImpl -import codeql.rust.elements.Attr -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.Name import codeql.rust.elements.StructFieldList -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause +import codeql.rust.elements.internal.TypeItemImpl::Impl as TypeItemImpl /** * INTERNAL: This module contains the fully generated definition of `Union` and should not @@ -29,53 +24,9 @@ module Generated { * INTERNAL: Do not reference the `Generated::Union` class directly. * Use the subclass `Union`, where the following predicates are available. */ - class Union extends Synth::TUnion, AdtImpl::Adt { + class Union extends Synth::TUnion, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Union" } - /** - * Gets the `index`th attr of this union (0-based). - */ - Attr getAttr(int index) { - result = Synth::convertAttrFromRaw(Synth::convertUnionToRaw(this).(Raw::Union).getAttr(index)) - } - - /** - * Gets any of the attrs of this union. - */ - final Attr getAnAttr() { result = this.getAttr(_) } - - /** - * Gets the number of attrs of this union. - */ - final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } - - /** - * Gets the generic parameter list of this union, if it exists. - */ - GenericParamList getGenericParamList() { - result = - Synth::convertGenericParamListFromRaw(Synth::convertUnionToRaw(this) - .(Raw::Union) - .getGenericParamList()) - } - - /** - * Holds if `getGenericParamList()` exists. - */ - final predicate hasGenericParamList() { exists(this.getGenericParamList()) } - - /** - * Gets the name of this union, if it exists. - */ - Name getName() { - result = Synth::convertNameFromRaw(Synth::convertUnionToRaw(this).(Raw::Union).getName()) - } - - /** - * Holds if `getName()` exists. - */ - final predicate hasName() { exists(this.getName()) } - /** * Gets the struct field list of this union, if it exists. */ @@ -90,33 +41,5 @@ module Generated { * Holds if `getStructFieldList()` exists. */ final predicate hasStructFieldList() { exists(this.getStructFieldList()) } - - /** - * Gets the visibility of this union, if it exists. - */ - Visibility getVisibility() { - result = - Synth::convertVisibilityFromRaw(Synth::convertUnionToRaw(this).(Raw::Union).getVisibility()) - } - - /** - * Holds if `getVisibility()` exists. - */ - final predicate hasVisibility() { exists(this.getVisibility()) } - - /** - * Gets the where clause of this union, if it exists. - */ - WhereClause getWhereClause() { - result = - Synth::convertWhereClauseFromRaw(Synth::convertUnionToRaw(this) - .(Raw::Union) - .getWhereClause()) - } - - /** - * Holds if `getWhereClause()` exists. - */ - final predicate hasWhereClause() { exists(this.getWhereClause()) } } } diff --git a/rust/ql/lib/codeql/rust/frameworks/Poem.qll b/rust/ql/lib/codeql/rust/frameworks/Poem.qll index 2554d845293..ad57ba1dc94 100644 --- a/rust/ql/lib/codeql/rust/frameworks/Poem.qll +++ b/rust/ql/lib/codeql/rust/frameworks/Poem.qll @@ -11,7 +11,7 @@ private import codeql.rust.Concepts private class PoemHandlerParam extends RemoteSource::Range { PoemHandlerParam() { exists(TupleStructPat param | - this.asPat().getPat() = param.getAField() and + this.asPat() = param.getAField() and param.getStruct().getCanonicalPath() = ["poem::web::query::Query", "poem::web::path::Path"] ) } diff --git a/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml b/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml index 4031b9bbe86..bef64edf68d 100644 --- a/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/actix-web.model.yml @@ -6,13 +6,13 @@ extensions: - ["::to", "Argument[0].Parameter[0..7]", "remote", "manual"] # Actix attributes such as `get` expand to this `to` call on the handler. - ["::to", "Argument[0].Parameter[0..7]", "remote", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["::new", "Argument[0]", "html-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel data: - - ["::into_inner", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["::into_inner", "Argument[self]", "ReturnValue.Field[0]", "taint", "manual"] - - ["::into_inner", "Argument[self]", "ReturnValue.Field[1]", "taint", "manual"] - - ["::into_inner", "Argument[self]", "ReturnValue.Field[2]", "taint", "manual"] - - ["::into_inner", "Argument[self]", "ReturnValue.Field[3]", "taint", "manual"] - - ["::into_inner", "Argument[self]", "ReturnValue.Field[4]", "taint", "manual"] \ No newline at end of file + - ["::into_inner", "Argument[self]", "ReturnValue", "taint", "manual"] \ No newline at end of file diff --git a/rust/ql/lib/codeql/rust/frameworks/axum.model.yml b/rust/ql/lib/codeql/rust/frameworks/axum.model.yml new file mode 100644 index 00000000000..7ae7dec3635 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/axum.model.yml @@ -0,0 +1,23 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sourceModel + data: + # Get + - ["axum::routing::method_routing::get", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::get", "Argument[0].Parameter[0..7]", "remote", "manual"] + # Post + - ["axum::routing::method_routing::post", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::post", "Argument[0].Parameter[0..7]", "remote", "manual"] + # Put + - ["axum::routing::method_routing::put", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::put", "Argument[0].Parameter[0..7]", "remote", "manual"] + # Delete + - ["axum::routing::method_routing::delete", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::delete", "Argument[0].Parameter[0..7]", "remote", "manual"] + # Patch + - ["axum::routing::method_routing::patch", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::patch", "Argument[0].Parameter[0..7]", "remote", "manual"] + # on + - ["axum::routing::method_routing::on", "Argument[1].Parameter[0..7]", "remote", "manual"] + - ["::on", "Argument[1].Parameter[0..7]", "remote", "manual"] \ No newline at end of file diff --git a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml index 35e547076d9..712897186a8 100644 --- a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml @@ -7,13 +7,10 @@ extensions: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - ["<_ as futures_util::io::AsyncReadExt>::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - ["<_ as futures_util::io::AsyncReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncReadExt>::read_to_end", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - ["<_ as futures_util::io::AsyncReadExt>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncBufReadExt>::read_line", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - ["<_ as futures_util::io::AsyncBufReadExt>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncBufReadExt>::read_until", "Argument[self]", "Argument[1].Reference", "taint", "manual"] - ["<_ as futures_util::io::AsyncBufReadExt>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncBufReadExt>::fill_buf", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as futures_util::io::AsyncBufReadExt>::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["<_ as futures_util::io::AsyncBufReadExt>::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - ["<_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["<_ as futures_io::if_std::AsyncRead>::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/native-tls.model.yml b/rust/ql/lib/codeql/rust/frameworks/native-tls.model.yml new file mode 100644 index 00000000000..1da63eb7961 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/native-tls.model.yml @@ -0,0 +1,9 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["::danger_accept_invalid_certs", "Argument[0]", "disable-certificate", "manual"] + - ["::danger_accept_invalid_hostnames", "Argument[0]", "disable-certificate", "manual"] + - ["::danger_accept_invalid_certs", "Argument[0]", "disable-certificate", "manual"] + - ["::danger_accept_invalid_hostnames", "Argument[0]", "disable-certificate", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml b/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml index 5457460919f..4b728a9a6ad 100644 --- a/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml @@ -11,6 +11,10 @@ extensions: data: - ["::request", "Argument[1]", "request-url", "manual"] - ["::request", "Argument[1]", "request-url", "manual"] + - ["::danger_accept_invalid_certs", "Argument[0]", "disable-certificate", "manual"] + - ["::danger_accept_invalid_hostnames", "Argument[0]", "disable-certificate", "manual"] + - ["::danger_accept_invalid_certs", "Argument[0]", "disable-certificate", "manual"] + - ["::danger_accept_invalid_hostnames", "Argument[0]", "disable-certificate", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel @@ -18,10 +22,10 @@ extensions: - ["::text", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::text_with_charset", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::bytes", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::chunk", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] + - ["::chunk", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - ["::text", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::text_with_charset", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::bytes", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::text", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::bytes", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::chunk", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] + - ["::chunk", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll index b34b3abf7cb..cbc638c8ae5 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll @@ -24,14 +24,14 @@ class StreamCipherInit extends Cryptography::CryptographicOperation::Range { StreamCipherInit() { // a call to `cipher::KeyInit::new`, `cipher::KeyInit::new_from_slice`, // `cipher::KeyIvInit::new`, `cipher::KeyIvInit::new_from_slices`, `rc2::Rc2::new_with_eff_key_len` or similar. - exists(CallExprBase ce, string rawAlgorithmName | - ce = this.asExpr().getExpr() and - ce.getStaticTarget().(Function).getName().getText() = - ["new", "new_from_slice", "new_with_eff_key_len", "new_from_slices"] and + exists(Call call, string rawAlgorithmName | + call = this.asExpr() and + call.getTargetName() = ["new", "new_from_slice", "new_with_eff_key_len", "new_from_slices"] and // extract the algorithm name from the type of `ce` or its receiver. exists(Type t, TypePath tp | - t = inferType([ce, ce.(MethodCallExpr).getReceiver()], tp) and - rawAlgorithmName = t.(StructType).getStruct().(Addressable).getCanonicalPath().splitAt("::") + t = inferType([call, call.(MethodCall).getReceiver()], tp) and + rawAlgorithmName = + t.(StructType).getTypeItem().(Addressable).getCanonicalPath().splitAt("::") ) and algorithmName = simplifyAlgorithmName(rawAlgorithmName) and // only match a known cryptographic algorithm diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/Builtins.qll b/rust/ql/lib/codeql/rust/frameworks/stdlib/Builtins.qll index 9269aff2bdc..6b09ababd74 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/Builtins.qll +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/Builtins.qll @@ -27,8 +27,19 @@ private class BuiltinsTypesFile extends File { class BuiltinType extends Struct { BuiltinType() { this.getFile() instanceof BuiltinsTypesFile } - /** Gets the name of this type. */ + /** + * Gets the name of this type. + * + * This is the name used internally to represent the type, for example `Ref`. + */ string getName() { result = super.getName().getText() } + + /** + * Gets a display name for this type. + * + * This is the name used in code, for example `&`. + */ + string getDisplayName() { result = this.getName() } } /** @@ -136,3 +147,77 @@ class F32 extends FloatingPointTypeImpl { class F64 extends FloatingPointTypeImpl { F64() { this.getName() = "f64" } } + +/** The builtin slice type `[T]`. */ +class SliceType extends BuiltinType { + SliceType() { this.getName() = "Slice" } + + override string getDisplayName() { result = "[]" } +} + +/** The builtin array type `[T; N]`. */ +class ArrayType extends BuiltinType { + ArrayType() { this.getName() = "Array" } + + override string getDisplayName() { result = "[;]" } +} + +/** A builtin reference type `&T` or `&mut T`. */ +abstract private class RefTypeImpl extends BuiltinType { } + +final class RefType = RefTypeImpl; + +/** The builtin shared reference type `&T`. */ +class RefSharedType extends RefTypeImpl { + RefSharedType() { this.getName() = "Ref" } + + override string getDisplayName() { result = "&" } +} + +/** The builtin mutable reference type `&mut T`. */ +class RefMutType extends RefTypeImpl { + RefMutType() { this.getName() = "RefMut" } + + override string getDisplayName() { result = "&mut" } +} + +/** A builtin raw pointer type `*const T` or `*mut T`. */ +abstract private class PtrTypeImpl extends BuiltinType { } + +final class PtrType = PtrTypeImpl; + +/** The builtin raw pointer type `*const T`. */ +class PtrConstType extends PtrTypeImpl { + PtrConstType() { this.getName() = "PtrConst" } + + override string getDisplayName() { result = "*const" } +} + +/** The builtin raw pointer type `*mut T`. */ +class PtrMutType extends PtrTypeImpl { + PtrMutType() { this.getName() = "PtrMut" } + + override string getDisplayName() { result = "*mut" } +} + +/** A builtin tuple type `(T1, T2, ...)`. */ +class TupleType extends BuiltinType { + TupleType() { this.getName().matches("Tuple%") } + + /** Gets the arity of this tuple type. */ + int getArity() { + not this.hasGenericParamList() and + result = 0 + or + result = this.getGenericParamList().getNumberOfGenericParams() + } + + override string getDisplayName() { + // Note: This produces "(,,)" for a 2-tuple, "(,,,)" for a 3-tuple, etc. + // This is in order to distinguish the unit type `()` from the 1-tuple `(,)`. + exists(string commas | + commas = concat(int i | i = [0 .. this.getArity() - 1] | ",") and + result = "(" + commas + ")" + ) + } +} diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll b/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll index 773aa77f80f..ec0e38f5739 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll @@ -4,20 +4,16 @@ private import rust private import codeql.rust.Concepts -private import codeql.rust.controlflow.ControlFlowGraph as Cfg -private import codeql.rust.controlflow.CfgNodes as CfgNodes private import codeql.rust.dataflow.DataFlow private import codeql.rust.internal.PathResolution /** * A call to the `starts_with` method on a `Path`. */ -private class StartswithCall extends Path::SafeAccessCheck::Range, CfgNodes::MethodCallExprCfgNode { - StartswithCall() { - this.getMethodCallExpr().getStaticTarget().getCanonicalPath() = "::starts_with" - } +private class StartswithCall extends Path::SafeAccessCheck::Range, MethodCall { + StartswithCall() { this.getStaticTarget().getCanonicalPath() = "::starts_with" } - override predicate checks(Cfg::CfgNode e, boolean branch) { + override predicate checks(Expr e, boolean branch) { e = this.getReceiver() and branch = true } @@ -254,6 +250,19 @@ class IndexTrait extends Trait { } } +/** + * The [`IndexMut` trait][1]. + * + * [1]: https://doc.rust-lang.org/std/ops/trait.IndexMut.html + */ +class IndexMutTrait extends Trait { + pragma[nomagic] + IndexMutTrait() { this.getCanonicalPath() = "core::ops::index::IndexMut" } + + /** Gets the `index_mut` function. */ + Function getIndexMutFunction() { result = this.(TraitItemNode).getAssocItem("index_mut") } +} + /** * The [`Box` struct][1]. * diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml index 5199a0e8117..ece380966de 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml @@ -24,30 +24,31 @@ extensions: extensible: summaryModel data: # Box - - ["::pin", "Argument[0]", "ReturnValue.Reference", "value", "manual"] - - ["::new", "Argument[0]", "ReturnValue.Reference", "value", "manual"] - - ["::into_pin", "Argument[0]", "ReturnValue", "value", "manual"] + - ["::deref", "Argument[self].Reference.Field[alloc::boxed::Box(0)]", "ReturnValue.Reference", "value", "manual"] + - ["::pin", "Argument[0]", "ReturnValue.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]", "value", "manual"] + - ["::new", "Argument[0]", "ReturnValue.Field[alloc::boxed::Box(0)]", "value", "manual"] + - ["::into_pin", "Argument[0]", "ReturnValue.Field[core::pin::Pin::pointer]", "value", "manual"] # Fmt - ["alloc::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"] # Layout - ["::from_size_align", "Argument[0]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::from_size_align_unchecked", "Argument[0]", "ReturnValue", "taint", "manual"] - ["::array", "Argument[0]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::repeat", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)].Field[0]", "taint", "manual"] + - ["::repeat", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)].Field[0]", "taint", "manual"] - ["::repeat", "Argument[0]", "ReturnValue.Field[core::result::Result::Ok(0)].Field[0]", "taint", "manual"] - - ["::repeat_packed", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::repeat_packed", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::repeat_packed", "Argument[0]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::extend", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)].Field[0]", "taint", "manual"] + - ["::extend", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)].Field[0]", "taint", "manual"] - ["::extend", "Argument[0]", "ReturnValue.Field[core::result::Result::Ok(0)].Field[0]", "taint", "manual"] - - ["::extend_packed", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::extend_packed", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::extend_packed", "Argument[0]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::align_to", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::align_to", "Argument[self].Element", "ReturnValue.Field[0,1,2].Reference.Element", "taint", "manual"] - - ["::pad_to_align", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["::size", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::align_to", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::align_to", "Argument[self].Reference.Element", "ReturnValue.Field[0,1,2].Reference.Element", "taint", "manual"] + - ["::pad_to_align", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::size", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # String - ["::as_str", "Argument[self]", "ReturnValue", "value", "manual"] - ["::as_bytes", "Argument[self]", "ReturnValue", "value", "manual"] - - ["<_ as alloc::string::ToString>::to_string", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as alloc::string::ToString>::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Vec - ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index 46eea8f9c4e..afcc3c42c8d 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -3,10 +3,76 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - # Arithmetic + # Builtin deref + - ["<& as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] + - ["<&mut as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] + # Index + - ["<_ as core::ops::index::Index>::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + - ["<_ as core::ops::index::IndexMut>::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + # Unary operators + - ["<_ as core::ops::arith::Neg>::neg", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::Not>::not", "Argument[self]", "ReturnValue", "taint", "manual"] + # Arithmetic operators - ["<_ as core::ops::arith::Add>::add", "Argument[self]", "ReturnValue", "taint", "manual"] - ["<_ as core::ops::arith::Add>::add", "Argument[0]", "ReturnValue", "taint", "manual"] - ["<_ as core::ops::arith::Add>::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Sub>::sub", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Sub>::sub", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Sub>::sub", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Mul>::mul", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Mul>::mul", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Mul>::mul", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Div>::div", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Div>::div", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Div>::div", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Rem>::rem", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Rem>::rem", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::arith::Rem>::rem", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + # Arithmetic assignment expressions + - ["<_ as core::ops::arith::AddAssign>::add_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::AddAssign>::add_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::AddAssign>::add_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::SubAssign>::sub_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::SubAssign>::sub_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::SubAssign>::sub_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::MulAssign>::mul_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::MulAssign>::mul_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::MulAssign>::mul_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::DivAssign>::div_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::DivAssign>::div_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::DivAssign>::div_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::RemAssign>::rem_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::RemAssign>::rem_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::arith::RemAssign>::rem_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + # Bitwise operators + - ["<_ as core::ops::bit::BitAnd>::bitand", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitAnd>::bitand", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitAnd>::bitand", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitOr>::bitor", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitOr>::bitor", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitOr>::bitor", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitXor>::bitxor", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitXor>::bitxor", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::BitXor>::bitxor", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + # Bitwise assignment operators + - ["<_ as core::ops::bit::BitAndAssign>::bitand_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::BitAndAssign>::bitand_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::BitOrAssign>::bitor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::BitOrAssign>::bitor_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::BitXorAssign>::bitxor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::BitXorAssign>::bitxor_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + # Shift operators + - ["<_ as core::ops::bit::Shl>::shl", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::Shl>::shl", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::Shl>::shl", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::Shr>::shr", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::Shr>::shr", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::ops::bit::Shr>::shr", "Argument[0].Reference", "ReturnValue", "taint", "manual"] + # Shift assignment operators + - ["<_ as core::ops::bit::ShlAssign>::shl_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::ShlAssign>::shl_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::ShrAssign>::shr_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::ops::bit::ShrAssign>::shr_assign", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] # Clone - ["<_ as core::clone::Clone>::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] # Conversions @@ -20,9 +86,8 @@ extensions: - ["::iter_mut", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::into_iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["<_ as core::iter::traits::iterator::Iterator>::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::nth", "Argument[self].Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::next", "Argument[self].Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::next", "Argument[self].Element", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["<_ as core::iter::traits::iterator::Iterator>::nth", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] + - ["<_ as core::iter::traits::iterator::Iterator>::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - ["<_ as core::iter::traits::iterator::Iterator>::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["<_ as core::iter::traits::iterator::Iterator>::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["<_ as core::iter::traits::iterator::Iterator>::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] @@ -30,12 +95,13 @@ extensions: - ["<_ as core::iter::traits::iterator::Iterator>::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - ["<_ as core::iter::traits::iterator::Iterator>::take", "Argument[self]", "ReturnValue", "taint", "manual"] # Pin - - ["core::pin::Pin", "Argument[0]", "ReturnValue", "value", "manual"] - - ["::new", "Argument[0]", "ReturnValue", "value", "manual"] - - ["::new_unchecked", "Argument[0].Reference", "ReturnValue", "value", "manual"] - - ["::into_inner", "Argument[0]", "ReturnValue", "value", "manual"] - - ["::into_inner_unchecked", "Argument[0]", "ReturnValue", "value", "manual"] - - ["::set", "Argument[0]", "Argument[self]", "value", "manual"] + - ["::new", "Argument[0]", "ReturnValue.Field[core::pin::Pin::pointer]", "value", "manual"] + # This model is not precise, but helps in cases where a `Pin` is implicitly dereferenced. + - ["::new", "Argument[0].Reference", "ReturnValue", "value", "manual"] + - ["::new_unchecked", "Argument[0]", "ReturnValue.Field[core::pin::Pin::pointer]", "value", "manual"] + - ["::into_inner", "Argument[0].Field[core::pin::Pin::pointer]", "ReturnValue", "value", "manual"] + - ["::into_inner_unchecked", "Argument[0].Field[core::pin::Pin::pointer]", "ReturnValue", "value", "manual"] + - ["::set", "Argument[0]", "Argument[self].Reference.Field[core::pin::Pin::pointer]", "value", "manual"] # Ptr - ["core::ptr::read", "Argument[0].Reference", "ReturnValue", "value", "manual"] - ["core::ptr::read_unaligned", "Argument[0].Reference", "ReturnValue", "value", "manual"] @@ -43,12 +109,19 @@ extensions: - ["core::ptr::write", "Argument[1]", "Argument[0].Reference", "value", "manual"] - ["core::ptr::write_unaligned", "Argument[1]", "Argument[0].Reference", "value", "manual"] - ["core::ptr::write_volatile", "Argument[1]", "Argument[0].Reference", "value", "manual"] + # https://doc.rust-lang.org/std/pin/struct.Pin.html#impl-Deref-for-Pin%3CPtr%3E, but limited to `Ptr = &` and `Ptr = Box` + - ["::deref", "Argument[self].Reference.Field[core::pin::Pin::pointer].Reference", "ReturnValue.Reference", "value", "manual"] + - ["::deref", "Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]", "ReturnValue.Reference", "value", "manual"] # Str - ["::as_str", "Argument[self]", "ReturnValue", "value", "manual"] - ["::as_bytes", "Argument[self]", "ReturnValue", "value", "manual"] - ["::parse", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::trim", "Argument[self]", "ReturnValue.Reference", "taint", "manual"] - ["::to_string", "Argument[self]", "ReturnValue", "taint", "manual"] + # Ord + - ["<_ as core::cmp::Ord>::min", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["<_ as core::cmp::Ord>::max", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["<_ as core::cmp::Ord>::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel @@ -60,6 +133,7 @@ extensions: - ["core::ptr::dangling", "ReturnValue", "pointer-invalidate", "manual"] - ["core::ptr::dangling_mut", "ReturnValue", "pointer-invalidate", "manual"] - ["core::ptr::null", "ReturnValue", "pointer-invalidate", "manual"] + - ["core::ptr::null_mut", "ReturnValue", "pointer-invalidate", "manual"] - ["v8::primitives::null", "ReturnValue", "pointer-invalidate", "manual"] - addsTo: pack: codeql/rust-all @@ -73,3 +147,9 @@ extensions: - ["core::ptr::write_bytes", "Argument[0]", "pointer-access", "manual"] - ["core::ptr::write_unaligned", "Argument[0]", "pointer-access", "manual"] - ["core::ptr::write_volatile", "Argument[0]", "pointer-access", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: excludeFieldTaintStep + data: + - ["core::ops::range::RangeInclusive::start"] + - ["core::ops::range::RangeInclusive::end"] \ No newline at end of file diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml index 79b0b16f41e..8be4fdc05bf 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml @@ -3,14 +3,27 @@ extensions: pack: codeql/rust-all extensible: sourceModel data: + - ["std::fs::exists", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] - ["std::fs::read", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["std::fs::read_dir", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] - ["std::fs::read_to_string", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] - ["std::fs::read_link", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["std::fs::metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["std::fs::symlink_metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] - ["::path", "ReturnValue", "file", "manual"] - ["::file_name", "ReturnValue", "file", "manual"] - ["::open", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] - ["::open_buffered", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] - ["::open", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["::exists", "ReturnValue", "file", "manual"] + - ["::try_exists", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["::is_file", "ReturnValue", "file", "manual"] + - ["::is_dir", "ReturnValue", "file", "manual"] + - ["::is_symlink", "ReturnValue", "file", "manual"] + - ["::metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["::symlink_metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["::read_dir", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] + - ["::read_link", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"] - addsTo: pack: codeql/rust-all extensible: sinkModel @@ -45,7 +58,7 @@ extensions: data: - ["std::fs::canonicalize", "Argument[0].OptionalStep[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["std::fs::canonicalize", "Argument[0].OptionalBarrier[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::as_path", "Argument[Self]", "ReturnValue.Reference", "value", "manual"] + - ["::as_path", "Argument[self].Reference", "ReturnValue.Reference", "value", "manual"] - ["::as_mut_os_string", "Argument[Self].Reference", "ReturnValue.Reference", "value", "manual"] - ["::into_os_string", "Argument[Self]", "ReturnValue", "value", "manual"] - ["::into_boxed_path", "Argument[Self]", "ReturnValue.Reference", "value", "manual"] @@ -68,3 +81,12 @@ extensions: - ["::with_extension", "Argument[Self].Reference", "ReturnValue", "taint", "manual"] - ["::with_file_name", "Argument[Self].Reference", "ReturnValue", "taint", "manual"] - ["::with_file_name", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["::accessed", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::created", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::file_type", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::is_file", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::is_dir", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::is_symlink", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::len", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::modified", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::permissions", "Argument[self].Reference", "ReturnValue", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml index b09ba8f297a..064c2cd19cf 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml @@ -9,18 +9,19 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::BufRead>::fill_buf", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::buffer", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::Read>::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::Read>::read_to_string", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::Read>::read_to_end", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::Read>::read_exact", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::BufRead>::read_line", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::BufRead>::read_until", "Argument[self]", "Argument[1].Reference", "taint", "manual"] + - ["<_ as std::io::BufRead>::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] + - ["<_ as std::io::Read>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as std::io::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as std::io::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as std::io::Read>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as std::io::BufRead>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as std::io::BufRead>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - ["<_ as std::io::BufRead>::split", "Argument[self]", "ReturnValue", "taint", "manual"] - ["<_ as std::io::BufRead>::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - ["<_ as std::io::Read>::bytes", "Argument[self]", "ReturnValue", "taint", "manual"] - ["<_ as std::io::Read>::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - ["<_ as std::io::Read>::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - ["<_ as std::io::Read>::take", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["::lock", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::lock", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml index 17b0451793d..b5dafedb8b3 100644 --- a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml @@ -9,40 +9,40 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::buffer", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until", "Argument[self]", "Argument[1].Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["::next_segment", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] + - ["::next_segment", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["::next_line", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u16", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u16_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u32", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u32_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u64", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u64_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u128", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u128_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i8", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i8_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i32", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i32_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i128", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i128_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>:::read_f32_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f64", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f64_le", "Argument[self]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::next_line", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>:::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/tokio/net.model.yml b/rust/ql/lib/codeql/rust/frameworks/tokio/net.model.yml index 0501969b71f..7008b6f6489 100644 --- a/rust/ql/lib/codeql/rust/frameworks/tokio/net.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/tokio/net.model.yml @@ -8,7 +8,6 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - - ["::peek", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["::try_read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["::try_read_buf", "Argument[self]", "Argument[0].Reference", "taint", "manual"] + - ["::peek", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::try_read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::try_read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml index 5071b4dea86..18757da5710 100644 --- a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml @@ -5,4 +5,9 @@ extensions: data: - ["<_ as warp::filter::Filter>::then", "Argument[0].Parameter[0..7]", "remote", "manual"] - ["<_ as warp::filter::Filter>::map", "Argument[0].Parameter[0..7]", "remote", "manual"] - - ["<_ as warp::filter::Filter>::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] \ No newline at end of file + - ["<_ as warp::filter::Filter>::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["warp::reply::html", "Argument[0]", "html-injection", "manual"] \ No newline at end of file diff --git a/rust/ql/lib/codeql/rust/internal/CachedStages.qll b/rust/ql/lib/codeql/rust/internal/CachedStages.qll index 132b9ec8f7e..dc80fc09dad 100644 --- a/rust/ql/lib/codeql/rust/internal/CachedStages.qll +++ b/rust/ql/lib/codeql/rust/internal/CachedStages.qll @@ -115,13 +115,11 @@ module Stages { predicate backref() { 1 = 1 or - exists(resolvePath(_)) + exists(resolvePathIgnoreVariableShadowing(_)) or exists(any(ItemNode i).getASuccessor(_, _, _)) or exists(any(ImplOrTraitItemNode i).getASelfPath()) - or - any(TypeParamItemNode i).hasTraitBound() } } diff --git a/rust/ql/lib/codeql/rust/internal/Definitions.qll b/rust/ql/lib/codeql/rust/internal/Definitions.qll index b1b3e475c46..aedcc3fc69c 100644 --- a/rust/ql/lib/codeql/rust/internal/Definitions.qll +++ b/rust/ql/lib/codeql/rust/internal/Definitions.qll @@ -37,6 +37,9 @@ private module Cached { TFormatArgsArgIndex(Expr e) { e = any(FormatArgsArg a).getExpr() } or TItemNode(ItemNode i) + pragma[nomagic] + private predicate isMacroCallLocation(Location loc) { loc = any(MacroCall m).getLocation() } + /** * Gets an element, of kind `kind`, that element `use` uses, if any. */ @@ -44,7 +47,7 @@ private module Cached { Definition definitionOf(Use use, string kind) { result = use.getDefinition() and kind = use.getUseType() and - not result.getLocation() = any(MacroCall m).getLocation() + not isMacroCallLocation(result.getLocation()) } } @@ -144,7 +147,7 @@ private class PathUse extends Use instanceof NameRef { override Definition getDefinition() { // Our call resolution logic may disambiguate some calls, so only use those - result.asItemNode() = this.getCall().getStaticTarget() + result.asItemNode() = this.getCall().getResolvedTarget() or not exists(this.getCall()) and result.asItemNode() = resolvePath(path) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 2bf316f78bc..e62f11b8e83 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1,9 +1,49 @@ /** * Provides functionality for resolving paths, using the predicate `resolvePath`. + * + * Path resolution needs to happen before variable resolution, because otherwise + * we cannot know whether an identifier pattern binds a new variable or whether it + * refers to a constructor or constant: + * + * ```rust + * let x = ...; // `x` is only a variable if it does not resolve to a constructor/constant + * ``` + * + * Even though variable names typically start with a lowercase letter and constructors + * with an uppercase letter, this is not enforced by the Rust language. + * + * Variables may shadow declarations, so variable resolution also needs to affect + * path resolution: + * + * ```rust + * fn foo() {} // (1) + * + * fn bar() { + * let f = foo; // `foo` here refers to (1) via path resolution + * let foo = f(); // (2) + * foo // `foo` here refers to (2) via variable resolution + * } + * ``` + * + * So it may seem that path resolution and variable resolution must happen in mutual + * recursion, but we would like to keep the inherently global path resolution logic + * separate from the inherently local variable resolution logic. We achieve this by + * + * - First computing global path resolution, where variable shadowing is ignored, + * exposed as the internal predicate `resolvePathIgnoreVariableShadowing`. + * - `resolvePathIgnoreVariableShadowing` is sufficient to determine whether an + * identifier pattern resolves to a constructor/constant, since if it does, it cannot + * be shadowed by a variable. We expose this as the predicate `identPatIsResolvable`. + * - Variable resolution can then be computed as a local property, using only the + * global information from `identPatIsResolvable`. + * - Finally, path resolution can be computed by restricting + * `resolvePathIgnoreVariableShadowing` to paths that are not resolvable via + * variable resolution. */ private import rust private import codeql.rust.elements.internal.generated.ParentChild +private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl private import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl private import codeql.rust.internal.CachedStages private import codeql.rust.frameworks.stdlib.Builtins as Builtins @@ -184,7 +224,7 @@ abstract class ItemNode extends Locatable { pragma[nomagic] final Attr getAttr(string name) { result = this.getAnAttr() and - result.getMeta().getPath().(RelevantPath).isUnqualified(name) + result.getMeta().getPath().(PathExt).isUnqualified(name) } final predicate hasAttr(string name) { exists(this.getAttr(name)) } @@ -224,6 +264,9 @@ abstract class ItemNode extends Locatable { pragma[nomagic] ItemNode getImmediateParent() { this = result.getADescendant() } + /** Gets a child item of this item, if any. */ + ItemNode getAChild() { this = result.getImmediateParent() } + /** Gets the immediately enclosing module (or source file) of this item. */ pragma[nomagic] ModuleLikeNode getImmediateParentModule() { @@ -259,8 +302,7 @@ abstract class ItemNode extends Locatable { kind.isInternal() and useOpt.isNone() or - externCrateEdge(this, name, result) and - kind.isInternal() and + externCrateEdge(this, name, kind, result) and useOpt.isNone() or macroExportEdge(this, name, result) and @@ -276,7 +318,7 @@ abstract class ItemNode extends Locatable { result = use_.getASuccessor(name, kind, _) ) or - exists(ExternCrateItemNode ec | result = ec.(ItemNode).getASuccessor(name, kind, useOpt) | + exists(ExternCrateItemNode ec | result = ec.getASuccessor(name, kind, useOpt) | ec = this.getASuccessor(_, _, _) or // if the extern crate appears in the crate root, then the crate name is also added @@ -300,10 +342,13 @@ abstract class ItemNode extends Locatable { typeImplEdge(this, _, name, kind, result, useOpt) or // trait items with default implementations made available in an implementation - exists(ImplItemNodeImpl impl, ItemNode trait | + exists(ImplItemNodeImpl impl, TraitItemNode trait | this = impl and trait = impl.resolveTraitTyCand() and result = trait.getASuccessor(name, kind, useOpt) and + // do not inherit default implementations from super traits; those are inherited by + // their `impl` blocks + result = trait.getAssocItem(name) and result.(AssocItemNode).hasImplementation() and kind.isExternalOrBoth() and not impl.hasAssocItem(name) @@ -363,8 +408,14 @@ abstract class ItemNode extends Locatable { this instanceof SourceFile and builtin(name, result) or - name = "Self" and - this = result.(ImplOrTraitItemNode).getAnItemInSelfScope() + exists(ImplOrTraitItemNode i | + name = "Self" and + this = i.getAnItemInSelfScope() + | + result = i.(Trait) + or + result = i.(ImplItemNodeImpl).resolveSelfTyCand() + ) or name = "crate" and this = result.(CrateItemNode).getASourceFile() @@ -527,7 +578,7 @@ class ExternCrateItemNode extends ItemNode instanceof ExternCrate { override Namespace getNamespace() { none() } - override Visibility getVisibility() { none() } + override Visibility getVisibility() { result = ExternCrate.super.getVisibility() } override Attr getAnAttr() { result = ExternCrate.super.getAnAttr() } @@ -620,7 +671,7 @@ private class VariantItemNode extends ParameterizableItemNode instanceof Variant override string getName() { result = Variant.super.getName().getText() } override Namespace getNamespace() { - if super.getFieldList() instanceof StructFieldList then result.isType() else result.isValue() + if super.isStruct() then result.isType() else result.isValue() } override TypeParam getTypeParam(int i) { @@ -695,7 +746,7 @@ abstract class ImplOrTraitItemNode extends ItemNode { Path getASelfPath() { Stages::PathResolutionStage::ref() and isUnqualifiedSelfPath(result) and - this = unqualifiedPathLookup(result, _, _) + result = this.getAnItemInSelfScope().getADescendant() } /** Gets an associated item belonging to this trait or `impl` block. */ @@ -713,12 +764,41 @@ abstract class ImplOrTraitItemNode extends ItemNode { predicate hasAssocItem(string name) { name = this.getAnAssocItem().getName() } } +private TypeItemNode resolveBuiltin(TypeRepr tr) { + tr instanceof SliceTypeRepr and + result instanceof Builtins::SliceType + or + tr instanceof ArrayTypeRepr and + result instanceof Builtins::ArrayType + or + tr = + any(RefTypeRepr rtr | + if rtr.isMut() + then result instanceof Builtins::RefMutType + else result instanceof Builtins::RefSharedType + ) + or + tr.(PtrTypeRepr).isConst() and + result instanceof Builtins::PtrConstType + or + tr.(PtrTypeRepr).isMut() and + result instanceof Builtins::PtrMutType + or + result.(Builtins::TupleType).getArity() = tr.(TupleTypeRepr).getNumberOfFields() +} + final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { Path getSelfPath() { result = super.getSelfTy().(PathTypeRepr).getPath() } Path getTraitPath() { result = super.getTrait().(PathTypeRepr).getPath() } - TypeItemNode resolveSelfTy() { result = resolvePath(this.getSelfPath()) } + TypeItemNode resolveSelfTyBuiltin() { result = resolveBuiltin(this.(Impl).getSelfTy()) } + + TypeItemNode resolveSelfTy() { + result = resolvePath(this.getSelfPath()) + or + result = this.resolveSelfTyBuiltin() + } TraitItemNode resolveTraitTy() { result = resolvePath(this.getTraitPath()) } @@ -893,9 +973,13 @@ private class ModuleItemNode extends ModuleLikeNode instanceof Module { } private class ImplItemNodeImpl extends ImplItemNode { - TypeItemNode resolveSelfTyCand() { result = resolvePathCand(this.getSelfPath()) } + TypeItemNode resolveSelfTyCand() { + result = resolvePathCand(this.getSelfPath()) + or + result = this.resolveSelfTyBuiltin() + } - TraitItemNode resolveTraitTyCand() { result = resolvePathCand(this.getTraitPath()) } + TraitItemNodeImpl resolveTraitTyCand() { result = resolvePathCand(this.getTraitPath()) } } private class StructItemNode extends TypeItemNode, ParameterizableItemNode instanceof Struct { @@ -904,7 +988,7 @@ private class StructItemNode extends TypeItemNode, ParameterizableItemNode insta override Namespace getNamespace() { result.isType() // the struct itself or - not super.getFieldList() instanceof StructFieldList and + not super.isStruct() and result.isValue() // the constructor } @@ -933,7 +1017,16 @@ private class StructItemNode extends TypeItemNode, ParameterizableItemNode insta language[monotonicAggregates] override string getCanonicalPath(Crate c) { this.hasCanonicalPath(c) and - result = strictconcat(int i | i in [0 .. 2] | this.getCanonicalPathPart(c, i) order by i) + ( + this = + any(Builtins::BuiltinType t | + not t.hasVisibility() and + result = t.getDisplayName() + ) + or + not this = any(Builtins::BuiltinType t | not t.hasVisibility()) and + result = strictconcat(int i | i in [0 .. 2] | this.getCanonicalPathPart(c, i) order by i) + ) } } @@ -1134,34 +1227,6 @@ final class TypeParamItemNode extends TypeItemNode instanceof TypeParam { ItemNode resolveABound() { result = resolvePath(this.getABoundPath()) } - /** - * Holds if this type parameter has a trait bound. Examples: - * - * ```rust - * impl Foo { ... } // has no trait bound - * - * impl Foo { ... } // has trait bound - * - * impl Foo where T: Trait { ... } // has trait bound - * ``` - */ - cached - predicate hasTraitBound() { Stages::PathResolutionStage::ref() and exists(this.getABoundPath()) } - - /** - * Holds if this type parameter has no trait bound. Examples: - * - * ```rust - * impl Foo { ... } // has no trait bound - * - * impl Foo { ... } // has trait bound - * - * impl Foo where T: Trait { ... } // has trait bound - * ``` - */ - pragma[nomagic] - predicate hasNoTraitBound() { not this.hasTraitBound() } - override string getName() { result = TypeParam.super.getName().getText() } override Namespace getNamespace() { result.isType() } @@ -1436,6 +1501,24 @@ private predicate crateDependencyEdge(SourceFileItemNode file, string name, Crat not hasDeclOrDep(file, name) } +/** + * Gets a `UseTree` that is nested under `tree`, and which needs to be resolved + * relative to the path of `tree`. + * + * `tree` is restricted to either having a path or being a direct child of some + * `use` statement without a path. + */ +private UseTree getAUseTreeUseTree(UseTree tree) { + result = tree.getUseTreeList().getAUseTree() and + (if tree.hasPath() then any() else tree = any(Use u).getUseTree()) + or + exists(UseTree mid | + mid = getAUseTreeUseTree(tree) and + not mid.hasPath() and + result = mid.getUseTreeList().getAUseTree() + ) +} + private predicate useTreeDeclares(UseTree tree, string name) { not tree.isGlob() and not exists(tree.getUseTreeList()) and @@ -1449,7 +1532,7 @@ private predicate useTreeDeclares(UseTree tree, string name) { or exists(UseTree mid | useTreeDeclares(mid, name) and - mid = tree.getUseTreeList().getAUseTree() + mid = getAUseTreeUseTree(tree) ) } @@ -1482,17 +1565,22 @@ private predicate declares(ItemNode item, Namespace ns, string name) { ) } -/** A path that does not access a local variable. */ -class RelevantPath extends Path { - RelevantPath() { not this = any(VariableAccess va).(PathExpr).getPath() } +/** + * A `Path` or an `IdentPat`. + * + * `IdentPat`s are included in order to resolve unqualified references to + * constructors in patterns. + */ +abstract class PathExt extends AstNode { + abstract string getText(); /** Holds if this is an unqualified path with the textual value `name`. */ pragma[nomagic] - predicate isUnqualified(string name) { - not exists(this.getQualifier()) and - not this = any(UseTreeList list).getAUseTree().getPath().getQualifier*() and - name = this.getText() - } + abstract predicate isUnqualified(string name); + + abstract Path getQualifier(); + + abstract string toStringDebug(); /** * Holds if this is an unqualified path with the textual value `name` and @@ -1514,6 +1602,33 @@ class RelevantPath extends Path { predicate isDollarCrate() { this.isUnqualified("$crate", _) } } +private class PathExtPath extends PathExt instanceof Path { + override string getText() { result = Path.super.getText() } + + override predicate isUnqualified(string name) { + not exists(Path.super.getQualifier()) and + not exists(UseTree tree | + tree.hasPath() and + this = getAUseTreeUseTree(tree).getPath().getQualifier*() + ) and + name = Path.super.getText() + } + + override Path getQualifier() { result = Path.super.getQualifier() } + + override string toStringDebug() { result = Path.super.toStringDebug() } +} + +private class PathExtIdentPat extends PathExt, IdentPat { + override string getText() { result = this.getName().getText() } + + override predicate isUnqualified(string name) { name = this.getText() } + + override Path getQualifier() { none() } + + override string toStringDebug() { result = this.getText() } +} + private predicate isModule(ItemNode m) { m instanceof Module } /** Holds if source file `source` contains the module `m`. */ @@ -1537,7 +1652,7 @@ private ItemNode getOuterScope(ItemNode i) { pragma[nomagic] private predicate unqualifiedPathLookup(ItemNode ancestor, string name, Namespace ns, ItemNode encl) { // lookup in the immediately enclosing item - exists(RelevantPath path | + exists(PathExt path | path.isUnqualified(name, encl) and ancestor = encl and not name = ["crate", "$crate", "super", "self"] @@ -1573,7 +1688,7 @@ private ItemNode getASuccessor( private predicate isSourceFile(ItemNode source) { source instanceof SourceFileItemNode } -private predicate hasCratePath(ItemNode i) { any(RelevantPath path).isCratePath(_, i) } +private predicate hasCratePath(ItemNode i) { any(PathExt path).isCratePath(_, i) } private predicate hasChild(ItemNode parent, ItemNode child) { child.getImmediateParent() = parent } @@ -1585,7 +1700,7 @@ private predicate sourceFileHasCratePathTc(ItemNode i1, ItemNode i2) = * `name` may be looked up inside `ancestor`. */ pragma[nomagic] -private predicate keywordLookup(ItemNode ancestor, string name, RelevantPath p) { +private predicate keywordLookup(ItemNode ancestor, string name, PathExt p) { // For `crate`, jump directly to the root module exists(ItemNode i | p.isCratePath(name, i) | ancestor instanceof SourceFile and @@ -1599,7 +1714,7 @@ private predicate keywordLookup(ItemNode ancestor, string name, RelevantPath p) } pragma[nomagic] -private ItemNode unqualifiedPathLookup(RelevantPath p, Namespace ns, SuccessorKind kind) { +private ItemNode unqualifiedPathLookup(PathExt p, Namespace ns, SuccessorKind kind) { exists(ItemNode ancestor, string name | result = getASuccessor(ancestor, pragma[only_bind_into](name), ns, kind, _) and kind.isInternalOrBoth() @@ -1614,7 +1729,7 @@ private ItemNode unqualifiedPathLookup(RelevantPath p, Namespace ns, SuccessorKi } pragma[nomagic] -private predicate isUnqualifiedSelfPath(RelevantPath path) { path.isUnqualified("Self") } +private predicate isUnqualifiedSelfPath(PathExt path) { path.isUnqualified("Self") } /** Provides the input to `TraitIsVisible`. */ signature predicate relevantTraitVisibleSig(Element element, Trait trait); @@ -1685,9 +1800,9 @@ private module DollarCrateResolution { macroDefPath = mc.getPath() ) or - exists(ItemNode adt | - expansion = adt.(Adt).getDeriveMacroExpansion(_) and - macroDefPath = adt.getAttr("derive").getMeta().getPath() + exists(ItemNode type | + expansion = type.(TypeItem).getDeriveMacroExpansion(_) and + macroDefPath = type.getAttr("derive").getMeta().getPath() ) } @@ -1697,14 +1812,14 @@ private module DollarCrateResolution { isDollarCrateSupportedMacroExpansion(_, expansion) } - private predicate isDollarCratePath(RelevantPath p) { p.isDollarCrate() } + private predicate isDollarCratePath(PathExt p) { p.isDollarCrate() } - private predicate isInDollarCrateMacroExpansion(RelevantPath p, AstNode expansion) = + private predicate isInDollarCrateMacroExpansion(PathExt p, AstNode expansion) = doublyBoundedFastTC(hasParent/2, isDollarCratePath/1, isDollarCrateSupportedMacroExpansion/1)(p, expansion) pragma[nomagic] - private predicate isInDollarCrateMacroExpansionFromFile(File macroDefFile, RelevantPath p) { + private predicate isInDollarCrateMacroExpansionFromFile(File macroDefFile, PathExt p) { exists(Path macroDefPath, AstNode expansion | isDollarCrateSupportedMacroExpansion(macroDefPath, expansion) and isInDollarCrateMacroExpansion(p, expansion) and @@ -1719,22 +1834,14 @@ private module DollarCrateResolution { * calls. */ pragma[nomagic] - predicate resolveDollarCrate(RelevantPath p, CrateItemNode crate) { + predicate resolveDollarCrate(PathExt p, CrateItemNode crate) { isInDollarCrateMacroExpansionFromFile(crate.getASourceFile().getFile(), p) } } pragma[nomagic] -private ItemNode resolvePathCand0(RelevantPath path, Namespace ns) { - exists(ItemNode res | - res = unqualifiedPathLookup(path, ns, _) and - if - not any(RelevantPath parent).getQualifier() = path and - isUnqualifiedSelfPath(path) and - res instanceof ImplItemNode - then result = res.(ImplItemNodeImpl).resolveSelfTyCand() - else result = res - ) +private ItemNode resolvePathCand0(PathExt path, Namespace ns) { + result = unqualifiedPathLookup(path, ns, _) or DollarCrateResolution::resolveDollarCrate(path, result) and ns = result.getNamespace() @@ -1743,10 +1850,17 @@ private ItemNode resolvePathCand0(RelevantPath path, Namespace ns) { or result = resolveUseTreeListItem(_, _, path, _) and ns = result.getNamespace() + or + exists(PathSegment seg | + seg = path.(Path).getSegment() and + result = resolveBuiltin(seg.getTypeRepr()) and + not seg.hasTraitTypeRepr() and + ns.isType() + ) } pragma[nomagic] -private ItemNode resolvePathCandQualifier(RelevantPath qualifier, RelevantPath path, string name) { +private ItemNode resolvePathCandQualifier(PathExt qualifier, PathExt path, string name) { qualifier = path.getQualifier() and result = resolvePathCand(qualifier) and name = path.getText() @@ -1789,14 +1903,35 @@ private predicate checkQualifiedVisibility( not i instanceof TypeParam } +pragma[nomagic] +private predicate isImplSelfQualifiedPath( + ImplItemNode impl, PathExt qualifier, PathExt path, string name +) { + qualifier = impl.getASelfPath() and + qualifier = path.getQualifier() and + name = path.getText() +} + +private ItemNode resolveImplSelfQualified(PathExt qualifier, PathExt path, Namespace ns) { + exists(ImplItemNode impl, string name | + isImplSelfQualifiedPath(impl, qualifier, path, name) and + result = impl.getAssocItem(name) and + ns = result.getNamespace() + ) +} + /** * Gets the item that `path` resolves to in `ns` when `qualifier` is the * qualifier of `path` and `qualifier` resolves to `q`, if any. */ pragma[nomagic] -private ItemNode resolvePathCandQualified( - RelevantPath qualifier, ItemNode q, RelevantPath path, Namespace ns -) { +private ItemNode resolvePathCandQualified(PathExt qualifier, ItemNode q, PathExt path, Namespace ns) { + // Special case for `Self::Assoc`; this always refers to the associated + // item in the enclosing `impl` block, if available. + q = resolvePathCandQualifier(qualifier, path, _) and + result = resolveImplSelfQualified(qualifier, path, ns) + or + not exists(resolveImplSelfQualified(qualifier, path, ns)) and exists(string name, SuccessorKind kind, UseOption useOpt | q = resolvePathCandQualifier(qualifier, path, name) and result = getASuccessor(q, name, ns, kind, useOpt) and @@ -1805,12 +1940,14 @@ private ItemNode resolvePathCandQualified( } /** Holds if path `p` must be looked up in namespace `n`. */ -private predicate pathUsesNamespace(Path p, Namespace n) { +private predicate pathUsesNamespace(PathExt p, Namespace n) { n.isValue() and ( p = any(PathExpr pe).getPath() or p = any(TupleStructPat tsp).getPath() + or + p instanceof PathExtIdentPat ) or n.isType() and @@ -1886,7 +2023,7 @@ private predicate macroUseEdge( * result in non-monotonic recursion. */ pragma[nomagic] -private ItemNode resolvePathCand(RelevantPath path) { +private ItemNode resolvePathCand(PathExt path) { exists(Namespace ns | result = resolvePathCand0(path, ns) and if path = any(ImplItemNode i).getSelfPath() @@ -1899,7 +2036,13 @@ private ItemNode resolvePathCand(RelevantPath path) { else if path = any(PathTypeRepr p).getPath() then result instanceof TypeItemNode - else any() + else + if path instanceof IdentPat + then + result instanceof VariantItemNode or + result instanceof StructItemNode or + result instanceof ConstItemNode + else any() | pathUsesNamespace(path, ns) or @@ -1910,13 +2053,13 @@ private ItemNode resolvePathCand(RelevantPath path) { or exists(CallExpr ce | path = CallExprImpl::getFunctionPath(ce) and - result.(ParameterizableItemNode).getArity() = ce.getNumberOfArgs() + result.(ParameterizableItemNode).getArity() = ce.getArgList().getNumberOfArgs() ) ) } /** Get a trait that should be visible when `path` resolves to `node`, if any. */ -private Trait getResolvePathTraitUsed(RelevantPath path, AssocItemNode node) { +private Trait getResolvePathTraitUsed(PathExt path, AssocItemNode node) { exists(TypeItemNode type, ImplItemNodeImpl impl | node = resolvePathCandQualified(_, type, path, _) and typeImplEdge(type, impl, _, _, node, _) and @@ -1928,9 +2071,9 @@ private predicate pathTraitUsed(Element path, Trait trait) { trait = getResolvePathTraitUsed(path, _) } -/** Gets the item that `path` resolves to, if any. */ +/** INTERNAL: Do not use; use `resolvePath` instead. */ cached -ItemNode resolvePath(RelevantPath path) { +ItemNode resolvePathIgnoreVariableShadowing(PathExt path) { result = resolvePathCand(path) and not path = any(Path parent | exists(resolvePathCand(parent))).getQualifier() and ( @@ -1943,33 +2086,47 @@ ItemNode resolvePath(RelevantPath path) { or // if `path` is the qualifier of a resolvable `parent`, then we should // resolve `path` to something consistent with what `parent` resolves to - exists(RelevantPath parent | - resolvePathCandQualified(path, result, parent, _) = resolvePath(parent) + exists(PathExt parent | + resolvePathCandQualified(path, result, parent, _) = resolvePathIgnoreVariableShadowing(parent) ) } -private predicate isUseTreeSubPath(UseTree tree, RelevantPath path) { +/** + * Holds if `ip` resolves to some constructor or constant. + */ +// use `forceLocal` once we implement overlay support +pragma[nomagic] +predicate identPatIsResolvable(IdentPat ip) { exists(resolvePathIgnoreVariableShadowing(ip)) } + +/** Gets the item that `path` resolves to, if any. */ +pragma[nomagic] +ItemNode resolvePath(PathExt path) { + result = resolvePathIgnoreVariableShadowing(path) and + not path = any(VariableAccess va).(PathExpr).getPath() +} + +private predicate isUseTreeSubPath(UseTree tree, PathExt path) { path = tree.getPath() or - exists(RelevantPath mid | + exists(PathExt mid | isUseTreeSubPath(tree, mid) and path = mid.getQualifier() ) } pragma[nomagic] -private predicate isUseTreeSubPathUnqualified(UseTree tree, RelevantPath path, string name) { +private predicate isUseTreeSubPathUnqualified(UseTree tree, PathExt path, string name) { isUseTreeSubPath(tree, path) and not exists(path.getQualifier()) and name = path.getText() } pragma[nomagic] -private ItemNode resolveUseTreeListItem(Use use, UseTree tree, RelevantPath path, SuccessorKind kind) { +private ItemNode resolveUseTreeListItem(Use use, UseTree tree, PathExt path, SuccessorKind kind) { exists(UseOption useOpt | checkQualifiedVisibility(use, result, kind, useOpt) | exists(UseTree midTree, ItemNode mid, string name | mid = resolveUseTreeListItem(use, midTree) and - tree = midTree.getUseTreeList().getAUseTree() and + tree = getAUseTreeUseTree(midTree) and isUseTreeSubPathUnqualified(tree, path, pragma[only_bind_into](name)) and result = mid.getASuccessor(pragma[only_bind_into](name), kind, useOpt) ) @@ -1982,21 +2139,33 @@ private ItemNode resolveUseTreeListItem(Use use, UseTree tree, RelevantPath path } pragma[nomagic] -private ItemNode resolveUseTreeListItemQualifier( - Use use, UseTree tree, RelevantPath path, string name -) { +private ItemNode resolveUseTreeListItemQualifier(Use use, UseTree tree, PathExt path, string name) { result = resolveUseTreeListItem(use, tree, path.getQualifier(), _) and name = path.getText() } +private UseTree getAUseUseTree(Use use) { + exists(UseTree root | root = use.getUseTree() | + if root.hasPath() then result = root else result = getAUseTreeUseTree(root) + ) +} + pragma[nomagic] private ItemNode resolveUseTreeListItem(Use use, UseTree tree) { exists(Path path | path = tree.getPath() | - tree = use.getUseTree() and + tree = getAUseUseTree(use) and result = resolvePathCand(path) or result = resolveUseTreeListItem(use, tree, path, _) ) + or + exists(UseTree midTree | + // `use foo::{bar, *}`; midTree = `foo` and tree = `*` + result = resolveUseTreeListItem(use, midTree) and + tree = getAUseTreeUseTree(midTree) and + tree.isGlob() and + not tree.hasPath() + ) } /** Holds if `use` imports `item` as `name`. */ @@ -2042,8 +2211,11 @@ private predicate useImportEdge(Use use, string name, ItemNode item, SuccessorKi /** Holds if `ec` imports `crate` as `name`. */ pragma[nomagic] -private predicate externCrateEdge(ExternCrateItemNode ec, string name, CrateItemNode crate) { +private predicate externCrateEdge( + ExternCrateItemNode ec, string name, SuccessorKind kind, CrateItemNode crate +) { name = ec.getName() and + (if ec.isPublic() then kind.isBoth() else kind.isInternal()) and exists(SourceFile f, string s | ec.getFile() = f.getFile() and s = ec.(ExternCrate).getIdentifier().getText() @@ -2106,7 +2278,8 @@ pragma[nomagic] private predicate builtin(string name, ItemNode i) { exists(BuiltinSourceFile builtins | builtins.getFile().getBaseName() = "types.rs" and - i = builtins.getASuccessor(name) + i = builtins.getASuccessor(name) and + i.isPublic() ) } @@ -2121,7 +2294,7 @@ private module Debug { } predicate debugUnqualifiedPathLookup( - RelevantPath p, string name, Namespace ns, ItemNode ancestor, string path + PathExt p, string name, Namespace ns, ItemNode ancestor, string path ) { p = getRelevantLocatable() and exists(ItemNode encl | @@ -2131,13 +2304,28 @@ private module Debug { path = p.toStringDebug() } + ItemNode debugUnqualifiedPathLookup(PathExt p, Namespace ns, SuccessorKind kind) { + p = getRelevantLocatable() and + result = unqualifiedPathLookup(p, ns, kind) + } + predicate debugItemNode(ItemNode item) { item = getRelevantLocatable() } - ItemNode debugResolvePath(RelevantPath path) { + ItemNode debugResolvePath(PathExt path) { path = getRelevantLocatable() and result = resolvePath(path) } + ItemNode debugResolveUseTreeListItem(Use use, UseTree tree, PathExt path, SuccessorKind kind) { + use = getRelevantLocatable() and + result = resolveUseTreeListItem(use, tree, path, kind) + } + + ItemNode debugResolveUseTreeListItem(Use use, UseTree tree) { + use = getRelevantLocatable() and + result = resolveUseTreeListItem(use, tree) + } + predicate debugUseImportEdge(Use use, string name, ItemNode item, SuccessorKind kind) { use = getRelevantLocatable() and useImportEdge(use, name, item, kind) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll index 1c8ac649df3..807225d1615 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll @@ -24,10 +24,10 @@ query predicate multiplePathResolutions(Path p, ItemNode i) { strictcount(ItemNode i0 | i0 = resolvePath(p) and not i0 instanceof Crate) > 1 } -/** Holds if `call` has multiple static call targets including `target`. */ -query predicate multipleCallTargets(CallExprBase call, Callable target) { - target = call.getStaticTarget() and - strictcount(call.getStaticTarget()) > 1 +/** Holds if `ie` has multiple resolved targets including `target`. */ +query predicate multipleResolvedTargets(InvocationExpr ie, Addressable target) { + target = ie.getResolvedTarget() and + strictcount(ie.getResolvedTarget()) > 1 } /** Holds if `fe` resolves to multiple record fields including `field`. */ @@ -55,8 +55,8 @@ int getPathResolutionInconsistencyCounts(string type) { type = "Multiple path resolutions" and result = count(Path p | multiplePathResolutions(p, _) | p) or - type = "Multiple static call targets" and - result = count(CallExprBase call | multipleCallTargets(call, _) | call) + type = "Multiple resolved targets" and + result = count(InvocationExpr ie | multipleResolvedTargets(ie, _) | ie) or type = "Multiple record fields" and result = count(FieldExpr fe | multipleStructFields(fe, _) | fe) diff --git a/rust/ql/lib/codeql/rust/internal/Type.qll b/rust/ql/lib/codeql/rust/internal/Type.qll index 4ce224ec610..9b409e20f76 100644 --- a/rust/ql/lib/codeql/rust/internal/Type.qll +++ b/rust/ql/lib/codeql/rust/internal/Type.qll @@ -7,6 +7,7 @@ private import codeql.rust.internal.CachedStages private import codeql.rust.elements.internal.generated.Raw private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.frameworks.stdlib.Stdlib +private import codeql.rust.frameworks.stdlib.Builtins as Builtins /** * Holds if a dyn trait type should have a type parameter associated with `n`. A @@ -31,38 +32,19 @@ private predicate dynTraitTypeParameter(Trait trait, AstNode n) { cached newtype TType = - TTuple(int arity) { - arity = - [ - any(TupleTypeRepr t).getNumberOfFields(), - any(TupleExpr e).getNumberOfFields(), - any(TuplePat p).getNumberOfFields() - ] and - Stages::TypeInferenceStage::ref() - } or - TStruct(Struct s) or - TEnum(Enum e) or + TDataType(TypeItem ti) { Stages::TypeInferenceStage::ref() } or TTrait(Trait t) or - TUnion(Union u) or - TArrayType() or // todo: add size? - TRefType() or // todo: add mut? TImplTraitType(ImplTraitTypeRepr impl) or TDynTraitType(Trait t) { t = any(DynTraitTypeRepr dt).getTrait() } or - TSliceType() or TNeverType() or - TPtrType() or - TTupleTypeParameter(int arity, int i) { exists(TTuple(arity)) and i in [0 .. arity - 1] } or + TUnknownType() or TTypeParamTypeParameter(TypeParam t) or TAssociatedTypeTypeParameter(TypeAlias t) { any(TraitItemNode trait).getAnAssocItem() = t } or - TArrayTypeParameter() or TDynTraitTypeParameter(AstNode n) { dynTraitTypeParameter(_, n) } or TImplTraitTypeParameter(ImplTraitTypeRepr implTrait, TypeParam tp) { implTraitTypeParam(implTrait, _, tp) } or - TRefTypeParameter() or - TSelfTypeParameter(Trait t) or - TSliceTypeParameter() or - TPtrTypeParameter() + TSelfTypeParameter(Trait t) private predicate implTraitTypeParam(ImplTraitTypeRepr implTrait, int i, TypeParam tp) { implTrait.isInReturnPos() and @@ -105,69 +87,78 @@ abstract class Type extends TType { } /** A tuple type `(T, ...)`. */ -class TupleType extends Type, TTuple { +class TupleType extends StructType { private int arity; - TupleType() { this = TTuple(arity) } - - override TypeParameter getPositionalTypeParameter(int i) { - result = TTupleTypeParameter(arity, i) - } + TupleType() { arity = this.getTypeItem().(Builtins::TupleType).getArity() } /** Gets the arity of this tuple type. */ int getArity() { result = arity } override string toString() { result = "(T_" + arity + ")" } +} - override Location getLocation() { result instanceof EmptyLocation } +pragma[nomagic] +TypeParamTypeParameter getTupleTypeParameter(int arity, int i) { + result = any(TupleType t | t.getArity() = arity).getPositionalTypeParameter(i) } /** The unit type `()`. */ class UnitType extends TupleType { - UnitType() { this = TTuple(0) } + UnitType() { this.getArity() = 0 } override string toString() { result = "()" } } -/** A struct type. */ -class StructType extends Type, TStruct { - private Struct struct; +class DataType extends Type, TDataType { + private TypeItem typeItem; - StructType() { this = TStruct(struct) } + DataType() { this = TDataType(typeItem) } - /** Gets the struct that this struct type represents. */ - Struct getStruct() { result = struct } + /** Gets the type item that this data type represents. */ + TypeItem getTypeItem() { result = typeItem } override TypeParameter getPositionalTypeParameter(int i) { - result = TTypeParamTypeParameter(struct.getGenericParamList().getTypeParam(i)) + result = TTypeParamTypeParameter(typeItem.getGenericParamList().getTypeParam(i)) } override TypeMention getTypeParameterDefault(int i) { - result = struct.getGenericParamList().getTypeParam(i).getDefaultType() + result = typeItem.getGenericParamList().getTypeParam(i).getDefaultType() } - override string toString() { result = struct.getName().getText() } + override string toString() { result = typeItem.getName().getText() } - override Location getLocation() { result = struct.getLocation() } + override Location getLocation() { result = typeItem.getLocation() } +} + +/** A struct type. */ +class StructType extends DataType { + private Struct struct; + + StructType() { struct = super.getTypeItem() } + + /** Gets the struct that this struct type represents. */ + override Struct getTypeItem() { result = struct } } /** An enum type. */ -class EnumType extends Type, TEnum { +class EnumType extends DataType { private Enum enum; - EnumType() { this = TEnum(enum) } + EnumType() { enum = super.getTypeItem() } - override TypeParameter getPositionalTypeParameter(int i) { - result = TTypeParamTypeParameter(enum.getGenericParamList().getTypeParam(i)) - } + /** Gets the enum that this enum type represents. */ + override Enum getTypeItem() { result = enum } +} - override TypeMention getTypeParameterDefault(int i) { - result = enum.getGenericParamList().getTypeParam(i).getDefaultType() - } +/** A union type. */ +class UnionType extends DataType { + private Union union; - override string toString() { result = enum.getName().getText() } + UnionType() { union = super.getTypeItem() } - override Location getLocation() { result = enum.getLocation() } + /** Gets the union that this union type represents. */ + override Union getTypeItem() { result = union } } /** A trait type. */ @@ -200,64 +191,46 @@ class TraitType extends Type, TTrait { override Location getLocation() { result = trait.getLocation() } } -/** A union type. */ -class UnionType extends Type, TUnion { - private Union union; - - UnionType() { this = TUnion(union) } - - /** Gets the union that this union type represents. */ - Union getUnion() { result = union } - - override TypeParameter getPositionalTypeParameter(int i) { - result = TTypeParamTypeParameter(union.getGenericParamList().getTypeParam(i)) - } - - override TypeMention getTypeParameterDefault(int i) { - result = union.getGenericParamList().getTypeParam(i).getDefaultType() - } - - override string toString() { result = union.getName().getText() } - - override Location getLocation() { result = union.getLocation() } -} - /** * An array type. * - * Array types like `[i64; 5]` are modeled as normal generic types - * with a single type argument. + * Array types like `[i64; 5]` are modeled as normal generic types. */ -class ArrayType extends Type, TArrayType { - ArrayType() { this = TArrayType() } +class ArrayType extends StructType { + ArrayType() { this.getTypeItem() instanceof Builtins::ArrayType } - override TypeParameter getPositionalTypeParameter(int i) { - result = TArrayTypeParameter() and - i = 0 - } - - override string toString() { result = "[]" } - - override Location getLocation() { result instanceof EmptyLocation } + override string toString() { result = "[;]" } } -/** - * A reference type. - * - * Reference types like `& i64` are modeled as normal generic types - * with a single type argument. - */ -class RefType extends Type, TRefType { - RefType() { this = TRefType() } +pragma[nomagic] +TypeParamTypeParameter getArrayTypeParameter() { + result = any(ArrayType t).getPositionalTypeParameter(0) +} - override TypeParameter getPositionalTypeParameter(int i) { - result = TRefTypeParameter() and - i = 0 - } +abstract class RefType extends StructType { } + +class RefMutType extends RefType { + RefMutType() { this.getTypeItem() instanceof Builtins::RefMutType } + + override string toString() { result = "&mut" } +} + +class RefSharedType extends RefType { + RefSharedType() { this.getTypeItem() instanceof Builtins::RefSharedType } override string toString() { result = "&" } +} - override Location getLocation() { result instanceof EmptyLocation } +pragma[nomagic] +RefType getRefType(boolean isMutable) { + isMutable = true and result instanceof RefMutType + or + isMutable = false and result instanceof RefSharedType +} + +pragma[nomagic] +TypeParamTypeParameter getRefTypeParameter(boolean isMutable) { + result = getRefType(isMutable).getPositionalTypeParameter(0) } /** @@ -339,17 +312,15 @@ class ImplTraitReturnType extends ImplTraitType { * Slice types like `[i64]` are modeled as normal generic types * with a single type argument. */ -class SliceType extends Type, TSliceType { - SliceType() { this = TSliceType() } - - override TypeParameter getPositionalTypeParameter(int i) { - result = TSliceTypeParameter() and - i = 0 - } +class SliceType extends StructType { + SliceType() { this.getTypeItem() instanceof Builtins::SliceType } override string toString() { result = "[]" } +} - override Location getLocation() { result instanceof EmptyLocation } +pragma[nomagic] +TypeParamTypeParameter getSliceTypeParameter() { + result = any(SliceType t).getPositionalTypeParameter(0) } class NeverType extends Type, TNeverType { @@ -360,13 +331,51 @@ class NeverType extends Type, TNeverType { override Location getLocation() { result instanceof EmptyLocation } } -class PtrType extends Type, TPtrType { - override TypeParameter getPositionalTypeParameter(int i) { - i = 0 and - result = TPtrTypeParameter() - } +abstract class PtrType extends StructType { } - override string toString() { result = "*" } +pragma[nomagic] +TypeParamTypeParameter getPtrTypeParameter() { + result = any(PtrType t).getPositionalTypeParameter(0) +} + +class PtrMutType extends PtrType { + PtrMutType() { this.getTypeItem() instanceof Builtins::PtrMutType } + + override string toString() { result = "*mut" } +} + +class PtrConstType extends PtrType { + PtrConstType() { this.getTypeItem() instanceof Builtins::PtrConstType } + + override string toString() { result = "*const" } +} + +/** + * A special pseudo type used to indicate that the actual type may have to be + * inferred by propagating type information back into call arguments. + * + * For example, in + * + * ```rust + * let x = Default::default(); + * foo(x); + * ``` + * + * `Default::default()` is assigned this type, which allows us to infer the actual + * type from the type of `foo`'s first parameter. + * + * Unknown types are not restricted to root types, for example in a call like + * `Vec::new()` we assign this type at the type path corresponding to the type + * parameter of `Vec`. + * + * Unknown types are used to restrict when type information is allowed to flow + * into call arguments (including method call receivers), in order to avoid + * combinatorial explosions. + */ +class UnknownType extends Type, TUnknownType { + override TypeParameter getPositionalTypeParameter(int i) { none() } + + override string toString() { result = "(context typed)" } override Location getLocation() { result instanceof EmptyLocation } } @@ -374,6 +383,8 @@ class PtrType extends Type, TPtrType { /** A type parameter. */ abstract class TypeParameter extends Type { override TypeParameter getPositionalTypeParameter(int i) { none() } + + abstract ItemNode getDeclaringItem(); } private class RawTypeParameter = @type_param or @trait or @type_alias or @impl_trait_type_repr; @@ -392,6 +403,8 @@ class TypeParamTypeParameter extends TypeParameter, TTypeParamTypeParameter { TypeParam getTypeParam() { result = typeParam } + override ItemNode getDeclaringItem() { result.getTypeParam(_) = typeParam } + override string toString() { result = typeParam.toString() } override Location getLocation() { result = typeParam.getLocation() } @@ -425,42 +438,13 @@ class AssociatedTypeTypeParameter extends TypeParameter, TAssociatedTypeTypePara /** Gets the trait that contains this associated type declaration. */ TraitItemNode getTrait() { result.getAnAssocItem() = typeAlias } + override ItemNode getDeclaringItem() { result = this.getTrait() } + override string toString() { result = typeAlias.getName().getText() } override Location getLocation() { result = typeAlias.getLocation() } } -/** - * A tuple type parameter. For instance the `T` in `(T, U)`. - * - * Since tuples are structural their type parameters can be represented as their - * positional index. The type inference library requires that type parameters - * belong to a single type, so we also include the arity of the tuple type. - */ -class TupleTypeParameter extends TypeParameter, TTupleTypeParameter { - private int arity; - private int index; - - TupleTypeParameter() { this = TTupleTypeParameter(arity, index) } - - override string toString() { result = index.toString() + "(" + arity + ")" } - - override Location getLocation() { result instanceof EmptyLocation } - - /** Gets the index of this tuple type parameter. */ - int getIndex() { result = index } - - /** Gets the tuple type that corresponds to this tuple type parameter. */ - TupleType getTupleType() { result = TTuple(arity) } -} - -/** An implicit array type parameter. */ -class ArrayTypeParameter extends TypeParameter, TArrayTypeParameter { - override string toString() { result = "[T;...]" } - - override Location getLocation() { result instanceof EmptyLocation } -} - class DynTraitTypeParameter extends TypeParameter, TDynTraitTypeParameter { private AstNode n; @@ -488,6 +472,8 @@ class DynTraitTypeParameter extends TypeParameter, TDynTraitTypeParameter { result = [this.getTypeParam().toString(), this.getTypeAlias().getName().toString()] } + override ItemNode getDeclaringItem() { none() } + override string toString() { result = "dyn(" + this.toStringInner() + ")" } override Location getLocation() { result = n.getLocation() } @@ -503,31 +489,13 @@ class ImplTraitTypeParameter extends TypeParameter, TImplTraitTypeParameter { ImplTraitTypeRepr getImplTraitTypeRepr() { result = implTrait } + override ItemNode getDeclaringItem() { none() } + override string toString() { result = "impl(" + typeParam.toString() + ")" } override Location getLocation() { result = typeParam.getLocation() } } -/** An implicit reference type parameter. */ -class RefTypeParameter extends TypeParameter, TRefTypeParameter { - override string toString() { result = "&T" } - - override Location getLocation() { result instanceof EmptyLocation } -} - -/** An implicit slice type parameter. */ -class SliceTypeParameter extends TypeParameter, TSliceTypeParameter { - override string toString() { result = "[T]" } - - override Location getLocation() { result instanceof EmptyLocation } -} - -class PtrTypeParameter extends TypeParameter, TPtrTypeParameter { - override string toString() { result = "*T" } - - override Location getLocation() { result instanceof EmptyLocation } -} - /** * The implicit `Self` type parameter of a trait, that refers to the * implementing type of the trait. @@ -542,6 +510,8 @@ class SelfTypeParameter extends TypeParameter, TSelfTypeParameter { Trait getTrait() { result = trait } + override ItemNode getDeclaringItem() { result = trait } + override string toString() { result = "Self [" + trait.toString() + "]" } override Location getLocation() { result = trait.getLocation() } @@ -569,6 +539,8 @@ class ImplTraitTypeTypeParameter extends ImplTraitType, TypeParameter { ImplTraitTypeTypeParameter() { impl = function.getAParam().getTypeRepr() } + override ItemNode getDeclaringItem() { none() } + override Function getFunction() { result = function } override TypeParameter getPositionalTypeParameter(int i) { none() } @@ -635,7 +607,7 @@ pragma[nomagic] predicate validSelfType(Type t) { t instanceof RefType or - exists(Struct s | t = TStruct(s) | + exists(Struct s | t = TDataType(s) | s instanceof BoxStruct or s instanceof RcStruct or s instanceof ArcStruct or diff --git a/rust/ql/lib/codeql/rust/internal/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/TypeInference.qll index 905175803a2..c994cab6bb2 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInference.qll @@ -1,6 +1,7 @@ /** Provides functionality for inferring types. */ private import codeql.util.Boolean +private import codeql.util.Option private import rust private import PathResolution private import Type @@ -9,11 +10,11 @@ private import TypeMention private import typeinference.FunctionType private import typeinference.FunctionOverloading as FunctionOverloading private import typeinference.BlanketImplementation as BlanketImplementation +private import codeql.rust.elements.internal.VariableImpl::Impl as VariableImpl +private import codeql.rust.internal.CachedStages private import codeql.typeinference.internal.TypeInference private import codeql.rust.frameworks.stdlib.Stdlib private import codeql.rust.frameworks.stdlib.Builtins as Builtins -private import codeql.rust.elements.Call -private import codeql.rust.elements.internal.CallImpl::Impl as CallImpl private import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl class Type = T::Type; @@ -87,26 +88,6 @@ private module Input1 implements InputSig1 { int getTypeParameterId(TypeParameter tp) { tp = rank[result](TypeParameter tp0, int kind, int id1, int id2 | - tp0 instanceof ArrayTypeParameter and - kind = 0 and - id1 = 0 and - id2 = 0 - or - tp0 instanceof RefTypeParameter and - kind = 0 and - id1 = 0 and - id2 = 1 - or - tp0 instanceof SliceTypeParameter and - kind = 0 and - id1 = 0 and - id2 = 2 - or - tp0 instanceof PtrTypeParameter and - kind = 0 and - id1 = 0 and - id2 = 3 - or kind = 1 and id1 = 0 and id2 = @@ -127,10 +108,6 @@ private module Input1 implements InputSig1 { node = tp0.(SelfTypeParameter).getTrait() or node = tp0.(ImplTraitTypeTypeParameter).getImplTraitTypeRepr() ) - or - kind = 4 and - id1 = tp0.(TupleTypeParameter).getTupleType().getArity() and - id2 = tp0.(TupleTypeParameter).getIndex() | tp0 order by kind, id1, id2 ) @@ -179,48 +156,52 @@ private module Input2 implements InputSig2 { * inference module for more information. */ predicate conditionSatisfiesConstraint( - TypeAbstraction abs, TypeMention condition, TypeMention constraint + TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive ) { // `impl` blocks implementing traits + transitive = false and exists(Impl impl | abs = impl and condition = impl.getSelfTy() and constraint = impl.getTrait() ) or - // supertraits - exists(Trait trait | - abs = trait and - condition = trait and - constraint = trait.getATypeBound().getTypeRepr() - ) - or - // trait bounds on type parameters - exists(TypeParam param | - abs = param.getATypeBound() and - condition = param and - constraint = abs.(TypeBound).getTypeRepr() - ) - or - // the implicit `Self` type parameter satisfies the trait - exists(SelfTypeParameterMention self | - abs = self and - condition = self and - constraint = self.getTrait() - ) - or - exists(ImplTraitTypeRepr impl | - abs = impl and - condition = impl and - constraint = impl.getTypeBoundList().getABound().getTypeRepr() - ) - or - // a `dyn Trait` type implements `Trait`. See the comment on - // `DynTypeBoundListMention` for further details. - exists(DynTraitTypeRepr object | - abs = object and - condition = object.getTypeBoundList() and - constraint = object.getTrait() + transitive = true and + ( + // supertraits + exists(Trait trait | + abs = trait and + condition = trait and + constraint = trait.getATypeBound().getTypeRepr() + ) + or + // trait bounds on type parameters + exists(TypeParam param | + abs = param.getATypeBound() and + condition = param and + constraint = abs.(TypeBound).getTypeRepr() + ) + or + // the implicit `Self` type parameter satisfies the trait + exists(SelfTypeParameterMention self | + abs = self and + condition = self and + constraint = self.getTrait() + ) + or + exists(ImplTraitTypeRepr impl | + abs = impl and + condition = impl and + constraint = impl.getTypeBoundList().getABound().getTypeRepr() + ) + or + // a `dyn Trait` type implements `Trait`. See the comment on + // `DynTypeBoundListMention` for further details. + exists(DynTraitTypeRepr object | + abs = object and + condition = object.getTypeBoundList() and + constraint = object.getTrait() + ) ) } } @@ -249,22 +230,129 @@ module Consistency { } } -/** A method, that is, a function with a `self` parameter. */ -private class Method extends Function { - Method() { this.hasSelfParam() } -} - /** A function without a `self` parameter. */ private class NonMethodFunction extends Function { NonMethodFunction() { not this.hasSelfParam() } } +private module ImplOrTraitItemNodeOption = Option; + +private class ImplOrTraitItemNodeOption = ImplOrTraitItemNodeOption::Option; + +private class FunctionDeclaration extends Function { + private ImplOrTraitItemNodeOption parent; + + FunctionDeclaration() { + not this = any(ImplOrTraitItemNode i).getAnAssocItem() and parent.isNone() + or + this = parent.asSome().getASuccessor(_) + } + + /** Holds if this function is associated with `i`. */ + predicate isAssoc(ImplOrTraitItemNode i) { i = parent.asSome() } + + /** Holds if this is a free function. */ + predicate isFree() { parent.isNone() } + + /** Holds if this function is valid for `i`. */ + predicate isFor(ImplOrTraitItemNodeOption i) { i = parent } + + /** + * Holds if this function is valid for `i`. If `i` is a trait or `impl` block then + * this function must be declared directly inside `i`. + */ + predicate isDirectlyFor(ImplOrTraitItemNodeOption i) { + i.isNone() and + this.isFree() + or + this = i.asSome().getAnAssocItem() + } + + TypeParameter getTypeParameter(ImplOrTraitItemNodeOption i, TypeParameterPosition ppos) { + i = parent and + ( + typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) + or + typeParamMatchPosition(i.asSome().getTypeParam(_), result, ppos) + or + ppos.isImplicit() and result = TSelfTypeParameter(i.asSome()) + or + ppos.isImplicit() and result.(AssociatedTypeTypeParameter).getTrait() = i.asSome() + or + ppos.isImplicit() and this = result.(ImplTraitTypeTypeParameter).getFunction() + ) + } + + pragma[nomagic] + Type getParameterType(ImplOrTraitItemNodeOption i, FunctionPosition pos, TypePath path) { + i = parent and + ( + not pos.isReturn() and + result = getAssocFunctionTypeAt(this, i.asSome(), pos, path) + or + i.isNone() and + result = this.getParam(pos.asPosition()).getTypeRepr().(TypeMention).resolveTypeAt(path) + ) + } + + private Type resolveRetType(ImplOrTraitItemNodeOption i, TypePath path) { + i = parent and + ( + result = + getAssocFunctionTypeAt(this, i.asSome(), any(FunctionPosition pos | pos.isReturn()), path) + or + i.isNone() and + result = getReturnTypeMention(this).resolveTypeAt(path) + ) + } + + Type getReturnType(ImplOrTraitItemNodeOption i, TypePath path) { + if this.isAsync() + then + i = parent and + path.isEmpty() and + result = getFutureTraitType() + or + exists(TypePath suffix | + result = this.resolveRetType(i, suffix) and + path = TypePath::cons(getDynFutureOutputTypeParameter(), suffix) + ) + else result = this.resolveRetType(i, path) + } + + Type getDeclaredType(ImplOrTraitItemNodeOption i, FunctionPosition pos, TypePath path) { + result = this.getParameterType(i, pos, path) + or + pos.isReturn() and + result = this.getReturnType(i, path) + } + + string toStringExt(ImplOrTraitItemNode i) { + i = parent.asSome() and + if this = i.getAnAssocItem() + then result = this.toString() + else + result = this + " [" + [i.(Impl).getSelfTy().toString(), i.(Trait).getName().toString()] + "]" + } +} + pragma[nomagic] -private TypeMention getCallExprTypeArgument(CallExpr ce, TypeArgumentPosition apos) { - exists(Path p, int i | +private TypeMention getCallExprTypeMentionArgument(CallExpr ce, TypeArgumentPosition apos) { + exists(Path p, int i | p = CallExprImpl::getFunctionPath(ce) | + apos.asTypeParam() = resolvePath(p).getTypeParam(pragma[only_bind_into](i)) and + result = getPathTypeArgument(p, pragma[only_bind_into](i)) + ) +} + +pragma[nomagic] +private Type getCallExprTypeArgument(CallExpr ce, TypeArgumentPosition apos, TypePath path) { + result = getCallExprTypeMentionArgument(ce, apos).resolveTypeAt(path) + or + // Handle constructions that use `Self(...)` syntax + exists(Path p, TypePath path0 | p = CallExprImpl::getFunctionPath(ce) and - result = p.getSegment().getGenericArgList().getTypeArg(pragma[only_bind_into](i)) and - apos.asTypeParam() = resolvePath(p).getTypeParam(pragma[only_bind_into](i)) + result = p.(TypeMention).resolveTypeAt(path0) and + path0.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) ) } @@ -281,11 +369,6 @@ private TypeMention getTypeAnnotation(AstNode n) { n = p.getPat() and result = p.getTypeRepr() ) - or - exists(Function f | - result = getReturnTypeMention(f) and - n = f.getFunctionBody() - ) } /** Gets the type of `n`, which has an explicit type annotation. */ @@ -296,6 +379,17 @@ private Type inferAnnotatedType(AstNode n, TypePath path) { result = n.(ShorthandSelfParameterMention).resolveTypeAt(path) } +pragma[nomagic] +private Type inferFunctionBodyType(AstNode n, TypePath path) { + exists(Function f | + n = f.getFunctionBody() and + result = getReturnTypeMention(f).resolveTypeAt(path) and + not exists(ImplTraitReturnType i | i.getFunction() = f | + result = i or result = i.getATypeParameter() + ) + ) +} + /** * Holds if `me` is a call to the `panic!` macro. * @@ -316,13 +410,12 @@ module CertainTypeInference { } pragma[nomagic] - private Type getCallExprType(CallExpr ce, Path p, Function f, TypePath tp) { - callResolvesTo(ce, p, f) and - result = - [ - f.(MethodCallMatchingInput::Declaration).getReturnType(tp), - f.(NonMethodCallMatchingInput::Declaration).getReturnType(tp) - ] + private Type getCallExprType(CallExpr ce, Path p, FunctionDeclaration f, TypePath path) { + exists(ImplOrTraitItemNodeOption i | + callResolvesTo(ce, p, f) and + result = f.getReturnType(i, path) and + f.isDirectlyFor(i) + ) } pragma[nomagic] @@ -356,8 +449,7 @@ module CertainTypeInference { // For type parameters of the function we must resolve their // instantiation from the path. For instance, for `fn bar(a: A) -> A` // and the path `bar`, we must resolve `A` to `i64`. - result = - getCallExprTypeArgument(ce, TTypeParamTypeArgumentPosition(tp)).resolveTypeAt(suffix) + result = getCallExprTypeArgument(ce, TTypeParamTypeArgumentPosition(tp), suffix) ) or not ty instanceof TypeParameter and @@ -407,7 +499,12 @@ module CertainTypeInference { any(IdentPat ip | n2 = ip.getName() and prefix1.isEmpty() and - if ip.isRef() then prefix2 = TypePath::singleton(TRefTypeParameter()) else prefix2.isEmpty() + if ip.isRef() + then + exists(boolean isMutable | if ip.isMut() then isMutable = true else isMutable = false | + prefix2 = TypePath::singleton(getRefTypeParameter(isMutable)) + ) + else prefix2.isEmpty() ) } @@ -427,9 +524,12 @@ module CertainTypeInference { * Holds if `n` has complete and certain type information and if `n` has the * resulting type at `path`. */ - pragma[nomagic] + cached Type inferCertainType(AstNode n, TypePath path) { - result = inferAnnotatedType(n, path) + result = inferAnnotatedType(n, path) and + Stages::TypeInferenceStage::ref() + or + result = inferFunctionBodyType(n, path) or result = inferCertainCallExprType(n, path) or @@ -437,7 +537,10 @@ module CertainTypeInference { or result = inferLiteralType(n, path, true) or - result = inferRefNodeType(n) and + result = inferRefPatType(n) and + path.isEmpty() + or + result = inferRefExprType(n) and path.isEmpty() or result = inferLogicalOperationType(n, path) @@ -516,7 +619,7 @@ private Type inferLogicalOperationType(AstNode n, TypePath path) { exists(Builtins::Bool t, BinaryLogicalOperation be | n = [be, be.getLhs(), be.getRhs()] and path.isEmpty() and - result = TStruct(t) + result = TDataType(t) ) } @@ -612,16 +715,25 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat strictcount(Expr e | bodyReturns(n1, e)) = 1 ) or - ( - n1 = n2.(RefExpr).getExpr() or - n1 = n2.(RefPat).getPat() - ) and - prefix1.isEmpty() and - prefix2 = TypePath::singleton(TRefTypeParameter()) + n2 = + any(RefExpr re | + n1 = re.getExpr() and + prefix1.isEmpty() and + prefix2 = TypePath::singleton(inferRefExprType(re).getPositionalTypeParameter(0)) + ) + or + n2 = + any(RefPat rp | + n1 = rp.getPat() and + prefix1.isEmpty() and + exists(boolean isMutable | if rp.isMut() then isMutable = true else isMutable = false | + prefix2 = TypePath::singleton(getRefTypeParameter(isMutable)) + ) + ) or exists(int i, int arity | prefix1.isEmpty() and - prefix2 = TypePath::singleton(TTupleTypeParameter(arity, i)) + prefix2 = TypePath::singleton(getTupleTypeParameter(arity, i)) | arity = n2.(TupleExpr).getNumberOfFields() and n1 = n2.(TupleExpr).getField(i) @@ -635,7 +747,7 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat n2 = be.getStmtList().getTailExpr() and if be.isAsync() then - prefix1 = TypePath::singleton(getFutureOutputTypeParameter()) and + prefix1 = TypePath::singleton(getDynFutureOutputTypeParameter()) and prefix2.isEmpty() else ( prefix1.isEmpty() and @@ -649,12 +761,12 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat ale.getAnExpr() = n2 and ale.getNumberOfExprs() = 1 ) and - prefix1 = TypePath::singleton(TArrayTypeParameter()) and + prefix1 = TypePath::singleton(getArrayTypeParameter()) and prefix2.isEmpty() or // an array repeat expression (`[1; 3]`) has the type of the repeat operand n1.(ArrayRepeatExpr).getRepeatOperand() = n2 and - prefix1 = TypePath::singleton(TArrayTypeParameter()) and + prefix1 = TypePath::singleton(getArrayTypeParameter()) and prefix2.isEmpty() or exists(Struct s | @@ -678,7 +790,7 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat /** * Holds if `child` is a child of `parent`, and the Rust compiler applies [least - * upper bound (LUB) coercion](1) to infer the type of `parent` from the type of + * upper bound (LUB) coercion][1] to infer the type of `parent` from the type of * `child`. * * In this case, we want type information to only flow from `child` to `parent`, @@ -703,7 +815,7 @@ private predicate lubCoercion(AstNode parent, AstNode child, TypePath prefix) { child = ale.getAnExpr() and ale.getNumberOfExprs() > 1 ) and - prefix = TypePath::singleton(TArrayTypeParameter()) + prefix = TypePath::singleton(getArrayTypeParameter()) or bodyReturns(parent, child) and strictcount(Expr e | bodyReturns(parent, e)) > 1 and @@ -715,9 +827,7 @@ private predicate lubCoercion(AstNode parent, AstNode child, TypePath prefix) { * of `n2` at `prefix2`, but type information should only propagate from `n1` to * `n2`. */ -private predicate typeEqualityNonSymmetric( - AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2 -) { +private predicate typeEqualityAsymmetric(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { lubCoercion(n2, n1, prefix2) and prefix1.isEmpty() or @@ -729,6 +839,13 @@ private predicate typeEqualityNonSymmetric( not lubCoercion(mid, n1, _) and prefix1 = prefixMid.append(suffix) ) + or + // When `n2` is `*n1` propagate type information from a raw pointer type + // parameter at `n1`. The other direction is handled in + // `inferDereferencedExprPtrType`. + n1 = n2.(DerefExpr).getExpr() and + prefix1 = TypePath::singleton(getPtrTypeParameter()) and + prefix2.isEmpty() } pragma[nomagic] @@ -741,13 +858,15 @@ private Type inferTypeEquality(AstNode n, TypePath path) { or typeEquality(n2, prefix2, n, prefix1) or - typeEqualityNonSymmetric(n2, prefix2, n, prefix1) + typeEqualityAsymmetric(n2, prefix2, n, prefix1) ) } /** * A matching configuration for resolving types of struct expressions * like `Foo { bar = baz }`. + * + * This also includes nullary struct expressions like `None`. */ private module StructExprMatchingInput implements MatchingInputSig { private newtype TPos = @@ -768,14 +887,14 @@ private module StructExprMatchingInput implements MatchingInputSig { } abstract class Declaration extends AstNode { - abstract TypeParam getATypeParam(); - final TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getATypeParam(), result, ppos) + typeParamMatchPosition(this.getTypeItem().getGenericParamList().getATypeParam(), result, ppos) } abstract StructField getField(string name); + abstract TypeItem getTypeItem(); + Type getDeclaredType(DeclarationPosition dpos, TypePath path) { // type of a field exists(TypeMention tp | @@ -787,69 +906,112 @@ private module StructExprMatchingInput implements MatchingInputSig { dpos.isStructPos() and result = this.getTypeParameter(_) and path = TypePath::singleton(result) + or + // type of the struct or enum itself + dpos.isStructPos() and + path.isEmpty() and + result = TDataType(this.getTypeItem()) } } private class StructDecl extends Declaration, Struct { - StructDecl() { this.isStruct() } - - override TypeParam getATypeParam() { result = this.getGenericParamList().getATypeParam() } + StructDecl() { this.isStruct() or this.isUnit() } override StructField getField(string name) { result = this.getStructField(name) } - override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - result = super.getDeclaredType(dpos, path) - or - // type of the struct itself - dpos.isStructPos() and - path.isEmpty() and - result = TStruct(this) - } + override TypeItem getTypeItem() { result = this } } private class StructVariantDecl extends Declaration, Variant { - StructVariantDecl() { this.isStruct() } - - Enum getEnum() { result.getVariantList().getAVariant() = this } - - override TypeParam getATypeParam() { - result = this.getEnum().getGenericParamList().getATypeParam() - } + StructVariantDecl() { this.isStruct() or this.isUnit() } override StructField getField(string name) { result = this.getStructField(name) } - override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - result = super.getDeclaredType(dpos, path) - or - // type of the enum itself - dpos.isStructPos() and - path.isEmpty() and - result = TEnum(this.getEnum()) - } + override TypeItem getTypeItem() { result = this.getEnum() } } class AccessPosition = DeclarationPosition; - class Access extends StructExpr { + abstract class Access extends AstNode { + pragma[nomagic] + abstract AstNode getNodeAt(AccessPosition apos); + + pragma[nomagic] + Type getInferredType(AccessPosition apos, TypePath path) { + result = inferType(this.getNodeAt(apos), path) + } + + pragma[nomagic] + abstract Path getStructPath(); + + pragma[nomagic] + Declaration getTarget() { result = resolvePath(this.getStructPath()) } + + pragma[nomagic] Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + // Handle constructions that use `Self {...}` syntax + exists(TypeMention tm, TypePath path0 | + tm = this.getStructPath() and + result = tm.resolveTypeAt(path0) and + path0.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) + ) + } + + /** + * Holds if the return type of this struct expression at `path` may have to + * be inferred from the context. + */ + pragma[nomagic] + predicate hasUnknownTypeAt(DeclarationPosition pos, TypePath path) { + exists(Declaration d, TypeParameter tp | + d = this.getTarget() and + pos.isStructPos() and + tp = d.getDeclaredType(pos, path) and + not exists(DeclarationPosition fieldPos | + not fieldPos.isStructPos() and + tp = d.getDeclaredType(fieldPos, _) + ) and + // check that no explicit type arguments have been supplied for `tp` + not exists(TypeArgumentPosition tapos | + exists(this.getTypeArgument(tapos, _)) and + TTypeParamTypeParameter(tapos.asTypeParam()) = tp + ) + ) + } + } + + private class StructExprAccess extends Access, StructExpr { + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + result = super.getTypeArgument(apos, path) + or exists(TypePath suffix | suffix.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) and result = CertainTypeInference::inferCertainType(this, suffix) ) } - AstNode getNodeAt(AccessPosition apos) { + override AstNode getNodeAt(AccessPosition apos) { result = this.getFieldExpr(apos.asFieldPos()).getExpr() or result = this and apos.isStructPos() } - Type getInferredType(AccessPosition apos, TypePath path) { - result = inferType(this.getNodeAt(apos), path) + override Path getStructPath() { result = this.getPath() } + } + + /** + * A potential nullary struct/variant construction such as `None`. + */ + private class PathExprAccess extends Access, PathExpr { + PathExprAccess() { not exists(CallExpr ce | this = ce.getFunction()) } + + override AstNode getNodeAt(AccessPosition apos) { + result = this and + apos.isStructPos() } - Declaration getTarget() { result = resolvePath(this.getPath()) } + override Path getStructPath() { result = this.getPath() } } predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { @@ -859,34 +1021,30 @@ private module StructExprMatchingInput implements MatchingInputSig { private module StructExprMatching = Matching; +pragma[nomagic] +private Type inferStructExprType0(AstNode n, boolean isReturn, TypePath path) { + exists(StructExprMatchingInput::Access a, StructExprMatchingInput::AccessPosition apos | + n = a.getNodeAt(apos) and + if apos.isStructPos() then isReturn = true else isReturn = false + | + result = StructExprMatching::inferAccessType(a, apos, path) + or + a.hasUnknownTypeAt(apos, path) and + result = TUnknownType() + ) +} + /** * Gets the type of `n` at `path`, where `n` is either a struct expression or * a field expression of a struct expression. */ -pragma[nomagic] -private Type inferStructExprType(AstNode n, TypePath path) { - exists(StructExprMatchingInput::Access a, StructExprMatchingInput::AccessPosition apos | - n = a.getNodeAt(apos) and - result = StructExprMatching::inferAccessType(a, apos, path) - ) -} +private predicate inferStructExprType = + ContextTyping::CheckContextTyping::check/2; pragma[nomagic] -private Type inferTupleRootType(AstNode n) { +private TupleType inferTupleRootType(AstNode n) { // `typeEquality` handles the non-root cases - result = TTuple([n.(TupleExpr).getNumberOfFields(), n.(TuplePat).getTupleArity()]) -} - -pragma[nomagic] -private Type inferPathExprType(PathExpr pe, TypePath path) { - // nullary struct/variant constructors - not exists(CallExpr ce | pe = ce.getFunction()) and - path.isEmpty() and - exists(ItemNode i | i = resolvePath(pe.getPath()) | - result = TEnum(i.(Variant).getEnum()) - or - result = TStruct(i) - ) + result.getArity() = [n.(TupleExpr).getNumberOfFields(), n.(TuplePat).getTupleArity()] } pragma[nomagic] @@ -909,6 +1067,132 @@ private Type getCallExprTypeQualifier(CallExpr ce, TypePath path) { ) } +/** + * Gets the trait qualifier of function call `ce`, if any. + * + * For example, the trait qualifier of `Default::::default()` is `Default`. + */ +pragma[nomagic] +private Trait getCallExprTraitQualifier(CallExpr ce) { + exists(PathExt qualifierPath | + qualifierPath = getCallExprPathQualifier(ce) and + result = resolvePath(qualifierPath) and + // When the qualifier is `Self` and resolves to a trait, it's inside a + // trait method's default implementation. This is not a dispatch whose + // target is inferred from the type of the receiver, but should always + // resolve to the function in the trait block as path resolution does. + not qualifierPath.isUnqualified("Self") + ) +} + +/** + * Provides functionality related to context-based typing of calls. + */ +private module ContextTyping { + /** + * Holds if the return type of the function `f` inside `i` at `path` is type + * parameter `tp`, and `tp` does not appear in the type of any parameter of + * `f`. + * + * In this case, the context in which `f` is called may be needed to infer + * the instantiation of `tp`. + * + * This covers functions like `Default::default` and `Vec::new`. + */ + pragma[nomagic] + private predicate assocFunctionReturnContextTypedAt( + ImplOrTraitItemNode i, Function f, FunctionPosition pos, TypePath path, TypeParameter tp + ) { + pos.isReturn() and + tp = getAssocFunctionTypeAt(f, i, pos, path) and + not exists(FunctionPosition nonResPos | not nonResPos.isReturn() | + tp = getAssocFunctionTypeAt(f, i, nonResPos, _) + or + // `Self` types in traits implicitly mention all type parameters of the trait + getAssocFunctionTypeAt(f, i, nonResPos, _) = TSelfTypeParameter(i) + ) + } + + /** + * A call where the type of the result may have to be inferred from the + * context in which the call appears, for example a call like + * `Default::default()`. + */ + abstract class ContextTypedCallCand extends AstNode { + abstract Type getTypeArgument(TypeArgumentPosition apos, TypePath path); + + private predicate hasTypeArgument(TypeArgumentPosition apos) { + exists(this.getTypeArgument(apos, _)) + } + + /** + * Holds if this call resolves to `target` inside `i`, and the return type + * at `pos` and `path` may have to be inferred from the context. + */ + bindingset[this, i, target] + predicate hasUnknownTypeAt( + ImplOrTraitItemNode i, Function target, FunctionPosition pos, TypePath path + ) { + exists(TypeParameter tp | + assocFunctionReturnContextTypedAt(i, target, pos, path, tp) and + // check that no explicit type arguments have been supplied for `tp` + not exists(TypeArgumentPosition tapos | this.hasTypeArgument(tapos) | + exists(int j | + j = tapos.asMethodTypeArgumentPosition() and + tp = TTypeParamTypeParameter(target.getGenericParamList().getTypeParam(j)) + ) + or + TTypeParamTypeParameter(tapos.asTypeParam()) = tp + ) and + not ( + tp instanceof TSelfTypeParameter and + exists(getCallExprTypeQualifier(this, _)) + ) + ) + } + } + + pragma[nomagic] + private predicate hasUnknownTypeAt(AstNode n, TypePath path) { + inferType(n, path) = TUnknownType() + } + + pragma[nomagic] + private predicate hasUnknownType(AstNode n) { hasUnknownTypeAt(n, _) } + + signature Type inferCallTypeSig(AstNode n, boolean isReturn, TypePath path); + + /** + * Given a predicate `inferCallType` for inferring the type of a call at a given + * position, this module exposes the predicate `check`, which wraps the input + * predicate and checks that types are only propagated into arguments when they + * are context-typed. + */ + module CheckContextTyping { + pragma[nomagic] + private Type inferCallTypeFromContextCand(AstNode n, TypePath path, TypePath prefix) { + result = inferCallType(n, false, path) and + hasUnknownType(n) and + prefix = path + or + exists(TypePath mid | + result = inferCallTypeFromContextCand(n, path, mid) and + mid.isSnoc(prefix, _) + ) + } + + pragma[nomagic] + Type check(AstNode n, TypePath path) { + result = inferCallType(n, true, path) + or + exists(TypePath prefix | + result = inferCallTypeFromContextCand(n, path, prefix) and + hasUnknownTypeAt(n, prefix) + ) + } + } +} + /** * Holds if function `f` with the name `name` and the arity `arity` exists in * `i`, and the type at position `pos` is `t`. @@ -969,6 +1253,36 @@ private predicate isComplexRootStripped(TypePath path, Type type) { type != TNeverType() } +private newtype TBorrowKind = + TNoBorrowKind() or + TSomeBorrowKind(Boolean isMutable) + +private class BorrowKind extends TBorrowKind { + predicate isNoBorrow() { this = TNoBorrowKind() } + + predicate isSharedBorrow() { this = TSomeBorrowKind(false) } + + predicate isMutableBorrow() { this = TSomeBorrowKind(true) } + + RefType getRefType() { + exists(boolean isMutable | + this = TSomeBorrowKind(isMutable) and + result = getRefType(isMutable) + ) + } + + string toString() { + this.isNoBorrow() and + result = "" + or + this.isMutableBorrow() and + result = "&mut" + or + this.isSharedBorrow() and + result = "&" + } +} + /** * Provides logic for resolving calls to methods. * @@ -1011,7 +1325,7 @@ private module MethodResolution { * * `strippedTypePath` points to the type `strippedType` inside `selfType`, * which is the (possibly complex-stripped) root type of `selfType`. For example, - * if `m` has a `&self` parameter, then `strippedTypePath` is `TRefTypeParameter()` + * if `m` has a `&self` parameter, then `strippedTypePath` is `getRefSharedTypeParameter()` * and `strippedType` is the type inside the reference. */ pragma[nomagic] @@ -1084,14 +1398,17 @@ private module MethodResolution { pragma[nomagic] private predicate methodCallTraitCandidate(Element mc, Trait trait) { - exists(string name, int arity | - mc.(MethodCall).hasNameAndArity(name, arity) and - methodTraitInfo(name, arity, trait) - | - not mc.(Call).hasTrait() - or - trait = mc.(Call).getTrait() - ) + mc = + any(MethodCall mc0 | + exists(string name, int arity | + mc0.hasNameAndArity(name, arity) and + methodTraitInfo(name, arity, trait) + | + not mc0.hasTrait() + or + trait = mc0.getTrait() + ) + ) } private module MethodTraitIsVisible = TraitIsVisible; @@ -1136,7 +1453,7 @@ private module MethodResolution { or methodCallVisibleTraitCandidate(mc, i) or - i.(ImplItemNode).resolveTraitTy() = mc.(Call).getTrait() + i.(ImplItemNode).resolveTraitTy() = mc.getTrait() ) } @@ -1163,7 +1480,7 @@ private module MethodResolution { | methodCallVisibleImplTraitCandidate(mc, impl) or - impl.resolveTraitTy() = mc.(Call).getTrait() + impl.resolveTraitTy() = mc.getTrait() ) } @@ -1190,18 +1507,24 @@ private module MethodResolution { abstract class MethodCall extends Expr { abstract predicate hasNameAndArity(string name, int arity); - abstract Expr getArgument(ArgumentPosition pos); + abstract Expr getArg(ArgumentPosition pos); abstract predicate supportsAutoDerefAndBorrow(); + /** Gets the trait targeted by this call, if any. */ + abstract Trait getTrait(); + + /** Holds if this call targets a trait. */ + predicate hasTrait() { exists(this.getTrait()) } + AstNode getNodeAt(FunctionPosition apos) { - result = this.getArgument(apos.asArgumentPosition()) + result = this.getArg(apos.asArgumentPosition()) or result = this and apos.isReturn() } Type getArgumentTypeAt(ArgumentPosition pos, TypePath path) { - result = inferType(this.getArgument(pos), path) + result = inferType(this.getArg(pos), path) } private Type getReceiverTypeAt(TypePath path) { @@ -1218,10 +1541,10 @@ private module MethodResolution { or this.supportsAutoDerefAndBorrow() and exists(TypePath path0, Type t0, string derefChain0 | - this.hasNoCompatibleTargetBorrow(derefChain0) and + this.hasNoCompatibleTargetMutBorrow(derefChain0) and t0 = this.getACandidateReceiverTypeAtNoBorrow(derefChain0, path0) | - path0.isCons(TRefTypeParameter(), path) and + path0.isCons(getRefTypeParameter(_), path) and result = t0 and derefChain = derefChain0 + ".ref" or @@ -1237,11 +1560,19 @@ private module MethodResolution { * Holds if the method inside `i` with matching name and arity can be ruled * out as a target of this call, because the candidate receiver type represented * by `derefChain` and `borrow` is incompatible with the `self` parameter type. + * + * The types are incompatible because they disagree on a concrete type somewhere + * inside `root`. */ pragma[nomagic] - private predicate hasIncompatibleTarget(ImplOrTraitItemNode i, string derefChain, boolean borrow) { - ReceiverIsInstantiationOfSelfParam::argIsNotInstantiationOf(MkMethodCallCand(this, derefChain, - borrow), i, _) + private predicate hasIncompatibleTarget( + ImplOrTraitItemNode i, string derefChain, BorrowKind borrow, Type root + ) { + exists(TypePath path | + ReceiverIsInstantiationOfSelfParam::argIsNotInstantiationOf(MkMethodCallCand(this, + derefChain, borrow), i, _, path) and + path.isCons(root.getATypeParameter(), _) + ) } /** @@ -1252,47 +1583,47 @@ private module MethodResolution { */ pragma[nomagic] private predicate hasIncompatibleBlanketLikeTarget( - ImplItemNode impl, string derefChain, boolean borrow + ImplItemNode impl, string derefChain, BorrowKind borrow ) { ReceiverIsNotInstantiationOfBlanketLikeSelfParam::argIsNotInstantiationOf(MkMethodCallCand(this, - derefChain, borrow), impl, _) + derefChain, borrow), impl, _, _) or ReceiverSatisfiesBlanketLikeConstraint::dissatisfiesBlanketConstraint(MkMethodCallCand(this, derefChain, borrow), impl) } /** - * Same as `getACandidateReceiverTypeAt`, but with traits substituted in for types - * with trait bounds. + * Same as `getACandidateReceiverTypeAt`, but excludes pseudo types `!` and `unknown`. */ pragma[nomagic] - Type getACandidateReceiverTypeAtSubstituteLookupTraits( - string derefChain, boolean borrow, TypePath path - ) { - result = substituteLookupTraits(this.getACandidateReceiverTypeAt(derefChain, borrow, path)) + Type getANonPseudoCandidateReceiverTypeAt(string derefChain, BorrowKind borrow, TypePath path) { + result = this.getACandidateReceiverTypeAt(derefChain, borrow, path) and + result != TNeverType() and + result != TUnknownType() } pragma[nomagic] - private Type getComplexStrippedType(string derefChain, boolean borrow, TypePath strippedTypePath) { - result = - this.getACandidateReceiverTypeAtSubstituteLookupTraits(derefChain, borrow, strippedTypePath) and + private Type getComplexStrippedType( + string derefChain, BorrowKind borrow, TypePath strippedTypePath + ) { + result = this.getANonPseudoCandidateReceiverTypeAt(derefChain, borrow, strippedTypePath) and isComplexRootStripped(strippedTypePath, result) } bindingset[derefChain, borrow, strippedTypePath, strippedType] private predicate hasNoCompatibleNonBlanketLikeTargetCheck( - string derefChain, boolean borrow, TypePath strippedTypePath, Type strippedType + string derefChain, BorrowKind borrow, TypePath strippedTypePath, Type strippedType ) { forall(ImplOrTraitItemNode i | methodCallNonBlanketCandidate(this, _, i, _, strippedTypePath, strippedType) | - this.hasIncompatibleTarget(i, derefChain, borrow) + this.hasIncompatibleTarget(i, derefChain, borrow, strippedType) ) } bindingset[derefChain, borrow, strippedTypePath, strippedType] private predicate hasNoCompatibleTargetCheck( - string derefChain, boolean borrow, TypePath strippedTypePath, Type strippedType + string derefChain, BorrowKind borrow, TypePath strippedTypePath, Type strippedType ) { this.hasNoCompatibleNonBlanketLikeTargetCheck(derefChain, borrow, strippedTypePath, strippedType) and @@ -1303,7 +1634,7 @@ private module MethodResolution { bindingset[derefChain, borrow, strippedTypePath, strippedType] private predicate hasNoCompatibleNonBlanketTargetCheck( - string derefChain, boolean borrow, TypePath strippedTypePath, Type strippedType + string derefChain, BorrowKind borrow, TypePath strippedTypePath, Type strippedType ) { this.hasNoCompatibleNonBlanketLikeTargetCheck(derefChain, borrow, strippedTypePath, strippedType) and @@ -1314,12 +1645,11 @@ private module MethodResolution { ) } - /** - * Holds if the candidate receiver type represented by `derefChain` does not - * have a matching method target. - */ + // forex using recursion pragma[nomagic] - predicate hasNoCompatibleTargetNoBorrow(string derefChain) { + private predicate hasNoCompatibleTargetNoBorrowToIndex( + string derefChain, TypePath strippedTypePath, Type strippedType, int n + ) { ( this.supportsAutoDerefAndBorrow() or @@ -1327,10 +1657,46 @@ private module MethodResolution { // `ReceiverSatisfiesBlanketLikeConstraintInput::hasBlanketCandidate` derefChain = "" ) and - exists(TypePath strippedTypePath, Type strippedType | - not derefChain.matches("%.ref") and // no need to try a borrow if the last thing we did was a deref - strippedType = this.getComplexStrippedType(derefChain, false, strippedTypePath) and - this.hasNoCompatibleTargetCheck(derefChain, false, strippedTypePath, strippedType) + strippedType = this.getComplexStrippedType(derefChain, TNoBorrowKind(), strippedTypePath) and + n = -1 + or + this.hasNoCompatibleTargetNoBorrowToIndex(derefChain, strippedTypePath, strippedType, n - 1) and + exists(Type t | t = getNthLookupType(strippedType, n) | + this.hasNoCompatibleTargetCheck(derefChain, TNoBorrowKind(), strippedTypePath, t) + ) + } + + /** + * Holds if the candidate receiver type represented by `derefChain` does not + * have a matching method target. + */ + pragma[nomagic] + predicate hasNoCompatibleTargetNoBorrow(string derefChain) { + exists(Type strippedType | + this.hasNoCompatibleTargetNoBorrowToIndex(derefChain, _, strippedType, + getLastLookupTypeIndex(strippedType)) + ) + } + + // forex using recursion + pragma[nomagic] + private predicate hasNoCompatibleNonBlanketTargetNoBorrowToIndex( + string derefChain, TypePath strippedTypePath, Type strippedType, int n + ) { + ( + this.supportsAutoDerefAndBorrow() + or + // needed for the `hasNoCompatibleTarget` check in + // `ReceiverSatisfiesBlanketLikeConstraintInput::hasBlanketCandidate` + derefChain = "" + ) and + strippedType = this.getComplexStrippedType(derefChain, TNoBorrowKind(), strippedTypePath) and + n = -1 + or + this.hasNoCompatibleNonBlanketTargetNoBorrowToIndex(derefChain, strippedTypePath, + strippedType, n - 1) and + exists(Type t | t = getNthLookupType(strippedType, n) | + this.hasNoCompatibleNonBlanketTargetCheck(derefChain, TNoBorrowKind(), strippedTypePath, t) ) } @@ -1340,44 +1706,128 @@ private module MethodResolution { */ pragma[nomagic] predicate hasNoCompatibleNonBlanketTargetNoBorrow(string derefChain) { - ( - this.supportsAutoDerefAndBorrow() - or - // needed for the `hasNoCompatibleTarget` check in - // `ReceiverSatisfiesBlanketLikeConstraintInput::hasBlanketCandidate` - derefChain = "" - ) and - exists(TypePath strippedTypePath, Type strippedType | - not derefChain.matches("%.ref") and // no need to try a borrow if the last thing we did was a deref - strippedType = this.getComplexStrippedType(derefChain, false, strippedTypePath) and - this.hasNoCompatibleNonBlanketTargetCheck(derefChain, false, strippedTypePath, strippedType) + exists(Type strippedType | + this.hasNoCompatibleNonBlanketTargetNoBorrowToIndex(derefChain, _, strippedType, + getLastLookupTypeIndex(strippedType)) + ) + } + + // forex using recursion + pragma[nomagic] + private predicate hasNoCompatibleTargetSharedBorrowToIndex( + string derefChain, TypePath strippedTypePath, Type strippedType, int n + ) { + this.hasNoCompatibleTargetNoBorrow(derefChain) and + strippedType = + this.getComplexStrippedType(derefChain, TSomeBorrowKind(false), strippedTypePath) and + n = -1 + or + this.hasNoCompatibleTargetSharedBorrowToIndex(derefChain, strippedTypePath, strippedType, + n - 1) and + exists(Type t | t = getNthLookupType(strippedType, n) | + this.hasNoCompatibleNonBlanketLikeTargetCheck(derefChain, TSomeBorrowKind(false), + strippedTypePath, t) ) } /** * Holds if the candidate receiver type represented by `derefChain`, followed - * by a borrow, does not have a matching method target. + * by a shared borrow, does not have a matching method target. */ pragma[nomagic] - predicate hasNoCompatibleTargetBorrow(string derefChain) { - exists(TypePath strippedTypePath, Type strippedType | - this.hasNoCompatibleTargetNoBorrow(derefChain) and - strippedType = this.getComplexStrippedType(derefChain, true, strippedTypePath) and - this.hasNoCompatibleNonBlanketLikeTargetCheck(derefChain, true, strippedTypePath, - strippedType) + predicate hasNoCompatibleTargetSharedBorrow(string derefChain) { + exists(Type strippedType | + this.hasNoCompatibleTargetSharedBorrowToIndex(derefChain, _, strippedType, + getLastLookupTypeIndex(strippedType)) + ) + } + + // forex using recursion + pragma[nomagic] + private predicate hasNoCompatibleTargetMutBorrowToIndex( + string derefChain, TypePath strippedTypePath, Type strippedType, int n + ) { + this.hasNoCompatibleTargetSharedBorrow(derefChain) and + strippedType = + this.getComplexStrippedType(derefChain, TSomeBorrowKind(true), strippedTypePath) and + n = -1 + or + this.hasNoCompatibleTargetMutBorrowToIndex(derefChain, strippedTypePath, strippedType, n - 1) and + exists(Type t | t = getNthLookupType(strippedType, n) | + this.hasNoCompatibleNonBlanketLikeTargetCheck(derefChain, TSomeBorrowKind(true), + strippedTypePath, t) ) } /** * Holds if the candidate receiver type represented by `derefChain`, followed - * by a borrow, does not have a matching non-blanket method target. + * by a `mut` borrow, does not have a matching method target. */ pragma[nomagic] - predicate hasNoCompatibleNonBlanketTargetBorrow(string derefChain) { - exists(TypePath strippedTypePath, Type strippedType | - this.hasNoCompatibleTargetNoBorrow(derefChain) and - strippedType = this.getComplexStrippedType(derefChain, true, strippedTypePath) and - this.hasNoCompatibleNonBlanketTargetCheck(derefChain, true, strippedTypePath, strippedType) + predicate hasNoCompatibleTargetMutBorrow(string derefChain) { + exists(Type strippedType | + this.hasNoCompatibleTargetMutBorrowToIndex(derefChain, _, strippedType, + getLastLookupTypeIndex(strippedType)) + ) + } + + // forex using recursion + pragma[nomagic] + private predicate hasNoCompatibleNonBlanketTargetSharedBorrowToIndex( + string derefChain, TypePath strippedTypePath, Type strippedType, int n + ) { + this.hasNoCompatibleTargetNoBorrow(derefChain) and + strippedType = + this.getComplexStrippedType(derefChain, TSomeBorrowKind(false), strippedTypePath) and + n = -1 + or + this.hasNoCompatibleNonBlanketTargetSharedBorrowToIndex(derefChain, strippedTypePath, + strippedType, n - 1) and + exists(Type t | t = getNthLookupType(strippedType, n) | + this.hasNoCompatibleNonBlanketTargetCheck(derefChain, TSomeBorrowKind(false), + strippedTypePath, t) + ) + } + + /** + * Holds if the candidate receiver type represented by `derefChain`, followed + * by a shared borrow, does not have a matching non-blanket method target. + */ + pragma[nomagic] + predicate hasNoCompatibleNonBlanketTargetSharedBorrow(string derefChain) { + exists(Type strippedType | + this.hasNoCompatibleNonBlanketTargetSharedBorrowToIndex(derefChain, _, strippedType, + getLastLookupTypeIndex(strippedType)) + ) + } + + // forex using recursion + pragma[nomagic] + private predicate hasNoCompatibleNonBlanketTargetMutBorrowToIndex( + string derefChain, TypePath strippedTypePath, Type strippedType, int n + ) { + this.hasNoCompatibleNonBlanketTargetSharedBorrow(derefChain) and + strippedType = + this.getComplexStrippedType(derefChain, TSomeBorrowKind(true), strippedTypePath) and + n = -1 + or + this.hasNoCompatibleNonBlanketTargetMutBorrowToIndex(derefChain, strippedTypePath, + strippedType, n - 1) and + exists(Type t | t = getNthLookupType(strippedType, n) | + this.hasNoCompatibleNonBlanketTargetCheck(derefChain, TSomeBorrowKind(true), + strippedTypePath, t) + ) + } + + /** + * Holds if the candidate receiver type represented by `derefChain`, followed + * by a `mut` borrow, does not have a matching non-blanket method target. + */ + pragma[nomagic] + predicate hasNoCompatibleNonBlanketTargetMutBorrow(string derefChain) { + exists(Type strippedType | + this.hasNoCompatibleNonBlanketTargetMutBorrowToIndex(derefChain, _, strippedType, + getLastLookupTypeIndex(strippedType)) ) } @@ -1394,20 +1844,29 @@ private module MethodResolution { * [1]: https://doc.rust-lang.org/reference/expressions/method-call-expr.html#r-expr.method.candidate-receivers */ pragma[nomagic] - Type getACandidateReceiverTypeAt(string derefChain, boolean borrow, TypePath path) { + Type getACandidateReceiverTypeAt(string derefChain, BorrowKind borrow, TypePath path) { result = this.getACandidateReceiverTypeAtNoBorrow(derefChain, path) and - borrow = false + borrow.isNoBorrow() or - this.supportsAutoDerefAndBorrow() and - this.hasNoCompatibleTargetNoBorrow(derefChain) and - borrow = true and - ( - path.isEmpty() and - result = TRefType() + exists(RefType rt | + // first try shared borrow + this.supportsAutoDerefAndBorrow() and + this.hasNoCompatibleTargetNoBorrow(derefChain) and + borrow.isSharedBorrow() or - exists(TypePath suffix | - result = this.getACandidateReceiverTypeAtNoBorrow(derefChain, suffix) and - path = TypePath::cons(TRefTypeParameter(), suffix) + // then try mutable borrow + this.hasNoCompatibleTargetSharedBorrow(derefChain) and + borrow.isMutableBorrow() + | + rt = borrow.getRefType() and + ( + path.isEmpty() and + result = rt + or + exists(TypePath suffix | + result = this.getACandidateReceiverTypeAtNoBorrow(derefChain, suffix) and + path = TypePath::cons(rt.getPositionalTypeParameter(0), suffix) + ) ) ) } @@ -1415,24 +1874,24 @@ private module MethodResolution { /** * Gets a method that this call resolves to after having applied a sequence of * dereferences and possibly a borrow on the receiver type, encoded in the string - * `derefChain` and the Boolean `borrow`. + * `derefChain` and the enum `borrow`. */ pragma[nomagic] - Method resolveCallTarget(string derefChain, boolean borrow) { + Method resolveCallTarget(ImplOrTraitItemNode i, string derefChain, BorrowKind borrow) { exists(MethodCallCand mcc | mcc = MkMethodCallCand(this, derefChain, borrow) and - result = mcc.resolveCallTarget() + result = mcc.resolveCallTarget(i) ) } predicate receiverHasImplicitDeref(AstNode receiver) { - exists(this.resolveCallTarget(".ref", false)) and - receiver = this.getArgument(CallImpl::TSelfArgumentPosition()) + exists(this.resolveCallTarget(_, ".ref", TNoBorrowKind())) and + receiver = this.getArg(any(ArgumentPosition pos | pos.isSelf())) } - predicate receiverHasImplicitBorrow(AstNode receiver) { - exists(this.resolveCallTarget("", true)) and - receiver = this.getArgument(CallImpl::TSelfArgumentPosition()) + predicate argumentHasImplicitBorrow(AstNode arg, boolean isMutable) { + exists(this.resolveCallTarget(_, "", TSomeBorrowKind(isMutable))) and + arg = this.getArg(any(ArgumentPosition pos | pos.isSelf())) } } @@ -1443,35 +1902,45 @@ private module MethodResolution { arity = super.getArgList().getNumberOfArgs() } - override Expr getArgument(ArgumentPosition pos) { - pos.isSelf() and - result = MethodCallExpr.super.getReceiver() - or - result = super.getArgList().getArg(pos.asPosition()) + override Expr getArg(ArgumentPosition pos) { + result = MethodCallExpr.super.getSyntacticArgument(pos) } override predicate supportsAutoDerefAndBorrow() { any() } + + override Trait getTrait() { none() } } - private class MethodCallIndexExpr extends MethodCall, IndexExpr { + private class MethodCallIndexExpr extends MethodCall instanceof IndexExpr { + private predicate isInMutableContext() { + // todo: does not handle all cases yet + VariableImpl::assignmentOperationDescendant(_, this) + } + pragma[nomagic] override predicate hasNameAndArity(string name, int arity) { - name = "index" and + (if this.isInMutableContext() then name = "index_mut" else name = "index") and arity = 1 } - override Expr getArgument(ArgumentPosition pos) { + override Expr getArg(ArgumentPosition pos) { pos.isSelf() and - result = this.getBase() + result = super.getBase() or pos.asPosition() = 0 and - result = this.getIndex() + result = super.getIndex() } override predicate supportsAutoDerefAndBorrow() { any() } + + override Trait getTrait() { + if this.isInMutableContext() + then result instanceof IndexMutTrait + else result instanceof IndexTrait + } } - private class MethodCallCallExpr extends MethodCall, CallExpr { + private class MethodCallCallExpr extends MethodCall instanceof CallExpr { MethodCallCallExpr() { exists(getCallExprPathQualifier(this)) and // even if a method cannot be resolved by path resolution, it may still @@ -1496,14 +1965,14 @@ private module MethodResolution { pragma[nomagic] override predicate hasNameAndArity(string name, int arity) { name = CallExprImpl::getFunctionPath(this).getText() and - arity = this.getArgList().getNumberOfArgs() - 1 + arity = super.getArgList().getNumberOfArgs() - 1 } - override Expr getArgument(ArgumentPosition pos) { + override Expr getArg(ArgumentPosition pos) { pos.isSelf() and - result = this.getArg(0) + result = super.getSyntacticPositionalArgument(0) or - result = this.getArgList().getArg(pos.asPosition() + 1) + result = super.getSyntacticPositionalArgument(pos.asPosition() + 1) } // needed for `TypeQualifierIsInstantiationOfImplSelfInput` @@ -1512,38 +1981,64 @@ private module MethodResolution { } override predicate supportsAutoDerefAndBorrow() { none() } + + override Trait getTrait() { result = getCallExprTraitQualifier(this) } } - final class MethodCallOperation extends MethodCall, Operation { + final class MethodCallOperation extends MethodCall instanceof Operation { pragma[nomagic] override predicate hasNameAndArity(string name, int arity) { - name = this.(Call).getMethodName() and - arity = this.getNumberOfOperands() - 1 + super.isOverloaded(_, name, _) and + arity = super.getNumberOfOperands() - 1 } - override Expr getArgument(ArgumentPosition pos) { result = this.(Call).getArgument(pos) } + override Expr getArg(ArgumentPosition pos) { + pos.isSelf() and + result = super.getOperand(0) + or + result = super.getOperand(pos.asPosition() + 1) + } + + private predicate implicitBorrowAt(ArgumentPosition pos, boolean isMutable) { + exists(int borrows | super.isOverloaded(_, _, borrows) | + pos.isSelf() and + borrows >= 1 and + if this instanceof CompoundAssignmentExpr then isMutable = true else isMutable = false + or + pos.asPosition() = 0 and + borrows = 2 and + isMutable = false + ) + } override Type getArgumentTypeAt(ArgumentPosition pos, TypePath path) { - if this.(Call).implicitBorrowAt(pos, true) - then - result = TRefType() and + exists(boolean isMutable, RefType rt | + this.implicitBorrowAt(pos, isMutable) and + rt = getRefType(isMutable) + | + result = rt and path.isEmpty() or exists(TypePath path0 | - result = inferType(this.getArgument(pos), path0) and - path = TypePath::cons(TRefTypeParameter(), path0) + result = inferType(this.getArg(pos), path0) and + path = TypePath::cons(rt.getPositionalTypeParameter(0), path0) ) - else result = inferType(this.getArgument(pos), path) + ) + or + not this.implicitBorrowAt(pos, _) and + result = inferType(this.getArg(pos), path) } - override predicate receiverHasImplicitBorrow(AstNode receiver) { + override predicate argumentHasImplicitBorrow(AstNode arg, boolean isMutable) { exists(ArgumentPosition pos | - this.(Call).implicitBorrowAt(pos, true) and - receiver = this.getArgument(pos) + this.implicitBorrowAt(pos, isMutable) and + arg = this.getArg(pos) ) } override predicate supportsAutoDerefAndBorrow() { none() } + + override Trait getTrait() { super.isOverloaded(result, _, _) } } pragma[nomagic] @@ -1553,7 +2048,7 @@ private module MethodResolution { } private newtype TMethodCallCand = - MkMethodCallCand(MethodCall mc, string derefChain, boolean borrow) { + MkMethodCallCand(MethodCall mc, string derefChain, BorrowKind borrow) { exists(mc.getACandidateReceiverTypeAt(derefChain, borrow, _)) } @@ -1561,24 +2056,27 @@ private module MethodResolution { private class MethodCallCand extends MkMethodCallCand { MethodCall mc_; string derefChain; - boolean borrow; + BorrowKind borrow; MethodCallCand() { this = MkMethodCallCand(mc_, derefChain, borrow) } MethodCall getMethodCall() { result = mc_ } Type getTypeAt(TypePath path) { - result = mc_.getACandidateReceiverTypeAtSubstituteLookupTraits(derefChain, borrow, path) and - not result = TNeverType() + result = + substituteLookupTraits(mc_.getANonPseudoCandidateReceiverTypeAt(derefChain, borrow, path)) } pragma[nomagic] predicate hasNoCompatibleNonBlanketTarget() { - mc_.hasNoCompatibleNonBlanketTargetBorrow(derefChain) and - borrow = true + mc_.hasNoCompatibleNonBlanketTargetSharedBorrow(derefChain) and + borrow.isSharedBorrow() + or + mc_.hasNoCompatibleNonBlanketTargetMutBorrow(derefChain) and + borrow.isMutableBorrow() or mc_.hasNoCompatibleNonBlanketTargetNoBorrow(derefChain) and - borrow = false + borrow.isNoBorrow() } pragma[nomagic] @@ -1597,7 +2095,7 @@ private module MethodResolution { */ pragma[nomagic] private predicate hasIncompatibleInherentTarget(Impl impl) { - ReceiverIsNotInstantiationOfInherentSelfParam::argIsNotInstantiationOf(this, impl, _) + ReceiverIsNotInstantiationOfInherentSelfParam::argIsNotInstantiationOf(this, impl, _, _) } /** @@ -1642,17 +2140,13 @@ private module MethodResolution { /** Gets a method that matches this method call. */ pragma[nomagic] - Method resolveCallTarget() { - exists(ImplOrTraitItemNode i | - result = this.resolveCallTargetCand(i) and - not FunctionOverloading::functionResolutionDependsOnArgument(i, _, _, _, _) - ) + Method resolveCallTarget(ImplOrTraitItemNode i) { + result = this.resolveCallTargetCand(i) and + not FunctionOverloading::functionResolutionDependsOnArgument(i, _, _, _, _) or - MethodArgsAreInstantiationsOf::argsAreInstantiationsOf(this, _, result) + MethodArgsAreInstantiationsOf::argsAreInstantiationsOf(this, i, result) } - predicate hasNoBorrow() { borrow = false } - string toString() { result = mc_.toString() + " [" + derefChain + "; " + borrow + "]" } Location getLocation() { result = mc_.getLocation() } @@ -1665,17 +2159,17 @@ private module MethodResolution { predicate hasBlanketCandidate( MethodCallCand mcc, ImplItemNode impl, TypePath blanketPath, TypeParam blanketTypeParam ) { - exists(MethodCall mc | - mc = mcc.getMethodCall() and + exists(MethodCall mc, BorrowKind borrow | + mcc = MkMethodCallCand(mc, _, borrow) and methodCallBlanketLikeCandidate(mc, _, impl, _, blanketPath, blanketTypeParam) and // Only apply blanket implementations when no other implementations are possible; // this is to account for codebases that use the (unstable) specialization feature // (https://rust-lang.github.io/rfcs/1210-impl-specialization.html) (mcc.hasNoCompatibleNonBlanketTarget() or not impl.isBlanketImplementation()) | - mcc.hasNoBorrow() + borrow.isNoBorrow() or - blanketPath.getHead() = TRefTypeParameter() + blanketPath.getHead() = borrow.getRefType().getPositionalTypeParameter(0) ) } } @@ -1849,94 +2343,68 @@ private module MethodResolution { private module MethodCallMatchingInput implements MatchingWithEnvironmentInputSig { import FunctionPositionMatchingInput - final class Declaration extends Function { + private class MethodDeclaration extends Method, FunctionDeclaration { } + + private newtype TDeclaration = + TMethodFunctionDeclaration(ImplOrTraitItemNode i, MethodDeclaration m) { m.isAssoc(i) } + + final class Declaration extends TMethodFunctionDeclaration { + ImplOrTraitItemNode parent; + ImplOrTraitItemNodeOption someParent; + MethodDeclaration m; + + Declaration() { + this = TMethodFunctionDeclaration(parent, m) and + someParent.asSome() = parent + } + + predicate isMethod(ImplOrTraitItemNode i, Method method) { + this = TMethodFunctionDeclaration(i, method) + } + TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) - or - exists(ImplOrTraitItemNode i | this = i.getAnAssocItem() | - typeParamMatchPosition(i.getTypeParam(_), result, ppos) - or - ppos.isImplicit() and result = TSelfTypeParameter(i) - or - ppos.isImplicit() and - result.(AssociatedTypeTypeParameter).getTrait() = i - ) - or - ppos.isImplicit() and - this = result.(ImplTraitTypeTypeParameter).getFunction() - } - - pragma[nomagic] - Type getParameterType(DeclarationPosition dpos, TypePath path) { - exists(Param p, int i | - p = this.getParam(i) and - i = dpos.asPosition() and - result = p.getTypeRepr().(TypeMention).resolveTypeAt(path) - ) - or - dpos.isSelf() and - exists(SelfParam self | - self = pragma[only_bind_into](this.getSelfParam()) and - result = getSelfParamTypeMention(self).resolveTypeAt(path) - ) - } - - private Type resolveRetType(TypePath path) { - result = getReturnTypeMention(this).resolveTypeAt(path) - } - - pragma[nomagic] - Type getReturnType(TypePath path) { - if this.isAsync() - then - path.isEmpty() and - result = getFutureTraitType() - or - exists(TypePath suffix | - result = this.resolveRetType(suffix) and - path = TypePath::cons(getFutureOutputTypeParameter(), suffix) - ) - else result = this.resolveRetType(path) + result = m.getTypeParameter(someParent, ppos) } Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - result = this.getParameterType(dpos, path) - or - dpos.isReturn() and - result = this.getReturnType(path) + result = m.getDeclaredType(someParent, dpos, path) } + + string toString() { result = m.toStringExt(parent) } + + Location getLocation() { result = m.getLocation() } } class AccessEnvironment = string; bindingset[derefChain, borrow] - private AccessEnvironment encodeDerefChainBorrow(string derefChain, boolean borrow) { - exists(string suffix | if borrow = true then suffix = "borrow" else suffix = "" | - result = derefChain + ";" + suffix - ) + additional AccessEnvironment encodeDerefChainBorrow(string derefChain, BorrowKind borrow) { + result = derefChain + ";" + borrow } final private class MethodCallFinal = MethodResolution::MethodCall; - class Access extends MethodCallFinal { + class Access extends MethodCallFinal, ContextTyping::ContextTypedCallCand { Access() { // handled in the `OperationMatchingInput` module not this instanceof Operation } pragma[nomagic] - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - exists(TypeMention arg | result = arg.resolveTypeAt(path) | - arg = - this.(MethodCallExpr).getGenericArgList().getTypeArg(apos.asMethodTypeArgumentPosition()) - or - arg = getCallExprTypeArgument(this, apos) - ) + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + result = + this.(MethodCallExpr) + .getGenericArgList() + .getTypeArg(apos.asMethodTypeArgumentPosition()) + .(TypeMention) + .resolveTypeAt(path) + or + result = getCallExprTypeArgument(this, apos, path) } pragma[nomagic] private Type getInferredSelfType(AccessPosition apos, string derefChainBorrow, TypePath path) { - exists(string derefChain, boolean borrow | + exists(string derefChain, BorrowKind borrow | result = this.getACandidateReceiverTypeAt(derefChain, borrow, path) and derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and apos.isSelf() @@ -1952,11 +2420,11 @@ private module MethodCallMatchingInput implements MatchingWithEnvironmentInputSi this instanceof IndexExpr then path.isEmpty() and - result = TRefType() + result instanceof RefType or exists(TypePath suffix | result = inferType(this.getNodeAt(apos), suffix) and - path = TypePath::cons(TRefTypeParameter(), suffix) + path = TypePath::cons(getRefTypeParameter(_), suffix) ) else ( not apos.isSelf() and @@ -1971,10 +2439,28 @@ private module MethodCallMatchingInput implements MatchingWithEnvironmentInputSi result = this.getInferredNonSelfType(apos, path) } - Declaration getTarget(string derefChainBorrow) { - exists(string derefChain, boolean borrow | + Method getTarget(ImplOrTraitItemNode i, string derefChainBorrow) { + exists(string derefChain, BorrowKind borrow | derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and - result = this.resolveCallTarget(derefChain, borrow) // mutual recursion; resolving method calls requires resolving types and vice versa + result = this.resolveCallTarget(i, derefChain, borrow) // mutual recursion; resolving method calls requires resolving types and vice versa + ) + } + + Declaration getTarget(string derefChainBorrow) { + exists(ImplOrTraitItemNode i, Method m | + m = this.getTarget(i, derefChainBorrow) and + result = TMethodFunctionDeclaration(i, m) + ) + } + + /** + * Holds if the return type of this call at `path` may have to be inferred + * from the context. + */ + pragma[nomagic] + predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path) { + exists(ImplOrTraitItemNode i | + this.hasUnknownTypeAt(i, this.getTarget(i, derefChainBorrow), pos, path) ) } } @@ -1989,29 +2475,31 @@ private Type inferMethodCallType0( ) { exists(TypePath path0 | n = a.getNodeAt(apos) and - result = MethodCallMatching::inferAccessType(a, derefChainBorrow, apos, path0) + ( + result = MethodCallMatching::inferAccessType(a, derefChainBorrow, apos, path0) + or + a.hasUnknownTypeAt(derefChainBorrow, apos, path0) and + result = TUnknownType() + ) | if // index expression `x[i]` desugars to `*x.index(i)`, so we must account for // the implicit deref apos.isReturn() and a instanceof IndexExpr - then path0.isCons(TRefTypeParameter(), path) + then path0.isCons(getRefTypeParameter(_), path) else path = path0 ) } -/** - * Gets the type of `n` at `path`, where `n` is either a method call or an - * argument/receiver of a method call. - */ pragma[nomagic] -private Type inferMethodCallType(AstNode n, TypePath path) { +private Type inferMethodCallType1(AstNode n, boolean isReturn, TypePath path) { exists( MethodCallMatchingInput::Access a, MethodCallMatchingInput::AccessPosition apos, string derefChainBorrow, TypePath path0 | - result = inferMethodCallType0(a, apos, n, derefChainBorrow, path0) + result = inferMethodCallType0(a, apos, n, derefChainBorrow, path0) and + if apos.isReturn() then isReturn = true else isReturn = false | ( not apos.isSelf() @@ -2022,16 +2510,23 @@ private Type inferMethodCallType(AstNode n, TypePath path) { or // adjust for implicit deref apos.isSelf() and - derefChainBorrow = ".ref;" and - path = TypePath::cons(TRefTypeParameter(), path0) + derefChainBorrow = MethodCallMatchingInput::encodeDerefChainBorrow(".ref", TNoBorrowKind()) and + path = TypePath::cons(getRefTypeParameter(_), path0) or // adjust for implicit borrow apos.isSelf() and - derefChainBorrow = ";borrow" and - path0.isCons(TRefTypeParameter(), path) + derefChainBorrow = MethodCallMatchingInput::encodeDerefChainBorrow("", TSomeBorrowKind(_)) and + path0.isCons(getRefTypeParameter(_), path) ) } +/** + * Gets the type of `n` at `path`, where `n` is either a method call or an + * argument/receiver of a method call. + */ +private predicate inferMethodCallType = + ContextTyping::CheckContextTyping::check/2; + /** * Provides logic for resolving calls to non-method items. This includes * "calls" to tuple variants and tuple structs. @@ -2091,14 +2586,17 @@ private module NonMethodResolution { pragma[nomagic] private predicate blanketLikeCallTraitCandidate(Element fc, Trait trait) { - exists(string name, int arity | - fc.(NonMethodCall).hasNameAndArity(name, arity) and - functionInfoBlanketLikeRelevantPos(_, name, arity, _, trait, _, _, _, _) - | - not fc.(Call).hasTrait() - or - trait = fc.(Call).getTrait() - ) + fc = + any(NonMethodCall nmc | + exists(string name, int arity | + nmc.hasNameAndArity(name, arity) and + functionInfoBlanketLikeRelevantPos(_, name, arity, _, trait, _, _, _, _) + | + not nmc.hasTrait() + or + trait = nmc.getTrait() + ) + ) } private module BlanketTraitIsVisible = TraitIsVisible; @@ -2140,9 +2638,15 @@ private module NonMethodResolution { ) } + /** Gets the trait targeted by this call, if any. */ + Trait getTrait() { result = getCallExprTraitQualifier(this) } + + /** Holds if this call targets a trait. */ + predicate hasTrait() { exists(this.getTrait()) } + pragma[nomagic] NonMethodFunction resolveAssocCallTargetCand(ImplItemNode i) { - not this.(Call).hasTrait() and + not this.hasTrait() and result = this.getPathResolutionResolved() and result = i.getASuccessor(_) or @@ -2150,7 +2654,7 @@ private module NonMethodResolution { } AstNode getNodeAt(FunctionPosition pos) { - result = this.getArg(pos.asPosition()) + result = this.getSyntacticArgument(pos.asArgumentPosition()) or result = this and pos.isReturn() } @@ -2175,29 +2679,35 @@ private module NonMethodResolution { pragma[nomagic] predicate hasTraitResolved(TraitItemNode trait, NonMethodFunction resolved) { resolved = this.getPathResolutionResolved() and - trait = this.(Call).getTrait() + trait = this.getTrait() } + /** + * Gets the target of this call, which can be resolved using only path resolution. + */ pragma[nomagic] - private NonMethodFunction resolveCallTargetRec() { - result = this.resolveCallTargetBlanketCand(_) and - not FunctionOverloading::functionResolutionDependsOnArgument(_, result, _, _, _) - or - NonMethodArgsAreInstantiationsOf::argsAreInstantiationsOf(this, _, result) - } - - pragma[nomagic] - ItemNode resolveCallTargetNonRec() { - not this.(Call).hasTrait() and + ItemNode resolveCallTargetViaPathResolution() { + not this.hasTrait() and result = this.getPathResolutionResolved() and not FunctionOverloading::functionResolutionDependsOnArgument(_, result, _, _, _) } - pragma[inline] - ItemNode resolveCallTarget() { - result = this.resolveCallTargetNonRec() + /** + * Gets the target of this call, which can be resolved using type inference. + */ + pragma[nomagic] + NonMethodFunction resolveCallTargetViaTypeInference(ImplOrTraitItemNode i) { + result = this.resolveCallTargetBlanketCand(i) and + not FunctionOverloading::functionResolutionDependsOnArgument(_, result, _, _, _) or - result = this.resolveCallTargetRec() + NonMethodArgsAreInstantiationsOf::argsAreInstantiationsOf(this, i, result) + } + + pragma[nomagic] + NonMethodFunction resolveTraitFunctionViaPathResolution(TraitItemNode trait) { + this.hasTrait() and + result = this.getPathResolutionResolved() and + result = trait.getASuccessor(_) } } @@ -2313,14 +2823,73 @@ private module NonMethodResolution { ArgsAreInstantiationsOf; } +abstract private class TupleLikeConstructor extends Addressable { + final TypeParameter getTypeParameter(TypeParameterPosition ppos) { + typeParamMatchPosition(this.getTypeItem().getGenericParamList().getATypeParam(), result, ppos) + } + + abstract TypeItem getTypeItem(); + + abstract TupleField getTupleField(int i); + + Type getReturnType(TypePath path) { + result = TDataType(this.getTypeItem()) and + path.isEmpty() + or + result = TTypeParamTypeParameter(this.getTypeItem().getGenericParamList().getATypeParam()) and + path = TypePath::singleton(result) + } + + Type getDeclaredType(FunctionPosition pos, TypePath path) { + result = this.getParameterType(pos, path) + or + pos.isReturn() and + result = this.getReturnType(path) + or + pos.isSelf() and + result = this.getReturnType(path) + } + + Type getParameterType(FunctionPosition pos, TypePath path) { + result = this.getTupleField(pos.asPosition()).getTypeRepr().(TypeMention).resolveTypeAt(path) + } +} + +private class TupleLikeStruct extends TupleLikeConstructor instanceof Struct { + TupleLikeStruct() { this.isTuple() } + + override TypeItem getTypeItem() { result = this } + + override TupleField getTupleField(int i) { result = Struct.super.getTupleField(i) } +} + +private class TupleLikeVariant extends TupleLikeConstructor instanceof Variant { + TupleLikeVariant() { this.isTuple() } + + override TypeItem getTypeItem() { result = super.getEnum() } + + override TupleField getTupleField(int i) { result = Variant.super.getTupleField(i) } +} + /** * A matching configuration for resolving types of calls like * `foo::bar(baz)` where the target is not a method. + * + * This also includes "calls" to tuple variants and tuple structs such + * as `Result::Ok(42)`. */ private module NonMethodCallMatchingInput implements MatchingInputSig { import FunctionPositionMatchingInput - abstract class Declaration extends AstNode { + private class NonMethodFunctionDeclaration extends NonMethodFunction, FunctionDeclaration { } + + private newtype TDeclaration = + TNonMethodFunctionDeclaration(ImplOrTraitItemNodeOption i, NonMethodFunctionDeclaration f) { + f.isFor(i) + } or + TTupleLikeConstructorDeclaration(TupleLikeConstructor tc) + + abstract class Declaration extends TDeclaration { abstract TypeParameter getTypeParameter(TypeParameterPosition ppos); pragma[nomagic] @@ -2334,69 +2903,20 @@ private module NonMethodCallMatchingInput implements MatchingInputSig { dpos.isReturn() and result = this.getReturnType(path) } + + abstract string toString(); + + abstract Location getLocation(); } - abstract additional class TupleDeclaration extends Declaration { - override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - result = super.getDeclaredType(dpos, path) - or - dpos.isSelf() and - result = this.getReturnType(path) - } - } + private class NonMethodFunctionDecl extends Declaration, TNonMethodFunctionDeclaration { + private ImplOrTraitItemNodeOption i; + private NonMethodFunctionDeclaration f; - private class TupleStructDecl extends TupleDeclaration, Struct { - TupleStructDecl() { this.isTuple() } + NonMethodFunctionDecl() { this = TNonMethodFunctionDeclaration(i, f) } override TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getGenericParamList().getATypeParam(), result, ppos) - } - - override Type getParameterType(DeclarationPosition dpos, TypePath path) { - exists(int pos | - result = this.getTupleField(pos).getTypeRepr().(TypeMention).resolveTypeAt(path) and - pos = dpos.asPosition() - ) - } - - override Type getReturnType(TypePath path) { - result = TStruct(this) and - path.isEmpty() - or - result = TTypeParamTypeParameter(this.getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) - } - } - - private class TupleVariantDecl extends TupleDeclaration, Variant { - TupleVariantDecl() { this.isTuple() } - - override TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getEnum().getGenericParamList().getATypeParam(), result, ppos) - } - - override Type getParameterType(DeclarationPosition dpos, TypePath path) { - exists(int pos | - result = this.getTupleField(pos).getTypeRepr().(TypeMention).resolveTypeAt(path) and - pos = dpos.asPosition() - ) - } - - override Type getReturnType(TypePath path) { - exists(Enum enum | enum = this.getEnum() | - result = TEnum(enum) and - path.isEmpty() - or - result = TTypeParamTypeParameter(enum.getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) - ) - } - } - - private class NonMethodFunctionDecl extends Declaration, NonMethodFunction instanceof MethodCallMatchingInput::Declaration - { - override TypeParameter getTypeParameter(TypeParameterPosition ppos) { - result = MethodCallMatchingInput::Declaration.super.getTypeParameter(ppos) + result = f.getTypeParameter(i, ppos) } override Type getParameterType(DeclarationPosition dpos, TypePath path) { @@ -2417,26 +2937,48 @@ private module NonMethodCallMatchingInput implements MatchingInputSig { // // we need to match `i32` against the type parameter `T` of the `impl` block. dpos.isSelf() and - exists(ImplOrTraitItemNode i | - this = i.getAnAssocItem() and - result = resolveImplOrTraitType(i, path) - ) + result = resolveImplOrTraitType(i.asSome(), path) or - exists(FunctionPosition fpos | - result = MethodCallMatchingInput::Declaration.super.getParameterType(fpos, path) and - dpos = fpos.getFunctionCallAdjusted(this) - ) + result = f.getParameterType(i, dpos, path) } - override Type getReturnType(TypePath path) { - result = MethodCallMatchingInput::Declaration.super.getReturnType(path) + override Type getReturnType(TypePath path) { result = f.getReturnType(i, path) } + + override string toString() { + i.isNone() and result = f.toString() + or + result = f.toStringExt(i.asSome()) } + + override Location getLocation() { result = f.getLocation() } } - class Access extends NonMethodResolution::NonMethodCall { + private class TupleLikeConstructorDeclaration extends Declaration, + TTupleLikeConstructorDeclaration + { + TupleLikeConstructor tc; + + TupleLikeConstructorDeclaration() { this = TTupleLikeConstructorDeclaration(tc) } + + override TypeParameter getTypeParameter(TypeParameterPosition ppos) { + result = tc.getTypeParameter(ppos) + } + + override Type getParameterType(DeclarationPosition dpos, TypePath path) { + result = tc.getParameterType(dpos, path) + } + + override Type getReturnType(TypePath path) { result = tc.getReturnType(path) } + + override string toString() { result = tc.toString() } + + override Location getLocation() { result = tc.getLocation() } + } + + class Access extends NonMethodResolution::NonMethodCall, ContextTyping::ContextTypedCallCand { pragma[nomagic] - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = getCallExprTypeArgument(this, apos).resolveTypeAt(path) + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + result = getCallExprTypeArgument(this, apos, path) } pragma[nomagic] @@ -2447,8 +2989,47 @@ private module NonMethodCallMatchingInput implements MatchingInputSig { result = inferType(this.getNodeAt(apos), path) } + pragma[inline] Declaration getTarget() { - result = this.resolveCallTarget() // potential mutual recursion; resolving some associated function calls requires resolving types + exists(ImplOrTraitItemNodeOption i, NonMethodFunctionDeclaration f | + result = TNonMethodFunctionDeclaration(i, f) + | + f = this.resolveCallTargetViaTypeInference(i.asSome()) // mutual recursion; resolving some associated function calls requires resolving types + or + f = this.resolveTraitFunctionViaPathResolution(i.asSome()) + or + f = this.resolveCallTargetViaPathResolution() and + f.isDirectlyFor(i) + ) + or + exists(ItemNode i | i = this.resolveCallTargetViaPathResolution() | + result = TTupleLikeConstructorDeclaration(i) + ) + } + + /** + * Holds if the return type of this call at `path` may have to be inferred + * from the context. + */ + pragma[nomagic] + predicate hasUnknownTypeAt(FunctionPosition pos, TypePath path) { + exists(ImplOrTraitItemNodeOption i, NonMethodFunctionDeclaration f | + TNonMethodFunctionDeclaration(i, f) = this.getTarget() and + this.hasUnknownTypeAt(i.asSome(), f, pos, path) + ) + or + // Tuple declarations, such as `Result::Ok(...)`, may also be context typed + exists(TupleLikeConstructor tc, TypeParameter tp | + tc = this.resolveCallTargetViaPathResolution() and + pos.isReturn() and + tp = tc.getReturnType(path) and + not tp = tc.getParameterType(_, _) and + // check that no explicit type arguments have been supplied for `tp` + not exists(TypeArgumentPosition tapos | + exists(this.getTypeArgument(tapos, _)) and + TTypeParamTypeParameter(tapos.asTypeParam()) = tp + ) + ) } } } @@ -2456,25 +3037,33 @@ private module NonMethodCallMatchingInput implements MatchingInputSig { private module NonMethodCallMatching = Matching; pragma[nomagic] -private Type inferNonMethodCallType(AstNode n, TypePath path) { +private Type inferNonMethodCallType0(AstNode n, boolean isReturn, TypePath path) { exists(NonMethodCallMatchingInput::Access a, NonMethodCallMatchingInput::AccessPosition apos | n = a.getNodeAt(apos) and + if apos.isReturn() then isReturn = true else isReturn = false + | result = NonMethodCallMatching::inferAccessType(a, apos, path) + or + a.hasUnknownTypeAt(apos, path) and + result = TUnknownType() ) } +private predicate inferNonMethodCallType = + ContextTyping::CheckContextTyping::check/2; + /** * A matching configuration for resolving types of operations like `a + b`. */ private module OperationMatchingInput implements MatchingInputSig { - private import codeql.rust.elements.internal.OperationImpl as OperationImpl + private import codeql.rust.elements.internal.OperationImpl::Impl as OperationImpl import FunctionPositionMatchingInput class Declaration extends MethodCallMatchingInput::Declaration { private Method getSelfOrImpl() { - result = this + result = m or - this.implements(result) + m.implements(result) } pragma[nomagic] @@ -2491,30 +3080,19 @@ private module OperationMatchingInput implements MatchingInputSig { ) } - pragma[nomagic] - private Type getParameterType(DeclarationPosition dpos, TypePath path) { - exists(TypePath path0 | - result = super.getParameterType(dpos, path0) and - if this.borrowsAt(dpos) then path0.isCons(TRefTypeParameter(), path) else path0 = path - ) - } - pragma[nomagic] private predicate derefsReturn() { this.getSelfOrImpl() = any(DerefTrait t).getDerefFunction() } - pragma[nomagic] - private Type getReturnType(TypePath path) { - exists(TypePath path0 | - result = super.getReturnType(path0) and - if this.derefsReturn() then path0.isCons(TRefTypeParameter(), path) else path0 = path - ) - } - Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - result = this.getParameterType(dpos, path) - or - dpos.isReturn() and - result = this.getReturnType(path) + exists(TypePath path0 | + result = super.getDeclaredType(dpos, path0) and + if + this.borrowsAt(dpos) + or + dpos.isReturn() and this.derefsReturn() + then path0.isCons(getRefTypeParameter(_), path) + else path0 = path + ) } } @@ -2527,7 +3105,9 @@ private module OperationMatchingInput implements MatchingInputSig { } Declaration getTarget() { - result = this.resolveCallTarget(_, _) // mutual recursion + exists(ImplOrTraitItemNode i | + result.isMethod(i, this.resolveCallTarget(i, _, _)) // mutual recursion + ) } } } @@ -2535,38 +3115,35 @@ private module OperationMatchingInput implements MatchingInputSig { private module OperationMatching = Matching; pragma[nomagic] -private Type inferOperationType(AstNode n, TypePath path) { +private Type inferOperationType0(AstNode n, boolean isReturn, TypePath path) { exists(OperationMatchingInput::Access a, OperationMatchingInput::AccessPosition apos | n = a.getNodeAt(apos) and - result = OperationMatching::inferAccessType(a, apos, path) + result = OperationMatching::inferAccessType(a, apos, path) and + if apos.isReturn() then isReturn = true else isReturn = false ) } +private predicate inferOperationType = + ContextTyping::CheckContextTyping::check/2; + pragma[nomagic] -private Type getFieldExprLookupType(FieldExpr fe, string name) { +private Type getFieldExprLookupType(FieldExpr fe, string name, boolean isDereferenced) { exists(TypePath path | result = inferType(fe.getContainer(), path) and name = fe.getIdentifier().getText() and - isComplexRootStripped(path, result) + isComplexRootStripped(path, result) and + if path.isEmpty() then isDereferenced = false else isDereferenced = true ) } pragma[nomagic] -private Type getTupleFieldExprLookupType(FieldExpr fe, int pos) { +private Type getTupleFieldExprLookupType(FieldExpr fe, int pos, boolean isDereferenced) { exists(string name | - result = getFieldExprLookupType(fe, name) and + result = getFieldExprLookupType(fe, name, isDereferenced) and pos = name.toInt() ) } -pragma[nomagic] -private TupleTypeParameter resolveTupleTypeFieldExpr(FieldExpr fe) { - exists(int arity, int i | - TTuple(arity) = getTupleFieldExprLookupType(fe, i) and - result = TTupleTypeParameter(arity, i) - ) -} - /** * A matching configuration for resolving types of field expressions like `x.field`. */ @@ -2591,8 +3168,7 @@ private module FieldExprMatchingInput implements MatchingInputSig { private newtype TDeclaration = TStructFieldDecl(StructField sf) or - TTupleFieldDecl(TupleField tf) or - TTupleTypeParameterDecl(TupleTypeParameter ttp) + TTupleFieldDecl(TupleField tf) abstract class Declaration extends TDeclaration { TypeParameter getTypeParameter(TypeParameterPosition ppos) { none() } @@ -2613,7 +3189,7 @@ private module FieldExprMatchingInput implements MatchingInputSig { dpos.isSelf() and // no case for variants as those can only be destructured using pattern matching exists(Struct s | this.getAstNode() = [s.getStructField(_).(AstNode), s.getTupleField(_)] | - result = TStruct(s) and + result = TDataType(s) and path.isEmpty() or result = TTypeParamTypeParameter(s.getGenericParamList().getATypeParam()) and @@ -2649,31 +3225,6 @@ private module FieldExprMatchingInput implements MatchingInputSig { override TypeRepr getTypeRepr() { result = tf.getTypeRepr() } } - private class TupleTypeParameterDecl extends Declaration, TTupleTypeParameterDecl { - private TupleTypeParameter ttp; - - TupleTypeParameterDecl() { this = TTupleTypeParameterDecl(ttp) } - - override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - dpos.isSelf() and - ( - result = ttp.getTupleType() and - path.isEmpty() - or - result = ttp and - path = TypePath::singleton(ttp) - ) - or - dpos.isField() and - result = ttp and - path.isEmpty() - } - - override string toString() { result = ttp.toString() } - - override Location getLocation() { result = ttp.getLocation() } - } - class AccessPosition = DeclarationPosition; class Access extends FieldExpr { @@ -2692,10 +3243,10 @@ private module FieldExprMatchingInput implements MatchingInputSig { if apos.isSelf() then // adjust for implicit deref - path0.isCons(TRefTypeParameter(), path) + path0.isCons(getRefTypeParameter(_), path) or - not path0.isCons(TRefTypeParameter(), _) and - not (result = TRefType() and path0.isEmpty()) and + not path0.isCons(getRefTypeParameter(_), _) and + not (result instanceof RefType and path0.isEmpty()) and path = path0 else path = path0 ) @@ -2705,9 +3256,8 @@ private module FieldExprMatchingInput implements MatchingInputSig { // mutual recursion; resolving fields requires resolving types and vice versa result = [ - TStructFieldDecl(resolveStructFieldExpr(this)).(TDeclaration), - TTupleFieldDecl(resolveTupleFieldExpr(this)), - TTupleTypeParameterDecl(resolveTupleTypeFieldExpr(this)) + TStructFieldDecl(resolveStructFieldExpr(this, _)).(TDeclaration), + TTupleFieldDecl(resolveTupleFieldExpr(this, _)) ] } } @@ -2734,29 +3284,46 @@ private Type inferFieldExprType(AstNode n, TypePath path) { if apos.isSelf() then exists(Type receiverType | receiverType = inferType(n) | - if receiverType = TRefType() + if receiverType instanceof RefType then // adjust for implicit deref - not path0.isCons(TRefTypeParameter(), _) and - not (path0.isEmpty() and result = TRefType()) and - path = TypePath::cons(TRefTypeParameter(), path0) + not path0.isCons(getRefTypeParameter(_), _) and + not (path0.isEmpty() and result instanceof RefType) and + path = TypePath::cons(getRefTypeParameter(_), path0) else path = path0 ) else path = path0 ) } +/** Gets the root type of the reference expression `ref`. */ +pragma[nomagic] +private Type inferRefExprType(RefExpr ref) { + if ref.isRaw() + then + ref.isMut() and result instanceof PtrMutType + or + ref.isConst() and result instanceof PtrConstType + else + if ref.isMut() + then result instanceof RefMutType + else result instanceof RefSharedType +} + /** Gets the root type of the reference node `ref`. */ pragma[nomagic] -private Type inferRefNodeType(AstNode ref) { - ( - ref = any(IdentPat ip | ip.isRef()).getName() +private Type inferRefPatType(AstNode ref) { + exists(boolean isMut | + ref = + any(IdentPat ip | + ip.isRef() and + if ip.isMut() then isMut = true else isMut = false + ).getName() or - ref instanceof RefExpr - or - ref instanceof RefPat - ) and - result = TRefType() + ref = any(RefPat rp | if rp.isMut() then isMut = true else isMut = false) + | + result = getRefType(isMut) + ) } pragma[nomagic] @@ -2772,15 +3339,15 @@ private Type inferTryExprType(TryExpr te, TypePath path) { } pragma[nomagic] -private StructType getStrStruct() { result = TStruct(any(Builtins::Str s)) } +private StructType getStrStruct() { result = TDataType(any(Builtins::Str s)) } pragma[nomagic] -private StructType getStringStruct() { result = TStruct(any(StringStruct s)) } +private StructType getStringStruct() { result = TDataType(any(StringStruct s)) } pragma[nomagic] private Type inferLiteralType(LiteralExpr le, TypePath path, boolean certain) { path.isEmpty() and - exists(Builtins::BuiltinType t | result = TStruct(t) | + exists(Builtins::BuiltinType t | result = TDataType(t) | le instanceof CharLiteralExpr and t instanceof Builtins::Char and certain = true @@ -2810,22 +3377,27 @@ private Type inferLiteralType(LiteralExpr le, TypePath path, boolean certain) { or le instanceof StringLiteralExpr and ( - path.isEmpty() and result = TRefType() + path.isEmpty() and result instanceof RefSharedType or - path = TypePath::singleton(TRefTypeParameter()) and + path = TypePath::singleton(getRefTypeParameter(false)) and result = getStrStruct() ) and certain = true } pragma[nomagic] -private TraitType getFutureTraitType() { result.getTrait() instanceof FutureTrait } +private DynTraitType getFutureTraitType() { result.getTrait() instanceof FutureTrait } pragma[nomagic] private AssociatedTypeTypeParameter getFutureOutputTypeParameter() { result.getTypeAlias() = any(FutureTrait ft).getOutputType() } +pragma[nomagic] +private DynTraitTypeParameter getDynFutureOutputTypeParameter() { + result = TDynTraitTypeParameter(any(FutureTrait ft).getOutputType()) +} + pragma[nomagic] predicate isUnitBlockExpr(BlockExpr be) { not be.getStmtList().hasTailExpr() and @@ -2842,7 +3414,7 @@ private Type inferBlockExprType(BlockExpr be, TypePath path) { result = getFutureTraitType() or isUnitBlockExpr(be) and - path = TypePath::singleton(getFutureOutputTypeParameter()) and + path = TypePath::singleton(getDynFutureOutputTypeParameter()) and result instanceof UnitType ) else ( isUnitBlockExpr(be) and @@ -2867,10 +3439,13 @@ final private class AwaitTarget extends Expr { } private module AwaitSatisfiesConstraintInput implements SatisfiesConstraintInputSig { + pragma[nomagic] predicate relevantConstraint(AwaitTarget term, Type constraint) { exists(term) and constraint.(TraitType).getTrait() instanceof FutureTrait } + + predicate useUniversalConditions() { none() } } pragma[nomagic] @@ -2886,13 +3461,13 @@ private Type inferAwaitExprType(AstNode n, TypePath path) { * Gets the root type of the array expression `ae`. */ pragma[nomagic] -private Type inferArrayExprType(ArrayExpr ae) { exists(ae) and result = TArrayType() } +private Type inferArrayExprType(ArrayExpr ae) { exists(ae) and result instanceof ArrayType } /** * Gets the root type of the range expression `re`. */ pragma[nomagic] -private Type inferRangeExprType(RangeExpr re) { result = TStruct(getRangeType(re)) } +private Type inferRangeExprType(RangeExpr re) { result = TDataType(getRangeType(re)) } /** * According to [the Rust reference][1]: _"array and slice-typed expressions @@ -2909,7 +3484,7 @@ private Type inferIndexExprType(IndexExpr ie, TypePath path) { // TODO: Method resolution to the `std::ops::Index` trait can handle the // `Index` instances for slices and arrays. exists(TypePath exprPath, Builtins::BuiltinType t | - TStruct(t) = inferType(ie.getIndex()) and + TDataType(t) = inferType(ie.getIndex()) and ( // also allow `i32`, since that is currently the type that we infer for // integer literals like `0` @@ -2922,15 +3497,36 @@ private Type inferIndexExprType(IndexExpr ie, TypePath path) { // todo: remove? exprPath.isCons(TTypeParamTypeParameter(any(Vec v).getElementTypeParam()), path) or - exprPath.isCons(any(ArrayTypeParameter tp), path) + exprPath.isCons(getArrayTypeParameter(), path) or exists(TypePath path0 | - exprPath.isCons(any(RefTypeParameter tp), path0) and - path0.isCons(any(SliceTypeParameter tp), path) + exprPath.isCons(getRefTypeParameter(_), path0) and + path0.isCons(getSliceTypeParameter(), path) ) ) } +pragma[nomagic] +private Type getInferredDerefType(DerefExpr de, TypePath path) { result = inferType(de, path) } + +pragma[nomagic] +private PtrType getInferredDerefExprPtrType(DerefExpr de) { result = inferType(de.getExpr()) } + +/** + * Gets the inferred type of `n` at `path` when `n` occurs in a dereference + * expression `*n` and when `n` is known to have a raw pointer type. + * + * The other direction is handled in `typeEqualityAsymmetric`. + */ +private Type inferDereferencedExprPtrType(AstNode n, TypePath path) { + exists(DerefExpr de, PtrType type, TypePath suffix | + de.getExpr() = n and + type = getInferredDerefExprPtrType(de) and + result = getInferredDerefType(de, suffix) and + path = TypePath::cons(type.getPositionalTypeParameter(0), suffix) + ) +} + /** * A matching configuration for resolving types of struct patterns * like `let Foo { bar } = ...`. @@ -2990,7 +3586,7 @@ private Type inferStructPatType(AstNode n, TypePath path) { private module TupleStructPatMatchingInput implements MatchingInputSig { import FunctionPositionMatchingInput - class Declaration = NonMethodCallMatchingInput::TupleDeclaration; + class Declaration = TupleLikeConstructor; class Access extends TupleStructPat { Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } @@ -3046,6 +3642,8 @@ private module ForIterableSatisfiesConstraintInput implements t instanceof IntoIteratorTrait ) } + + predicate useUniversalConditions() { none() } } pragma[nomagic] @@ -3071,7 +3669,7 @@ private Type inferForLoopExprType(AstNode n, TypePath path) { or // TODO: Remove once we can handle the `impl IntoIterator for I` implementation tp = getIteratorItemTypeParameter() and - inferType(fe.getIterable()) != TArrayType() + inferType(fe.getIterable()) != getArrayTypeParameter() ) } @@ -3081,12 +3679,9 @@ private Type inferForLoopExprType(AstNode n, TypePath path) { * first-class function. */ final private class InvokedClosureExpr extends Expr { - private CallExpr call; + private CallExprImpl::DynamicCallExpr call; - InvokedClosureExpr() { - call.getFunction() = this and - (not this instanceof PathExpr or this = any(Variable v).getAnAccess()) - } + InvokedClosureExpr() { call.getFunction() = this } Type getTypeAt(TypePath path) { result = inferType(this, path) } @@ -3100,6 +3695,8 @@ private module InvokedClosureSatisfiesConstraintInput implements exists(term) and constraint.(TraitType).getTrait() instanceof FnOnceTrait } + + predicate useUniversalConditions() { none() } } /** Gets the type of `ce` when viewed as an implementation of `FnOnce`. */ @@ -3118,7 +3715,7 @@ pragma[nomagic] private TypePath closureParameterPath(int arity, int index) { result = TypePath::cons(TDynTraitTypeParameter(any(FnOnceTrait t).getTypeParam()), - TypePath::singleton(TTupleTypeParameter(arity, index))) + TypePath::singleton(getTupleTypeParameter(arity, index))) } /** Gets the path to the return type of the `FnOnce` trait. */ @@ -3134,7 +3731,7 @@ pragma[nomagic] private TypePath fnParameterPath(int arity, int index) { result = TypePath::cons(TTypeParamTypeParameter(any(FnOnceTrait t).getTypeParam()), - TypePath::singleton(TTupleTypeParameter(arity, index))) + TypePath::singleton(getTupleTypeParameter(arity, index))) } pragma[nomagic] @@ -3147,8 +3744,9 @@ private Type inferDynamicCallExprType(Expr n, TypePath path) { or // Propagate the function's parameter type to the arguments exists(int index | - n = ce.getCall().getArgList().getArg(index) and - path = path0.stripPrefix(fnParameterPath(ce.getCall().getNumberOfArgs(), index)) + n = ce.getCall().getSyntacticPositionalArgument(index) and + path = + path0.stripPrefix(fnParameterPath(ce.getCall().getArgList().getNumberOfArgs(), index)) ) ) or @@ -3158,16 +3756,17 @@ private Type inferDynamicCallExprType(Expr n, TypePath path) { ce.getTypeAt(TypePath::nil()).(DynTraitType).getTrait() instanceof FnOnceTrait | // Propagate the type of arguments to the parameter types of closure - exists(int index | + exists(int index, ArgList args | n = ce and - arity = ce.getCall().getNumberOfArgs() and - result = inferType(ce.getCall().getArg(index), path0) and + args = ce.getCall().getArgList() and + arity = args.getNumberOfArgs() and + result = inferType(args.getArg(index), path0) and path = closureParameterPath(arity, index).append(path0) ) or // Propagate the type of the call expression to the return type of the closure n = ce and - arity = ce.getCall().getNumberOfArgs() and + arity = ce.getCall().getArgList().getNumberOfArgs() and result = inferType(ce.getCall(), path0) and path = closureReturnPath().append(path0) ) @@ -3179,11 +3778,11 @@ private Type inferClosureExprType(AstNode n, TypePath path) { exists(ClosureExpr ce | n = ce and path.isEmpty() and - result = TDynTraitType(any(FnOnceTrait t)) + result = TDynTraitType(any(FnOnceTrait t)) // always exists because of the mention in `builtins/mentions.rs` or n = ce and path = TypePath::singleton(TDynTraitTypeParameter(any(FnOnceTrait t).getTypeParam())) and - result = TTuple(ce.getNumberOfParams()) + result.(TupleType).getArity() = ce.getNumberOfParams() or // Propagate return type annotation to body n = ce.getClosureBody() and @@ -3198,36 +3797,58 @@ private Type inferCastExprType(CastExpr ce, TypePath path) { cached private module Cached { - private import codeql.rust.internal.CachedStages - - /** Holds if `receiver` is the receiver of a method call with an implicit dereference. */ + /** Holds if `n` is implicitly dereferenced. */ cached - predicate receiverHasImplicitDeref(AstNode receiver) { - any(MethodResolution::MethodCall mc).receiverHasImplicitDeref(receiver) - } - - /** Holds if `receiver` is the receiver of a method call with an implicit borrow. */ - cached - predicate receiverHasImplicitBorrow(AstNode receiver) { - any(MethodResolution::MethodCall mc).receiverHasImplicitBorrow(receiver) - } - - /** Gets an item (function or tuple struct/variant) that `call` resolves to, if any. */ - cached - Addressable resolveCallTarget(Call call) { - result = call.(MethodResolution::MethodCall).resolveCallTarget(_, _) + predicate implicitDeref(AstNode n) { + any(MethodResolution::MethodCall mc).receiverHasImplicitDeref(n) or - result = call.(NonMethodResolution::NonMethodCall).resolveCallTarget() + n = + any(FieldExpr fe | + exists(resolveStructFieldExpr(fe, true)) + or + exists(resolveTupleFieldExpr(fe, true)) + ).getContainer() + } + + /** Holds if `n` is implicitly borrowed. */ + cached + predicate implicitBorrow(AstNode n, boolean isMutable) { + any(MethodResolution::MethodCall mc).argumentHasImplicitBorrow(n, isMutable) + } + + /** + * Gets an item (function or tuple struct/variant) that `call` resolves to, if + * any. + * + * The parameter `dispatch` is `true` if and only if the resolved target is a + * trait item because a precise target could not be determined from the + * types (for instance in the presence of generics or `dyn` types) + */ + cached + Addressable resolveCallTarget(InvocationExpr call, boolean dispatch) { + dispatch = false and + result = call.(NonMethodResolution::NonMethodCall).resolveCallTargetViaPathResolution() + or + exists(ImplOrTraitItemNode i | + i instanceof TraitItemNode and dispatch = true + or + i instanceof ImplItemNode and dispatch = false + | + result = call.(MethodResolution::MethodCall).resolveCallTarget(i, _, _) or + result = call.(NonMethodResolution::NonMethodCall).resolveCallTargetViaTypeInference(i) + ) } /** * Gets the struct field that the field expression `fe` resolves to, if any. */ cached - StructField resolveStructFieldExpr(FieldExpr fe) { - exists(string name, Type ty | ty = getFieldExprLookupType(fe, pragma[only_bind_into](name)) | - result = ty.(StructType).getStruct().getStructField(pragma[only_bind_into](name)) or - result = ty.(UnionType).getUnion().getStructField(pragma[only_bind_into](name)) + StructField resolveStructFieldExpr(FieldExpr fe, boolean isDereferenced) { + exists(string name, DataType ty | + ty = getFieldExprLookupType(fe, pragma[only_bind_into](name), isDereferenced) + | + result = ty.(StructType).getTypeItem().getStructField(pragma[only_bind_into](name)) or + result = ty.(UnionType).getTypeItem().getStructField(pragma[only_bind_into](name)) ) } @@ -3235,12 +3856,12 @@ private module Cached { * Gets the tuple field that the field expression `fe` resolves to, if any. */ cached - TupleField resolveTupleFieldExpr(FieldExpr fe) { + TupleField resolveTupleFieldExpr(FieldExpr fe, boolean isDereferenced) { exists(int i | result = - getTupleFieldExprLookupType(fe, pragma[only_bind_into](i)) + getTupleFieldExprLookupType(fe, pragma[only_bind_into](i), isDereferenced) .(StructType) - .getStruct() + .getTypeItem() .getTupleField(pragma[only_bind_into](i)) ) } @@ -3303,8 +3924,6 @@ private module Cached { or result = inferStructExprType(n, path) or - result = inferPathExprType(n, path) - or result = inferMethodCallType(n, path) or result = inferNonMethodCallType(n, path) @@ -3321,6 +3940,8 @@ private module Cached { or result = inferIndexExprType(n, path) or + result = inferDereferencedExprPtrType(n, path) + or result = inferForLoopExprType(n, path) or result = inferDynamicCallExprType(n, path) @@ -3356,16 +3977,16 @@ private module Debug { result = inferType(n, path) } - Addressable debugResolveCallTarget(Call c) { + Addressable debugResolveCallTarget(InvocationExpr c, boolean dispatch) { c = getRelevantLocatable() and - result = resolveCallTarget(c) + result = resolveCallTarget(c, dispatch) } predicate debugConditionSatisfiesConstraint( - TypeAbstraction abs, TypeMention condition, TypeMention constraint + TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive ) { abs = getRelevantLocatable() and - Input2::conditionSatisfiesConstraint(abs, condition, constraint) + Input2::conditionSatisfiesConstraint(abs, condition, constraint, transitive) } predicate debugInferShorthandSelfType(ShorthandSelfParameterMention self, TypePath path, Type t) { diff --git a/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll b/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll index 16eaff92bb6..11ad9bef2a2 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll @@ -11,7 +11,14 @@ import TypeInference::Consistency query predicate illFormedTypeMention(TypeMention tm) { Consistency::illFormedTypeMention(tm) and - not tm instanceof PathTypeReprMention and // avoid overlap with `PathTypeMention` + // avoid overlap with `PathTypeMention` + not tm instanceof PathTypeReprMention and + // known limitation for type mentions that would mention an escaping type parameter + not tm = + any(PathTypeMention ptm | + exists(ptm.resolvePathTypeAt(TypePath::nil())) and + not exists(ptm.resolveType()) + ) and // Only include inconsistencies in the source, as we otherwise get // inconsistencies from library code in every project. tm.fromSource() diff --git a/rust/ql/lib/codeql/rust/internal/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/TypeMention.qll index c4185efc91f..d8cf06827f6 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeMention.qll @@ -20,11 +20,11 @@ abstract class TypeMention extends AstNode { class TupleTypeReprMention extends TypeMention instanceof TupleTypeRepr { override Type resolveTypeAt(TypePath path) { path.isEmpty() and - result = TTuple(super.getNumberOfFields()) + result.(TupleType).getArity() = super.getNumberOfFields() or exists(TypePath suffix, int i | result = super.getField(i).(TypeMention).resolveTypeAt(suffix) and - path = TypePath::cons(TTupleTypeParameter(super.getNumberOfFields(), i), suffix) + path = TypePath::cons(getTupleTypeParameter(super.getNumberOfFields(), i), suffix) ) } } @@ -32,11 +32,11 @@ class TupleTypeReprMention extends TypeMention instanceof TupleTypeRepr { class ParenthesizedArgListMention extends TypeMention instanceof ParenthesizedArgList { override Type resolveTypeAt(TypePath path) { path.isEmpty() and - result = TTuple(super.getNumberOfTypeArgs()) + result.(TupleType).getArity() = super.getNumberOfTypeArgs() or exists(TypePath suffix, int index | result = super.getTypeArg(index).getTypeRepr().(TypeMention).resolveTypeAt(suffix) and - path = TypePath::cons(TTupleTypeParameter(super.getNumberOfTypeArgs(), index), suffix) + path = TypePath::cons(getTupleTypeParameter(super.getNumberOfTypeArgs(), index), suffix) ) } } @@ -44,23 +44,26 @@ class ParenthesizedArgListMention extends TypeMention instanceof ParenthesizedAr class ArrayTypeReprMention extends TypeMention instanceof ArrayTypeRepr { override Type resolveTypeAt(TypePath path) { path.isEmpty() and - result = TArrayType() + result instanceof ArrayType or exists(TypePath suffix | result = super.getElementTypeRepr().(TypeMention).resolveTypeAt(suffix) and - path = TypePath::cons(TArrayTypeParameter(), suffix) + path = TypePath::cons(getArrayTypeParameter(), suffix) ) } } class RefTypeReprMention extends TypeMention instanceof RefTypeRepr { + private RefType resolveRootType() { + if super.isMut() then result instanceof RefMutType else result instanceof RefSharedType + } + override Type resolveTypeAt(TypePath path) { - path.isEmpty() and - result = TRefType() + path.isEmpty() and result = this.resolveRootType() or exists(TypePath suffix | result = super.getTypeRepr().(TypeMention).resolveTypeAt(suffix) and - path = TypePath::cons(TRefTypeParameter(), suffix) + path = TypePath::cons(this.resolveRootType().getPositionalTypeParameter(0), suffix) ) } } @@ -68,16 +71,28 @@ class RefTypeReprMention extends TypeMention instanceof RefTypeRepr { class SliceTypeReprMention extends TypeMention instanceof SliceTypeRepr { override Type resolveTypeAt(TypePath path) { path.isEmpty() and - result = TSliceType() + result instanceof SliceType or exists(TypePath suffix | result = super.getTypeRepr().(TypeMention).resolveTypeAt(suffix) and - path = TypePath::cons(TSliceTypeParameter(), suffix) + path = TypePath::cons(getSliceTypeParameter(), suffix) ) } } -abstract class PathTypeMention extends TypeMention, Path { } +abstract class PathTypeMention extends TypeMention, Path { + abstract Type resolvePathTypeAt(TypePath typePath); + + final override Type resolveTypeAt(TypePath typePath) { + result = this.resolvePathTypeAt(typePath) and + ( + not result instanceof TypeParameter + or + // Prevent type parameters from escaping their scope + this = result.(TypeParameter).getDeclaringItem().getAChild*().getADescendant() + ) + } +} class AliasPathTypeMention extends PathTypeMention { TypeAlias resolved; @@ -94,7 +109,7 @@ class AliasPathTypeMention extends PathTypeMention { * Holds if this path resolved to a type alias with a rhs. that has the * resulting type at `typePath`. */ - override Type resolveTypeAt(TypePath typePath) { + override Type resolvePathTypeAt(TypePath typePath) { result = rhs.resolveTypeAt(typePath) and not result = pathGetTypeParameter(resolved, _) or @@ -108,6 +123,20 @@ class AliasPathTypeMention extends PathTypeMention { } } +/** + * Gets the `i`th type argument of `p`. + * + * Takes into account that variants can have type arguments applied to both the + * enum and the variant itself, e.g. `Option::::Some` is valid in addition + * to `Option::Some::`. + */ +TypeMention getPathTypeArgument(Path p, int i) { + result = p.getSegment().getGenericArgList().getTypeArg(i) + or + resolvePath(p) instanceof Variant and + result = p.getQualifier().getSegment().getGenericArgList().getTypeArg(i) +} + class NonAliasPathTypeMention extends PathTypeMention { TypeItemNode resolved; @@ -143,18 +172,6 @@ class NonAliasPathTypeMention extends PathTypeMention { ) } - /** - * Gets the positional type argument at index `i` that occurs in this path, if - * any. - */ - private TypeMention getPathPositionalTypeArgument(int i) { - result = this.getSegment().getGenericArgList().getTypeArg(i) - or - // `Option::::Some` is valid in addition to `Option::Some::` - resolvePath(this) instanceof Variant and - result = this.getQualifier().getSegment().getGenericArgList().getTypeArg(i) - } - /** * Gets the type mention that instantiates the implicit `Self` type parameter * for this path, if it occurs in the position of a trait bound. @@ -173,7 +190,7 @@ class NonAliasPathTypeMention extends PathTypeMention { private Type getDefaultPositionalTypeArgument(int i, TypePath path) { // If a type argument is not given in the path, then we use the default for // the type parameter if one exists for the type. - not exists(this.getPathPositionalTypeArgument(i)) and + not exists(getPathTypeArgument(this, i)) and // Defaults only apply to type mentions in type annotations this = any(PathTypeRepr ptp).getPath().getQualifier*() and exists(Type ty, TypePath prefix | @@ -191,7 +208,7 @@ class NonAliasPathTypeMention extends PathTypeMention { } private Type getPositionalTypeArgument(int i, TypePath path) { - result = this.getPathPositionalTypeArgument(i).resolveTypeAt(path) + result = getPathTypeArgument(this, i).resolveTypeAt(path) or result = this.getDefaultPositionalTypeArgument(i, path) } @@ -207,6 +224,11 @@ class NonAliasPathTypeMention extends PathTypeMention { ) } + pragma[nomagic] + private TypeAlias getResolvedAlias(string name) { + result = resolved.(TraitItemNode).getAssocItem(name) + } + /** Gets the type mention in this path for the type parameter `tp`, if any. */ pragma[nomagic] private TypeMention getTypeMentionForTypeParameter(TypeParameter tp) { @@ -228,16 +250,11 @@ class NonAliasPathTypeMention extends PathTypeMention { // } // ``` // the rhs. of the type alias is a type argument to the trait. - exists(ImplItemNode impl, AssociatedTypeTypeParameter param, TypeAlias alias, string name | + exists(ImplItemNode impl, TypeAlias alias, string name | this = impl.getTraitPath() and - param.getTrait() = resolved and - name = param.getTypeAlias().getName().getText() and alias = impl.getASuccessor(pragma[only_bind_into](name)) and result = alias.getTypeRepr() and - tp = - TAssociatedTypeTypeParameter(resolved - .(TraitItemNode) - .getAssocItem(pragma[only_bind_into](name))) + tp = TAssociatedTypeTypeParameter(this.getResolvedAlias(pragma[only_bind_into](name))) ) or // Handle the special syntactic sugar for function traits. For now we only @@ -254,9 +271,7 @@ class NonAliasPathTypeMention extends PathTypeMention { pragma[nomagic] private Type resolveRootType() { - result = TStruct(resolved) - or - result = TEnum(resolved) + result = TDataType(resolved) or exists(TraitItemNode trait | trait = resolved | // If this is a `Self` path, then it resolves to the implicit `Self` @@ -266,14 +281,12 @@ class NonAliasPathTypeMention extends PathTypeMention { else result = TTrait(trait) ) or - result = TUnion(resolved) - or result = TTypeParamTypeParameter(resolved) or result = TAssociatedTypeTypeParameter(resolved) } - override Type resolveTypeAt(TypePath typePath) { + override Type resolvePathTypeAt(TypePath typePath) { typePath.isEmpty() and result = this.resolveRootType() or @@ -289,6 +302,9 @@ class NonAliasPathTypeMention extends PathTypeMention { result = this.getSelfTraitBoundArg().resolveTypeAt(suffix) and typePath = TypePath::cons(TSelfTypeParameter(resolved), suffix) ) + or + not this.getSegment().hasTraitTypeRepr() and + result = this.getSegment().getTypeRepr().(TypeMention).resolveTypeAt(typePath) } } @@ -302,7 +318,9 @@ class ImplSelfMention extends PathTypeMention { ImplSelfMention() { this = impl.getASelfPath() } - override Type resolveTypeAt(TypePath typePath) { result = resolveImplSelfTypeAt(impl, typePath) } + override Type resolvePathTypeAt(TypePath typePath) { + result = resolveImplSelfTypeAt(impl, typePath) + } } class PathTypeReprMention extends TypeMention, PathTypeRepr { @@ -419,20 +437,24 @@ class ShorthandSelfParameterMention extends TypeMention instanceof SelfParam { private Type resolveSelfType(TypePath path) { result = resolveImplOrTraitType(encl, path) } + private RefType resolveSelfRefRootType() { + super.isRef() and + if super.isMut() then result instanceof RefMutType else result instanceof RefSharedType + } + override Type resolveTypeAt(TypePath typePath) { - if super.isRef() - then - // `fn f(&self, ...)` - typePath.isEmpty() and - result = TRefType() - or - exists(TypePath suffix | - result = this.resolveSelfType(suffix) and - typePath = TypePath::cons(TRefTypeParameter(), suffix) - ) - else - // `fn f(self, ...)` - result = this.resolveSelfType(typePath) + // `fn f(&self, ...)` + typePath.isEmpty() and + result = this.resolveSelfRefRootType() + or + exists(TypePath suffix | + result = this.resolveSelfType(suffix) and + typePath = TypePath::cons(this.resolveSelfRefRootType().getPositionalTypeParameter(0), suffix) + ) + or + // `fn f(self, ...)` + not super.isRef() and + result = this.resolveSelfType(typePath) } } @@ -537,13 +559,18 @@ class NeverTypeReprMention extends TypeMention, NeverTypeRepr { } class PtrTypeReprMention extends TypeMention instanceof PtrTypeRepr { + private PtrType resolveRootType() { + super.isConst() and result instanceof PtrConstType + or + super.isMut() and result instanceof PtrMutType + } + override Type resolveTypeAt(TypePath path) { - path.isEmpty() and - result = TPtrType() + path.isEmpty() and result = this.resolveRootType() or exists(TypePath suffix | result = super.getTypeRepr().(TypeMention).resolveTypeAt(suffix) and - path = TypePath::cons(TPtrTypeParameter(), suffix) + path = TypePath::cons(this.resolveRootType().getPositionalTypeParameter(0), suffix) ) } } diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll b/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll index 6ddb7ee3be0..c60ad3f6ae3 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll @@ -92,7 +92,8 @@ module SatisfiesBlanketConstraint< Type getTypeAt(TypePath path) { result = at.getTypeAt(blanketPath.appendInverse(path)) and - not result = TNeverType() + not result = TNeverType() and + not result = TUnknownType() } string toString() { result = at.toString() + " [blanket at " + blanketPath.toString() + "]" } diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll b/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll index 10c007a9d72..bbbbeaba2a6 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll @@ -3,7 +3,6 @@ private import codeql.rust.internal.TypeInference private import codeql.rust.internal.PathResolution private import codeql.rust.internal.Type private import codeql.rust.internal.TypeMention -private import codeql.rust.elements.Call private newtype TFunctionPosition = TArgumentFunctionPosition(ArgumentPosition pos) or @@ -72,16 +71,24 @@ module FunctionPositionMatchingInput { } private newtype TAssocFunctionType = - /** An associated function `f` that should be specialized for `i` at `pos`. */ - MkAssocFunctionType(Function f, ImplOrTraitItemNode i, FunctionPosition pos) { - f = i.getASuccessor(_) and exists(pos.getTypeMention(f)) + /** An associated function `f` in `parent` should be specialized for `i` at `pos`. */ + MkAssocFunctionType( + ImplOrTraitItemNode parent, Function f, ImplOrTraitItemNode i, FunctionPosition pos + ) { + parent.getAnAssocItem() = f and + i.getASuccessor(_) = f and + // When `f` is not directly in `i`, the `parent` should be satisfiable + // through `i`. This ensures that `parent` is either a supertrait of `i` or + // `i` in an `impl` block implementing `parent`. + (parent = i or BaseTypes::rootTypesSatisfaction(_, TTrait(parent), i, _, _)) and + exists(pos.getTypeMention(f)) } -bindingset[condition, constraint, tp] +bindingset[abs, constraint, tp] private Type getTraitConstraintTypeAt( - TypeMention condition, TypeMention constraint, TypeParameter tp, TypePath path + TypeAbstraction abs, TypeMention constraint, TypeParameter tp, TypePath path ) { - BaseTypes::conditionSatisfiesConstraintTypeAt(_, condition, constraint, + BaseTypes::conditionSatisfiesConstraintTypeAt(abs, _, constraint, TypePath::singleton(tp).appendInverse(path), result) } @@ -91,28 +98,19 @@ private Type getTraitConstraintTypeAt( */ pragma[nomagic] Type getAssocFunctionTypeAt(Function f, ImplOrTraitItemNode i, FunctionPosition pos, TypePath path) { - exists(MkAssocFunctionType(f, i, pos)) and - ( + exists(ImplOrTraitItemNode parent | exists(MkAssocFunctionType(parent, f, i, pos)) | // No specialization needed when the function is directly in the trait or // impl block or the declared type is not a type parameter - (i.getAnAssocItem() = f or not result instanceof TypeParameter) and + (parent = i or not result instanceof TypeParameter) and result = pos.getTypeMention(f).resolveTypeAt(path) or - not i.getAnAssocItem() = f and - exists(TypePath prefix, TypePath suffix, TypeParameter tp | + exists(TypePath prefix, TypePath suffix, TypeParameter tp, TypeMention constraint | + BaseTypes::rootTypesSatisfaction(_, TTrait(parent), i, _, constraint) and path = prefix.append(suffix) and - tp = pos.getTypeMention(f).resolveTypeAt(prefix) - | + tp = pos.getTypeMention(f).resolveTypeAt(prefix) and if tp = TSelfTypeParameter(_) then result = resolveImplOrTraitType(i, suffix) - else - exists(TraitItemNode trait, TypeMention condition, TypeMention constraint | - trait.getAnAssocItem() = f and - BaseTypes::rootTypesSatisfaction(_, TTrait(trait), _, condition, constraint) and - result = getTraitConstraintTypeAt(condition, constraint, tp, suffix) - | - condition = i.(Trait) or condition = i.(Impl).getSelfTy() - ) + else result = getTraitConstraintTypeAt(i, constraint, tp, suffix) ) ) } @@ -125,32 +123,34 @@ Type getAssocFunctionTypeAt(Function f, ImplOrTraitItemNode i, FunctionPosition * * ```rust * trait T1 { - * fn m1(self); // self1 + * fn m1(self); // T1::m1 * - * fn m2(self) { ... } // self2 + * fn m2(self) { ... } // T1::m2 * } * * trait T2 : T1 { - * fn m3(self); // self3 + * fn m3(self); // T2::m3 + * } + * + * impl T1 for X { + * fn m1(self) { ... } // X::m1 * } * * impl T2 for X { - * fn m1(self) { ... } // self4 - * - * fn m3(self) { ... } // self5 + * fn m3(self) { ... } // X::m3 * } * ``` * - * param | `impl` or trait | type - * ------- | --------------- | ---- - * `self1` | `trait T1` | `T1` - * `self1` | `trait T2` | `T2` - * `self2` | `trait T1` | `T1` - * `self2` | `trait T2` | `T2` - * `self2` | `impl T2 for X` | `X` - * `self3` | `trait T2` | `T2` - * `self4` | `impl T2 for X` | `X` - * `self5` | `impl T2 for X` | `X` + * f | `impl` or trait | pos | type + * -------- | --------------- | ------ | ---- + * `T1::m1` | `trait T1` | `self` | `T1` + * `T1::m1` | `trait T2` | `self` | `T2` + * `T1::m2` | `trait T1` | `self` | `T1` + * `T1::m2` | `trait T2` | `self` | `T2` + * `T1::m2` | `impl T1 for X` | `self` | `X` + * `T2::m3` | `trait T2` | `self` | `T2` + * `X::m1` | `impl T1 for X` | `self` | `X` + * `X::m3` | `impl T2 for X` | `self` | `X` */ class AssocFunctionType extends MkAssocFunctionType { /** @@ -158,7 +158,7 @@ class AssocFunctionType extends MkAssocFunctionType { * when viewed as a member of the `impl` or trait item `i`. */ predicate appliesTo(Function f, ImplOrTraitItemNode i, FunctionPosition pos) { - this = MkAssocFunctionType(f, i, pos) + this = MkAssocFunctionType(_, f, i, pos) } /** @@ -194,6 +194,7 @@ class AssocFunctionType extends MkAssocFunctionType { Location getLocation() { result = this.getTypeMention().getLocation() } } +pragma[nomagic] private Trait getALookupTrait(Type t) { result = t.(TypeParamTypeParameter).getTypeParam().(TypeParamItemNode).resolveABound() or @@ -208,7 +209,7 @@ private Trait getALookupTrait(Type t) { * Gets the type obtained by substituting in relevant traits in which to do function * lookup, or `t` itself when no such trait exist. */ -bindingset[t] +pragma[nomagic] Type substituteLookupTraits(Type t) { not exists(getALookupTrait(t)) and result = t @@ -216,6 +217,30 @@ Type substituteLookupTraits(Type t) { result = TTrait(getALookupTrait(t)) } +/** + * Gets the `n`th `substituteLookupTraits` type for `t`, per some arbitrary order. + */ +pragma[nomagic] +Type getNthLookupType(Type t, int n) { + not exists(getALookupTrait(t)) and + result = t and + n = 0 + or + result = + TTrait(rank[n + 1](Trait trait, int i | + trait = getALookupTrait(t) and + i = idOfTypeParameterAstNode(trait) + | + trait order by i + )) +} + +/** + * Gets the index of the last `substituteLookupTraits` type for `t`. + */ +pragma[nomagic] +int getLastLookupTypeIndex(Type t) { result = max(int n | exists(getNthLookupType(t, n))) } + /** * A wrapper around `IsInstantiationOf` which ensures to substitute in lookup * traits when checking whether argument types are instantiations of function @@ -229,7 +254,8 @@ module ArgIsInstantiationOf< private class ArgSubst extends ArgFinal { Type getTypeAt(TypePath path) { result = substituteLookupTraits(super.getTypeAt(path)) and - not result = TNeverType() + not result = TNeverType() and + not result = TUnknownType() } } @@ -255,8 +281,10 @@ module ArgIsInstantiationOf< ArgSubstIsInstantiationOf::isInstantiationOf(arg, i, constraint) } - predicate argIsNotInstantiationOf(Arg arg, ImplOrTraitItemNode i, AssocFunctionType constraint) { - ArgSubstIsInstantiationOf::isNotInstantiationOf(arg, i, constraint) + predicate argIsNotInstantiationOf( + Arg arg, ImplOrTraitItemNode i, AssocFunctionType constraint, TypePath path + ) { + ArgSubstIsInstantiationOf::isNotInstantiationOf(arg, i, constraint, path) } } @@ -350,7 +378,7 @@ module ArgsAreInstantiationsOf { | rnk = 0 or - argsAreInstantiationsOfFromIndex(call, abs, f, rnk - 1) + argsAreInstantiationsOfToIndex(call, abs, f, rnk - 1) ) } @@ -359,15 +387,15 @@ module ArgsAreInstantiationsOf { } } - private module ArgIsInstantiationOfFromIndex = + private module ArgIsInstantiationOfToIndex = ArgIsInstantiationOf; pragma[nomagic] - private predicate argsAreInstantiationsOfFromIndex( + private predicate argsAreInstantiationsOfToIndex( Input::Call call, ImplOrTraitItemNode i, Function f, int rnk ) { exists(FunctionPosition pos | - ArgIsInstantiationOfFromIndex::argIsInstantiationOf(MkCallAndPos(call, pos), i, _) and + ArgIsInstantiationOfToIndex::argIsInstantiationOf(MkCallAndPos(call, pos), i, _) and call.hasTargetCand(i, f) and toCheckRanked(i, f, pos, rnk) ) @@ -380,7 +408,7 @@ module ArgsAreInstantiationsOf { pragma[nomagic] predicate argsAreInstantiationsOf(Input::Call call, ImplOrTraitItemNode i, Function f) { exists(int rnk | - argsAreInstantiationsOfFromIndex(call, i, f, rnk) and + argsAreInstantiationsOfToIndex(call, i, f, rnk) and rnk = max(int r | toCheckRanked(i, f, _, r)) ) } diff --git a/rust/ql/lib/codeql/rust/security/AccessAfterLifetimeExtensions.qll b/rust/ql/lib/codeql/rust/security/AccessAfterLifetimeExtensions.qll index 4b3177c9df9..64b806331a6 100644 --- a/rust/ql/lib/codeql/rust/security/AccessAfterLifetimeExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/AccessAfterLifetimeExtensions.qll @@ -39,6 +39,14 @@ module AccessAfterLifetime { */ abstract class Barrier extends DataFlow::Node { } + /** + * Holds if the value pointed to by `source` accesses a variable `target` with scope `scope`. + */ + pragma[nomagic] + predicate sourceValueScope(Source source, Variable target, BlockExpr scope) { + valueScope(source.getTarget(), target, scope) + } + /** * Holds if the pair `(source, sink)`, that represents a flow from a * pointer or reference to a dereference, has its dereference outside the @@ -47,8 +55,8 @@ module AccessAfterLifetime { bindingset[source, sink] predicate dereferenceAfterLifetime(Source source, Sink sink, Variable target) { exists(BlockExpr valueScope, BlockExpr accessScope | - valueScope(source.getTarget(), target, valueScope) and - accessScope = sink.asExpr().getExpr().getEnclosingBlock() and + sourceValueScope(source, target, valueScope) and + accessScope = sink.asExpr().getEnclosingBlock() and not mayEncloseOnStack(valueScope, accessScope) ) } @@ -92,9 +100,9 @@ module AccessAfterLifetime { a = b.getEnclosingBlock*() or // propagate through function calls - exists(CallExprBase ce | - mayEncloseOnStack(a, ce.getEnclosingBlock()) and - ce.getStaticTarget() = b.getEnclosingCallable() + exists(Call call | + mayEncloseOnStack(a, call.getEnclosingBlock()) and + call.getARuntimeTarget() = b.getEnclosingCallable() ) } @@ -104,7 +112,7 @@ module AccessAfterLifetime { private class RefExprSource extends Source { Expr targetValue; - RefExprSource() { this.asExpr().getExpr().(RefExpr).getExpr() = targetValue } + RefExprSource() { this.asExpr().(RefExpr).getExpr() = targetValue } override Expr getTarget() { result = targetValue } } @@ -114,6 +122,6 @@ module AccessAfterLifetime { * variables through closures properly. */ private class ClosureBarrier extends Barrier { - ClosureBarrier() { this.asExpr().getExpr().getEnclosingCallable() instanceof ClosureExpr } + ClosureBarrier() { this.asExpr().getEnclosingCallable() instanceof ClosureExpr } } } diff --git a/rust/ql/lib/codeql/rust/security/AccessInvalidPointerExtensions.qll b/rust/ql/lib/codeql/rust/security/AccessInvalidPointerExtensions.qll index 444db014209..d8d7be25933 100644 --- a/rust/ql/lib/codeql/rust/security/AccessInvalidPointerExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/AccessInvalidPointerExtensions.qll @@ -9,6 +9,9 @@ private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink private import codeql.rust.Concepts private import codeql.rust.dataflow.internal.Node +private import codeql.rust.security.Barriers as Barriers +private import codeql.rust.internal.TypeInference as TypeInference +private import codeql.rust.internal.Type /** * Provides default sources, sinks and barriers for detecting accesses to @@ -46,17 +49,29 @@ module AccessInvalidPointer { ModelsAsDataSource() { sourceNode(this, "pointer-invalidate") } } - /** - * A pointer access using the unary `*` operator. - */ + /** A raw pointer access using the unary `*` operator. */ private class DereferenceSink extends Sink { - DereferenceSink() { any(DerefExpr p).getExpr() = this.asExpr().getExpr() } + DereferenceSink() { + exists(Expr p, DerefExpr d | p = d.getExpr() and p = this.asExpr() | + // Dereferencing a raw pointer is an unsafe operation. Hence relevant + // dereferences must occur inside code marked as unsafe. + // See: https://doc.rust-lang.org/reference/types/pointer.html#r-type.pointer.raw.safety + (p.getEnclosingBlock*().isUnsafe() or p.getEnclosingCallable().(Function).isUnsafe()) and + // We are only interested in dereferences of raw pointers, as other uses + // of `*` are safe. + (not exists(TypeInference::inferType(p)) or TypeInference::inferType(p) instanceof PtrType) + ) + } } - /** - * A pointer access from model data. - */ + /** A pointer access from model data. */ private class ModelsAsDataSink extends Sink { ModelsAsDataSink() { sinkNode(this, "pointer-access") } } + + /** + * A barrier for invalid pointer access vulnerabilities for values checked to + * be non-`null`. + */ + private class NotNullCheckBarrier extends Barrier instanceof Barriers::NotNullCheckBarrier { } } diff --git a/rust/ql/lib/codeql/rust/security/Barriers.qll b/rust/ql/lib/codeql/rust/security/Barriers.qll index 398e4f56712..a285bfe3569 100644 --- a/rust/ql/lib/codeql/rust/security/Barriers.qll +++ b/rust/ql/lib/codeql/rust/security/Barriers.qll @@ -1,5 +1,5 @@ /** - * Classes to represent barriers commonly used in dataflow and taint tracking + * Classes to represent barriers commonly used in data flow and taint tracking * configurations. */ @@ -7,36 +7,58 @@ import rust private import codeql.rust.dataflow.DataFlow private import codeql.rust.internal.TypeInference as TypeInference private import codeql.rust.internal.Type -private import codeql.rust.frameworks.stdlib.Builtins +private import codeql.rust.controlflow.ControlFlowGraph as Cfg +private import codeql.rust.controlflow.CfgNodes as CfgNodes +private import codeql.rust.frameworks.stdlib.Builtins as Builtins -/** - * A node whose type is a numeric or boolean type, which may be an appropriate - * taint flow barrier for some queries. - */ +/** A node whose type is a numeric type. */ class NumericTypeBarrier extends DataFlow::Node { NumericTypeBarrier() { - exists(StructType t, Struct s | - t = TypeInference::inferType(this.asExpr().getExpr()) and - s = t.getStruct() - | - s instanceof NumericType or - s instanceof Bool - ) + TypeInference::inferType(this.asExpr()).(StructType).getTypeItem() instanceof + Builtins::NumericType + } +} + +/** A node whose type is `bool`. */ +class BooleanTypeBarrier extends DataFlow::Node { + BooleanTypeBarrier() { + TypeInference::inferType(this.asExpr()).(StructType).getTypeItem() instanceof Builtins::Bool + } +} + +/** A node whose type is an integral (integer). */ +class IntegralTypeBarrier extends DataFlow::Node { + IntegralTypeBarrier() { + TypeInference::inferType(this.asExpr()).(StructType).getTypeItem() instanceof + Builtins::IntegralType + } +} + +/** A node whose type is a fieldless enum. */ +class FieldlessEnumTypeBarrier extends DataFlow::Node { + FieldlessEnumTypeBarrier() { + TypeInference::inferType(this.asExpr()).(EnumType).getTypeItem().isFieldless() } } /** - * A node whose type is an integral (integer) or boolean type, which may be an + * Holds if guard expression `g` having result `branch` indicates that the + * sub-expression `e` is not null. For example when `ptr.is_null()` is + * `false`, we have that `ptr` is not null. + */ +private predicate notNullCheck(AstNode g, Expr e, boolean branch) { + exists(MethodCallExpr call | + call.getStaticTarget().getName().getText() = "is_null" and + g = call and + e = call.getReceiver() and + branch = false + ) +} + +/** + * A node representing a value checked to be non-null. This may be an * appropriate taint flow barrier for some queries. */ -class IntegralOrBooleanTypeBarrier extends DataFlow::Node { - IntegralOrBooleanTypeBarrier() { - exists(StructType t, Struct s | - t = TypeInference::inferType(this.asExpr().getExpr()) and - s = t.getStruct() - | - s instanceof IntegralType or - s instanceof Bool - ) - } +class NotNullCheckBarrier extends DataFlow::Node { + NotNullCheckBarrier() { this = DataFlow::BarrierGuard::getABarrierNode() } } diff --git a/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll b/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll index 0961efd553f..f634992fb81 100644 --- a/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll @@ -8,6 +8,7 @@ private import codeql.rust.dataflow.DataFlow private import codeql.rust.dataflow.FlowSink private import codeql.rust.security.SensitiveData private import codeql.rust.Concepts +private import codeql.rust.security.Barriers as Barriers /** * Provides default sources, sinks and barriers for detecting cleartext logging @@ -42,4 +43,9 @@ module CleartextLogging { private class ModelsAsDataSink extends Sink { ModelsAsDataSink() { sinkNode(this, "log-injection") } } + + private class BooleanTypeBarrier extends Barrier instanceof Barriers::BooleanTypeBarrier { } + + private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier + { } } diff --git a/rust/ql/lib/codeql/rust/security/DisabledCertificateCheckExtensions.qll b/rust/ql/lib/codeql/rust/security/DisabledCertificateCheckExtensions.qll new file mode 100644 index 00000000000..a86ee506dfa --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/DisabledCertificateCheckExtensions.qll @@ -0,0 +1,45 @@ +/** + * Provides classes and predicates for reasoning about disabled certificate + * check vulnerabilities. + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.Concepts +private import codeql.rust.dataflow.internal.Node as Node + +/** + * Provides default sinks for detecting disabled certificate check + * vulnerabilities, as well as extension points for adding your own. + */ +module DisabledCertificateCheckExtensions { + /** + * A data flow sink for disabled certificate check vulnerabilities. + */ + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "DisabledCertificateCheck" } + } + + /** + * A sink for disabled certificate check vulnerabilities from model data. + */ + private class ModelsAsDataSink extends Sink { + ModelsAsDataSink() { sinkNode(this, "disable-certificate") } + } + + /** + * A heuristic sink for disabled certificate check vulnerabilities based on function names. + */ + private class HeuristicSink extends Sink { + HeuristicSink() { + exists(Call call | + call.getStaticTarget().getName().getText() = + ["danger_accept_invalid_certs", "danger_accept_invalid_hostnames"] and + call.getPositionalArgument(0) = this.asExpr() and + // don't duplicate modeled sinks + not exists(ModelsAsDataSink s | s.(Node::FlowSummaryNode).getSinkElement().getCall() = call) + ) + } + } +} diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index bc487e42ef0..9bdfc53971e 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -9,6 +9,7 @@ private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink private import codeql.rust.Concepts private import codeql.rust.security.SensitiveData +private import codeql.rust.dataflow.internal.Node as Node /** * A kind of cryptographic value. @@ -63,7 +64,7 @@ module HardcodedCryptographicValue { * A literal, considered as a flow source. */ private class LiteralSource extends Source { - LiteralSource() { this.asExpr().getExpr() instanceof LiteralExpr } + LiteralSource() { this.asExpr() instanceof LiteralExpr } } /** @@ -75,8 +76,8 @@ module HardcodedCryptographicValue { */ private class ArrayListSource extends Source { ArrayListSource() { - this.asExpr().getExpr().(ArrayListExpr).getExpr(_) instanceof LiteralExpr or - this.asExpr().getExpr().(ArrayRepeatExpr).getRepeatOperand() instanceof LiteralExpr + this.asExpr().(ArrayListExpr).getExpr(_) instanceof LiteralExpr or + this.asExpr().(ArrayRepeatExpr).getRepeatOperand() instanceof LiteralExpr } } @@ -98,15 +99,45 @@ module HardcodedCryptographicValue { override CryptographicValueKind getKind() { result = kind } } + /** + * A heuristic sink for hard-coded cryptographic value vulnerabilities. + */ + private class HeuristicSinks extends Sink { + CryptographicValueKind kind; + + HeuristicSinks() { + // any argument going to a parameter whose name matches a credential name + exists(Call c, Function f, int argIndex, string argName | + c.getPositionalArgument(argIndex) = this.asExpr() and + c.getStaticTarget() = f and + f.getParam(argIndex).getPat().(IdentPat).getName().getText() = argName and + ( + argName = "password" and kind = "password" + or + argName = "iv" and kind = "iv" + or + argName = "nonce" and kind = "nonce" + or + argName = "salt" and kind = "salt" + // + // note: matching "key" results in too many false positives + ) and + // don't duplicate modeled sinks + not exists(ModelsAsDataSinks s | s.(Node::FlowSummaryNode).getSinkElement().getCall() = c) + ) + } + + override CryptographicValueKind getKind() { result = kind } + } + /** * A call to `getrandom` that is a barrier. */ private class GetRandomBarrier extends Barrier { GetRandomBarrier() { - exists(CallExprBase ce | - ce.getStaticTarget().(Addressable).getCanonicalPath() = - ["getrandom::fill", "getrandom::getrandom"] and - this.asExpr().getExpr().getParentNode*() = ce.getArgList().getArg(0) + exists(Call call | + call.getStaticTarget().getCanonicalPath() = ["getrandom::fill", "getrandom::getrandom"] and + this.asExpr().getParentNode*() = call.getPositionalArgument(0) ) } } diff --git a/rust/ql/lib/codeql/rust/security/InsecureCookieExtensions.qll b/rust/ql/lib/codeql/rust/security/InsecureCookieExtensions.qll index d5d15c821d8..87d37d6b85b 100644 --- a/rust/ql/lib/codeql/rust/security/InsecureCookieExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/InsecureCookieExtensions.qll @@ -80,18 +80,18 @@ module InsecureCookie { * as `false`. */ predicate cookieSetNode(DataFlow::Node node, string attrib, boolean value) { - exists(FlowSummaryNode summaryNode, CallExprBase ce, int arg, DataFlow::Node argNode | + exists(FlowSummaryNode summaryNode, MethodCall call, int arg, DataFlow::Node argNode | // decode the models-as-data `OptionalBarrier` cookieOptionalBarrier(summaryNode, attrib, arg) and // find a call and arg referenced by this optional barrier - ce.getStaticTarget() = summaryNode.getSummarizedCallable() and - ce.getArg(arg) = argNode.asExpr().getExpr() and + call.getStaticTarget() = summaryNode.getSummarizedCallable() and + call.getPositionalArgument(arg) = argNode.asExpr() and // check if the argument is always `true` ( if forex(DataFlow::Node argSourceNode, BooleanLiteralExpr argSourceValue | DataFlow::localFlow(argSourceNode, argNode) and - argSourceValue = argSourceNode.asExpr().getExpr() + argSourceValue = argSourceNode.asExpr() | argSourceValue.getTextValue() = "true" ) @@ -101,12 +101,12 @@ module InsecureCookie { // and find the node where this happens (we can't just use the flow summary node, since its // shared across all calls to the modeled function, we need a node specific to this call) ( - node.asExpr().getExpr() = ce.(MethodCallExpr).getReceiver() // e.g. `a` in `a.set_secure(true)` + node.asExpr() = call.getReceiver() // e.g. `a` in `a.set_secure(true)` or exists(BasicBlock bb, int i | // associated SSA node node.(SsaNode).asDefinition().definesAt(_, bb, i) and - ce.(MethodCallExpr).getReceiver() = bb.getNode(i).getAstNode() + call.getReceiver() = bb.getNode(i).getAstNode() ) ) ) diff --git a/rust/ql/lib/codeql/rust/security/LogInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/LogInjectionExtensions.qll index dafebc96731..31403b625f9 100644 --- a/rust/ql/lib/codeql/rust/security/LogInjectionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/LogInjectionExtensions.qll @@ -46,7 +46,12 @@ module LogInjection { /** * A barrier for log injection vulnerabilities for nodes whose type is a - * numeric or boolean type, which is unlikely to expose any vulnerability. + * numeric type, which is unlikely to expose any vulnerability. */ private class NumericTypeBarrier extends Barrier instanceof Barriers::NumericTypeBarrier { } + + private class BooleanTypeBarrier extends Barrier instanceof Barriers::BooleanTypeBarrier { } + + private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier + { } } diff --git a/rust/ql/lib/codeql/rust/security/SensitiveData.qll b/rust/ql/lib/codeql/rust/security/SensitiveData.qll index 4e6ba21a2d2..c4cd7c31366 100644 --- a/rust/ql/lib/codeql/rust/security/SensitiveData.qll +++ b/rust/ql/lib/codeql/rust/security/SensitiveData.qll @@ -28,12 +28,13 @@ private class SensitiveDataCall extends SensitiveData { SensitiveDataClassification classification; SensitiveDataCall() { - exists(CallExprBase call, string name | - call = this.asExpr().getExpr() and + exists(InvocationExpr call, Addressable target, string name | + call = this.asExpr() and + target = call.getResolvedTarget() and name = [ - call.getStaticTarget().(Function).getName().getText(), - call.(CallExpr).getVariant().getName().getText(), + target.(Function).getName().getText(), + target.(Variant).getName().getText(), ] and HeuristicNames::nameIndicatesSensitiveData(name, classification) ) @@ -50,7 +51,6 @@ private class SensitiveVariableAccess extends SensitiveData { SensitiveVariableAccess() { HeuristicNames::nameIndicatesSensitiveData(this.asExpr() - .getExpr() .(VariableAccess) .getVariable() .(Variable) @@ -69,7 +69,7 @@ private class SensitiveFieldAccess extends SensitiveData { SensitiveDataClassification classification; SensitiveFieldAccess() { - exists(FieldExpr fe | fieldExprParentField*(fe) = this.asExpr().getExpr() | + exists(FieldExpr fe | fieldExprParentField*(fe) = this.asExpr() | HeuristicNames::nameIndicatesSensitiveData(fe.getIdentifier().getText(), classification) ) } diff --git a/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll index ff81df37e40..f36ab264987 100644 --- a/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll @@ -60,8 +60,13 @@ module SqlInjection { } /** - * A barrier for SQL injection vulnerabilities for nodes whose type is a numeric or - * boolean type, which is unlikely to expose any vulnerability. + * A barrier for SQL injection vulnerabilities for nodes whose type is a numeric + * type, which is unlikely to expose any vulnerability. */ private class NumericTypeBarrier extends Barrier instanceof Barriers::NumericTypeBarrier { } + + private class BooleanTypeBarrier extends Barrier instanceof Barriers::BooleanTypeBarrier { } + + private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier + { } } diff --git a/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll b/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll index 9310999bd3d..ccf3736ceb4 100644 --- a/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll @@ -8,7 +8,6 @@ private import codeql.rust.dataflow.TaintTracking private import codeql.rust.Concepts private import codeql.rust.dataflow.internal.DataFlowImpl private import codeql.rust.controlflow.ControlFlowGraph as Cfg -private import codeql.rust.controlflow.CfgNodes as CfgNodes /** * Provides default sources, sinks and barriers for detecting path injection @@ -50,16 +49,16 @@ module TaintedPath { } } -private predicate sanitizerGuard(CfgNodes::AstCfgNode g, Cfg::CfgNode node, boolean branch) { - g.(SanitizerGuard::Range).checks(node, branch) +private predicate sanitizerGuard(AstNode g, Expr e, boolean branch) { + g.(SanitizerGuard::Range).checks(e, branch) } /** Provides a class for modeling new path safety checks. */ module SanitizerGuard { /** A data-flow node that checks that a path is safe to access. */ - abstract class Range extends CfgNodes::AstCfgNode { - /** Holds if this guard validates `node` upon evaluating to `branch`. */ - abstract predicate checks(Cfg::CfgNode node, boolean branch); + abstract class Range extends AstNode { + /** Holds if this guard validates `e` upon evaluating to `branch`. */ + abstract predicate checks(Expr e, boolean branch); } } @@ -67,15 +66,14 @@ module SanitizerGuard { * A check of the form `!strings.Contains(nd, "..")`, considered as a sanitizer guard for * path traversal. */ -private class DotDotCheck extends SanitizerGuard::Range, CfgNodes::MethodCallExprCfgNode { +private class DotDotCheck extends SanitizerGuard::Range, MethodCall { DotDotCheck() { - this.getAstNode().(CallExprBase).getStaticTarget().(Addressable).getCanonicalPath() = + this.getStaticTarget().getCanonicalPath() = ["::contains", "::contains"] and - this.getArgument(0).getAstNode().(LiteralExpr).getTextValue() = - ["\"..\"", "\"../\"", "\"..\\\""] + this.getPositionalArgument(0).(LiteralExpr).getTextValue() = ["\"..\"", "\"../\"", "\"..\\\""] } - override predicate checks(Cfg::CfgNode e, boolean branch) { + override predicate checks(Expr e, boolean branch) { e = this.getReceiver() and branch = false } diff --git a/rust/ql/lib/codeql/rust/security/UncontrolledAllocationSizeExtensions.qll b/rust/ql/lib/codeql/rust/security/UncontrolledAllocationSizeExtensions.qll index 2f4898f6e9d..c6251563ea6 100644 --- a/rust/ql/lib/codeql/rust/security/UncontrolledAllocationSizeExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/UncontrolledAllocationSizeExtensions.qll @@ -7,8 +7,6 @@ import rust private import codeql.rust.Concepts private import codeql.rust.dataflow.DataFlow private import codeql.rust.dataflow.FlowSink -private import codeql.rust.controlflow.ControlFlowGraph as Cfg -private import codeql.rust.controlflow.CfgNodes as CfgNodes /** * Provides default sources, sinks and barriers for detecting uncontrolled @@ -45,23 +43,24 @@ module UncontrolledAllocationSize { /** * Holds if comparison `g` having result `branch` indicates an upper bound for the sub-expression - * `node`. For example when the comparison `x < 10` is true, we have an upper bound for `x`. + * `e`. For example when the comparison `x < 10` is true, we have an upper bound for `x`. */ - private predicate isUpperBoundCheck(CfgNodes::AstCfgNode g, Cfg::CfgNode node, boolean branch) { - exists(BinaryExpr cmp | g = cmp.getACfgNode() | - node = cmp.(RelationalOperation).getLesserOperand().getACfgNode() and - branch = true - or - node = cmp.(RelationalOperation).getGreaterOperand().getACfgNode() and - branch = false - or - cmp instanceof EqualsOperation and - [cmp.getLhs(), cmp.getRhs()].getACfgNode() = node and - branch = true - or - cmp instanceof NotEqualsOperation and - [cmp.getLhs(), cmp.getRhs()].getACfgNode() = node and - branch = false - ) + private predicate isUpperBoundCheck(AstNode g, Expr e, boolean branch) { + g = + any(BinaryExpr cmp | + e = cmp.(RelationalOperation).getLesserOperand() and + branch = true + or + e = cmp.(RelationalOperation).getGreaterOperand() and + branch = false + or + cmp instanceof EqualsOperation and + [cmp.getLhs(), cmp.getRhs()] = e and + branch = true + or + cmp instanceof NotEqualsOperation and + [cmp.getLhs(), cmp.getRhs()] = e and + branch = false + ) } } diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll index bd91cde238f..076ed42edfb 100644 --- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll @@ -50,7 +50,7 @@ module UseOfHttp { * An HTTP string literal as a source. */ private class HttpStringLiteralAsSource extends Source { - HttpStringLiteralAsSource() { this.asExpr().getExpr() instanceof HttpStringLiteral } + HttpStringLiteralAsSource() { this.asExpr() instanceof HttpStringLiteral } } /** diff --git a/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll b/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll index 7b6b6c801d7..bd29f0498b3 100644 --- a/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll @@ -189,7 +189,7 @@ class ModeledHashOperation extends Cryptography::CryptographicOperation::Range { exists(CallExpr call | sinkNode(input, "hasher-input") and call = input.(Node::FlowSummaryNode).getSinkElement().getCall() and - call = this.asExpr().getExpr() and + call = this.asExpr() and algorithmName = call.getFunction().(PathExpr).getPath().getQualifier().getText() ) } diff --git a/rust/ql/lib/codeql/rust/security/XssExtensions.qll b/rust/ql/lib/codeql/rust/security/XssExtensions.qll new file mode 100644 index 00000000000..97318ff8173 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/XssExtensions.qll @@ -0,0 +1,72 @@ +/** + * Provides classes and predicates for reasoning about cross-site scripting (XSS) + * vulnerabilities. + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.Concepts +private import codeql.util.Unit +private import codeql.rust.security.Barriers as Barriers + +/** + * Provides default sources, sinks and barriers for detecting XSS + * vulnerabilities, as well as extension points for adding your own. + */ +module Xss { + /** + * A data flow source for XSS vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for XSS vulnerabilities. + */ + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "Xss" } + } + + /** + * A barrier for XSS vulnerabilities. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * An active threat-model source, considered as a flow source. + */ + private class ActiveThreatModelSourceAsSource extends Source, ActiveThreatModelSource { } + + /** + * A sink for XSS from model data. + */ + private class ModelsAsDataSink extends Sink { + ModelsAsDataSink() { sinkNode(this, "html-injection") } + } + + /** + * A barrier for XSS vulnerabilities for nodes whose type is a + * numeric or boolean type, which is unlikely to expose any vulnerability. + */ + private class NumericTypeBarrier extends Barrier instanceof Barriers::NumericTypeBarrier { } + + /** A call to a function with "escape" or "encode" in its name. */ + private class HeuristicHtmlEncodingBarrier extends Barrier { + HeuristicHtmlEncodingBarrier() { + exists(Call c | + c.getStaticTarget().getName().getText().regexpMatch(".*(escape|encode).*") and + c.getAnArgument() = this.asExpr() + ) + } + } + + // TODO: Convert this to MaD once MaD supports sink for tuple struct expressions. + private class AxumHtmlSink extends Sink { + AxumHtmlSink() { + exists(TupleStructExpr call | + call.getResolvedTarget().getCanonicalPath() = "axum::response::Html" and + this.asExpr() = call.getSyntacticPositionalArgument(0) + ) + } + } +} diff --git a/rust/ql/lib/codeql/rust/security/regex/RegexInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/regex/RegexInjectionExtensions.qll index 750517708af..7cb0dc47c9f 100644 --- a/rust/ql/lib/codeql/rust/security/regex/RegexInjectionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/regex/RegexInjectionExtensions.qll @@ -6,7 +6,6 @@ private import codeql.util.Unit private import rust private import codeql.rust.dataflow.DataFlow -private import codeql.rust.controlflow.CfgNodes private import codeql.rust.dataflow.FlowSink private import codeql.rust.Concepts private import codeql.rust.security.Barriers as Barriers @@ -54,11 +53,11 @@ module RegexInjection { */ private class NewSink extends Sink { NewSink() { - exists(CallExprBase call, Addressable a | - call.getStaticTarget() = a and - a.getCanonicalPath() = "::new" and - this.asExpr().getExpr() = call.getArg(0) and - not this.asExpr() instanceof LiteralExprCfgNode + exists(Call call, Function f | + call.getStaticTarget() = f and + f.getCanonicalPath() = "::new" and + this.asExpr() = call.getPositionalArgument(0) and + not this.asExpr() instanceof LiteralExpr ) } } @@ -78,7 +77,6 @@ module RegexInjection { // A barrier is any call to a function named `escape`, in particular this // makes calls to `regex::escape` a barrier. this.asExpr() - .getExpr() .(CallExpr) .getFunction() .(PathExpr) @@ -91,11 +89,12 @@ module RegexInjection { /** * A barrier for regular expression injection vulnerabilities for nodes whose - * type is an integral or boolean type, which is unlikely to expose any vulnerability. + * type is an integral type, which is unlikely to expose any vulnerability. * * We don't include floating point types in this barrier, as `.` is a special character * in regular expressions. */ - private class IntegralOrBooleanTypeBarrier extends Barrier instanceof Barriers::IntegralOrBooleanTypeBarrier - { } + private class IntegralTypeBarrier extends Barrier instanceof Barriers::IntegralTypeBarrier { } + + private class BooleanTypeBarrier extends Barrier instanceof Barriers::BooleanTypeBarrier { } } diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 3c045cd83e5..551f2cd20cf 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.1.20-dev +version: 0.2.3-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index 30a0713e5bf..c467bf63916 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -398,7 +398,7 @@ callable_attrs( | @become_expr | @binary_expr | @break_expr -| @call_expr_base +| @call_expr | @cast_expr | @closure_expr | @continue_expr @@ -412,6 +412,7 @@ callable_attrs( | @macro_block_expr | @macro_expr | @match_expr +| @method_call_expr | @offset_of_expr | @paren_expr | @path_expr_base @@ -1480,24 +1481,29 @@ break_expr_lifetimes( int lifetime: @lifetime ref ); -@call_expr_base = - @call_expr -| @method_call_expr -; +call_exprs( + unique int id: @call_expr +); #keyset[id] -call_expr_base_arg_lists( - int id: @call_expr_base ref, +call_expr_arg_lists( + int id: @call_expr ref, int arg_list: @arg_list ref ); #keyset[id, index] -call_expr_base_attrs( - int id: @call_expr_base ref, +call_expr_attrs( + int id: @call_expr ref, int index: int ref, int attr: @attr ref ); +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + cast_exprs( unique int id: @cast_expr ); @@ -1870,8 +1876,7 @@ infer_type_reprs( ); @item = - @adt -| @asm_expr + @asm_expr | @assoc_item | @extern_block | @extern_crate @@ -1882,6 +1887,7 @@ infer_type_reprs( | @module | @trait | @trait_alias +| @type_item | @use ; @@ -2100,6 +2106,41 @@ match_expr_match_arm_lists( int match_arm_list: @match_arm_list ref ); +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + name_refs( unique int id: @name_ref ); @@ -2684,19 +2725,6 @@ yield_expr_exprs( int expr: @expr ref ); -@adt = - @enum -| @struct -| @union -; - -#keyset[id, index] -adt_derive_macro_expansions( - int id: @adt ref, - int index: int ref, - int derive_macro_expansion: @macro_items ref -); - asm_exprs( unique int id: @asm_expr ); @@ -2776,16 +2804,6 @@ block_expr_stmt_lists( int stmt_list: @stmt_list ref ); -call_exprs( - unique int id: @call_expr -); - -#keyset[id] -call_expr_functions( - int id: @call_expr ref, - int function: @expr ref -); - extern_blocks( unique int id: @extern_block ); @@ -2988,28 +3006,6 @@ macro_rules_visibilities( int visibility: @visibility ref ); -method_call_exprs( - unique int id: @method_call_expr -); - -#keyset[id] -method_call_expr_generic_arg_lists( - int id: @method_call_expr ref, - int generic_arg_list: @generic_arg_list ref -); - -#keyset[id] -method_call_expr_identifiers( - int id: @method_call_expr ref, - int identifier: @name_ref ref -); - -#keyset[id] -method_call_expr_receivers( - int id: @method_call_expr ref, - int receiver: @expr ref -); - modules( unique int id: @module ); @@ -3148,6 +3144,50 @@ trait_alias_where_clauses( int where_clause: @where_clause ref ); +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + uses( unique int id: @use ); @@ -3237,43 +3277,12 @@ enums( unique int id: @enum ); -#keyset[id, index] -enum_attrs( - int id: @enum ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id] -enum_generic_param_lists( - int id: @enum ref, - int generic_param_list: @generic_param_list ref -); - -#keyset[id] -enum_names( - int id: @enum ref, - int name: @name ref -); - #keyset[id] enum_variant_lists( int id: @enum ref, int variant_list: @variant_list ref ); -#keyset[id] -enum_visibilities( - int id: @enum ref, - int visibility: @visibility ref -); - -#keyset[id] -enum_where_clauses( - int id: @enum ref, - int where_clause: @where_clause ref -); - for_exprs( unique int id: @for_expr ); @@ -3467,43 +3476,12 @@ structs( unique int id: @struct ); -#keyset[id, index] -struct_attrs( - int id: @struct ref, - int index: int ref, - int attr: @attr ref -); - #keyset[id] struct_field_lists_( int id: @struct ref, int field_list: @field_list ref ); -#keyset[id] -struct_generic_param_lists( - int id: @struct ref, - int generic_param_list: @generic_param_list ref -); - -#keyset[id] -struct_names( - int id: @struct ref, - int name: @name ref -); - -#keyset[id] -struct_visibilities( - int id: @struct ref, - int visibility: @visibility ref -); - -#keyset[id] -struct_where_clauses( - int id: @struct ref, - int where_clause: @where_clause ref -); - type_aliases( unique int id: @type_alias ); @@ -3560,43 +3538,12 @@ unions( unique int id: @union ); -#keyset[id, index] -union_attrs( - int id: @union ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id] -union_generic_param_lists( - int id: @union ref, - int generic_param_list: @generic_param_list ref -); - -#keyset[id] -union_names( - int id: @union ref, - int name: @name ref -); - #keyset[id] union_struct_field_lists( int id: @union ref, int struct_field_list: @struct_field_list ref ); -#keyset[id] -union_visibilities( - int id: @union ref, - int visibility: @visibility ref -); - -#keyset[id] -union_where_clauses( - int id: @union ref, - int where_clause: @where_clause ref -); - while_exprs( unique int id: @while_expr ); diff --git a/rust/ql/lib/rust.qll b/rust/ql/lib/rust.qll index d209672028b..410f062d91e 100644 --- a/rust/ql/lib/rust.qll +++ b/rust/ql/lib/rust.qll @@ -6,6 +6,7 @@ import codeql.Locations import codeql.files.FileSystem import codeql.rust.elements.Operation import codeql.rust.elements.ArithmeticOperation +import codeql.rust.elements.InvocationExpr import codeql.rust.elements.AssignmentOperation import codeql.rust.elements.BitwiseOperation import codeql.rust.elements.ComparisonOperation @@ -18,6 +19,7 @@ import codeql.rust.elements.Variable import codeql.rust.elements.NamedFormatArgument import codeql.rust.elements.PositionalFormatArgument import codeql.rust.elements.RangeExprExt -private import codeql.rust.elements.Call as Call - -class Call = Call::Call; +import codeql.rust.elements.Call +import codeql.rust.elements.TupleStructExpr +import codeql.rust.elements.TupleVariantExpr +import codeql.rust.elements.Method diff --git a/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/old.dbscheme b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/old.dbscheme new file mode 100644 index 00000000000..30a0713e5bf --- /dev/null +++ b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/old.dbscheme @@ -0,0 +1,3615 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr_base +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +@call_expr_base = + @call_expr +| @method_call_expr +; + +#keyset[id] +call_expr_base_arg_lists( + int id: @call_expr_base ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_base_attrs( + int id: @call_expr_base ref, + int index: int ref, + int attr: @attr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @adt +| @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +@adt = + @enum +| @struct +| @union +; + +#keyset[id, index] +adt_derive_macro_expansions( + int id: @adt ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id, index] +enum_attrs( + int id: @enum ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +enum_generic_param_lists( + int id: @enum ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +enum_names( + int id: @enum ref, + int name: @name ref +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +#keyset[id] +enum_visibilities( + int id: @enum ref, + int visibility: @visibility ref +); + +#keyset[id] +enum_where_clauses( + int id: @enum ref, + int where_clause: @where_clause ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id, index] +struct_attrs( + int id: @struct ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +#keyset[id] +struct_generic_param_lists( + int id: @struct ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +struct_names( + int id: @struct ref, + int name: @name ref +); + +#keyset[id] +struct_visibilities( + int id: @struct ref, + int visibility: @visibility ref +); + +#keyset[id] +struct_where_clauses( + int id: @struct ref, + int where_clause: @where_clause ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id, index] +union_attrs( + int id: @union ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +union_generic_param_lists( + int id: @union ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +union_names( + int id: @union ref, + int name: @name ref +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +#keyset[id] +union_visibilities( + int id: @union ref, + int visibility: @visibility ref +); + +#keyset[id] +union_where_clauses( + int id: @union ref, + int where_clause: @where_clause ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/rust.dbscheme b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/rust.dbscheme new file mode 100644 index 00000000000..e54d01f67a4 --- /dev/null +++ b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/rust.dbscheme @@ -0,0 +1,3624 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @adt +| @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +@adt = + @enum +| @struct +| @union +; + +#keyset[id, index] +adt_derive_macro_expansions( + int id: @adt ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id, index] +enum_attrs( + int id: @enum ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +enum_generic_param_lists( + int id: @enum ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +enum_names( + int id: @enum ref, + int name: @name ref +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +#keyset[id] +enum_visibilities( + int id: @enum ref, + int visibility: @visibility ref +); + +#keyset[id] +enum_where_clauses( + int id: @enum ref, + int where_clause: @where_clause ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id, index] +struct_attrs( + int id: @struct ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +#keyset[id] +struct_generic_param_lists( + int id: @struct ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +struct_names( + int id: @struct ref, + int name: @name ref +); + +#keyset[id] +struct_visibilities( + int id: @struct ref, + int visibility: @visibility ref +); + +#keyset[id] +struct_where_clauses( + int id: @struct ref, + int where_clause: @where_clause ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id, index] +union_attrs( + int id: @union ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +union_generic_param_lists( + int id: @union ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +union_names( + int id: @union ref, + int name: @name ref +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +#keyset[id] +union_visibilities( + int id: @union ref, + int visibility: @visibility ref +); + +#keyset[id] +union_where_clauses( + int id: @union ref, + int where_clause: @where_clause ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/upgrade.properties b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/upgrade.properties new file mode 100644 index 00000000000..d3abc91cc1b --- /dev/null +++ b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/upgrade.properties @@ -0,0 +1,10 @@ +description: Removed the `@call_expr_base` union type +compatibility: backwards + +call_expr_base_arg_lists.rel: delete +call_expr_base_attrs.rel: delete + +call_expr_arg_lists.rel: run upgrade.ql call_expr_arg_lists +call_expr_attrs.rel: run upgrade.ql call_expr_attrs +method_call_expr_arg_lists.rel: run upgrade.ql method_call_expr_arg_lists +method_call_expr_attrs.rel: run upgrade.ql method_call_expr_attrs diff --git a/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/upgrade.ql b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/upgrade.ql new file mode 100644 index 00000000000..727b13634ef --- /dev/null +++ b/rust/ql/lib/upgrades/30a0713e5bf69c60d003e4994e5abd1c78a36826/upgrade.ql @@ -0,0 +1,23 @@ +class Element extends @element { + string toString() { none() } +} + +class CallExpr extends Element, @call_expr { } + +class ArgList extends Element, @arg_list { } + +class Attr extends Element, @attr { } + +class MethodCallExpr extends Element, @method_call_expr { } + +query predicate call_expr_arg_lists(CallExpr c, ArgList l) { call_expr_base_arg_lists(c, l) } + +query predicate call_expr_attrs(CallExpr c, int i, Attr a) { call_expr_base_attrs(c, i, a) } + +query predicate method_call_expr_arg_lists(MethodCallExpr c, ArgList l) { + call_expr_base_arg_lists(c, l) +} + +query predicate method_call_expr_attrs(MethodCallExpr c, int i, Attr a) { + call_expr_base_attrs(c, i, a) +} diff --git a/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/old.dbscheme b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/old.dbscheme new file mode 100644 index 00000000000..e54d01f67a4 --- /dev/null +++ b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/old.dbscheme @@ -0,0 +1,3624 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @adt +| @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +@adt = + @enum +| @struct +| @union +; + +#keyset[id, index] +adt_derive_macro_expansions( + int id: @adt ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id, index] +enum_attrs( + int id: @enum ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +enum_generic_param_lists( + int id: @enum ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +enum_names( + int id: @enum ref, + int name: @name ref +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +#keyset[id] +enum_visibilities( + int id: @enum ref, + int visibility: @visibility ref +); + +#keyset[id] +enum_where_clauses( + int id: @enum ref, + int where_clause: @where_clause ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id, index] +struct_attrs( + int id: @struct ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +#keyset[id] +struct_generic_param_lists( + int id: @struct ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +struct_names( + int id: @struct ref, + int name: @name ref +); + +#keyset[id] +struct_visibilities( + int id: @struct ref, + int visibility: @visibility ref +); + +#keyset[id] +struct_where_clauses( + int id: @struct ref, + int where_clause: @where_clause ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id, index] +union_attrs( + int id: @union ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +union_generic_param_lists( + int id: @union ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +union_names( + int id: @union ref, + int name: @name ref +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +#keyset[id] +union_visibilities( + int id: @union ref, + int visibility: @visibility ref +); + +#keyset[id] +union_where_clauses( + int id: @union ref, + int where_clause: @where_clause ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/rust.dbscheme b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/rust.dbscheme new file mode 100644 index 00000000000..c467bf63916 --- /dev/null +++ b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/rust.dbscheme @@ -0,0 +1,3562 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- 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 +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string 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 +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_block_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_block_exprs( + unique int id: @macro_block_expr +); + +#keyset[id, index] +macro_block_expr_statements( + int id: @macro_block_expr ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +macro_block_expr_tail_exprs( + int id: @macro_block_expr ref, + int tail_expr: @expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.properties b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.properties new file mode 100644 index 00000000000..2377b8d6e23 --- /dev/null +++ b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.properties @@ -0,0 +1,29 @@ +description: Renamed the `@adt` union type to `@type_item` and updated its relations +compatibility: full + +adt_derive_macro_expansions.rel: delete + +enum_attrs.rel: delete +enum_generic_param_lists.rel: delete +enum_names.rel: delete +enum_visibilities.rel: delete +enum_where_clauses.rel: delete + +struct_attrs.rel: delete +struct_generic_param_lists.rel: delete +struct_names.rel: delete +struct_visibilities.rel: delete +struct_where_clauses.rel: delete + +union_attrs.rel: delete +union_generic_param_lists.rel: delete +union_names.rel: delete +union_visibilities.rel: delete +union_where_clauses.rel: delete + +type_item_derive_macro_expansions.rel: reorder adt_derive_macro_expansions.rel (@adt id, int index, @macro_items items) id index items +type_item_attrs.rel: run upgrade.ql new_type_item_attrs +type_item_generic_param_lists.rel: run upgrade.ql new_type_item_generic_param_lists +type_item_names.rel: run upgrade.ql new_type_item_names +type_item_visibilities.rel: run upgrade.ql new_type_item_visibilities +type_item_where_clauses.rel: run upgrade.ql new_type_item_where_clauses \ No newline at end of file diff --git a/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.ql b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.ql new file mode 100644 index 00000000000..c8e8e956fd8 --- /dev/null +++ b/rust/ql/lib/upgrades/e54d01f67a416b3d6eb7b970f27295097f2cac7f/upgrade.ql @@ -0,0 +1,45 @@ +class Element extends @element { + string toString() { none() } +} + +class Adt extends Element, @adt { } + +class Attr extends Element, @attr { } + +class GenericParamList extends Element, @generic_param_list { } + +class Name extends Element, @name { } + +class Visibility extends Element, @visibility { } + +class WhereClause extends Element, @where_clause { } + +query predicate new_type_item_attrs(Adt adt, int index, Attr attr) { + enum_attrs(adt, index, attr) or + struct_attrs(adt, index, attr) or + union_attrs(adt, index, attr) +} + +query predicate new_type_item_generic_param_lists(Adt adt, GenericParamList g) { + enum_generic_param_lists(adt, g) or + struct_generic_param_lists(adt, g) or + union_generic_param_lists(adt, g) +} + +query predicate new_type_item_names(Adt adt, Name name) { + enum_names(adt, name) or + struct_names(adt, name) or + union_names(adt, name) +} + +query predicate new_type_item_visibilities(Adt adt, Visibility visibility) { + enum_visibilities(adt, visibility) or + struct_visibilities(adt, visibility) or + union_visibilities(adt, visibility) +} + +query predicate new_type_item_where_clauses(Adt adt, WhereClause where_clause) { + enum_where_clauses(adt, where_clause) or + struct_where_clauses(adt, where_clause) or + union_where_clauses(adt, where_clause) +} diff --git a/rust/ql/lib/utils/test/InlineFlowTest.qll b/rust/ql/lib/utils/test/InlineFlowTest.qll index 9ba92f7757b..aad06087d28 100644 --- a/rust/ql/lib/utils/test/InlineFlowTest.qll +++ b/rust/ql/lib/utils/test/InlineFlowTest.qll @@ -18,23 +18,29 @@ private import internal.InlineExpectationsTestImpl as InlineExpectationsTestImpl * representation of the path has `name` as a prefix. */ bindingset[name] -private predicate callTargetName(CallExprCfgNode call, string name) { - call.getFunction().(PathExprCfgNode).toString().matches(name + "%") +private predicate callTargetName(CallExpr call, string name) { + call.getFunction().(PathExpr).toString().matches(name + "%") } private module FlowTestImpl implements InputSig { predicate defaultSource(DataFlow::Node source) { callTargetName(source.asExpr(), "source") } predicate defaultSink(DataFlow::Node sink) { - any(CallExprCfgNode call | callTargetName(call, "sink")).getArgument(_) = sink.asExpr() + any(CallExpr call | callTargetName(call, "sink")).getASyntacticArgument() = sink.asExpr() } private string getSourceArgString(DataFlow::Node src) { defaultSource(src) and - result = src.asExpr().(CallExprCfgNode).getArgument(0).toString() + exists(Expr arg | arg = src.asExpr().(Call).getPositionalArgument(0) | + not arg instanceof ArrayListExpr and + result = arg.toString() + or + result = arg.(ArrayListExpr).getExpr(0).toString() + ) or sourceNode(src, _) and - result = src.(Node::FlowSummaryNode).getSourceElement().getCall().getArg(0).toString() and + result = + src.(Node::FlowSummaryNode).getSourceElement().getCall().getPositionalArgument(0).toString() and // Don't use the result if it contains spaces not result.matches("% %") } diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index 2b0c54fc057..f5e2fdb6407 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,29 @@ +## 0.1.23 + +No user-facing changes. + +## 0.1.22 + +No user-facing changes. + +## 0.1.21 + +### New Queries + +* Added a new query `rust/xss`, to detect cross-site scripting security vulnerabilities. +* Added a new query `rust/disabled-certificate-check`, to detect disabled TLS certificate checks. +* Added three example queries (`rust/examples/empty-if`, `rust/examples/simple-sql-injection` and `rust/examples/simple-constant-password`) to help developers learn to write CodeQL queries for Rust. + +### Minor Analysis Improvements + +* The `rust/access-invalid-pointer` query has been improved with new flow sources and barriers. + +## 0.1.20 + +### Minor Analysis Improvements + +* Taint flow barriers have been added to the `rust/regex-injection`, `rust/sql-injection` and `rust/log-injection`, reducing the frequency of false positive results for these queries. + ## 0.1.19 ### Minor Analysis Improvements diff --git a/rust/ql/src/change-notes/2025-12-01-hard-coded-cryptographic-value.md b/rust/ql/src/change-notes/2025-12-01-hard-coded-cryptographic-value.md new file mode 100644 index 00000000000..f211982df62 --- /dev/null +++ b/rust/ql/src/change-notes/2025-12-01-hard-coded-cryptographic-value.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `rust/hard-coded-cryptographic-value` query has been extended with new heuristic sinks identifying passwords, initialization vectors, nonces and salts. diff --git a/rust/ql/src/change-notes/2025-12-04-access-after-lifetime-ended.md b/rust/ql/src/change-notes/2025-12-04-access-after-lifetime-ended.md new file mode 100644 index 00000000000..1e9200eec8f --- /dev/null +++ b/rust/ql/src/change-notes/2025-12-04-access-after-lifetime-ended.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed false positives from the `rust/access-after-lifetime-ended` query, involving calls to trait methods. diff --git a/rust/ql/src/change-notes/2025-12-05-exclude-dereference-sinks.md b/rust/ql/src/change-notes/2025-12-05-exclude-dereference-sinks.md new file mode 100644 index 00000000000..c0ccd758e8d --- /dev/null +++ b/rust/ql/src/change-notes/2025-12-05-exclude-dereference-sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed false positives from the `rust/access-invalid-pointer` query, by only considering dereferences of raw pointers as sinks. diff --git a/rust/ql/src/change-notes/2025-12-10-unused-variable.md b/rust/ql/src/change-notes/2025-12-10-unused-variable.md new file mode 100644 index 00000000000..7391255e608 --- /dev/null +++ b/rust/ql/src/change-notes/2025-12-10-unused-variable.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed common false positives for the `rust/unused-variable` and `rust/unused-value` queries. diff --git a/rust/ql/src/change-notes/2025-10-31-barriers.md b/rust/ql/src/change-notes/released/0.1.20.md similarity index 80% rename from rust/ql/src/change-notes/2025-10-31-barriers.md rename to rust/ql/src/change-notes/released/0.1.20.md index 1504380d8d0..a29940bfb7c 100644 --- a/rust/ql/src/change-notes/2025-10-31-barriers.md +++ b/rust/ql/src/change-notes/released/0.1.20.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 0.1.20 + +### Minor Analysis Improvements + * Taint flow barriers have been added to the `rust/regex-injection`, `rust/sql-injection` and `rust/log-injection`, reducing the frequency of false positive results for these queries. diff --git a/rust/ql/src/change-notes/released/0.1.21.md b/rust/ql/src/change-notes/released/0.1.21.md new file mode 100644 index 00000000000..6fd41f2d6c4 --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.21.md @@ -0,0 +1,11 @@ +## 0.1.21 + +### New Queries + +* Added a new query `rust/xss`, to detect cross-site scripting security vulnerabilities. +* Added a new query `rust/disabled-certificate-check`, to detect disabled TLS certificate checks. +* Added three example queries (`rust/examples/empty-if`, `rust/examples/simple-sql-injection` and `rust/examples/simple-constant-password`) to help developers learn to write CodeQL queries for Rust. + +### Minor Analysis Improvements + +* The `rust/access-invalid-pointer` query has been improved with new flow sources and barriers. diff --git a/rust/ql/src/change-notes/released/0.1.22.md b/rust/ql/src/change-notes/released/0.1.22.md new file mode 100644 index 00000000000..26e5511ae0c --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.22.md @@ -0,0 +1,3 @@ +## 0.1.22 + +No user-facing changes. diff --git a/rust/ql/src/change-notes/released/0.1.23.md b/rust/ql/src/change-notes/released/0.1.23.md new file mode 100644 index 00000000000..3e1036afffa --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.23.md @@ -0,0 +1,3 @@ +## 0.1.23 + +No user-facing changes. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index de6e4c49068..484c6d90798 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.19 +lastReleaseVersion: 0.1.23 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index a26c9d35de5..2162add3f35 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.20-dev +version: 0.1.24-dev groups: - rust - queries diff --git a/rust/ql/src/queries/security/CWE-079/XSS.qhelp b/rust/ql/src/queries/security/CWE-079/XSS.qhelp new file mode 100644 index 00000000000..13b7c026f3c --- /dev/null +++ b/rust/ql/src/queries/security/CWE-079/XSS.qhelp @@ -0,0 +1,48 @@ + + + + +

    Directly writing user input (for example, an HTTP request parameter) to a webpage, +without properly sanitizing the input first, allows for a cross-site +scripting vulnerability.

    +
    + + +

    To guard against cross-site scripting, consider encoding/escaping the untrusted +input before including it in the HTML.

    +
    + + + +

    The following example shows a simple web handler that writes a URL path parameter +directly to an HTML response, leaving the website vulnerable to cross-site +scripting:

    + + + +

    To fix this vulnerability, the user input should be HTML-encoded before being +included in the response. In the following example, encode_text from +the html_escape +crate is used to achieve this:

    + + + +
    + + +
  • + OWASP: + +Cross Site Scripting Prevention Cheat Sheet. +
  • +
  • + Wikipedia: Cross-site scripting. +
  • +
  • + OWASP: + Cross Site Scripting (XSS). +
  • +
    + diff --git a/rust/ql/src/queries/security/CWE-079/XSS.ql b/rust/ql/src/queries/security/CWE-079/XSS.ql new file mode 100644 index 00000000000..3c43f5043c7 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-079/XSS.ql @@ -0,0 +1,42 @@ +/** + * @name Cross-site scripting + * @description Writing user input directly to a webpage + * allows for a cross-site scripting vulnerability. + * @kind path-problem + * @problem.severity error + * @security-severity 6.1 + * @precision high + * @id rust/xss + * @tags security + * external/cwe/cwe-079 + * external/cwe/cwe-116 + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.security.XssExtensions + +/** + * A taint configuration for tainted data that reaches an XSS sink. + */ +module XssConfig implements DataFlow::ConfigSig { + import Xss + + predicate isSource(DataFlow::Node node) { node instanceof Source } + + predicate isSink(DataFlow::Node node) { node instanceof Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module XssFlow = TaintTracking::Global; + +import XssFlow::PathGraph + +from XssFlow::PathNode sourceNode, XssFlow::PathNode sinkNode +where XssFlow::flowPath(sourceNode, sinkNode) +select sinkNode.getNode(), sourceNode, sinkNode, "Cross-site scripting vulnerability due to a $@.", + sourceNode.getNode(), "user-provided value" diff --git a/rust/ql/src/queries/security/CWE-079/XSSBad.rs b/rust/ql/src/queries/security/CWE-079/XSSBad.rs new file mode 100644 index 00000000000..a8f08e0de7a --- /dev/null +++ b/rust/ql/src/queries/security/CWE-079/XSSBad.rs @@ -0,0 +1,21 @@ +use actix_web::{web, HttpResponse, Result}; + +// BAD: User input is directly included in HTML response without sanitization +async fn vulnerable_handler(path: web::Path) -> impl Responder { + let user_input = path.into_inner(); + + let html = format!( + r#" + + + Welcome + +

    Hello, {}!

    + + + "#, + user_input + ); + + Html::new(html) // Unsafe: User input included directly in the response +} diff --git a/rust/ql/src/queries/security/CWE-079/XSSGood.rs b/rust/ql/src/queries/security/CWE-079/XSSGood.rs new file mode 100644 index 00000000000..de62691f79c --- /dev/null +++ b/rust/ql/src/queries/security/CWE-079/XSSGood.rs @@ -0,0 +1,21 @@ +use actix_web::{web, HttpResponse, Result}; + +// GOOD: Manual HTML encoding using an `html_escape::encode_text` function +async fn safe_handler_with_encoding(path: web::Path) -> impl Responder { + let user_input = path.into_inner(); + let escaped_input = html_escape::encode_text(&user_input); + let html = format!( + r#" + + + Welcome + +

    Hello, {}!

    + + + "#, + escaped_input + ); + + Html::new(html) // Safe: user input is HTML-encoded +} diff --git a/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.qhelp b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.qhelp new file mode 100644 index 00000000000..1824f6e78df --- /dev/null +++ b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.qhelp @@ -0,0 +1,42 @@ + + + + +

    +The danger_accept_invalid_certs option on TLS connectors and HTTP clients controls whether certificate verification is performed. If this option is set to true, the client will accept any certificate, making it susceptible to man-in-the-middle attacks. +

    +

    +Similarly, the danger_accept_invalid_hostnames option controls whether hostname verification is performed. If this option is set to true, the client will accept any valid certificate regardless of the site that certificate is for, again making it susceptible to man-in-the-middle attacks. +

    +
    + + +

    +Do not set danger_accept_invalid_certs or danger_accept_invalid_hostnames to true, except in controlled environments such as tests. In production, always ensure certificate and hostname verification is enabled to prevent security risks. +

    +
    + + +

    +The following code snippet shows a function that creates an HTTP client with certificate verification disabled: +

    + +

    +In production code, always configure clients to verify certificates: +

    + +
    + +
  • +Rust native-tls crate: TlsConnectorBuilder. +
  • +
  • +Rust reqwest crate: ClientBuilder. +
  • +
  • +SSL.com: Browsers and Certificate Validation. +
  • +
    +
    diff --git a/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.ql b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.ql new file mode 100644 index 00000000000..ae22a3c9d2c --- /dev/null +++ b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.ql @@ -0,0 +1,47 @@ +/** + * @name Disabled TLS certificate check + * @description An application that disables TLS certificate checking is more vulnerable to + * man-in-the-middle attacks. + * @kind path-problem + * @problem.severity warning + * @security-severity 7.5 + * @precision high + * @id rust/disabled-certificate-check + * @tags security + * external/cwe/cwe-295 + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.security.DisabledCertificateCheckExtensions +import codeql.rust.Concepts + +/** + * A taint configuration for disabled TLS certificate checks. + */ +module DisabledCertificateCheckConfig implements DataFlow::ConfigSig { + import DisabledCertificateCheckExtensions + + predicate isSource(DataFlow::Node node) { + // the constant `true` + node.asExpr().(BooleanLiteralExpr).getTextValue() = "true" + or + // a value controlled by a potential attacker + node instanceof ActiveThreatModelSource + } + + predicate isSink(DataFlow::Node node) { node instanceof Sink } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module DisabledCertificateCheckFlow = TaintTracking::Global; + +import DisabledCertificateCheckFlow::PathGraph + +from + DisabledCertificateCheckFlow::PathNode sourceNode, DisabledCertificateCheckFlow::PathNode sinkNode +where DisabledCertificateCheckFlow::flowPath(sourceNode, sinkNode) +select sinkNode.getNode(), sourceNode, sinkNode, + "Disabling TLS certificate validation can expose the application to man-in-the-middle attacks." diff --git a/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheckBad.rs b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheckBad.rs new file mode 100644 index 00000000000..9e4102c64cc --- /dev/null +++ b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheckBad.rs @@ -0,0 +1,6 @@ +// BAD: Disabling certificate validation in Rust + +let _client = reqwest::Client::builder() + .danger_accept_invalid_certs(true) // disables certificate validation + .build() + .unwrap(); diff --git a/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheckGood.rs b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheckGood.rs new file mode 100644 index 00000000000..c726a756c38 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheckGood.rs @@ -0,0 +1,10 @@ +// GOOD: Certificate validation is enabled (default) + +let _client = reqwest::Client::builder() + .danger_accept_invalid_certs(false) // certificate validation enabled explicitly + .build() + .unwrap(); + +let _client = native_tls::TlsConnector::builder() // certificate validation enabled by default + .build() + .unwrap(); diff --git a/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql b/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql index b1c56114c7b..1e3ae49f56f 100644 --- a/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql +++ b/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql @@ -37,7 +37,7 @@ module CleartextLoggingConfig implements DataFlow::ConfigSig { predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { // flow from `a` to `&a` - node2.asExpr().getExpr().(RefExpr).getExpr() = node1.asExpr().getExpr() + node2.asExpr().(RefExpr).getExpr() = node1.asExpr() } predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { diff --git a/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql b/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql index dd09f2f8f20..d5aa87ad709 100644 --- a/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql +++ b/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql @@ -36,7 +36,7 @@ module CleartextStorageDatabaseConfig implements DataFlow::ConfigSig { predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { // flow from `a` to `&a` - node2.asExpr().getExpr().(RefExpr).getExpr() = node1.asExpr().getExpr() + node2.asExpr().(RefExpr).getExpr() = node1.asExpr() } predicate observeDiffInformedIncrementalMode() { any() } diff --git a/rust/ql/src/queries/security/CWE-614/InsecureCookie.ql b/rust/ql/src/queries/security/CWE-614/InsecureCookie.ql index 61996adaf05..4de9cc98948 100644 --- a/rust/ql/src/queries/security/CWE-614/InsecureCookie.ql +++ b/rust/ql/src/queries/security/CWE-614/InsecureCookie.ql @@ -88,5 +88,5 @@ import InsecureCookieFlow::PathGraph from InsecureCookieFlow::PathNode sourceNode, InsecureCookieFlow::PathNode sinkNode where InsecureCookieFlow::flowPath(sourceNode, sinkNode) and - not PartitionedCookieFlow::flow(_, sinkNode.getNode()) + not PartitionedCookieFlow::flowTo(sinkNode.getNode()) select sinkNode.getNode(), sourceNode, sinkNode, "Cookie attribute 'Secure' is not set to true." diff --git a/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql b/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql index f0f7cdf0d98..7a206856adf 100644 --- a/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql +++ b/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql @@ -30,10 +30,8 @@ class CtorAttr extends Attr { /** * A call into the Rust standard library, that is, a sink for this query. */ -class StdCall extends Expr { - StdCall() { - this.(CallExprBase).getStaticTarget().getCanonicalPath().matches(["std::%", " enclosed call edgesFwd(_, pred) and - pred = succ.(CallExprBase).getEnclosingCallable() + pred = succ.(Call).getEnclosingCallable() or // [forwards reachable] call -> target callable edgesFwd(_, pred) and - pred.(CallExprBase).getStaticTarget() = succ + pred.(Call).getStaticTarget() = succ } /** diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql index f5a43c5419c..c8e6c9932cb 100644 --- a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -39,6 +39,11 @@ module HardcodedCryptographicValueConfig implements DataFlow::ConfigSig { // case like `[0, 0, 0, 0]`) isSource(node) } + + predicate isBarrierOut(DataFlow::Node node) { + // make sinks barriers so that we only report the closest instance + isSink(node) + } } module HardcodedCryptographicValueFlow = TaintTracking::Global; diff --git a/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql b/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql index 65c6d861638..edc22a86409 100644 --- a/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql +++ b/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql @@ -23,40 +23,37 @@ import AccessAfterLifetimeFlow::PathGraph * lifetime has ended. */ module AccessAfterLifetimeConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node node) { node instanceof AccessAfterLifetime::Source } + predicate isSource(DataFlow::Node node) { + node instanceof AccessAfterLifetime::Source and + // exclude cases with sources in macros, since these results are difficult to interpret + not node.asExpr().isFromMacroExpansion() and + AccessAfterLifetime::sourceValueScope(node, _, _) + } - predicate isSink(DataFlow::Node node) { node instanceof AccessAfterLifetime::Sink } + predicate isSink(DataFlow::Node node) { + node instanceof AccessAfterLifetime::Sink and + // Exclude cases with sinks in macros, since these results are difficult to interpret + not node.asExpr().isFromMacroExpansion() and + // TODO: Remove this condition if it can be done without negatively + // impacting performance. This condition only include nodes with + // corresponding to an expression. This excludes sinks from models-as-data. + exists(node.asExpr()) + } predicate isBarrier(DataFlow::Node barrier) { barrier instanceof AccessAfterLifetime::Barrier } predicate observeDiffInformedIncrementalMode() { any() } Location getASelectedSourceLocation(DataFlow::Node source) { - exists(Variable target, DataFlow::Node sink | + exists(Variable target | + AccessAfterLifetime::sourceValueScope(source, target, _) and result = [target.getLocation(), source.getLocation()] - | - isSink(sink) and - narrowDereferenceAfterLifetime(source, sink, target) ) } } module AccessAfterLifetimeFlow = TaintTracking::Global; -pragma[inline] -predicate narrowDereferenceAfterLifetime(DataFlow::Node source, DataFlow::Node sink, Variable target) { - // check that the dereference is outside the lifetime of the target - AccessAfterLifetime::dereferenceAfterLifetime(source, sink, target) and - // include only results inside `unsafe` blocks, as other results tend to be false positives - ( - sink.asExpr().getExpr().getEnclosingBlock*().isUnsafe() or - sink.asExpr().getExpr().getEnclosingCallable().(Function).isUnsafe() - ) and - // exclude cases with sources / sinks in macros, since these results are difficult to interpret - not source.asExpr().getExpr().isFromMacroExpansion() and - not sink.asExpr().getExpr().isFromMacroExpansion() -} - from AccessAfterLifetimeFlow::PathNode sourceNode, AccessAfterLifetimeFlow::PathNode sinkNode, Variable target @@ -64,6 +61,6 @@ where // flow from a pointer or reference to the dereference AccessAfterLifetimeFlow::flowPath(sourceNode, sinkNode) and // check that the dereference is outside the lifetime of the target - narrowDereferenceAfterLifetime(sourceNode.getNode(), sinkNode.getNode(), target) + AccessAfterLifetime::dereferenceAfterLifetime(sourceNode.getNode(), sinkNode.getNode(), target) select sinkNode.getNode(), sourceNode, sinkNode, "Access of a pointer to $@ after its lifetime has ended.", target, target.toString() diff --git a/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql b/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql index 5177e1fb0e0..3c10e2b197a 100644 --- a/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql +++ b/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql @@ -22,11 +22,13 @@ import AccessInvalidPointerFlow::PathGraph * A data flow configuration for accesses to invalid pointers. */ module AccessInvalidPointerConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node node) { node instanceof AccessInvalidPointer::Source } + import AccessInvalidPointer - predicate isSink(DataFlow::Node node) { node instanceof AccessInvalidPointer::Sink } + predicate isSource(DataFlow::Node node) { node instanceof Source } - predicate isBarrier(DataFlow::Node barrier) { barrier instanceof AccessInvalidPointer::Barrier } + predicate isSink(DataFlow::Node node) { node instanceof Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } predicate isBarrierOut(DataFlow::Node node) { // make sinks barriers so that we only report the closest instance diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 7cd4fd67e24..d06389fb6a7 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -22,6 +22,7 @@ private import codeql.rust.security.AccessInvalidPointerExtensions private import codeql.rust.security.CleartextLoggingExtensions private import codeql.rust.security.CleartextStorageDatabaseExtensions private import codeql.rust.security.CleartextTransmissionExtensions +private import codeql.rust.security.DisabledCertificateCheckExtensions private import codeql.rust.security.HardcodedCryptographicValueExtensions private import codeql.rust.security.InsecureCookieExtensions private import codeql.rust.security.LogInjectionExtensions @@ -31,6 +32,7 @@ private import codeql.rust.security.TaintedPathExtensions private import codeql.rust.security.UncontrolledAllocationSizeExtensions private import codeql.rust.security.UseOfHttpExtensions private import codeql.rust.security.WeakSensitiveDataHashingExtensions +private import codeql.rust.security.XssExtensions /** * Gets a count of the total number of lines of code in the database. diff --git a/rust/ql/src/queries/telemetry/DatabaseQuality.qll b/rust/ql/src/queries/telemetry/DatabaseQuality.qll index 64adf9826dc..5f50cdd4c4f 100644 --- a/rust/ql/src/queries/telemetry/DatabaseQuality.qll +++ b/rust/ql/src/queries/telemetry/DatabaseQuality.qll @@ -1,12 +1,14 @@ /** * Provides database quality statistics that are reported by * `rust/telemetry/extractor-information` - * and perhaps warned about by `rust/diagnostics/database-quality`. + * and perhaps warned about by `rust/diagnostic/database-quality`. */ import rust import codeql.util.ReportStats +import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl import codeql.rust.internal.TypeInference as TypeInference +import codeql.rust.internal.Type /** * A file that is included in the quality statistics. @@ -19,25 +21,26 @@ private class RelevantFile extends File { } module CallTargetStats implements StatsSig { - int getNumberOfOk() { - result = - count(CallExprBase c | c.getFile() instanceof RelevantFile and exists(c.getStaticTarget())) + /** + * A call-like expression that is relevant for call target statistics. + * + * Note that this also includes tuple struct instantiations and tuple + * variant instantiations. + */ + private class RelevantInvocationExpr extends InvocationExpr { + RelevantInvocationExpr() { + this.getFile() instanceof RelevantFile and + not this instanceof CallExprImpl::DynamicCallExpr and + not this = any(Operation o | not o.isOverloaded(_, _, _)) and + not this = any(DerefExpr de | TypeInference::inferType(de.getExpr()) instanceof PtrType) + } } - private predicate isLambdaCall(CallExpr call) { - exists(Expr receiver | receiver = call.getFunction() | - // All calls to complex expressions and local variable accesses are lambda calls - receiver instanceof PathExpr implies receiver = any(Variable v).getAnAccess() - ) - } + int getNumberOfOk() { result = count(RelevantInvocationExpr e | exists(e.getResolvedTarget())) } - additional predicate isNotOkCall(CallExprBase c) { - c.getFile() instanceof RelevantFile and - not exists(c.getStaticTarget()) and - not isLambdaCall(c) - } + additional predicate isNotOkCall(RelevantInvocationExpr e) { not exists(e.getResolvedTarget()) } - int getNumberOfNotOk() { result = count(CallExprBase c | isNotOkCall(c)) } + int getNumberOfNotOk() { result = count(RelevantInvocationExpr e | isNotOkCall(e)) } string getOkText() { result = "calls with call target" } diff --git a/rust/ql/src/queries/unusedentities/UnusedValue.ql b/rust/ql/src/queries/unusedentities/UnusedValue.ql index 07e80b00b45..8ef6b85ebe7 100644 --- a/rust/ql/src/queries/unusedentities/UnusedValue.ql +++ b/rust/ql/src/queries/unusedentities/UnusedValue.ql @@ -21,7 +21,7 @@ where not write.isFromMacroExpansion() and not isAllowableUnused(v) and // SSA definitions are only created for live writes - not write = any(Ssa::WriteDefinition def).getWriteAccess().getAstNode() and + not write = any(Ssa::WriteDefinition def).getWriteAccess() and // avoid overlap with the unused variable query not isUnused(v) select write, "Variable $@ is assigned a value that is never used.", v, v.getText() diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.qll b/rust/ql/src/queries/unusedentities/UnusedVariable.qll index c0684636e77..744af559dd2 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.qll +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.qll @@ -43,4 +43,10 @@ predicate isAllowableUnused(Variable v) { or // a 'self' variable v.getText() = "self" + or + // a common source of false positives is match arms containing constants + // (typically beginning with a capital letter) that are misrecognized as a + // variable, having not been correctly resolved. + v.getPat().getParentNode() instanceof MatchArm and + v.getText().charAt(0).isUppercase() } diff --git a/rust/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql b/rust/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql index 9dd63e06ea7..38568b02ad4 100644 --- a/rust/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql +++ b/rust/ql/src/utils/modelgenerator/CaptureContentSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture content based summary models. + * @name Capture content based summary models * @description Finds applicable content based summary models to be used by other queries. * @kind diagnostic * @id rust/utils/modelgenerator/contentbased-summary-models diff --git a/rust/ql/src/utils/modelgenerator/CaptureNeutralModels.ql b/rust/ql/src/utils/modelgenerator/CaptureNeutralModels.ql index 556d1624f39..aade0ea4037 100644 --- a/rust/ql/src/utils/modelgenerator/CaptureNeutralModels.ql +++ b/rust/ql/src/utils/modelgenerator/CaptureNeutralModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture neutral models. + * @name Capture neutral models * @description Finds neutral models to be used by other queries. * @kind diagnostic * @id rust/utils/modelgenerator/neutral-models diff --git a/rust/ql/src/utils/modelgenerator/CaptureSinkModels.ql b/rust/ql/src/utils/modelgenerator/CaptureSinkModels.ql index 989637a867e..cbd15849b15 100644 --- a/rust/ql/src/utils/modelgenerator/CaptureSinkModels.ql +++ b/rust/ql/src/utils/modelgenerator/CaptureSinkModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture sink models. + * @name Capture sink models * @description Finds public methods that act as sinks as they flow into a known sink. * @kind diagnostic * @id rust/utils/modelgenerator/sink-models diff --git a/rust/ql/src/utils/modelgenerator/CaptureSourceModels.ql b/rust/ql/src/utils/modelgenerator/CaptureSourceModels.ql index 2ffc4894b18..5403e2e3e50 100644 --- a/rust/ql/src/utils/modelgenerator/CaptureSourceModels.ql +++ b/rust/ql/src/utils/modelgenerator/CaptureSourceModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture source models. + * @name Capture source models * @description Finds APIs that act as sources as they expose already known sources. * @kind diagnostic * @id rust/utils/modelgenerator/source-models diff --git a/rust/ql/src/utils/modelgenerator/CaptureSummaryModels.ql b/rust/ql/src/utils/modelgenerator/CaptureSummaryModels.ql index d0b3152c9be..48789e72231 100644 --- a/rust/ql/src/utils/modelgenerator/CaptureSummaryModels.ql +++ b/rust/ql/src/utils/modelgenerator/CaptureSummaryModels.ql @@ -1,5 +1,5 @@ /** - * @name Capture summary models. + * @name Capture summary models * @description Finds applicable summary models to be used by other queries. * @kind diagnostic * @id rust/utils/modelgenerator/summary-models diff --git a/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 754bb53357a..9826f56795f 100644 --- a/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -67,8 +67,9 @@ module ModelGeneratorCommonInput implements string parameterExactAccess(R::ParamBase p) { result = - "Argument[" + any(DataFlowImpl::ParameterPosition pos | p = pos.getParameterIn(_)).toString() + - "]" + "Argument[" + + any(DataFlowImpl::RustDataFlow::ParameterPosition pos | p = pos.getParameterIn(_)) + .toString() + "]" } string parameterApproximateAccess(R::ParamBase p) { result = parameterExactAccess(p) } @@ -78,12 +79,16 @@ module ModelGeneratorCommonInput implements } bindingset[c] - string paramReturnNodeAsApproximateOutput(QualifiedCallable c, DataFlowImpl::ParameterPosition pos) { + string paramReturnNodeAsApproximateOutput( + QualifiedCallable c, DataFlowImpl::RustDataFlow::ParameterPosition pos + ) { result = paramReturnNodeAsExactOutput(c, pos) } bindingset[c] - string paramReturnNodeAsExactOutput(QualifiedCallable c, DataFlowImpl::ParameterPosition pos) { + string paramReturnNodeAsExactOutput( + QualifiedCallable c, DataFlowImpl::RustDataFlow::ParameterPosition pos + ) { result = parameterExactAccess(c.getFunction().getParam(pos.getPosition())) or pos.isSelf() and result = qualifierString() @@ -120,7 +125,7 @@ private module SummaryModelGeneratorInput implements SummaryModelGeneratorInputS } QualifiedCallable getAsExprEnclosingCallable(NodeExtended node) { - result.getFunction() = node.asExpr().getScope() + result.getFunction() = node.asExpr().getEnclosingCfgScope() } Parameter asParameter(NodeExtended node) { result = node.asParameter() } diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index 879695fb758..a0f338af420 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -23,7 +23,7 @@ BinaryExpr/gen_binary_expr.rs 5ea68396dc2e3ff7fcaf5a5201636dd175dd45be36647b6ae0 BlockExpr/gen_block_expr.rs 17b06c726e304e0efcfde8e71afd9c657860312be554366894236125cb08719e 17b06c726e304e0efcfde8e71afd9c657860312be554366894236125cb08719e BoxPat/gen_box_pat.rs 1493e24b732370b577ade38c47db17fa157df19f5390606a67a6040e49b501c0 1493e24b732370b577ade38c47db17fa157df19f5390606a67a6040e49b501c0 BreakExpr/gen_break_expr.rs aacdf9df7fc51d19742b9e813835c0bd0913017e8d62765960e06b27d58b9031 aacdf9df7fc51d19742b9e813835c0bd0913017e8d62765960e06b27d58b9031 -CallExpr/gen_call_expr.rs 013a7c878996aefb25b94b68eebc4f0b1bb74ccd09e91c491980817a383e2401 013a7c878996aefb25b94b68eebc4f0b1bb74ccd09e91c491980817a383e2401 +CallExpr/gen_call_expr.rs 228705e9b0c46d34aa035da3c139a8c3e93fb144d3310592d5bad38ac97382c2 228705e9b0c46d34aa035da3c139a8c3e93fb144d3310592d5bad38ac97382c2 CastExpr/gen_cast_expr.rs c3892211fbae4fed7cb1f25ff1679fd79d2878bf0bf2bd4b7982af23d00129f5 c3892211fbae4fed7cb1f25ff1679fd79d2878bf0bf2bd4b7982af23d00129f5 ClosureExpr/gen_closure_expr.rs bd95408103b7f2084e526e6d35cf3319b2e9d7219aff4c80e4e6691180c549b4 bd95408103b7f2084e526e6d35cf3319b2e9d7219aff4c80e4e6691180c549b4 Comment/gen_comment.rs 1e1f9f43161a79c096c2056e8b7f5346385ab7addcdec68c2d53b383dd3debe6 1e1f9f43161a79c096c2056e8b7f5346385ab7addcdec68c2d53b383dd3debe6 @@ -80,7 +80,7 @@ MatchArmList/gen_match_arm_list.rs 6dcb92591c86771d2aeb762e4274d3e61a7d6c1a42da3 MatchExpr/gen_match_expr.rs 081c5d4c78cb71ccd13fb37a93d7f525267c51b179f44b5a22ca3297897002a0 081c5d4c78cb71ccd13fb37a93d7f525267c51b179f44b5a22ca3297897002a0 MatchGuard/gen_match_guard.rs f0e84a1f608c0361983c516a40216cea149620a36e0aed7ff39b0b7d77a9ab8a f0e84a1f608c0361983c516a40216cea149620a36e0aed7ff39b0b7d77a9ab8a Meta/gen_meta.rs 39172a1f7dd02fa3149e7a1fc1dc1f135aa87c84057ee721cd9b373517042b25 39172a1f7dd02fa3149e7a1fc1dc1f135aa87c84057ee721cd9b373517042b25 -MethodCallExpr/gen_method_call_expr.rs f2b4679eb1ec095981fe6bd656b632c22bf6bd0da133309da3f7ef5bd1ab4b5d f2b4679eb1ec095981fe6bd656b632c22bf6bd0da133309da3f7ef5bd1ab4b5d +MethodCallExpr/gen_method_call_expr.rs f696e63c5302f46dcac7bc2914fe899d029996d5064ffe8252cfa173a06f9dd3 f696e63c5302f46dcac7bc2914fe899d029996d5064ffe8252cfa173a06f9dd3 Module/gen_module.rs 815605a604fea1d9276684f8d6738a4e833eacad57ceeb27e2095fc450264fc1 815605a604fea1d9276684f8d6738a4e833eacad57ceeb27e2095fc450264fc1 Name/gen_name.rs 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 NameRef/gen_name_ref.rs c8c922e77a7d62b8272359ccdabbf7e15411f31ca85f15a3afdd94bec7ec64e7 c8c922e77a7d62b8272359ccdabbf7e15411f31ca85f15a3afdd94bec7ec64e7 @@ -129,8 +129,8 @@ Trait/gen_trait.rs bac694993e224f9c6dd86cfb28c54846ae1b3bae45a1e58d3149c88418448 TraitAlias/gen_trait_alias.rs 425d78a7cb87db7737ceaf713c9a62e0411537374d1bc58c5b1fb80cc25732c9 425d78a7cb87db7737ceaf713c9a62e0411537374d1bc58c5b1fb80cc25732c9 TryExpr/gen_try_expr.rs f60198181a423661f4ed1bf6f98d475f40ada190b7b5fc6af97aa5e45ca29a1e f60198181a423661f4ed1bf6f98d475f40ada190b7b5fc6af97aa5e45ca29a1e TupleExpr/gen_tuple_expr.rs 27e56846b3f08c37c8a345169c2a532b2023d231d46a5bdf586bbc6d8fb36a01 27e56846b3f08c37c8a345169c2a532b2023d231d46a5bdf586bbc6d8fb36a01 -TupleField/gen_tuple_field.rs 5d6b4f356af895541f975cc1fd90116fd047fe914c2049d47f61e4a43a8c2af4 5d6b4f356af895541f975cc1fd90116fd047fe914c2049d47f61e4a43a8c2af4 -TupleFieldList/gen_tuple_field_list.rs 42f0af8c391fb9e33fe09b791e0e719cadf5143b58764f8a5d38f8d9054daca7 42f0af8c391fb9e33fe09b791e0e719cadf5143b58764f8a5d38f8d9054daca7 +TupleField/gen_tuple_field.rs 20507753ddb979a33d0e568ae5ebe466f039e7ab7b8f2e6ce15b28b3e4450615 20507753ddb979a33d0e568ae5ebe466f039e7ab7b8f2e6ce15b28b3e4450615 +TupleFieldList/gen_tuple_field_list.rs 4702b92cfca9c4db9b84cb846c5d44569ad3f3e40cd07e9015d144152c684fd0 4702b92cfca9c4db9b84cb846c5d44569ad3f3e40cd07e9015d144152c684fd0 TuplePat/gen_tuple_pat.rs b1b0c9c5ff1b787f380644691c77807655a4f6441fc7431c90ecf78c54c26148 b1b0c9c5ff1b787f380644691c77807655a4f6441fc7431c90ecf78c54c26148 TupleStructPat/gen_tuple_struct_pat.rs 601ca8813272d15b4c8fd7402d0d28a42a62be82865eb5e86b985ad31464ca98 601ca8813272d15b4c8fd7402d0d28a42a62be82865eb5e86b985ad31464ca98 TupleTypeRepr/gen_tuple_type_repr.rs 64873a6a1cd5df6cd10165d7e9fa0399902b6bfbac086ef3a7ce83237b816879 64873a6a1cd5df6cd10165d7e9fa0399902b6bfbac086ef3a7ce83237b816879 diff --git a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected index 3aaaed00da2..16e6f165028 100644 --- a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected +++ b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected @@ -1,21 +1,16 @@ instances -| gen_call_expr.rs:5:5:5:11 | foo(...) | -| gen_call_expr.rs:6:5:6:23 | foo::<...>(...) | -| gen_call_expr.rs:7:5:7:14 | ...(...) | -| gen_call_expr.rs:8:5:8:10 | foo(...) | +| gen_call_expr.rs:8:5:8:11 | foo(...) | +| gen_call_expr.rs:9:5:9:23 | foo::<...>(...) | +| gen_call_expr.rs:10:5:10:14 | ...(...) | +| gen_call_expr.rs:11:5:11:20 | ...::Some(...) | getArgList -| gen_call_expr.rs:5:5:5:11 | foo(...) | gen_call_expr.rs:5:8:5:11 | ArgList | -| gen_call_expr.rs:6:5:6:23 | foo::<...>(...) | gen_call_expr.rs:6:20:6:23 | ArgList | -| gen_call_expr.rs:7:5:7:14 | ...(...) | gen_call_expr.rs:7:11:7:14 | ArgList | -| gen_call_expr.rs:8:5:8:10 | foo(...) | gen_call_expr.rs:8:8:8:10 | ArgList | +| gen_call_expr.rs:8:5:8:11 | foo(...) | gen_call_expr.rs:8:8:8:11 | ArgList | +| gen_call_expr.rs:9:5:9:23 | foo::<...>(...) | gen_call_expr.rs:9:20:9:23 | ArgList | +| gen_call_expr.rs:10:5:10:14 | ...(...) | gen_call_expr.rs:10:11:10:14 | ArgList | +| gen_call_expr.rs:11:5:11:20 | ...::Some(...) | gen_call_expr.rs:11:17:11:20 | ArgList | getAttr -getArg -| gen_call_expr.rs:5:5:5:11 | foo(...) | 0 | gen_call_expr.rs:5:9:5:10 | 42 | -| gen_call_expr.rs:6:5:6:23 | foo::<...>(...) | 0 | gen_call_expr.rs:6:21:6:22 | 42 | -| gen_call_expr.rs:7:5:7:14 | ...(...) | 0 | gen_call_expr.rs:7:12:7:13 | 42 | -| gen_call_expr.rs:8:5:8:10 | foo(...) | 0 | gen_call_expr.rs:8:9:8:9 | 1 | getFunction -| gen_call_expr.rs:5:5:5:11 | foo(...) | gen_call_expr.rs:5:5:5:7 | foo | -| gen_call_expr.rs:6:5:6:23 | foo::<...>(...) | gen_call_expr.rs:6:5:6:19 | foo::<...> | -| gen_call_expr.rs:7:5:7:14 | ...(...) | gen_call_expr.rs:7:5:7:10 | foo[0] | -| gen_call_expr.rs:8:5:8:10 | foo(...) | gen_call_expr.rs:8:5:8:7 | foo | +| gen_call_expr.rs:8:5:8:11 | foo(...) | gen_call_expr.rs:8:5:8:7 | foo | +| gen_call_expr.rs:9:5:9:23 | foo::<...>(...) | gen_call_expr.rs:9:5:9:19 | foo::<...> | +| gen_call_expr.rs:10:5:10:14 | ...(...) | gen_call_expr.rs:10:5:10:10 | foo[0] | +| gen_call_expr.rs:11:5:11:20 | ...::Some(...) | gen_call_expr.rs:11:5:11:16 | ...::Some | diff --git a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.ql b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.ql index e16ab837325..4d3b26f2f78 100644 --- a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.ql +++ b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.ql @@ -12,10 +12,6 @@ query predicate getAttr(CallExpr x, int index, Attr getAttr) { toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) } -query predicate getArg(CallExpr x, int index, Expr getArg) { - toBeTested(x) and not x.isUnknown() and getArg = x.getArg(index) -} - query predicate getFunction(CallExpr x, Expr getFunction) { toBeTested(x) and not x.isUnknown() and getFunction = x.getFunction() } diff --git a/rust/ql/test/extractor-tests/generated/CallExpr/gen_call_expr.rs b/rust/ql/test/extractor-tests/generated/CallExpr/gen_call_expr.rs index b2436cc0042..3ab2646ae37 100644 --- a/rust/ql/test/extractor-tests/generated/CallExpr/gen_call_expr.rs +++ b/rust/ql/test/extractor-tests/generated/CallExpr/gen_call_expr.rs @@ -1,9 +1,12 @@ // generated by codegen, do not edit fn test_call_expr() -> () { - // A function call expression. For example: + // NOTE: Consider using `Call` instead, as that excludes call expressions that are + // instantiations of tuple structs and tuple variants. + // + // A call expression. For example: foo(42); foo::(42); foo[0](42); - foo(1) = 4; + Option::Some(42); // tuple variant instantiation } diff --git a/rust/ql/test/extractor-tests/generated/Enum/Enum.ql b/rust/ql/test/extractor-tests/generated/Enum/Enum.ql index 0aa1bda8041..d9843feecc3 100644 --- a/rust/ql/test/extractor-tests/generated/Enum/Enum.ql +++ b/rust/ql/test/extractor-tests/generated/Enum/Enum.ql @@ -26,10 +26,6 @@ query predicate getName(Enum x, Name getName) { toBeTested(x) and not x.isUnknown() and getName = x.getName() } -query predicate getVariantList(Enum x, VariantList getVariantList) { - toBeTested(x) and not x.isUnknown() and getVariantList = x.getVariantList() -} - query predicate getVisibility(Enum x, Visibility getVisibility) { toBeTested(x) and not x.isUnknown() and getVisibility = x.getVisibility() } @@ -37,3 +33,7 @@ query predicate getVisibility(Enum x, Visibility getVisibility) { query predicate getWhereClause(Enum x, WhereClause getWhereClause) { toBeTested(x) and not x.isUnknown() and getWhereClause = x.getWhereClause() } + +query predicate getVariantList(Enum x, VariantList getVariantList) { + toBeTested(x) and not x.isUnknown() and getVariantList = x.getVariantList() +} diff --git a/rust/ql/test/extractor-tests/generated/MacroDef/MacroDef.expected b/rust/ql/test/extractor-tests/generated/MacroDef/MacroDef.expected index ba510853f06..e35d59d6588 100644 --- a/rust/ql/test/extractor-tests/generated/MacroDef/MacroDef.expected +++ b/rust/ql/test/extractor-tests/generated/MacroDef/MacroDef.expected @@ -9,4 +9,4 @@ getBody getName | gen_macro_def.rs:4:5:9:5 | MacroDef | gen_macro_def.rs:7:15:7:24 | vec_of_two | getVisibility -| gen_macro_def.rs:4:5:9:5 | MacroDef | gen_macro_def.rs:7:5:7:7 | Visibility | +| gen_macro_def.rs:4:5:9:5 | MacroDef | gen_macro_def.rs:7:5:7:7 | pub | diff --git a/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.expected b/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.expected index 0eedcc70b5d..34d44431de2 100644 --- a/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.expected +++ b/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.expected @@ -1,18 +1,15 @@ instances -| gen_method_call_expr.rs:5:5:5:13 | x.foo(...) | -| gen_method_call_expr.rs:6:5:6:25 | x.foo(...) | +| gen_method_call_expr.rs:9:5:9:13 | x.foo(...) | +| gen_method_call_expr.rs:10:5:10:25 | x.foo(...) | getArgList -| gen_method_call_expr.rs:5:5:5:13 | x.foo(...) | gen_method_call_expr.rs:5:10:5:13 | ArgList | -| gen_method_call_expr.rs:6:5:6:25 | x.foo(...) | gen_method_call_expr.rs:6:22:6:25 | ArgList | +| gen_method_call_expr.rs:9:5:9:13 | x.foo(...) | gen_method_call_expr.rs:9:10:9:13 | ArgList | +| gen_method_call_expr.rs:10:5:10:25 | x.foo(...) | gen_method_call_expr.rs:10:22:10:25 | ArgList | getAttr -getArg -| gen_method_call_expr.rs:5:5:5:13 | x.foo(...) | 0 | gen_method_call_expr.rs:5:11:5:12 | 42 | -| gen_method_call_expr.rs:6:5:6:25 | x.foo(...) | 0 | gen_method_call_expr.rs:6:23:6:24 | 42 | getGenericArgList -| gen_method_call_expr.rs:6:5:6:25 | x.foo(...) | gen_method_call_expr.rs:6:10:6:21 | <...> | +| gen_method_call_expr.rs:10:5:10:25 | x.foo(...) | gen_method_call_expr.rs:10:10:10:21 | <...> | getIdentifier -| gen_method_call_expr.rs:5:5:5:13 | x.foo(...) | gen_method_call_expr.rs:5:7:5:9 | foo | -| gen_method_call_expr.rs:6:5:6:25 | x.foo(...) | gen_method_call_expr.rs:6:7:6:9 | foo | +| gen_method_call_expr.rs:9:5:9:13 | x.foo(...) | gen_method_call_expr.rs:9:7:9:9 | foo | +| gen_method_call_expr.rs:10:5:10:25 | x.foo(...) | gen_method_call_expr.rs:10:7:10:9 | foo | getReceiver -| gen_method_call_expr.rs:5:5:5:13 | x.foo(...) | gen_method_call_expr.rs:5:5:5:5 | x | -| gen_method_call_expr.rs:6:5:6:25 | x.foo(...) | gen_method_call_expr.rs:6:5:6:5 | x | +| gen_method_call_expr.rs:9:5:9:13 | x.foo(...) | gen_method_call_expr.rs:9:5:9:5 | x | +| gen_method_call_expr.rs:10:5:10:25 | x.foo(...) | gen_method_call_expr.rs:10:5:10:5 | x | diff --git a/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql b/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql index d1b6d5a1304..8ecc14ee820 100644 --- a/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql +++ b/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql @@ -12,10 +12,6 @@ query predicate getAttr(MethodCallExpr x, int index, Attr getAttr) { toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) } -query predicate getArg(MethodCallExpr x, int index, Expr getArg) { - toBeTested(x) and not x.isUnknown() and getArg = x.getArg(index) -} - query predicate getGenericArgList(MethodCallExpr x, GenericArgList getGenericArgList) { toBeTested(x) and not x.isUnknown() and getGenericArgList = x.getGenericArgList() } diff --git a/rust/ql/test/extractor-tests/generated/MethodCallExpr/gen_method_call_expr.rs b/rust/ql/test/extractor-tests/generated/MethodCallExpr/gen_method_call_expr.rs index f8bf728d257..5b4f22e8efc 100644 --- a/rust/ql/test/extractor-tests/generated/MethodCallExpr/gen_method_call_expr.rs +++ b/rust/ql/test/extractor-tests/generated/MethodCallExpr/gen_method_call_expr.rs @@ -1,6 +1,10 @@ // generated by codegen, do not edit fn test_method_call_expr() -> () { + // NOTE: Consider using `MethodCall` instead, as that also includes calls to methods using + // call syntax (such as `Foo::method(x)`), operation syntax (such as `x + y`), and + // indexing syntax (such as `x[y]`). + // // A method call expression. For example: x.foo(42); x.foo::(42); diff --git a/rust/ql/test/extractor-tests/generated/Module/Module.expected b/rust/ql/test/extractor-tests/generated/Module/Module.expected index d0259df5ee8..a22ef831d9f 100644 --- a/rust/ql/test/extractor-tests/generated/Module/Module.expected +++ b/rust/ql/test/extractor-tests/generated/Module/Module.expected @@ -11,4 +11,4 @@ getName | gen_module.rs:5:1:7:1 | mod bar | gen_module.rs:5:5:5:7 | bar | | lib.rs:1:1:1:19 | mod gen_module | lib.rs:1:9:1:18 | gen_module | getVisibility -| lib.rs:1:1:1:19 | mod gen_module | lib.rs:1:1:1:3 | Visibility | +| lib.rs:1:1:1:19 | mod gen_module | lib.rs:1:1:1:3 | pub | diff --git a/rust/ql/test/extractor-tests/generated/Struct/Struct.ql b/rust/ql/test/extractor-tests/generated/Struct/Struct.ql index 25a980701c5..a4cf01bbfdc 100644 --- a/rust/ql/test/extractor-tests/generated/Struct/Struct.ql +++ b/rust/ql/test/extractor-tests/generated/Struct/Struct.ql @@ -18,10 +18,6 @@ query predicate getAttr(Struct x, int index, Attr getAttr) { toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) } -query predicate getFieldList(Struct x, FieldList getFieldList) { - toBeTested(x) and not x.isUnknown() and getFieldList = x.getFieldList() -} - query predicate getGenericParamList(Struct x, GenericParamList getGenericParamList) { toBeTested(x) and not x.isUnknown() and getGenericParamList = x.getGenericParamList() } @@ -37,3 +33,7 @@ query predicate getVisibility(Struct x, Visibility getVisibility) { query predicate getWhereClause(Struct x, WhereClause getWhereClause) { toBeTested(x) and not x.isUnknown() and getWhereClause = x.getWhereClause() } + +query predicate getFieldList(Struct x, FieldList getFieldList) { + toBeTested(x) and not x.isUnknown() and getFieldList = x.getFieldList() +} diff --git a/rust/ql/test/extractor-tests/generated/StructField/StructField.expected b/rust/ql/test/extractor-tests/generated/StructField/StructField.expected index 3b5d0d7b71c..285d3530c66 100644 --- a/rust/ql/test/extractor-tests/generated/StructField/StructField.expected +++ b/rust/ql/test/extractor-tests/generated/StructField/StructField.expected @@ -1,9 +1,9 @@ instances -| gen_struct_field.rs:7:16:7:21 | StructField | isUnsafe: | no | +| gen_struct_field.rs:7:16:7:21 | x: i32 | isUnsafe: | no | getAttr getDefault getName -| gen_struct_field.rs:7:16:7:21 | StructField | gen_struct_field.rs:7:16:7:16 | x | +| gen_struct_field.rs:7:16:7:21 | x: i32 | gen_struct_field.rs:7:16:7:16 | x | getTypeRepr -| gen_struct_field.rs:7:16:7:21 | StructField | gen_struct_field.rs:7:19:7:21 | i32 | +| gen_struct_field.rs:7:16:7:21 | x: i32 | gen_struct_field.rs:7:19:7:21 | i32 | getVisibility diff --git a/rust/ql/test/extractor-tests/generated/StructFieldList/StructFieldList.expected b/rust/ql/test/extractor-tests/generated/StructFieldList/StructFieldList.expected index 847bfd3c937..3e9fe67dd29 100644 --- a/rust/ql/test/extractor-tests/generated/StructFieldList/StructFieldList.expected +++ b/rust/ql/test/extractor-tests/generated/StructFieldList/StructFieldList.expected @@ -1,5 +1,5 @@ instances | gen_struct_field_list.rs:7:14:7:31 | StructFieldList | getField -| gen_struct_field_list.rs:7:14:7:31 | StructFieldList | 0 | gen_struct_field_list.rs:7:16:7:21 | StructField | -| gen_struct_field_list.rs:7:14:7:31 | StructFieldList | 1 | gen_struct_field_list.rs:7:24:7:29 | StructField | +| gen_struct_field_list.rs:7:14:7:31 | StructFieldList | 0 | gen_struct_field_list.rs:7:16:7:21 | x: i32 | +| gen_struct_field_list.rs:7:14:7:31 | StructFieldList | 1 | gen_struct_field_list.rs:7:24:7:29 | y: i32 | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait.expected index e0f91737d5e..9e8d41cb5ff 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait.expected @@ -13,6 +13,6 @@ getName | gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:11:10:13 | Foo | getTypeBoundList getVisibility -| gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:1:10:3 | Visibility | +| gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:1:10:3 | pub | getWhereClause | gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:32:10:54 | WhereClause | diff --git a/rust/ql/test/extractor-tests/generated/TupleField/gen_tuple_field.rs b/rust/ql/test/extractor-tests/generated/TupleField/gen_tuple_field.rs index 96fe3582e40..e7a28dd5939 100644 --- a/rust/ql/test/extractor-tests/generated/TupleField/gen_tuple_field.rs +++ b/rust/ql/test/extractor-tests/generated/TupleField/gen_tuple_field.rs @@ -1,7 +1,7 @@ // generated by codegen, do not edit fn test_tuple_field() -> () { - // A field in a tuple struct or tuple enum variant. + // A field in a tuple struct or tuple variant. // // For example: struct S(i32, String); diff --git a/rust/ql/test/extractor-tests/generated/TupleFieldList/gen_tuple_field_list.rs b/rust/ql/test/extractor-tests/generated/TupleFieldList/gen_tuple_field_list.rs index 26f955c4add..d010d73c207 100644 --- a/rust/ql/test/extractor-tests/generated/TupleFieldList/gen_tuple_field_list.rs +++ b/rust/ql/test/extractor-tests/generated/TupleFieldList/gen_tuple_field_list.rs @@ -1,7 +1,7 @@ // generated by codegen, do not edit fn test_tuple_field_list() -> () { - // A list of fields in a tuple struct or tuple enum variant. + // A list of fields in a tuple struct or tuple variant. // // For example: struct S(i32, String); diff --git a/rust/ql/test/extractor-tests/generated/Union/Union.ql b/rust/ql/test/extractor-tests/generated/Union/Union.ql index 9c555d1e590..922e8ef4a59 100644 --- a/rust/ql/test/extractor-tests/generated/Union/Union.ql +++ b/rust/ql/test/extractor-tests/generated/Union/Union.ql @@ -26,10 +26,6 @@ query predicate getName(Union x, Name getName) { toBeTested(x) and not x.isUnknown() and getName = x.getName() } -query predicate getStructFieldList(Union x, StructFieldList getStructFieldList) { - toBeTested(x) and not x.isUnknown() and getStructFieldList = x.getStructFieldList() -} - query predicate getVisibility(Union x, Visibility getVisibility) { toBeTested(x) and not x.isUnknown() and getVisibility = x.getVisibility() } @@ -37,3 +33,7 @@ query predicate getVisibility(Union x, Visibility getVisibility) { query predicate getWhereClause(Union x, WhereClause getWhereClause) { toBeTested(x) and not x.isUnknown() and getWhereClause = x.getWhereClause() } + +query predicate getStructFieldList(Union x, StructFieldList getStructFieldList) { + toBeTested(x) and not x.isUnknown() and getStructFieldList = x.getStructFieldList() +} diff --git a/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected b/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected index 4bc7fefe4c1..2d032d6eee4 100644 --- a/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected +++ b/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected @@ -1,4 +1,4 @@ instances -| gen_visibility.rs:7:7:7:9 | Visibility | -| lib.rs:1:1:1:3 | Visibility | +| gen_visibility.rs:7:7:7:9 | pub | +| lib.rs:1:1:1:3 | pub | getPath diff --git a/rust/ql/test/extractor-tests/literal/literal.expected b/rust/ql/test/extractor-tests/literal/literal.expected index d229d968467..bc08d37fc96 100644 --- a/rust/ql/test/extractor-tests/literal/literal.expected +++ b/rust/ql/test/extractor-tests/literal/literal.expected @@ -16,30 +16,32 @@ stringLiteral | literal.rs:21:5:21:8 | r"R" | | literal.rs:22:5:22:11 | "\\\\x52" | | literal.rs:23:5:23:11 | r"\\x52" | +| literal.rs:25:5:29:5 | "\n A normal string literal\n... | +| literal.rs:31:5:34:6 | r#"\n A raw string literal\n ... | integerLiteral -| literal.rs:28:5:28:7 | 123 | | -| literal.rs:29:5:29:10 | 123i32 | i32 | -| literal.rs:30:5:30:10 | 123u32 | u32 | -| literal.rs:31:5:31:11 | 123_u32 | u32 | -| literal.rs:33:5:33:8 | 0xff | | -| literal.rs:34:5:34:11 | 0xff_u8 | u8 | -| literal.rs:35:5:35:12 | 0x01_f32 | | -| literal.rs:36:5:36:11 | 0x01_e3 | | -| literal.rs:38:5:38:8 | 0o70 | | -| literal.rs:39:5:39:12 | 0o70_i16 | i16 | -| literal.rs:41:5:41:25 | 0b1111_1111_1001_0000 | | -| literal.rs:42:5:42:28 | 0b1111_1111_1001_0000i64 | i64 | -| literal.rs:43:5:43:15 | 0b________1 | | -| literal.rs:45:5:45:10 | 0usize | usize | -| literal.rs:48:5:49:10 | 128_i8 | i8 | -| literal.rs:50:5:51:10 | 256_u8 | u8 | +| literal.rs:39:5:39:7 | 123 | | +| literal.rs:40:5:40:10 | 123i32 | i32 | +| literal.rs:41:5:41:10 | 123u32 | u32 | +| literal.rs:42:5:42:11 | 123_u32 | u32 | +| literal.rs:44:5:44:8 | 0xff | | +| literal.rs:45:5:45:11 | 0xff_u8 | u8 | +| literal.rs:46:5:46:12 | 0x01_f32 | | +| literal.rs:47:5:47:11 | 0x01_e3 | | +| literal.rs:49:5:49:8 | 0o70 | | +| literal.rs:50:5:50:12 | 0o70_i16 | i16 | +| literal.rs:52:5:52:25 | 0b1111_1111_1001_0000 | | +| literal.rs:53:5:53:28 | 0b1111_1111_1001_0000i64 | i64 | +| literal.rs:54:5:54:15 | 0b________1 | | +| literal.rs:56:5:56:10 | 0usize | usize | +| literal.rs:59:5:60:10 | 128_i8 | i8 | +| literal.rs:61:5:62:10 | 256_u8 | u8 | floatLiteral -| literal.rs:56:5:56:8 | 5f32 | f32 | -| literal.rs:58:5:58:12 | 123.0f64 | f64 | -| literal.rs:59:5:59:10 | 0.1f64 | f64 | -| literal.rs:60:5:60:10 | 0.1f32 | f32 | -| literal.rs:61:5:61:14 | 12E+99_f64 | f64 | -| literal.rs:62:18:62:19 | 2. | | +| literal.rs:67:5:67:8 | 5f32 | f32 | +| literal.rs:69:5:69:12 | 123.0f64 | f64 | +| literal.rs:70:5:70:10 | 0.1f64 | f64 | +| literal.rs:71:5:71:10 | 0.1f32 | f32 | +| literal.rs:72:5:72:14 | 12E+99_f64 | f64 | +| literal.rs:73:18:73:19 | 2. | | booleanLiteral -| literal.rs:66:5:66:8 | true | -| literal.rs:67:5:67:9 | false | +| literal.rs:77:5:77:8 | true | +| literal.rs:78:5:78:9 | false | diff --git a/rust/ql/test/extractor-tests/literal/literal.rs b/rust/ql/test/extractor-tests/literal/literal.rs index ea4ccdece63..4a91c3e7041 100644 --- a/rust/ql/test/extractor-tests/literal/literal.rs +++ b/rust/ql/test/extractor-tests/literal/literal.rs @@ -21,6 +21,17 @@ fn string_literals() { r"R"; // R "\\x52"; r"\x52"; // \x52 + + " + A normal string literal + across many + lines + "; + + r#" + A raw string literal + across multiple lines + "#; } fn integer_literals() { diff --git a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 141cfc355b9..00000000000 --- a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| proc_macro.rs:44:27:44:30 | ...::to_tokens(...) | diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected index 1a0ded6950d..5d43ff532fd 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -146,10 +146,10 @@ lib.rs: # 1| [SourceFile] SourceFile # 1| getItem(0): [Module] mod call # 1| getName(): [Name] call -# 1| getVisibility(): [Visibility] Visibility +# 1| getVisibility(): [Visibility] pub # 2| getItem(1): [Module] mod macro_expansion # 2| getName(): [Name] macro_expansion -# 2| getVisibility(): [Visibility] Visibility +# 2| getVisibility(): [Visibility] pub macro_expansion.rs: # 1| [SourceFile] SourceFile # 1| getItem(0): [Use] use proc_macro::{...} @@ -223,7 +223,7 @@ macro_expansion.rs: # 11| getSegment(): [PathSegment] inner_1 # 11| getIdentifier(): [NameRef] inner_1 # 4| getName(): [Name] foo -# 4| getVisibility(): [Visibility] Visibility +# 4| getVisibility(): [Visibility] pub # 4| getItem(1): [Function] fn foo_new # 4| getParamList(): [ParamList] ParamList # 4| getFunctionBody(): [BlockExpr] { ... } @@ -271,7 +271,7 @@ macro_expansion.rs: # 11| getSegment(): [PathSegment] inner_1 # 11| getIdentifier(): [NameRef] inner_1 # 4| getName(): [Name] foo_new -# 4| getVisibility(): [Visibility] Visibility +# 4| getVisibility(): [Visibility] pub # 3| getAttr(0): [Attr] Attr # 3| getMeta(): [Meta] Meta # 3| getPath(): [Path] add_one @@ -286,13 +286,13 @@ macro_expansion.rs: # 16| getFunctionBody(): [BlockExpr] { ... } # 16| getStmtList(): [StmtList] StmtList # 16| getName(): [Name] bar_0 -# 16| getVisibility(): [Visibility] Visibility +# 16| getVisibility(): [Visibility] pub # 16| getItem(1): [Function] fn bar_0_new # 16| getParamList(): [ParamList] ParamList # 16| getFunctionBody(): [BlockExpr] { ... } # 16| getStmtList(): [StmtList] StmtList # 16| getName(): [Name] bar_0_new -# 16| getVisibility(): [Visibility] Visibility +# 16| getVisibility(): [Visibility] pub # 15| getAttr(0): [Attr] Attr # 15| getMeta(): [Meta] Meta # 15| getPath(): [Path] add_one @@ -305,13 +305,13 @@ macro_expansion.rs: # 16| getFunctionBody(): [BlockExpr] { ... } # 16| getStmtList(): [StmtList] StmtList # 16| getName(): [Name] bar_1 -# 16| getVisibility(): [Visibility] Visibility +# 16| getVisibility(): [Visibility] pub # 16| getItem(1): [Function] fn bar_1_new # 16| getParamList(): [ParamList] ParamList # 16| getFunctionBody(): [BlockExpr] { ... } # 16| getStmtList(): [StmtList] StmtList # 16| getName(): [Name] bar_1_new -# 16| getVisibility(): [Visibility] Visibility +# 16| getVisibility(): [Visibility] pub # 15| getAttr(0): [Attr] Attr # 15| getMeta(): [Meta] Meta # 15| getPath(): [Path] add_one @@ -340,7 +340,7 @@ macro_expansion.rs: # 22| getTokenTree(): [TokenTree] TokenTree # 28| getItem(5): [Struct] struct S # 28| getName(): [Name] S -# 28| getVisibility(): [Visibility] Visibility +# 28| getVisibility(): [Visibility] pub # 30| getItem(6): [Impl] impl S { ... } # 30| getAssocItemList(): [AssocItemList] AssocItemList # 31| getAssocItem(0): [Function] (item with attribute macro expansion) @@ -392,7 +392,7 @@ macro_expansion.rs: # 31| getSegment(): [PathSegment] _print # 31| getIdentifier(): [NameRef] _print # 32| getName(): [Name] bzz_0 -# 32| getVisibility(): [Visibility] Visibility +# 32| getVisibility(): [Visibility] pub # 32| getItem(1): [Function] fn bzz_1 # 32| getParamList(): [ParamList] ParamList # 32| getFunctionBody(): [BlockExpr] { ... } @@ -440,7 +440,7 @@ macro_expansion.rs: # 31| getSegment(): [PathSegment] _print # 31| getIdentifier(): [NameRef] _print # 32| getName(): [Name] bzz_1 -# 32| getVisibility(): [Visibility] Visibility +# 32| getVisibility(): [Visibility] pub # 32| getItem(2): [Function] fn bzz_2 # 32| getParamList(): [ParamList] ParamList # 32| getFunctionBody(): [BlockExpr] { ... } @@ -488,7 +488,7 @@ macro_expansion.rs: # 31| getSegment(): [PathSegment] _print # 31| getIdentifier(): [NameRef] _print # 32| getName(): [Name] bzz_2 -# 32| getVisibility(): [Visibility] Visibility +# 32| getVisibility(): [Visibility] pub # 31| getAttr(0): [Attr] Attr # 31| getMeta(): [Meta] Meta # 31| getPath(): [Path] repeat @@ -515,7 +515,7 @@ macro_expansion.rs: # 44| getFunctionBody(): [BlockExpr] { ... } # 44| getStmtList(): [StmtList] StmtList # 44| getName(): [Name] x -# 44| getVisibility(): [Visibility] Visibility +# 44| getVisibility(): [Visibility] pub # 43| getSelfTy(): [PathTypeRepr] S # 43| getPath(): [Path] S # 43| getSegment(): [PathSegment] S @@ -660,7 +660,7 @@ macro_expansion.rs: # 71| getSegment(): [PathSegment] i32 # 71| getIdentifier(): [NameRef] i32 # 72| getTailExpr(): [CastExpr] a as ... -# 72| getExpr(): [PathExpr,VariableAccess] a +# 72| getExpr(): [VariableAccess] a # 72| getPath(): [Path] a # 72| getSegment(): [PathSegment] a # 72| getIdentifier(): [NameRef] a @@ -699,8 +699,9 @@ macro_expansion.rs: # 76| getSegment(): [PathSegment] i32 # 76| getIdentifier(): [NameRef] i32 # 78| getItem(16): [Struct] struct MyStruct +# 78| getName(): [Name] MyStruct # 78| getFieldList(): [StructFieldList] StructFieldList -# 79| getField(0): [StructField] StructField +# 79| getField(0): [StructField] field: ... # 79| getName(): [Name] field # 79| getTypeRepr(): [MacroTypeRepr] MacroTypeRepr # 79| getMacroCall(): [MacroCall] my_int!... @@ -712,7 +713,6 @@ macro_expansion.rs: # 79| getPath(): [Path] i32 # 79| getSegment(): [PathSegment] i32 # 79| getIdentifier(): [NameRef] i32 -# 78| getName(): [Name] MyStruct # 83| getItem(17): [Struct] struct MyDerive # 84| getDeriveMacroExpansion(0): [MacroItems] MacroItems # 84| getItem(0): [Impl] impl ...::Debug for MyDerive::<...> { ... } @@ -738,7 +738,7 @@ macro_expansion.rs: # 84| getFunctionBody(): [BlockExpr] { ... } # 84| getStmtList(): [StmtList] StmtList # 84| getTailExpr(): [MatchExpr] match self { ... } -# 83| getScrutinee(): [PathExpr,VariableAccess] self +# 83| getScrutinee(): [VariableAccess] self # 83| getPath(): [Path] self # 83| getSegment(): [PathSegment] self # 83| getIdentifier(): [NameRef] self @@ -751,7 +751,7 @@ macro_expansion.rs: # 85| getArgList(): [ArgList] ArgList # 83| getArg(0): [StringLiteralExpr] "field" # 85| getArg(1): [RefExpr] &field -# 85| getExpr(): [PathExpr,VariableAccess] field +# 85| getExpr(): [VariableAccess] field # 85| getPath(): [Path] field # 85| getSegment(): [PathSegment] field # 85| getIdentifier(): [NameRef] field @@ -760,7 +760,7 @@ macro_expansion.rs: # 83| getArgList(): [ArgList] ArgList # 83| getArg(0): [StringLiteralExpr] "MyDerive" # 83| getIdentifier(): [NameRef] debug_struct -# 83| getReceiver(): [PathExpr,VariableAccess] f +# 83| getReceiver(): [VariableAccess] f # 83| getPath(): [Path] f # 83| getSegment(): [PathSegment] f # 83| getIdentifier(): [NameRef] f @@ -808,14 +808,14 @@ macro_expansion.rs: # 83| getSegment(): [PathSegment] derive # 83| getIdentifier(): [NameRef] derive # 83| getTokenTree(): [TokenTree] TokenTree +# 84| getName(): [Name] MyDerive # 84| getFieldList(): [StructFieldList] StructFieldList -# 85| getField(0): [StructField] StructField +# 85| getField(0): [StructField] field: usize # 85| getName(): [Name] field # 85| getTypeRepr(): [PathTypeRepr] usize # 85| getPath(): [Path] usize # 85| getSegment(): [PathSegment] usize # 85| getIdentifier(): [NameRef] usize -# 84| getName(): [Name] MyDerive # 88| getItem(18): [Enum] enum MyDeriveEnum # 89| getDeriveMacroExpansion(0): [MacroItems] MacroItems # 89| getItem(0): [Impl] impl ...::PartialEq for MyDeriveEnum::<...> { ... } @@ -836,11 +836,11 @@ macro_expansion.rs: # 89| getStmtList(): [StmtList] StmtList # 89| getTailExpr(): [MatchExpr] match ... { ... } # 88| getScrutinee(): [TupleExpr] TupleExpr -# 88| getField(0): [PathExpr,VariableAccess] self +# 88| getField(0): [VariableAccess] self # 88| getPath(): [Path] self # 88| getSegment(): [PathSegment] self # 88| getIdentifier(): [NameRef] self -# 88| getField(1): [PathExpr,VariableAccess] other +# 88| getField(1): [VariableAccess] other # 88| getPath(): [Path] other # 88| getSegment(): [PathSegment] other # 88| getIdentifier(): [NameRef] other @@ -990,13 +990,13 @@ macro_expansion.rs: # 98| getTokenTree(): [TokenTree] TokenTree # 99| getName(): [Name] MyDeriveUnion # 99| getStructFieldList(): [StructFieldList] StructFieldList -# 100| getField(0): [StructField] StructField +# 100| getField(0): [StructField] field1: usize # 100| getName(): [Name] field1 # 100| getTypeRepr(): [PathTypeRepr] usize # 100| getPath(): [Path] usize # 100| getSegment(): [PathSegment] usize # 100| getIdentifier(): [NameRef] usize -# 101| getField(1): [StructField] StructField +# 101| getField(1): [StructField] field2: f64 # 101| getName(): [Name] field2 # 101| getTypeRepr(): [PathTypeRepr] f64 # 101| getPath(): [Path] f64 @@ -1076,7 +1076,7 @@ proc_macro.rs: # 6| getMacroCallExpansion(): [MatchExpr] match ... { ... } # 6| getScrutinee(): [CallExpr] ...::parse::<...>(...) # 6| getArgList(): [ArgList] ArgList -# 6| getArg(0): [PathExpr,VariableAccess] attr +# 6| getArg(0): [VariableAccess] attr # 6| getPath(): [Path] attr # 6| getSegment(): [PathSegment] attr # 6| getIdentifier(): [NameRef] attr @@ -1098,7 +1098,7 @@ proc_macro.rs: # 6| getIdentifier(): [NameRef] parse # 6| getMatchArmList(): [MatchArmList] MatchArmList # 6| getArm(0): [MatchArm] ... => data -# 6| getExpr(): [PathExpr,VariableAccess] data +# 6| getExpr(): [VariableAccess] data # 6| getPath(): [Path] data # 6| getSegment(): [PathSegment] data # 6| getIdentifier(): [NameRef] data @@ -1124,7 +1124,7 @@ proc_macro.rs: # 6| getArg(0): [MethodCallExpr] err.to_compile_error() # 6| getArgList(): [ArgList] ArgList # 6| getIdentifier(): [NameRef] to_compile_error -# 6| getReceiver(): [PathExpr,VariableAccess] err +# 6| getReceiver(): [VariableAccess] err # 6| getPath(): [Path] err # 6| getSegment(): [PathSegment] err # 6| getIdentifier(): [NameRef] err @@ -1168,7 +1168,7 @@ proc_macro.rs: # 7| getMacroCallExpansion(): [MatchExpr] match ... { ... } # 7| getScrutinee(): [CallExpr] ...::parse::<...>(...) # 7| getArgList(): [ArgList] ArgList -# 7| getArg(0): [PathExpr,VariableAccess] item +# 7| getArg(0): [VariableAccess] item # 7| getPath(): [Path] item # 7| getSegment(): [PathSegment] item # 7| getIdentifier(): [NameRef] item @@ -1190,7 +1190,7 @@ proc_macro.rs: # 7| getIdentifier(): [NameRef] parse # 7| getMatchArmList(): [MatchArmList] MatchArmList # 7| getArm(0): [MatchArm] ... => data -# 7| getExpr(): [PathExpr,VariableAccess] data +# 7| getExpr(): [VariableAccess] data # 7| getPath(): [Path] data # 7| getSegment(): [PathSegment] data # 7| getIdentifier(): [NameRef] data @@ -1216,7 +1216,7 @@ proc_macro.rs: # 7| getArg(0): [MethodCallExpr] err.to_compile_error() # 7| getArgList(): [ArgList] ArgList # 7| getIdentifier(): [NameRef] to_compile_error -# 7| getReceiver(): [PathExpr,VariableAccess] err +# 7| getReceiver(): [VariableAccess] err # 7| getPath(): [Path] err # 7| getSegment(): [PathSegment] err # 7| getIdentifier(): [NameRef] err @@ -1273,7 +1273,7 @@ proc_macro.rs: # 10| getInitializer(): [MethodCallExpr] ast.clone() # 10| getArgList(): [ArgList] ArgList # 10| getIdentifier(): [NameRef] clone -# 10| getReceiver(): [PathExpr,VariableAccess] ast +# 10| getReceiver(): [VariableAccess] ast # 10| getPath(): [Path] ast # 10| getSegment(): [PathSegment] ast # 10| getIdentifier(): [NameRef] ast @@ -1283,7 +1283,7 @@ proc_macro.rs: # 11| getExpr(): [AssignmentExpr] ... = ... # 11| getLhs(): [FieldExpr] ... .ident # 11| getContainer(): [FieldExpr] new_ast.sig -# 11| getContainer(): [PathExpr,VariableAccess] new_ast +# 11| getContainer(): [VariableAccess] new_ast # 11| getPath(): [Path] new_ast # 11| getSegment(): [PathSegment] new_ast # 11| getIdentifier(): [NameRef] new_ast @@ -1320,14 +1320,14 @@ proc_macro.rs: # 11| getArg(0): [FormatArgsArg] FormatArgsArg # 11| getExpr(): [FieldExpr] ... .ident # 11| getContainer(): [FieldExpr] ast.sig -# 11| getContainer(): [PathExpr,VariableAccess] ast +# 11| getContainer(): [VariableAccess] ast # 11| getPath(): [Path] ast # 11| getSegment(): [PathSegment] ast # 11| getIdentifier(): [NameRef] ast # 11| getIdentifier(): [NameRef] sig # 11| getIdentifier(): [NameRef] ident # 11| getArg(1): [FormatArgsArg] FormatArgsArg -# 11| getExpr(): [PathExpr,VariableAccess] i +# 11| getExpr(): [VariableAccess] i # 11| getPath(): [Path] i # 11| getSegment(): [PathSegment] i # 11| getIdentifier(): [NameRef] i @@ -1359,7 +1359,7 @@ proc_macro.rs: # 11| getIdentifier(): [NameRef] span # 11| getReceiver(): [FieldExpr] ... .ident # 11| getContainer(): [FieldExpr] ast.sig -# 11| getContainer(): [PathExpr,VariableAccess] ast +# 11| getContainer(): [VariableAccess] ast # 11| getPath(): [Path] ast # 11| getSegment(): [PathSegment] ast # 11| getIdentifier(): [NameRef] ast @@ -1375,14 +1375,14 @@ proc_macro.rs: # 11| getIdentifier(): [NameRef] Ident # 11| getSegment(): [PathSegment] new # 11| getIdentifier(): [NameRef] new -# 12| getTailExpr(): [PathExpr,VariableAccess] new_ast +# 12| getTailExpr(): [VariableAccess] new_ast # 12| getPath(): [Path] new_ast # 12| getSegment(): [PathSegment] new_ast # 12| getIdentifier(): [NameRef] new_ast # 9| getIdentifier(): [NameRef] map # 8| getReceiver(): [ParenExpr] (...) # 8| getExpr(): [RangeExpr] 0..number -# 8| getEnd(): [PathExpr,VariableAccess] number +# 8| getEnd(): [VariableAccess] number # 8| getPath(): [Path] number # 8| getSegment(): [PathSegment] number # 8| getIdentifier(): [NameRef] number @@ -1614,7 +1614,7 @@ proc_macro.rs: # 16| getInitializer(): [MethodCallExpr] items.quote_into_iter() # 15| getArgList(): [ArgList] ArgList # 15| getIdentifier(): [NameRef] quote_into_iter -# 16| getReceiver(): [PathExpr,VariableAccess] items +# 16| getReceiver(): [VariableAccess] items # 16| getPath(): [Path] items # 16| getSegment(): [PathSegment] items # 16| getIdentifier(): [NameRef] items @@ -1625,11 +1625,11 @@ proc_macro.rs: # 15| getName(): [Name] i # 15| getStatement(1): [LetStmt] let ... = ... # 15| getInitializer(): [BinaryExpr] ... | ... -# 15| getLhs(): [PathExpr,VariableAccess] has_iter +# 15| getLhs(): [VariableAccess] has_iter # 15| getPath(): [Path] has_iter # 15| getSegment(): [PathSegment] has_iter # 15| getIdentifier(): [NameRef] has_iter -# 15| getRhs(): [PathExpr,VariableAccess] i +# 15| getRhs(): [VariableAccess] i # 15| getPath(): [Path] i # 15| getSegment(): [PathSegment] i # 15| getIdentifier(): [NameRef] i @@ -1646,7 +1646,7 @@ proc_macro.rs: # 16| getTokenTree(): [TokenTree] TokenTree # 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr # 15| getStatement(3): [LetStmt] let _ = has_iter -# 15| getInitializer(): [PathExpr,VariableAccess] has_iter +# 15| getInitializer(): [VariableAccess] has_iter # 15| getPath(): [Path] has_iter # 15| getSegment(): [PathSegment] has_iter # 15| getIdentifier(): [NameRef] has_iter @@ -1764,15 +1764,15 @@ proc_macro.rs: # 16| getScrutinee(): [MethodCallExpr] items.next() # 15| getArgList(): [ArgList] ArgList # 15| getIdentifier(): [NameRef] next -# 16| getReceiver(): [PathExpr,VariableAccess] items +# 16| getReceiver(): [VariableAccess] items # 16| getPath(): [Path] items # 16| getSegment(): [PathSegment] items # 16| getIdentifier(): [NameRef] items # 15| getMatchArmList(): [MatchArmList] MatchArmList # 15| getArm(0): [MatchArm] ... => ... -# 15| getExpr(): [CallExpr] ...::RepInterp(...) +# 15| getExpr(): [TupleStructExpr] ...::RepInterp(...) # 15| getArgList(): [ArgList] ArgList -# 15| getArg(0): [PathExpr] _x +# 15| getArg(0): [VariableAccess] _x # 15| getPath(): [Path] _x # 15| getSegment(): [PathSegment] _x # 15| getIdentifier(): [NameRef] _x @@ -1876,12 +1876,12 @@ proc_macro.rs: # 16| getExpr(): [CallExpr] ...::to_tokens(...) # 16| getArgList(): [ArgList] ArgList # 16| getArg(0): [RefExpr] &items -# 16| getExpr(): [PathExpr,VariableAccess] items +# 16| getExpr(): [VariableAccess] items # 16| getPath(): [Path] items # 16| getSegment(): [PathSegment] items # 16| getIdentifier(): [NameRef] items # 15| getArg(1): [RefExpr] &mut _s -# 15| getExpr(): [PathExpr] _s +# 15| getExpr(): [VariableAccess] _s # 15| getPath(): [Path] _s # 15| getSegment(): [PathSegment] _s # 15| getIdentifier(): [NameRef] _s @@ -1993,7 +1993,7 @@ proc_macro.rs: # 15| getIdentifier(): [NameRef] quote_token_with_context # 16| getTokenTree(): [TokenTree] TokenTree # 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr -# 15| getTailExpr(): [PathExpr] _s +# 15| getTailExpr(): [VariableAccess] _s # 15| getPath(): [Path] _s # 15| getSegment(): [PathSegment] _s # 15| getIdentifier(): [NameRef] _s @@ -2003,7 +2003,7 @@ proc_macro.rs: # 5| getPath(): [Path] TokenStream # 5| getSegment(): [PathSegment] TokenStream # 5| getIdentifier(): [NameRef] TokenStream -# 5| getVisibility(): [Visibility] Visibility +# 5| getVisibility(): [Visibility] pub # 20| getItem(3): [Function] fn add_one # 21| getParamList(): [ParamList] ParamList # 21| getParam(0): [Param] ...: TokenStream @@ -2040,7 +2040,7 @@ proc_macro.rs: # 22| getMacroCallExpansion(): [MatchExpr] match ... { ... } # 22| getScrutinee(): [CallExpr] ...::parse::<...>(...) # 22| getArgList(): [ArgList] ArgList -# 22| getArg(0): [PathExpr,VariableAccess] item +# 22| getArg(0): [VariableAccess] item # 22| getPath(): [Path] item # 22| getSegment(): [PathSegment] item # 22| getIdentifier(): [NameRef] item @@ -2062,7 +2062,7 @@ proc_macro.rs: # 22| getIdentifier(): [NameRef] parse # 22| getMatchArmList(): [MatchArmList] MatchArmList # 22| getArm(0): [MatchArm] ... => data -# 22| getExpr(): [PathExpr,VariableAccess] data +# 22| getExpr(): [VariableAccess] data # 22| getPath(): [Path] data # 22| getSegment(): [PathSegment] data # 22| getIdentifier(): [NameRef] data @@ -2088,7 +2088,7 @@ proc_macro.rs: # 22| getArg(0): [MethodCallExpr] err.to_compile_error() # 22| getArgList(): [ArgList] ArgList # 22| getIdentifier(): [NameRef] to_compile_error -# 22| getReceiver(): [PathExpr,VariableAccess] err +# 22| getReceiver(): [VariableAccess] err # 22| getPath(): [Path] err # 22| getSegment(): [PathSegment] err # 22| getIdentifier(): [NameRef] err @@ -2123,7 +2123,7 @@ proc_macro.rs: # 23| getInitializer(): [MethodCallExpr] ast.clone() # 23| getArgList(): [ArgList] ArgList # 23| getIdentifier(): [NameRef] clone -# 23| getReceiver(): [PathExpr,VariableAccess] ast +# 23| getReceiver(): [VariableAccess] ast # 23| getPath(): [Path] ast # 23| getSegment(): [PathSegment] ast # 23| getIdentifier(): [NameRef] ast @@ -2133,7 +2133,7 @@ proc_macro.rs: # 24| getExpr(): [AssignmentExpr] ... = ... # 24| getLhs(): [FieldExpr] ... .ident # 24| getContainer(): [FieldExpr] new_ast.sig -# 24| getContainer(): [PathExpr,VariableAccess] new_ast +# 24| getContainer(): [VariableAccess] new_ast # 24| getPath(): [Path] new_ast # 24| getSegment(): [PathSegment] new_ast # 24| getIdentifier(): [NameRef] new_ast @@ -2170,7 +2170,7 @@ proc_macro.rs: # 24| getArg(0): [FormatArgsArg] FormatArgsArg # 24| getExpr(): [FieldExpr] ... .ident # 24| getContainer(): [FieldExpr] ast.sig -# 24| getContainer(): [PathExpr,VariableAccess] ast +# 24| getContainer(): [VariableAccess] ast # 24| getPath(): [Path] ast # 24| getSegment(): [PathSegment] ast # 24| getIdentifier(): [NameRef] ast @@ -2203,7 +2203,7 @@ proc_macro.rs: # 24| getIdentifier(): [NameRef] span # 24| getReceiver(): [FieldExpr] ... .ident # 24| getContainer(): [FieldExpr] ast.sig -# 24| getContainer(): [PathExpr,VariableAccess] ast +# 24| getContainer(): [VariableAccess] ast # 24| getPath(): [Path] ast # 24| getSegment(): [PathSegment] ast # 24| getIdentifier(): [NameRef] ast @@ -2317,12 +2317,12 @@ proc_macro.rs: # 26| getExpr(): [CallExpr] ...::to_tokens(...) # 26| getArgList(): [ArgList] ArgList # 26| getArg(0): [RefExpr] &ast -# 26| getExpr(): [PathExpr,VariableAccess] ast +# 26| getExpr(): [VariableAccess] ast # 26| getPath(): [Path] ast # 26| getSegment(): [PathSegment] ast # 26| getIdentifier(): [NameRef] ast # 25| getArg(1): [RefExpr] &mut _s -# 25| getExpr(): [PathExpr] _s +# 25| getExpr(): [VariableAccess] _s # 25| getPath(): [Path] _s # 25| getSegment(): [PathSegment] _s # 25| getIdentifier(): [NameRef] _s @@ -2362,12 +2362,12 @@ proc_macro.rs: # 27| getExpr(): [CallExpr] ...::to_tokens(...) # 27| getArgList(): [ArgList] ArgList # 27| getArg(0): [RefExpr] &new_ast -# 27| getExpr(): [PathExpr,VariableAccess] new_ast +# 27| getExpr(): [VariableAccess] new_ast # 27| getPath(): [Path] new_ast # 27| getSegment(): [PathSegment] new_ast # 27| getIdentifier(): [NameRef] new_ast # 25| getArg(1): [RefExpr] &mut _s -# 25| getExpr(): [PathExpr] _s +# 25| getExpr(): [VariableAccess] _s # 25| getPath(): [Path] _s # 25| getSegment(): [PathSegment] _s # 25| getIdentifier(): [NameRef] _s @@ -2424,7 +2424,7 @@ proc_macro.rs: # 25| getIdentifier(): [NameRef] quote_token_with_context # 27| getTokenTree(): [TokenTree] TokenTree # 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr -# 25| getTailExpr(): [PathExpr] _s +# 25| getTailExpr(): [VariableAccess] _s # 25| getPath(): [Path] _s # 25| getSegment(): [PathSegment] _s # 25| getIdentifier(): [NameRef] _s @@ -2434,7 +2434,7 @@ proc_macro.rs: # 21| getPath(): [Path] TokenStream # 21| getSegment(): [PathSegment] TokenStream # 21| getIdentifier(): [NameRef] TokenStream -# 21| getVisibility(): [Visibility] Visibility +# 21| getVisibility(): [Visibility] pub # 31| getItem(4): [Function] fn erase # 32| getParamList(): [ParamList] ParamList # 32| getParam(0): [Param] ...: TokenStream @@ -2473,7 +2473,7 @@ proc_macro.rs: # 32| getPath(): [Path] TokenStream # 32| getSegment(): [PathSegment] TokenStream # 32| getIdentifier(): [NameRef] TokenStream -# 32| getVisibility(): [Visibility] Visibility +# 32| getVisibility(): [Visibility] pub # 36| getItem(5): [Function] fn my_trait_derive # 37| getParamList(): [ParamList] ParamList # 37| getParam(0): [Param] ...: TokenStream @@ -2504,7 +2504,7 @@ proc_macro.rs: # 38| getMacroCallExpansion(): [MatchExpr] match ... { ... } # 38| getScrutinee(): [CallExpr] ...::parse::<...>(...) # 38| getArgList(): [ArgList] ArgList -# 38| getArg(0): [PathExpr,VariableAccess] input +# 38| getArg(0): [VariableAccess] input # 38| getPath(): [Path] input # 38| getSegment(): [PathSegment] input # 38| getIdentifier(): [NameRef] input @@ -2526,7 +2526,7 @@ proc_macro.rs: # 38| getIdentifier(): [NameRef] parse # 38| getMatchArmList(): [MatchArmList] MatchArmList # 38| getArm(0): [MatchArm] ... => data -# 38| getExpr(): [PathExpr,VariableAccess] data +# 38| getExpr(): [VariableAccess] data # 38| getPath(): [Path] data # 38| getSegment(): [PathSegment] data # 38| getIdentifier(): [NameRef] data @@ -2552,7 +2552,7 @@ proc_macro.rs: # 38| getArg(0): [MethodCallExpr] err.to_compile_error() # 38| getArgList(): [ArgList] ArgList # 38| getIdentifier(): [NameRef] to_compile_error -# 38| getReceiver(): [PathExpr,VariableAccess] err +# 38| getReceiver(): [VariableAccess] err # 38| getPath(): [Path] err # 38| getSegment(): [PathSegment] err # 38| getIdentifier(): [NameRef] err @@ -2586,7 +2586,7 @@ proc_macro.rs: # 39| getStatement(1): [LetStmt] let ... = ... # 39| getInitializer(): [RefExpr] &... # 39| getExpr(): [FieldExpr] ast.ident -# 39| getContainer(): [PathExpr,VariableAccess] ast +# 39| getContainer(): [VariableAccess] ast # 39| getPath(): [Path] ast # 39| getSegment(): [PathSegment] ast # 39| getIdentifier(): [NameRef] ast @@ -2623,7 +2623,7 @@ proc_macro.rs: # 40| getTokenTree(): [TokenTree] TokenTree # 40| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr # 40| getArg(0): [FormatArgsArg] FormatArgsArg -# 40| getExpr(): [PathExpr,VariableAccess] name +# 40| getExpr(): [VariableAccess] name # 40| getPath(): [Path] name # 40| getSegment(): [PathSegment] name # 40| getIdentifier(): [NameRef] name @@ -2652,7 +2652,7 @@ proc_macro.rs: # 40| getArg(1): [MethodCallExpr] name.span() # 40| getArgList(): [ArgList] ArgList # 40| getIdentifier(): [NameRef] span -# 40| getReceiver(): [PathExpr,VariableAccess] name +# 40| getReceiver(): [VariableAccess] name # 40| getPath(): [Path] name # 40| getSegment(): [PathSegment] name # 40| getIdentifier(): [NameRef] name @@ -2776,7 +2776,7 @@ proc_macro.rs: # 42| getExpr(): [CallExpr] ...::push_ident(...) # 42| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -2812,12 +2812,12 @@ proc_macro.rs: # 42| getExpr(): [CallExpr] ...::to_tokens(...) # 42| getArgList(): [ArgList] ArgList # 42| getArg(0): [RefExpr] &const_ident -# 42| getExpr(): [PathExpr,VariableAccess] const_ident +# 42| getExpr(): [VariableAccess] const_ident # 42| getPath(): [Path] const_ident # 42| getSegment(): [PathSegment] const_ident # 42| getIdentifier(): [NameRef] const_ident # 41| getArg(1): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -2867,7 +2867,7 @@ proc_macro.rs: # 41| getExpr(): [CallExpr] ...::push_colon(...) # 41| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -2906,7 +2906,7 @@ proc_macro.rs: # 42| getExpr(): [CallExpr] ...::push_ident(...) # 42| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -2952,7 +2952,7 @@ proc_macro.rs: # 41| getExpr(): [CallExpr] ...::push_eq(...) # 41| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -2991,7 +2991,7 @@ proc_macro.rs: # 42| getExpr(): [CallExpr] ...::parse(...) # 42| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3037,7 +3037,7 @@ proc_macro.rs: # 41| getExpr(): [CallExpr] ...::push_semi(...) # 41| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3076,7 +3076,7 @@ proc_macro.rs: # 44| getExpr(): [CallExpr] ...::push_ident(...) # 44| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3122,7 +3122,7 @@ proc_macro.rs: # 44| getExpr(): [CallExpr] ...::push_ident(...) # 44| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3168,7 +3168,7 @@ proc_macro.rs: # 44| getExpr(): [CallExpr] ...::push_ident(...) # 44| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3204,12 +3204,12 @@ proc_macro.rs: # 44| getExpr(): [CallExpr] ...::to_tokens(...) # 44| getArgList(): [ArgList] ArgList # 44| getArg(0): [RefExpr] &name -# 44| getExpr(): [PathExpr,VariableAccess] name +# 44| getExpr(): [VariableAccess] name # 44| getPath(): [Path] name # 44| getSegment(): [PathSegment] name # 44| getIdentifier(): [NameRef] name # 41| getArg(1): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3259,7 +3259,7 @@ proc_macro.rs: # 45| getExpr(): [CallExpr] ...::push_group(...) # 45| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3384,7 +3384,7 @@ proc_macro.rs: # 45| getExpr(): [CallExpr] ...::push_ident(...) # 45| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3430,7 +3430,7 @@ proc_macro.rs: # 45| getExpr(): [CallExpr] ...::push_ident(...) # 45| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3476,7 +3476,7 @@ proc_macro.rs: # 41| getExpr(): [CallExpr] ...::push_group(...) # 41| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3552,7 +3552,7 @@ proc_macro.rs: # 41| getExpr(): [CallExpr] ...::push_rarrow(...) # 41| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3591,7 +3591,7 @@ proc_macro.rs: # 45| getExpr(): [CallExpr] ...::push_ident(...) # 45| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3637,7 +3637,7 @@ proc_macro.rs: # 46| getExpr(): [CallExpr] ...::push_group(...) # 46| getArgList(): [ArgList] ArgList # 41| getArg(0): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3687,12 +3687,12 @@ proc_macro.rs: # 46| getExpr(): [CallExpr] ...::to_tokens(...) # 46| getArgList(): [ArgList] ArgList # 46| getArg(0): [RefExpr] &const_ident -# 46| getExpr(): [PathExpr,VariableAccess] const_ident +# 46| getExpr(): [VariableAccess] const_ident # 46| getPath(): [Path] const_ident # 46| getSegment(): [PathSegment] const_ident # 46| getIdentifier(): [NameRef] const_ident # 41| getArg(1): [RefExpr] &mut _s -# 41| getExpr(): [PathExpr] _s +# 41| getExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3706,7 +3706,7 @@ proc_macro.rs: # 41| getIdentifier(): [NameRef] ToTokens # 41| getSegment(): [PathSegment] to_tokens # 41| getIdentifier(): [NameRef] to_tokens -# 41| getTailExpr(): [PathExpr] _s +# 41| getTailExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3752,7 +3752,7 @@ proc_macro.rs: # 41| getIdentifier(): [NameRef] quote_token_with_context # 45| getTokenTree(): [TokenTree] TokenTree # 41| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr -# 41| getTailExpr(): [PathExpr] _s +# 41| getTailExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3798,7 +3798,7 @@ proc_macro.rs: # 41| getIdentifier(): [NameRef] quote_token_with_context # 44| getTokenTree(): [TokenTree] TokenTree # 41| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr -# 41| getTailExpr(): [PathExpr] _s +# 41| getTailExpr(): [VariableAccess] _s # 41| getPath(): [Path] _s # 41| getSegment(): [PathSegment] _s # 41| getIdentifier(): [NameRef] _s @@ -3808,4 +3808,4 @@ proc_macro.rs: # 37| getPath(): [Path] TokenStream # 37| getSegment(): [PathSegment] TokenStream # 37| getIdentifier(): [NameRef] TokenStream -# 37| getVisibility(): [Visibility] Visibility +# 37| getVisibility(): [Visibility] pub diff --git a/rust/ql/test/extractor-tests/macro-expansion/test.ql b/rust/ql/test/extractor-tests/macro-expansion/test.ql index 7d97ea6a10f..6372dc2e93f 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/test.ql +++ b/rust/ql/test/extractor-tests/macro-expansion/test.ql @@ -5,7 +5,7 @@ query predicate attribute_macros(Item i, int index, Item expanded) { i.fromSource() and expanded = i.getAttributeMacroExpansion().getItem(index) } -query predicate derive_macros(Adt i, int index, int subIndex, Item expanded) { +query predicate derive_macros(TypeItem i, int index, int subIndex, Item expanded) { i.fromSource() and expanded = i.getDeriveMacroExpansion(index).getItem(subIndex) } diff --git a/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected b/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected index 30dbc24103b..aa0fc42f81d 100644 --- a/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected @@ -2,7 +2,7 @@ lib.rs: # 1| [SourceFile] SourceFile # 1| getItem(0): [Module] mod macro_in_library # 1| getName(): [Name] macro_in_library -# 1| getVisibility(): [Visibility] Visibility +# 1| getVisibility(): [Visibility] pub macro_in_library.rs: # 1| [SourceFile] SourceFile # 1| getItem(0): [MacroCall] (item with attribute macro expansion) @@ -10,15 +10,15 @@ macro_in_library.rs: # 2| getItem(0): [Function] fn foo # 2| getParamList(): [ParamList] ParamList # 2| getName(): [Name] foo -# 2| getVisibility(): [Visibility] Visibility +# 2| getVisibility(): [Visibility] pub # 2| getItem(1): [Function] fn foo_new # 2| getParamList(): [ParamList] ParamList # 2| getName(): [Name] foo_new -# 2| getVisibility(): [Visibility] Visibility +# 2| getVisibility(): [Visibility] pub # 4| getItem(1): [Function] fn bar # 4| getParamList(): [ParamList] ParamList # 4| getName(): [Name] bar -# 4| getVisibility(): [Visibility] Visibility +# 4| getVisibility(): [Visibility] pub proc_macro.rs: # 1| [SourceFile] SourceFile # 1| getItem(0): [Use] use ...::TokenStream @@ -60,4 +60,4 @@ proc_macro.rs: # 5| getPath(): [Path] TokenStream # 5| getSegment(): [PathSegment] TokenStream # 5| getIdentifier(): [NameRef] TokenStream -# 5| getVisibility(): [Visibility] Visibility +# 5| getVisibility(): [Visibility] pub diff --git a/rust/ql/test/extractor-tests/utf8/ast.expected b/rust/ql/test/extractor-tests/utf8/ast.expected index 7fe2a9bd4ee..a5f91da6158 100644 --- a/rust/ql/test/extractor-tests/utf8/ast.expected +++ b/rust/ql/test/extractor-tests/utf8/ast.expected @@ -1,4 +1,4 @@ -| lib.rs:1:1:1:3 | Visibility | +| lib.rs:1:1:1:3 | pub | | lib.rs:1:1:1:25 | SourceFile | | lib.rs:1:1:1:25 | mod utf8_identifiers | | lib.rs:1:9:1:24 | utf8_identifiers | @@ -17,12 +17,12 @@ | utf8_identifiers.rs:6:8:6:8 | X | | utf8_identifiers.rs:6:10:8:1 | StructFieldList | | utf8_identifiers.rs:7:5:7:5 | \u03b4 | -| utf8_identifiers.rs:7:5:7:13 | StructField | +| utf8_identifiers.rs:7:5:7:13 | \u03b4: usize | | utf8_identifiers.rs:7:9:7:13 | usize | | utf8_identifiers.rs:7:9:7:13 | usize | | utf8_identifiers.rs:7:9:7:13 | usize | | utf8_identifiers.rs:7:9:7:13 | usize | -| utf8_identifiers.rs:10:1:10:3 | Visibility | +| utf8_identifiers.rs:10:1:10:3 | pub | | utf8_identifiers.rs:10:1:12:1 | fn main | | utf8_identifiers.rs:10:8:10:11 | main | | utf8_identifiers.rs:10:12:10:13 | ParamList | diff --git a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected index 266b4c4be8c..68da00c4312 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected @@ -1,7 +1,8 @@ models edges | main.rs:9:13:9:19 | ...: ... | main.rs:10:11:10:11 | s | provenance | | -| main.rs:10:11:10:11 | s | main.rs:9:30:14:1 | { ... } | provenance | | +| main.rs:10:11:10:11 | s | main.rs:12:9:12:9 | s | provenance | | +| main.rs:12:9:12:9 | s | main.rs:9:30:14:1 | { ... } | provenance | | | main.rs:21:9:21:9 | s | main.rs:22:10:22:10 | s | provenance | | | main.rs:21:13:21:21 | source(...) | main.rs:21:9:21:9 | s | provenance | | | main.rs:26:9:26:9 | s | main.rs:27:22:27:22 | s | provenance | | @@ -16,6 +17,7 @@ nodes | main.rs:9:13:9:19 | ...: ... | semmle.label | ...: ... | | main.rs:9:30:14:1 | { ... } | semmle.label | { ... } | | main.rs:10:11:10:11 | s | semmle.label | s | +| main.rs:12:9:12:9 | s | semmle.label | s | | main.rs:17:10:17:18 | source(...) | semmle.label | source(...) | | main.rs:21:9:21:9 | s | semmle.label | s | | main.rs:21:13:21:21 | source(...) | semmle.label | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ql b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ql index e399ea0e5d7..5dcb7ee70a9 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ql +++ b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ql @@ -5,8 +5,8 @@ import rust import utils.test.InlineFlowTest import DefaultFlowTest -import ValueFlow::PathGraph +import TaintFlow::PathGraph -from ValueFlow::PathNode source, ValueFlow::PathNode sink -where ValueFlow::flowPath(source, sink) +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/collections/Cargo.lock b/rust/ql/test/library-tests/dataflow/collections/Cargo.lock new file mode 100644 index 00000000000..b9856cfaf77 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/collections/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "test" +version = "0.0.1" diff --git a/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected new file mode 100644 index 00000000000..fdd3a25a347 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected @@ -0,0 +1,254 @@ +models +| 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | +| 2 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[0].Reference; Argument[self].Reference; taint | +| 3 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[0]; Argument[self].Reference; taint | +| 4 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +edges +| main.rs:15:13:15:13 | s | main.rs:16:20:16:20 | s | provenance | | +| main.rs:15:17:15:25 | source(...) | main.rs:15:13:15:13 | s | provenance | | +| main.rs:16:13:16:15 | arr [element] | main.rs:17:14:17:16 | arr [element] | provenance | | +| main.rs:16:13:16:15 | arr [element] | main.rs:18:15:18:17 | arr [element] | provenance | | +| main.rs:16:19:16:24 | [s; 5] [element] | main.rs:16:13:16:15 | arr [element] | provenance | | +| main.rs:16:20:16:20 | s | main.rs:16:19:16:24 | [s; 5] [element] | provenance | | +| main.rs:17:14:17:16 | arr [element] | main.rs:17:14:17:19 | arr[2] | provenance | MaD:4 | +| main.rs:18:15:18:17 | arr [element] | main.rs:18:15:18:26 | arr.index(...) [&ref] | provenance | MaD:4 | +| main.rs:18:15:18:26 | arr.index(...) [&ref] | main.rs:18:14:18:26 | * ... | provenance | MaD:1 | +| main.rs:20:13:20:19 | mut arr | main.rs:21:14:21:16 | arr | provenance | | +| main.rs:20:13:20:19 | mut arr | main.rs:22:15:22:17 | arr | provenance | | +| main.rs:20:23:20:33 | source(...) | main.rs:20:13:20:19 | mut arr | provenance | | +| main.rs:21:14:21:16 | arr | main.rs:21:14:21:19 | arr[0] | provenance | MaD:4 | +| main.rs:22:15:22:17 | arr | main.rs:22:15:22:26 | arr.index(...) [&ref] | provenance | MaD:4 | +| main.rs:22:15:22:26 | arr.index(...) [&ref] | main.rs:22:14:22:26 | * ... | provenance | MaD:1 | +| main.rs:24:13:24:13 | s | main.rs:25:20:25:20 | s | provenance | | +| main.rs:24:17:24:25 | source(...) | main.rs:24:13:24:13 | s | provenance | | +| main.rs:25:13:25:15 | arr [element] | main.rs:26:18:26:20 | arr [element] | provenance | | +| main.rs:25:19:25:21 | [...] [element] | main.rs:25:13:25:15 | arr [element] | provenance | | +| main.rs:25:20:25:20 | s | main.rs:25:19:25:21 | [...] [element] | provenance | | +| main.rs:26:13:26:13 | x | main.rs:27:18:27:18 | x | provenance | | +| main.rs:26:18:26:20 | arr [element] | main.rs:26:13:26:13 | x | provenance | | +| main.rs:30:13:30:15 | arr | main.rs:32:18:32:18 | x | provenance | | +| main.rs:30:19:30:29 | source(...) | main.rs:30:13:30:15 | arr | provenance | | +| main.rs:37:9:37:11 | [post] arr [element] | main.rs:38:14:38:16 | arr [element] | provenance | | +| main.rs:37:18:37:26 | source(...) | main.rs:37:9:37:11 | [post] arr [element] | provenance | | +| main.rs:38:14:38:16 | arr [element] | main.rs:38:14:38:19 | arr[0] | provenance | MaD:4 | +| main.rs:46:9:46:14 | [post] arr[0] | main.rs:47:14:47:16 | arr | provenance | | +| main.rs:46:19:46:27 | source(...) | main.rs:46:9:46:14 | [post] arr[0] | provenance | MaD:2 | +| main.rs:46:19:46:27 | source(...) | main.rs:46:9:46:14 | [post] arr[0] | provenance | MaD:3 | +| main.rs:47:14:47:16 | arr | main.rs:47:14:47:19 | arr[0] | provenance | MaD:4 | +| main.rs:63:18:63:22 | SelfParam [&ref, S] | main.rs:63:56:65:9 | { ... } [&ref, S] | provenance | | +| main.rs:76:34:76:44 | ...: Self [S] | main.rs:77:23:77:27 | other [S] | provenance | | +| main.rs:77:13:77:16 | [post] self [&ref, S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, S] | provenance | | +| main.rs:77:13:77:16 | [post] self [&ref, tuple.0] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, tuple.0] | provenance | | +| main.rs:77:13:77:18 | [post] self.0 | main.rs:77:13:77:16 | [post] self [&ref, S] | provenance | | +| main.rs:77:13:77:18 | [post] self.0 | main.rs:77:13:77:16 | [post] self [&ref, tuple.0] | provenance | | +| main.rs:77:23:77:27 | other [S] | main.rs:77:23:77:29 | other.0 | provenance | | +| main.rs:77:23:77:29 | other.0 | main.rs:77:13:77:18 | [post] self.0 | provenance | MaD:2 | +| main.rs:77:23:77:29 | other.0 | main.rs:77:13:77:18 | [post] self.0 | provenance | MaD:3 | +| main.rs:82:13:82:13 | s | main.rs:83:19:83:19 | s | provenance | | +| main.rs:82:17:82:25 | source(...) | main.rs:82:13:82:13 | s | provenance | | +| main.rs:83:13:83:13 | s [S] | main.rs:84:14:84:14 | s [S] | provenance | | +| main.rs:83:13:83:13 | s [S] | main.rs:85:16:85:16 | s [S] | provenance | | +| main.rs:83:17:83:20 | S(...) [S] | main.rs:83:13:83:13 | s [S] | provenance | | +| main.rs:83:19:83:19 | s | main.rs:83:17:83:20 | S(...) [S] | provenance | | +| main.rs:84:14:84:14 | s [S] | main.rs:63:18:63:22 | SelfParam [&ref, S] | provenance | | +| main.rs:84:14:84:14 | s [S] | main.rs:84:14:84:17 | s[0] [S] | provenance | | +| main.rs:84:14:84:17 | s[0] [S] | main.rs:84:14:84:19 | ... .0 | provenance | | +| main.rs:85:15:85:25 | * ... [S] | main.rs:85:14:85:28 | ... .0 | provenance | | +| main.rs:85:16:85:16 | s [S] | main.rs:63:18:63:22 | SelfParam [&ref, S] | provenance | | +| main.rs:85:16:85:16 | s [S] | main.rs:85:16:85:25 | s.index(...) [&ref, S] | provenance | | +| main.rs:85:16:85:25 | s.index(...) [&ref, S] | main.rs:85:15:85:25 | * ... [S] | provenance | MaD:1 | +| main.rs:89:9:89:9 | [post] s [S] | main.rs:90:14:90:14 | s [S] | provenance | | +| main.rs:89:16:89:27 | S(...) [S] | main.rs:89:9:89:9 | [post] s [S] | provenance | | +| main.rs:89:18:89:26 | source(...) | main.rs:89:16:89:27 | S(...) [S] | provenance | | +| main.rs:90:14:90:14 | s [S] | main.rs:90:14:90:16 | s.0 | provenance | | +| main.rs:94:10:94:10 | [post] s [S] | main.rs:95:14:95:14 | s [S] | provenance | | +| main.rs:94:10:94:23 | [post] s.index_mut(...) [&ref, S] | main.rs:94:10:94:10 | [post] s [S] | provenance | | +| main.rs:94:27:94:38 | S(...) [S] | main.rs:94:10:94:23 | [post] s.index_mut(...) [&ref, S] | provenance | | +| main.rs:94:29:94:37 | source(...) | main.rs:94:27:94:38 | S(...) [S] | provenance | | +| main.rs:95:14:95:14 | s [S] | main.rs:95:14:95:16 | s.0 | provenance | | +| main.rs:99:9:99:9 | [post] s [S] | main.rs:100:14:100:14 | s [S] | provenance | | +| main.rs:99:9:99:9 | [post] s [tuple.0] | main.rs:100:14:100:14 | s [tuple.0] | provenance | | +| main.rs:99:9:99:12 | [post] s[0] [S] | main.rs:99:9:99:9 | [post] s [S] | provenance | | +| main.rs:99:9:99:12 | [post] s[0] [tuple.0] | main.rs:99:9:99:9 | [post] s [tuple.0] | provenance | | +| main.rs:99:17:99:28 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | provenance | | +| main.rs:99:17:99:28 | S(...) [S] | main.rs:99:9:99:12 | [post] s[0] [S] | provenance | MaD:2 | +| main.rs:99:17:99:28 | S(...) [S] | main.rs:99:9:99:12 | [post] s[0] [S] | provenance | MaD:3 | +| main.rs:99:17:99:28 | S(...) [S] | main.rs:99:9:99:12 | [post] s[0] [tuple.0] | provenance | MaD:2 | +| main.rs:99:17:99:28 | S(...) [S] | main.rs:99:9:99:12 | [post] s[0] [tuple.0] | provenance | MaD:3 | +| main.rs:99:19:99:27 | source(...) | main.rs:99:17:99:28 | S(...) [S] | provenance | | +| main.rs:100:14:100:14 | s [S] | main.rs:100:14:100:16 | s.0 | provenance | | +| main.rs:100:14:100:14 | s [tuple.0] | main.rs:100:14:100:16 | s.0 | provenance | | +| main.rs:104:9:104:23 | [post] * ... [S] | main.rs:104:10:104:23 | [post] s.index_mut(...) [&ref, S] | provenance | | +| main.rs:104:9:104:23 | [post] * ... [tuple.0] | main.rs:104:10:104:23 | [post] s.index_mut(...) [&ref, tuple.0] | provenance | | +| main.rs:104:10:104:10 | [post] s [S] | main.rs:106:14:106:14 | s [S] | provenance | | +| main.rs:104:10:104:10 | [post] s [tuple.0] | main.rs:106:14:106:14 | s [tuple.0] | provenance | | +| main.rs:104:10:104:23 | [post] s.index_mut(...) [&ref, S] | main.rs:104:10:104:10 | [post] s [S] | provenance | | +| main.rs:104:10:104:23 | [post] s.index_mut(...) [&ref, tuple.0] | main.rs:104:10:104:10 | [post] s [tuple.0] | provenance | | +| main.rs:104:28:104:39 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | provenance | | +| main.rs:104:28:104:39 | S(...) [S] | main.rs:104:9:104:23 | [post] * ... [S] | provenance | MaD:2 | +| main.rs:104:28:104:39 | S(...) [S] | main.rs:104:9:104:23 | [post] * ... [S] | provenance | MaD:3 | +| main.rs:104:28:104:39 | S(...) [S] | main.rs:104:9:104:23 | [post] * ... [tuple.0] | provenance | MaD:2 | +| main.rs:104:28:104:39 | S(...) [S] | main.rs:104:9:104:23 | [post] * ... [tuple.0] | provenance | MaD:3 | +| main.rs:104:30:104:38 | source(...) | main.rs:104:28:104:39 | S(...) [S] | provenance | | +| main.rs:105:9:105:9 | [post] s [S] | main.rs:106:14:106:14 | s [S] | provenance | | +| main.rs:105:9:105:9 | [post] s [tuple.0] | main.rs:106:14:106:14 | s [tuple.0] | provenance | | +| main.rs:105:9:105:12 | [post] s[0] [S] | main.rs:105:9:105:9 | [post] s [S] | provenance | | +| main.rs:105:9:105:12 | [post] s[0] [tuple.0] | main.rs:105:9:105:9 | [post] s [tuple.0] | provenance | | +| main.rs:105:17:105:28 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | provenance | | +| main.rs:105:17:105:28 | S(...) [S] | main.rs:105:9:105:12 | [post] s[0] [S] | provenance | MaD:2 | +| main.rs:105:17:105:28 | S(...) [S] | main.rs:105:9:105:12 | [post] s[0] [S] | provenance | MaD:3 | +| main.rs:105:17:105:28 | S(...) [S] | main.rs:105:9:105:12 | [post] s[0] [tuple.0] | provenance | MaD:2 | +| main.rs:105:17:105:28 | S(...) [S] | main.rs:105:9:105:12 | [post] s[0] [tuple.0] | provenance | MaD:3 | +| main.rs:105:19:105:27 | source(...) | main.rs:105:17:105:28 | S(...) [S] | provenance | | +| main.rs:106:14:106:14 | s [S] | main.rs:106:14:106:16 | s.0 | provenance | | +| main.rs:106:14:106:14 | s [tuple.0] | main.rs:106:14:106:16 | s.0 | provenance | | +| main.rs:110:10:110:24 | [post] * ... [S] | main.rs:110:11:110:24 | [post] s.index_mut(...) [&ref, S] | provenance | | +| main.rs:110:10:110:24 | [post] * ... [tuple.0] | main.rs:110:11:110:24 | [post] s.index_mut(...) [&ref, tuple.0] | provenance | | +| main.rs:110:11:110:11 | [post] s [S] | main.rs:111:14:111:14 | s [S] | provenance | | +| main.rs:110:11:110:11 | [post] s [tuple.0] | main.rs:111:14:111:14 | s [tuple.0] | provenance | | +| main.rs:110:11:110:24 | [post] s.index_mut(...) [&ref, S] | main.rs:110:11:110:11 | [post] s [S] | provenance | | +| main.rs:110:11:110:24 | [post] s.index_mut(...) [&ref, tuple.0] | main.rs:110:11:110:11 | [post] s [tuple.0] | provenance | | +| main.rs:110:38:110:49 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | provenance | | +| main.rs:110:38:110:49 | S(...) [S] | main.rs:110:10:110:24 | [post] * ... [S] | provenance | MaD:2 | +| main.rs:110:38:110:49 | S(...) [S] | main.rs:110:10:110:24 | [post] * ... [S] | provenance | MaD:3 | +| main.rs:110:38:110:49 | S(...) [S] | main.rs:110:10:110:24 | [post] * ... [tuple.0] | provenance | MaD:2 | +| main.rs:110:38:110:49 | S(...) [S] | main.rs:110:10:110:24 | [post] * ... [tuple.0] | provenance | MaD:3 | +| main.rs:110:40:110:48 | source(...) | main.rs:110:38:110:49 | S(...) [S] | provenance | | +| main.rs:111:14:111:14 | s [S] | main.rs:111:14:111:16 | s.0 | provenance | | +| main.rs:111:14:111:14 | s [tuple.0] | main.rs:111:14:111:16 | s.0 | provenance | | +nodes +| main.rs:15:13:15:13 | s | semmle.label | s | +| main.rs:15:17:15:25 | source(...) | semmle.label | source(...) | +| main.rs:16:13:16:15 | arr [element] | semmle.label | arr [element] | +| main.rs:16:19:16:24 | [s; 5] [element] | semmle.label | [s; 5] [element] | +| main.rs:16:20:16:20 | s | semmle.label | s | +| main.rs:17:14:17:16 | arr [element] | semmle.label | arr [element] | +| main.rs:17:14:17:19 | arr[2] | semmle.label | arr[2] | +| main.rs:18:14:18:26 | * ... | semmle.label | * ... | +| main.rs:18:15:18:17 | arr [element] | semmle.label | arr [element] | +| main.rs:18:15:18:26 | arr.index(...) [&ref] | semmle.label | arr.index(...) [&ref] | +| main.rs:20:13:20:19 | mut arr | semmle.label | mut arr | +| main.rs:20:23:20:33 | source(...) | semmle.label | source(...) | +| main.rs:21:14:21:16 | arr | semmle.label | arr | +| main.rs:21:14:21:19 | arr[0] | semmle.label | arr[0] | +| main.rs:22:14:22:26 | * ... | semmle.label | * ... | +| main.rs:22:15:22:17 | arr | semmle.label | arr | +| main.rs:22:15:22:26 | arr.index(...) [&ref] | semmle.label | arr.index(...) [&ref] | +| main.rs:24:13:24:13 | s | semmle.label | s | +| main.rs:24:17:24:25 | source(...) | semmle.label | source(...) | +| main.rs:25:13:25:15 | arr [element] | semmle.label | arr [element] | +| main.rs:25:19:25:21 | [...] [element] | semmle.label | [...] [element] | +| main.rs:25:20:25:20 | s | semmle.label | s | +| main.rs:26:13:26:13 | x | semmle.label | x | +| main.rs:26:18:26:20 | arr [element] | semmle.label | arr [element] | +| main.rs:27:18:27:18 | x | semmle.label | x | +| main.rs:30:13:30:15 | arr | semmle.label | arr | +| main.rs:30:19:30:29 | source(...) | semmle.label | source(...) | +| main.rs:32:18:32:18 | x | semmle.label | x | +| main.rs:37:9:37:11 | [post] arr [element] | semmle.label | [post] arr [element] | +| main.rs:37:18:37:26 | source(...) | semmle.label | source(...) | +| main.rs:38:14:38:16 | arr [element] | semmle.label | arr [element] | +| main.rs:38:14:38:19 | arr[0] | semmle.label | arr[0] | +| main.rs:46:9:46:14 | [post] arr[0] | semmle.label | [post] arr[0] | +| main.rs:46:19:46:27 | source(...) | semmle.label | source(...) | +| main.rs:47:14:47:16 | arr | semmle.label | arr | +| main.rs:47:14:47:19 | arr[0] | semmle.label | arr[0] | +| main.rs:63:18:63:22 | SelfParam [&ref, S] | semmle.label | SelfParam [&ref, S] | +| main.rs:63:56:65:9 | { ... } [&ref, S] | semmle.label | { ... } [&ref, S] | +| main.rs:76:23:76:31 | SelfParam [Return] [&ref, S] | semmle.label | SelfParam [Return] [&ref, S] | +| main.rs:76:23:76:31 | SelfParam [Return] [&ref, tuple.0] | semmle.label | SelfParam [Return] [&ref, tuple.0] | +| main.rs:76:34:76:44 | ...: Self [S] | semmle.label | ...: Self [S] | +| main.rs:77:13:77:16 | [post] self [&ref, S] | semmle.label | [post] self [&ref, S] | +| main.rs:77:13:77:16 | [post] self [&ref, tuple.0] | semmle.label | [post] self [&ref, tuple.0] | +| main.rs:77:13:77:18 | [post] self.0 | semmle.label | [post] self.0 | +| main.rs:77:23:77:27 | other [S] | semmle.label | other [S] | +| main.rs:77:23:77:29 | other.0 | semmle.label | other.0 | +| main.rs:82:13:82:13 | s | semmle.label | s | +| main.rs:82:17:82:25 | source(...) | semmle.label | source(...) | +| main.rs:83:13:83:13 | s [S] | semmle.label | s [S] | +| main.rs:83:17:83:20 | S(...) [S] | semmle.label | S(...) [S] | +| main.rs:83:19:83:19 | s | semmle.label | s | +| main.rs:84:14:84:14 | s [S] | semmle.label | s [S] | +| main.rs:84:14:84:17 | s[0] [S] | semmle.label | s[0] [S] | +| main.rs:84:14:84:19 | ... .0 | semmle.label | ... .0 | +| main.rs:85:14:85:28 | ... .0 | semmle.label | ... .0 | +| main.rs:85:15:85:25 | * ... [S] | semmle.label | * ... [S] | +| main.rs:85:16:85:16 | s [S] | semmle.label | s [S] | +| main.rs:85:16:85:25 | s.index(...) [&ref, S] | semmle.label | s.index(...) [&ref, S] | +| main.rs:89:9:89:9 | [post] s [S] | semmle.label | [post] s [S] | +| main.rs:89:16:89:27 | S(...) [S] | semmle.label | S(...) [S] | +| main.rs:89:18:89:26 | source(...) | semmle.label | source(...) | +| main.rs:90:14:90:14 | s [S] | semmle.label | s [S] | +| main.rs:90:14:90:16 | s.0 | semmle.label | s.0 | +| main.rs:94:10:94:10 | [post] s [S] | semmle.label | [post] s [S] | +| main.rs:94:10:94:23 | [post] s.index_mut(...) [&ref, S] | semmle.label | [post] s.index_mut(...) [&ref, S] | +| main.rs:94:27:94:38 | S(...) [S] | semmle.label | S(...) [S] | +| main.rs:94:29:94:37 | source(...) | semmle.label | source(...) | +| main.rs:95:14:95:14 | s [S] | semmle.label | s [S] | +| main.rs:95:14:95:16 | s.0 | semmle.label | s.0 | +| main.rs:99:9:99:9 | [post] s [S] | semmle.label | [post] s [S] | +| main.rs:99:9:99:9 | [post] s [tuple.0] | semmle.label | [post] s [tuple.0] | +| main.rs:99:9:99:12 | [post] s[0] [S] | semmle.label | [post] s[0] [S] | +| main.rs:99:9:99:12 | [post] s[0] [tuple.0] | semmle.label | [post] s[0] [tuple.0] | +| main.rs:99:17:99:28 | S(...) [S] | semmle.label | S(...) [S] | +| main.rs:99:19:99:27 | source(...) | semmle.label | source(...) | +| main.rs:100:14:100:14 | s [S] | semmle.label | s [S] | +| main.rs:100:14:100:14 | s [tuple.0] | semmle.label | s [tuple.0] | +| main.rs:100:14:100:16 | s.0 | semmle.label | s.0 | +| main.rs:104:9:104:23 | [post] * ... [S] | semmle.label | [post] * ... [S] | +| main.rs:104:9:104:23 | [post] * ... [tuple.0] | semmle.label | [post] * ... [tuple.0] | +| main.rs:104:10:104:10 | [post] s [S] | semmle.label | [post] s [S] | +| main.rs:104:10:104:10 | [post] s [tuple.0] | semmle.label | [post] s [tuple.0] | +| main.rs:104:10:104:23 | [post] s.index_mut(...) [&ref, S] | semmle.label | [post] s.index_mut(...) [&ref, S] | +| main.rs:104:10:104:23 | [post] s.index_mut(...) [&ref, tuple.0] | semmle.label | [post] s.index_mut(...) [&ref, tuple.0] | +| main.rs:104:28:104:39 | S(...) [S] | semmle.label | S(...) [S] | +| main.rs:104:30:104:38 | source(...) | semmle.label | source(...) | +| main.rs:105:9:105:9 | [post] s [S] | semmle.label | [post] s [S] | +| main.rs:105:9:105:9 | [post] s [tuple.0] | semmle.label | [post] s [tuple.0] | +| main.rs:105:9:105:12 | [post] s[0] [S] | semmle.label | [post] s[0] [S] | +| main.rs:105:9:105:12 | [post] s[0] [tuple.0] | semmle.label | [post] s[0] [tuple.0] | +| main.rs:105:17:105:28 | S(...) [S] | semmle.label | S(...) [S] | +| main.rs:105:19:105:27 | source(...) | semmle.label | source(...) | +| main.rs:106:14:106:14 | s [S] | semmle.label | s [S] | +| main.rs:106:14:106:14 | s [tuple.0] | semmle.label | s [tuple.0] | +| main.rs:106:14:106:16 | s.0 | semmle.label | s.0 | +| main.rs:110:10:110:24 | [post] * ... [S] | semmle.label | [post] * ... [S] | +| main.rs:110:10:110:24 | [post] * ... [tuple.0] | semmle.label | [post] * ... [tuple.0] | +| main.rs:110:11:110:11 | [post] s [S] | semmle.label | [post] s [S] | +| main.rs:110:11:110:11 | [post] s [tuple.0] | semmle.label | [post] s [tuple.0] | +| main.rs:110:11:110:24 | [post] s.index_mut(...) [&ref, S] | semmle.label | [post] s.index_mut(...) [&ref, S] | +| main.rs:110:11:110:24 | [post] s.index_mut(...) [&ref, tuple.0] | semmle.label | [post] s.index_mut(...) [&ref, tuple.0] | +| main.rs:110:38:110:49 | S(...) [S] | semmle.label | S(...) [S] | +| main.rs:110:40:110:48 | source(...) | semmle.label | source(...) | +| main.rs:111:14:111:14 | s [S] | semmle.label | s [S] | +| main.rs:111:14:111:14 | s [tuple.0] | semmle.label | s [tuple.0] | +| main.rs:111:14:111:16 | s.0 | semmle.label | s.0 | +subpaths +| main.rs:84:14:84:14 | s [S] | main.rs:63:18:63:22 | SelfParam [&ref, S] | main.rs:63:56:65:9 | { ... } [&ref, S] | main.rs:84:14:84:17 | s[0] [S] | +| main.rs:85:16:85:16 | s [S] | main.rs:63:18:63:22 | SelfParam [&ref, S] | main.rs:63:56:65:9 | { ... } [&ref, S] | main.rs:85:16:85:25 | s.index(...) [&ref, S] | +| main.rs:99:17:99:28 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, S] | main.rs:99:9:99:12 | [post] s[0] [S] | +| main.rs:99:17:99:28 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, tuple.0] | main.rs:99:9:99:12 | [post] s[0] [tuple.0] | +| main.rs:104:28:104:39 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, S] | main.rs:104:9:104:23 | [post] * ... [S] | +| main.rs:104:28:104:39 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, tuple.0] | main.rs:104:9:104:23 | [post] * ... [tuple.0] | +| main.rs:105:17:105:28 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, S] | main.rs:105:9:105:12 | [post] s[0] [S] | +| main.rs:105:17:105:28 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, tuple.0] | main.rs:105:9:105:12 | [post] s[0] [tuple.0] | +| main.rs:110:38:110:49 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, S] | main.rs:110:10:110:24 | [post] * ... [S] | +| main.rs:110:38:110:49 | S(...) [S] | main.rs:76:34:76:44 | ...: Self [S] | main.rs:76:23:76:31 | SelfParam [Return] [&ref, tuple.0] | main.rs:110:10:110:24 | [post] * ... [tuple.0] | +testFailures +#select +| main.rs:17:14:17:19 | arr[2] | main.rs:15:17:15:25 | source(...) | main.rs:17:14:17:19 | arr[2] | $@ | main.rs:15:17:15:25 | source(...) | source(...) | +| main.rs:18:14:18:26 | * ... | main.rs:15:17:15:25 | source(...) | main.rs:18:14:18:26 | * ... | $@ | main.rs:15:17:15:25 | source(...) | source(...) | +| main.rs:21:14:21:19 | arr[0] | main.rs:20:23:20:33 | source(...) | main.rs:21:14:21:19 | arr[0] | $@ | main.rs:20:23:20:33 | source(...) | source(...) | +| main.rs:22:14:22:26 | * ... | main.rs:20:23:20:33 | source(...) | main.rs:22:14:22:26 | * ... | $@ | main.rs:20:23:20:33 | source(...) | source(...) | +| main.rs:27:18:27:18 | x | main.rs:24:17:24:25 | source(...) | main.rs:27:18:27:18 | x | $@ | main.rs:24:17:24:25 | source(...) | source(...) | +| main.rs:32:18:32:18 | x | main.rs:30:19:30:29 | source(...) | main.rs:32:18:32:18 | x | $@ | main.rs:30:19:30:29 | source(...) | source(...) | +| main.rs:38:14:38:19 | arr[0] | main.rs:37:18:37:26 | source(...) | main.rs:38:14:38:19 | arr[0] | $@ | main.rs:37:18:37:26 | source(...) | source(...) | +| main.rs:47:14:47:19 | arr[0] | main.rs:46:19:46:27 | source(...) | main.rs:47:14:47:19 | arr[0] | $@ | main.rs:46:19:46:27 | source(...) | source(...) | +| main.rs:84:14:84:19 | ... .0 | main.rs:82:17:82:25 | source(...) | main.rs:84:14:84:19 | ... .0 | $@ | main.rs:82:17:82:25 | source(...) | source(...) | +| main.rs:85:14:85:28 | ... .0 | main.rs:82:17:82:25 | source(...) | main.rs:85:14:85:28 | ... .0 | $@ | main.rs:82:17:82:25 | source(...) | source(...) | +| main.rs:90:14:90:16 | s.0 | main.rs:89:18:89:26 | source(...) | main.rs:90:14:90:16 | s.0 | $@ | main.rs:89:18:89:26 | source(...) | source(...) | +| main.rs:95:14:95:16 | s.0 | main.rs:94:29:94:37 | source(...) | main.rs:95:14:95:16 | s.0 | $@ | main.rs:94:29:94:37 | source(...) | source(...) | +| main.rs:100:14:100:16 | s.0 | main.rs:99:19:99:27 | source(...) | main.rs:100:14:100:16 | s.0 | $@ | main.rs:99:19:99:27 | source(...) | source(...) | +| main.rs:106:14:106:16 | s.0 | main.rs:104:30:104:38 | source(...) | main.rs:106:14:106:16 | s.0 | $@ | main.rs:104:30:104:38 | source(...) | source(...) | +| main.rs:106:14:106:16 | s.0 | main.rs:105:19:105:27 | source(...) | main.rs:106:14:106:16 | s.0 | $@ | main.rs:105:19:105:27 | source(...) | source(...) | +| main.rs:111:14:111:16 | s.0 | main.rs:110:40:110:48 | source(...) | main.rs:111:14:111:16 | s.0 | $@ | main.rs:110:40:110:48 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/collections/inline-flow.ql b/rust/ql/test/library-tests/dataflow/collections/inline-flow.ql new file mode 100644 index 00000000000..5dcb7ee70a9 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/collections/inline-flow.ql @@ -0,0 +1,12 @@ +/** + * @kind path-problem + */ + +import rust +import utils.test.InlineFlowTest +import DefaultFlowTest +import TaintFlow::PathGraph + +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/collections/main.rs b/rust/ql/test/library-tests/dataflow/collections/main.rs new file mode 100644 index 00000000000..e7675f9fdde --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/collections/main.rs @@ -0,0 +1,118 @@ +fn source(s: T) -> T { + s +} + +fn sink(s: i64) { + println!("{}", s); +} + +mod arrays { + use crate::*; + use std::ops::Index; + use std::ops::IndexMut; + + pub fn f() { + let s = source(0); + let arr = [s; 5]; + sink(arr[2]); // $ hasValueFlow=0 + sink(*arr.index(2)); // $ hasValueFlow=0 + + let mut arr = source([1]); + sink(arr[0]); // $ hasTaintFlow=1 + sink(*arr.index(0)); // $ hasTaintFlow=1 + + let s = source(2); + let arr = [s]; + for x in arr { + sink(x); // $ hasValueFlow=2 + } + + let arr = source([3]); + for x in arr { + sink(x); // $ hasTaintFlow=3 + } + + let mut arr = [0]; + sink(arr[0]); + arr[0] = source(4); + sink(arr[0]); // $ hasValueFlow=4 + + let mut arr = [0]; + sink(arr[0]); + *arr.index_mut(0) = source(5); + sink(arr[0]); // $ MISSING: hasValueFlow=5 -- needs generalized reverse flow + + let mut arr = [0]; + arr[0] += source(6); + sink(arr[0]); // $ hasTaintFlow=6 + } +} + +mod indexers { + use crate::*; + use std::ops::AddAssign; + use std::ops::Index; + use std::ops::IndexMut; + + #[derive(Debug)] + struct S(T); + + impl Index for S { + type Output = S; // `T` would be a better choice here, but that requires generalized reverse flow for the test to pass + + fn index(&self, index: usize) -> &Self::Output { + self + } + } + + impl IndexMut for S { + // `Self::Output` is not yet handled, so use `S` for now + fn index_mut(&mut self, index: usize) -> &mut S { + self + } + } + + impl std::ops::AddAssign for S { + fn add_assign(&mut self, other: Self) { + self.0 += other.0; + } + } + + pub fn f() { + let s = source(0); + let s = S(s); + sink(s[0].0); // $ hasValueFlow=0 + sink((*s.index(0)).0); // $ hasValueFlow=0 + + let mut s = S(0); + sink(s.0); + s[0] = S(source(1)); + sink(s.0); // $ hasValueFlow=1 + + let mut s = S(0); + sink(s.0); + *s.index_mut(0) = S(source(2)); + sink(s.0); // $ hasValueFlow=2 + + let mut s = S(0i64); + sink(s.0); + s[0] += S(source(3)); + sink(s.0); // $ hasTaintFlow=3 + + let mut s = S(0i64); + sink(s.0); + *s.index_mut(0) += S(source(5)); + s[0] += S(source(5)); + sink(s.0); // $ hasTaintFlow=5 + + let mut s = S(0i64); + sink(s.0); + (*s.index_mut(0)).add_assign(S(source(6))); + sink(s.0); // $ hasTaintFlow=6 + } +} + +fn main() { + arrays::f(); + indexers::f(); +} diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected index 26984a1d377..343a33146d2 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -1,18 +1,18 @@ models -| 1 | Summary: futures_executor::local_pool::block_on; Argument[0]; ReturnValue; value | +| 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | +| 2 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self]; ReturnValue; taint | +| 3 | Summary: futures_executor::local_pool::block_on; Argument[0]; ReturnValue; value | edges | main.rs:12:28:14:1 | { ... } | main.rs:17:13:17:23 | get_data(...) | provenance | | | main.rs:13:5:13:13 | source(...) | main.rs:12:28:14:1 | { ... } | provenance | | | main.rs:17:9:17:9 | a | main.rs:18:10:18:10 | a | provenance | | | main.rs:17:13:17:23 | get_data(...) | main.rs:17:9:17:9 | a | provenance | | -| main.rs:26:28:26:33 | ...: i64 | main.rs:27:24:27:24 | n | provenance | | -| main.rs:27:10:27:14 | [post] * ... [MyStruct] | main.rs:27:11:27:14 | [post] self [&ref, MyStruct] | provenance | | -| main.rs:27:11:27:14 | [post] self [&ref, MyStruct] | main.rs:26:17:26:25 | SelfParam [Return] [&ref, MyStruct] | provenance | | -| main.rs:27:24:27:24 | n | main.rs:27:10:27:14 | [post] * ... [MyStruct] | provenance | | -| main.rs:30:17:30:21 | SelfParam [&ref, MyStruct] | main.rs:31:11:31:14 | self [&ref, MyStruct] | provenance | | -| main.rs:31:9:31:20 | ... .data | main.rs:30:31:32:5 | { ... } | provenance | | -| main.rs:31:10:31:14 | * ... [MyStruct] | main.rs:31:9:31:20 | ... .data | provenance | | -| main.rs:31:11:31:14 | self [&ref, MyStruct] | main.rs:31:10:31:14 | * ... [MyStruct] | provenance | | +| main.rs:26:28:26:33 | ...: i64 | main.rs:27:21:27:21 | n | provenance | | +| main.rs:27:9:27:12 | [post] self [&ref, MyStruct] | main.rs:26:17:26:25 | SelfParam [Return] [&ref, MyStruct] | provenance | | +| main.rs:27:21:27:21 | n | main.rs:27:9:27:12 | [post] self [&ref, MyStruct] | provenance | | +| main.rs:30:17:30:21 | SelfParam [&ref, MyStruct] | main.rs:31:9:31:12 | self [&ref, MyStruct] | provenance | | +| main.rs:31:9:31:12 | self [&ref, MyStruct] | main.rs:31:9:31:17 | self.data | provenance | | +| main.rs:31:9:31:17 | self.data | main.rs:30:31:32:5 | { ... } | provenance | | | main.rs:38:6:38:11 | [post] &mut a [&ref, MyStruct] | main.rs:38:11:38:11 | [post] a [MyStruct] | provenance | | | main.rs:38:11:38:11 | [post] a [MyStruct] | main.rs:39:10:39:10 | a [MyStruct] | provenance | | | main.rs:38:23:38:31 | source(...) | main.rs:26:28:26:33 | ...: i64 | provenance | | @@ -49,138 +49,176 @@ edges | main.rs:86:26:86:26 | a | main.rs:82:21:82:26 | ...: i64 | provenance | | | main.rs:86:26:86:26 | a | main.rs:86:13:86:27 | pass_through(...) | provenance | | | main.rs:104:22:104:27 | ...: i64 | main.rs:105:14:105:14 | n | provenance | | -| main.rs:108:30:110:5 | { ... } | main.rs:138:13:138:25 | mn.get_data() | provenance | | -| main.rs:109:35:109:43 | source(...) | main.rs:108:30:110:5 | { ... } | provenance | | -| main.rs:112:27:112:32 | ...: i64 | main.rs:112:42:114:5 | { ... } | provenance | | -| main.rs:118:28:118:33 | ...: i64 | main.rs:119:14:119:14 | n | provenance | | -| main.rs:122:36:124:5 | { ... } | main.rs:132:13:132:30 | x.get_data_trait() | provenance | | -| main.rs:122:36:124:5 | { ... } | main.rs:142:13:142:31 | mn.get_data_trait() | provenance | | -| main.rs:123:35:123:44 | source(...) | main.rs:122:36:124:5 | { ... } | provenance | | -| main.rs:126:33:126:38 | ...: i64 | main.rs:126:48:128:5 | { ... } | provenance | | -| main.rs:132:9:132:9 | a | main.rs:133:10:133:10 | a | provenance | | -| main.rs:132:13:132:30 | x.get_data_trait() | main.rs:132:9:132:9 | a | provenance | | -| main.rs:138:9:138:9 | a | main.rs:139:10:139:10 | a | provenance | | -| main.rs:138:13:138:25 | mn.get_data() | main.rs:138:9:138:9 | a | provenance | | -| main.rs:142:9:142:9 | a | main.rs:143:10:143:10 | a | provenance | | -| main.rs:142:13:142:31 | mn.get_data_trait() | main.rs:142:9:142:9 | a | provenance | | -| main.rs:149:9:149:9 | a | main.rs:150:21:150:21 | a | provenance | | -| main.rs:149:13:149:22 | source(...) | main.rs:149:9:149:9 | a | provenance | | -| main.rs:150:21:150:21 | a | main.rs:118:28:118:33 | ...: i64 | provenance | | -| main.rs:155:9:155:9 | a | main.rs:156:16:156:16 | a | provenance | | -| main.rs:155:13:155:21 | source(...) | main.rs:155:9:155:9 | a | provenance | | -| main.rs:156:16:156:16 | a | main.rs:104:22:104:27 | ...: i64 | provenance | | -| main.rs:159:9:159:9 | a | main.rs:160:22:160:22 | a | provenance | | -| main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | a | provenance | | -| main.rs:160:22:160:22 | a | main.rs:118:28:118:33 | ...: i64 | provenance | | -| main.rs:166:9:166:9 | a | main.rs:167:34:167:34 | a | provenance | | -| main.rs:166:13:166:22 | source(...) | main.rs:166:9:166:9 | a | provenance | | -| main.rs:167:9:167:9 | b | main.rs:168:10:168:10 | b | provenance | | -| main.rs:167:13:167:35 | x.data_through_trait(...) | main.rs:167:9:167:9 | b | provenance | | -| main.rs:167:34:167:34 | a | main.rs:126:33:126:38 | ...: i64 | provenance | | -| main.rs:167:34:167:34 | a | main.rs:167:13:167:35 | x.data_through_trait(...) | provenance | | -| main.rs:173:9:173:9 | a | main.rs:174:29:174:29 | a | provenance | | -| main.rs:173:13:173:21 | source(...) | main.rs:173:9:173:9 | a | provenance | | -| main.rs:174:9:174:9 | b | main.rs:175:10:175:10 | b | provenance | | -| main.rs:174:13:174:30 | mn.data_through(...) | main.rs:174:9:174:9 | b | provenance | | -| main.rs:174:29:174:29 | a | main.rs:112:27:112:32 | ...: i64 | provenance | | -| main.rs:174:29:174:29 | a | main.rs:174:13:174:30 | mn.data_through(...) | provenance | | -| main.rs:178:9:178:9 | a | main.rs:179:35:179:35 | a | provenance | | -| main.rs:178:13:178:22 | source(...) | main.rs:178:9:178:9 | a | provenance | | -| main.rs:179:9:179:9 | b | main.rs:180:10:180:10 | b | provenance | | -| main.rs:179:13:179:36 | mn.data_through_trait(...) | main.rs:179:9:179:9 | b | provenance | | -| main.rs:179:35:179:35 | a | main.rs:126:33:126:38 | ...: i64 | provenance | | -| main.rs:179:35:179:35 | a | main.rs:179:13:179:36 | mn.data_through_trait(...) | provenance | | -| main.rs:187:9:187:9 | a | main.rs:188:25:188:25 | a | provenance | | -| main.rs:187:13:187:21 | source(...) | main.rs:187:9:187:9 | a | provenance | | -| main.rs:188:25:188:25 | a | main.rs:104:22:104:27 | ...: i64 | provenance | | -| main.rs:193:9:193:9 | a | main.rs:194:38:194:38 | a | provenance | | -| main.rs:193:13:193:22 | source(...) | main.rs:193:9:193:9 | a | provenance | | -| main.rs:194:9:194:9 | b | main.rs:195:10:195:10 | b | provenance | | -| main.rs:194:13:194:39 | ...::data_through(...) | main.rs:194:9:194:9 | b | provenance | | -| main.rs:194:38:194:38 | a | main.rs:112:27:112:32 | ...: i64 | provenance | | -| main.rs:194:38:194:38 | a | main.rs:194:13:194:39 | ...::data_through(...) | provenance | | -| main.rs:206:12:206:17 | ...: i64 | main.rs:207:24:207:24 | n | provenance | | -| main.rs:207:9:207:26 | MyInt {...} [MyInt] | main.rs:206:28:208:5 | { ... } [MyInt] | provenance | | -| main.rs:207:24:207:24 | n | main.rs:207:9:207:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:212:9:212:9 | n [MyInt] | main.rs:213:9:213:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:212:13:212:34 | ...::new(...) [MyInt] | main.rs:212:9:212:9 | n [MyInt] | provenance | | -| main.rs:212:24:212:33 | source(...) | main.rs:206:12:206:17 | ...: i64 | provenance | | -| main.rs:212:24:212:33 | source(...) | main.rs:212:13:212:34 | ...::new(...) [MyInt] | provenance | | -| main.rs:213:9:213:26 | MyInt {...} [MyInt] | main.rs:213:24:213:24 | m | provenance | | -| main.rs:213:24:213:24 | m | main.rs:214:10:214:10 | m | provenance | | -| main.rs:220:12:220:15 | SelfParam [MyInt] | main.rs:222:24:222:27 | self [MyInt] | provenance | | -| main.rs:222:9:222:35 | MyInt {...} [MyInt] | main.rs:220:42:223:5 | { ... } [MyInt] | provenance | | -| main.rs:222:24:222:27 | self [MyInt] | main.rs:222:24:222:33 | self.value | provenance | | -| main.rs:222:24:222:33 | self.value | main.rs:222:9:222:35 | MyInt {...} [MyInt] | provenance | | -| main.rs:227:30:227:39 | ...: MyInt [MyInt] | main.rs:228:25:228:27 | rhs [MyInt] | provenance | | -| main.rs:228:10:228:14 | [post] * ... [MyInt] | main.rs:228:11:228:14 | [post] self [&ref, MyInt] | provenance | | -| main.rs:228:11:228:14 | [post] self [&ref, MyInt] | main.rs:227:19:227:27 | SelfParam [Return] [&ref, MyInt] | provenance | | -| main.rs:228:25:228:27 | rhs [MyInt] | main.rs:228:25:228:33 | rhs.value | provenance | | -| main.rs:228:25:228:33 | rhs.value | main.rs:228:10:228:14 | [post] * ... [MyInt] | provenance | | -| main.rs:235:14:235:18 | SelfParam [&ref, MyInt] | main.rs:236:12:236:15 | self [&ref, MyInt] | provenance | | -| main.rs:236:9:236:22 | &... [&ref] | main.rs:235:38:237:5 | { ... } [&ref] | provenance | | -| main.rs:236:10:236:22 | ... .value | main.rs:236:9:236:22 | &... [&ref] | provenance | | -| main.rs:236:11:236:15 | * ... [MyInt] | main.rs:236:10:236:22 | ... .value | provenance | | -| main.rs:236:12:236:15 | self [&ref, MyInt] | main.rs:236:11:236:15 | * ... [MyInt] | provenance | | -| main.rs:242:9:242:9 | a [MyInt] | main.rs:244:13:244:13 | a [MyInt] | provenance | | -| main.rs:242:13:242:38 | MyInt {...} [MyInt] | main.rs:242:9:242:9 | a [MyInt] | provenance | | -| main.rs:242:28:242:36 | source(...) | main.rs:242:13:242:38 | MyInt {...} [MyInt] | provenance | | -| main.rs:244:9:244:9 | c [MyInt] | main.rs:245:10:245:10 | c [MyInt] | provenance | | -| main.rs:244:13:244:13 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | provenance | | -| main.rs:244:13:244:13 | a [MyInt] | main.rs:244:13:244:17 | ... + ... [MyInt] | provenance | | -| main.rs:244:13:244:17 | ... + ... [MyInt] | main.rs:244:9:244:9 | c [MyInt] | provenance | | -| main.rs:245:10:245:10 | c [MyInt] | main.rs:245:10:245:16 | c.value | provenance | | -| main.rs:252:9:252:9 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | provenance | | -| main.rs:252:9:252:9 | a [MyInt] | main.rs:254:13:254:20 | a.add(...) [MyInt] | provenance | | -| main.rs:252:13:252:38 | MyInt {...} [MyInt] | main.rs:252:9:252:9 | a [MyInt] | provenance | | -| main.rs:252:28:252:36 | source(...) | main.rs:252:13:252:38 | MyInt {...} [MyInt] | provenance | | -| main.rs:254:9:254:9 | d [MyInt] | main.rs:255:10:255:10 | d [MyInt] | provenance | | -| main.rs:254:13:254:20 | a.add(...) [MyInt] | main.rs:254:9:254:9 | d [MyInt] | provenance | | -| main.rs:255:10:255:10 | d [MyInt] | main.rs:255:10:255:16 | d.value | provenance | | -| main.rs:259:9:259:9 | b [MyInt] | main.rs:261:35:261:35 | b [MyInt] | provenance | | -| main.rs:259:13:259:39 | MyInt {...} [MyInt] | main.rs:259:9:259:9 | b [MyInt] | provenance | | -| main.rs:259:28:259:37 | source(...) | main.rs:259:13:259:39 | MyInt {...} [MyInt] | provenance | | -| main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | main.rs:261:32:261:32 | [post] a [MyInt] | provenance | | -| main.rs:261:32:261:32 | [post] a [MyInt] | main.rs:262:10:262:10 | a [MyInt] | provenance | | -| main.rs:261:35:261:35 | b [MyInt] | main.rs:227:30:227:39 | ...: MyInt [MyInt] | provenance | | -| main.rs:261:35:261:35 | b [MyInt] | main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | provenance | | -| main.rs:262:10:262:10 | a [MyInt] | main.rs:262:10:262:16 | a.value | provenance | | -| main.rs:270:9:270:9 | a [MyInt] | main.rs:272:28:272:28 | a [MyInt] | provenance | | -| main.rs:270:13:270:39 | MyInt {...} [MyInt] | main.rs:270:9:270:9 | a [MyInt] | provenance | | -| main.rs:270:28:270:37 | source(...) | main.rs:270:13:270:39 | MyInt {...} [MyInt] | provenance | | -| main.rs:272:9:272:9 | c | main.rs:273:10:273:10 | c | provenance | | -| main.rs:272:13:272:29 | * ... | main.rs:272:9:272:9 | c | provenance | | -| main.rs:272:14:272:29 | ...::deref(...) [&ref] | main.rs:272:13:272:29 | * ... | provenance | | -| main.rs:272:27:272:28 | &a [&ref, MyInt] | main.rs:235:14:235:18 | SelfParam [&ref, MyInt] | provenance | | -| main.rs:272:27:272:28 | &a [&ref, MyInt] | main.rs:272:14:272:29 | ...::deref(...) [&ref] | provenance | | -| main.rs:272:28:272:28 | a [MyInt] | main.rs:272:27:272:28 | &a [&ref, MyInt] | provenance | | -| main.rs:289:18:289:21 | SelfParam [MyInt] | main.rs:289:48:291:5 | { ... } [MyInt] | provenance | | -| main.rs:293:26:293:37 | ...: MyInt [MyInt] | main.rs:293:49:295:5 | { ... } [MyInt] | provenance | | -| main.rs:299:9:299:9 | a [MyInt] | main.rs:301:50:301:50 | a [MyInt] | provenance | | -| main.rs:299:13:299:38 | MyInt {...} [MyInt] | main.rs:299:9:299:9 | a [MyInt] | provenance | | -| main.rs:299:28:299:36 | source(...) | main.rs:299:13:299:38 | MyInt {...} [MyInt] | provenance | | -| main.rs:301:9:301:26 | MyInt {...} [MyInt] | main.rs:301:24:301:24 | c | provenance | | -| main.rs:301:24:301:24 | c | main.rs:302:10:302:10 | c | provenance | | -| main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | main.rs:301:9:301:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:301:50:301:50 | a [MyInt] | main.rs:289:18:289:21 | SelfParam [MyInt] | provenance | | -| main.rs:301:50:301:50 | a [MyInt] | main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | provenance | | -| main.rs:305:9:305:9 | b [MyInt] | main.rs:306:55:306:55 | b [MyInt] | provenance | | -| main.rs:305:13:305:39 | MyInt {...} [MyInt] | main.rs:305:9:305:9 | b [MyInt] | provenance | | -| main.rs:305:28:305:37 | source(...) | main.rs:305:13:305:39 | MyInt {...} [MyInt] | provenance | | -| main.rs:306:9:306:26 | MyInt {...} [MyInt] | main.rs:306:24:306:24 | c | provenance | | -| main.rs:306:24:306:24 | c | main.rs:307:10:307:10 | c | provenance | | -| main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | main.rs:306:9:306:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:306:55:306:55 | b [MyInt] | main.rs:293:26:293:37 | ...: MyInt [MyInt] | provenance | | -| main.rs:306:55:306:55 | b [MyInt] | main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | provenance | | -| main.rs:315:32:319:1 | { ... } | main.rs:334:41:334:54 | async_source(...) | provenance | | -| main.rs:316:9:316:9 | a | main.rs:315:32:319:1 | { ... } | provenance | | -| main.rs:316:9:316:9 | a | main.rs:317:10:317:10 | a | provenance | | -| main.rs:316:13:316:21 | source(...) | main.rs:316:9:316:9 | a | provenance | | -| main.rs:326:13:326:13 | c | main.rs:327:14:327:14 | c | provenance | | -| main.rs:326:17:326:25 | source(...) | main.rs:326:13:326:13 | c | provenance | | -| main.rs:334:9:334:9 | a | main.rs:335:10:335:10 | a | provenance | | -| main.rs:334:13:334:55 | ...::block_on(...) | main.rs:334:9:334:9 | a | provenance | | -| main.rs:334:41:334:54 | async_source(...) | main.rs:334:13:334:55 | ...::block_on(...) | provenance | MaD:1 | +| main.rs:108:30:114:5 | { ... } | main.rs:154:13:154:25 | mn.get_data() | provenance | | +| main.rs:112:13:112:21 | source(...) | main.rs:108:30:114:5 | { ... } | provenance | | +| main.rs:116:27:116:32 | ...: i64 | main.rs:116:42:122:5 | { ... } | provenance | | +| main.rs:126:28:126:33 | ...: i64 | main.rs:127:14:127:14 | n | provenance | | +| main.rs:130:36:136:5 | { ... } | main.rs:148:13:148:30 | x.get_data_trait() | provenance | | +| main.rs:130:36:136:5 | { ... } | main.rs:158:13:158:31 | mn.get_data_trait() | provenance | | +| main.rs:134:13:134:22 | source(...) | main.rs:130:36:136:5 | { ... } | provenance | | +| main.rs:138:33:138:38 | ...: i64 | main.rs:138:48:144:5 | { ... } | provenance | | +| main.rs:148:9:148:9 | a | main.rs:149:10:149:10 | a | provenance | | +| main.rs:148:13:148:30 | x.get_data_trait() | main.rs:148:9:148:9 | a | provenance | | +| main.rs:154:9:154:9 | a | main.rs:155:10:155:10 | a | provenance | | +| main.rs:154:13:154:25 | mn.get_data() | main.rs:154:9:154:9 | a | provenance | | +| main.rs:158:9:158:9 | a | main.rs:159:10:159:10 | a | provenance | | +| main.rs:158:13:158:31 | mn.get_data_trait() | main.rs:158:9:158:9 | a | provenance | | +| main.rs:165:9:165:9 | a | main.rs:166:21:166:21 | a | provenance | | +| main.rs:165:13:165:22 | source(...) | main.rs:165:9:165:9 | a | provenance | | +| main.rs:166:21:166:21 | a | main.rs:126:28:126:33 | ...: i64 | provenance | | +| main.rs:171:9:171:9 | a | main.rs:172:16:172:16 | a | provenance | | +| main.rs:171:13:171:21 | source(...) | main.rs:171:9:171:9 | a | provenance | | +| main.rs:172:16:172:16 | a | main.rs:104:22:104:27 | ...: i64 | provenance | | +| main.rs:175:9:175:9 | a | main.rs:176:22:176:22 | a | provenance | | +| main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | a | provenance | | +| main.rs:176:22:176:22 | a | main.rs:126:28:126:33 | ...: i64 | provenance | | +| main.rs:182:9:182:9 | a | main.rs:183:34:183:34 | a | provenance | | +| main.rs:182:13:182:22 | source(...) | main.rs:182:9:182:9 | a | provenance | | +| main.rs:183:9:183:9 | b | main.rs:184:10:184:10 | b | provenance | | +| main.rs:183:13:183:35 | x.data_through_trait(...) | main.rs:183:9:183:9 | b | provenance | | +| main.rs:183:34:183:34 | a | main.rs:138:33:138:38 | ...: i64 | provenance | | +| main.rs:183:34:183:34 | a | main.rs:183:13:183:35 | x.data_through_trait(...) | provenance | | +| main.rs:189:9:189:9 | a | main.rs:190:29:190:29 | a | provenance | | +| main.rs:189:13:189:21 | source(...) | main.rs:189:9:189:9 | a | provenance | | +| main.rs:190:9:190:9 | b | main.rs:191:10:191:10 | b | provenance | | +| main.rs:190:13:190:30 | mn.data_through(...) | main.rs:190:9:190:9 | b | provenance | | +| main.rs:190:29:190:29 | a | main.rs:116:27:116:32 | ...: i64 | provenance | | +| main.rs:190:29:190:29 | a | main.rs:190:13:190:30 | mn.data_through(...) | provenance | | +| main.rs:194:9:194:9 | a | main.rs:195:35:195:35 | a | provenance | | +| main.rs:194:13:194:22 | source(...) | main.rs:194:9:194:9 | a | provenance | | +| main.rs:195:9:195:9 | b | main.rs:196:10:196:10 | b | provenance | | +| main.rs:195:13:195:36 | mn.data_through_trait(...) | main.rs:195:9:195:9 | b | provenance | | +| main.rs:195:35:195:35 | a | main.rs:138:33:138:38 | ...: i64 | provenance | | +| main.rs:195:35:195:35 | a | main.rs:195:13:195:36 | mn.data_through_trait(...) | provenance | | +| main.rs:203:9:203:9 | a | main.rs:204:25:204:25 | a | provenance | | +| main.rs:203:13:203:21 | source(...) | main.rs:203:9:203:9 | a | provenance | | +| main.rs:204:25:204:25 | a | main.rs:104:22:104:27 | ...: i64 | provenance | | +| main.rs:209:9:209:9 | a | main.rs:210:38:210:38 | a | provenance | | +| main.rs:209:13:209:22 | source(...) | main.rs:209:9:209:9 | a | provenance | | +| main.rs:210:9:210:9 | b | main.rs:211:10:211:10 | b | provenance | | +| main.rs:210:13:210:39 | ...::data_through(...) | main.rs:210:9:210:9 | b | provenance | | +| main.rs:210:38:210:38 | a | main.rs:116:27:116:32 | ...: i64 | provenance | | +| main.rs:210:38:210:38 | a | main.rs:210:13:210:39 | ...::data_through(...) | provenance | | +| main.rs:222:12:222:17 | ...: i64 | main.rs:223:24:223:24 | n | provenance | | +| main.rs:223:9:223:26 | MyInt {...} [MyInt] | main.rs:222:28:224:5 | { ... } [MyInt] | provenance | | +| main.rs:223:24:223:24 | n | main.rs:223:9:223:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:228:9:228:9 | n [MyInt] | main.rs:229:9:229:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:228:13:228:34 | ...::new(...) [MyInt] | main.rs:228:9:228:9 | n [MyInt] | provenance | | +| main.rs:228:24:228:33 | source(...) | main.rs:222:12:222:17 | ...: i64 | provenance | | +| main.rs:228:24:228:33 | source(...) | main.rs:228:13:228:34 | ...::new(...) [MyInt] | provenance | | +| main.rs:229:9:229:26 | MyInt {...} [MyInt] | main.rs:229:24:229:24 | m | provenance | | +| main.rs:229:24:229:24 | m | main.rs:230:10:230:10 | m | provenance | | +| main.rs:236:12:236:15 | SelfParam [MyInt] | main.rs:238:24:238:27 | self [MyInt] | provenance | | +| main.rs:238:9:238:35 | MyInt {...} [MyInt] | main.rs:236:42:239:5 | { ... } [MyInt] | provenance | | +| main.rs:238:24:238:27 | self [MyInt] | main.rs:238:24:238:33 | self.value | provenance | | +| main.rs:238:24:238:33 | self.value | main.rs:238:9:238:35 | MyInt {...} [MyInt] | provenance | | +| main.rs:243:30:243:39 | ...: MyInt [MyInt] | main.rs:244:22:244:24 | rhs [MyInt] | provenance | | +| main.rs:244:9:244:12 | [post] self [&ref, MyInt] | main.rs:243:19:243:27 | SelfParam [Return] [&ref, MyInt] | provenance | | +| main.rs:244:22:244:24 | rhs [MyInt] | main.rs:244:22:244:30 | rhs.value | provenance | | +| main.rs:244:22:244:30 | rhs.value | main.rs:244:9:244:12 | [post] self [&ref, MyInt] | provenance | | +| main.rs:251:14:251:18 | SelfParam [&ref, MyInt] | main.rs:252:12:252:15 | self [&ref, MyInt] | provenance | | +| main.rs:252:9:252:22 | &... [&ref] | main.rs:251:38:253:5 | { ... } [&ref] | provenance | | +| main.rs:252:10:252:22 | ... .value | main.rs:252:9:252:22 | &... [&ref] | provenance | | +| main.rs:252:11:252:15 | * ... [MyInt] | main.rs:252:10:252:22 | ... .value | provenance | | +| main.rs:252:12:252:15 | self [&ref, MyInt] | main.rs:252:11:252:15 | * ... [MyInt] | provenance | MaD:1 | +| main.rs:258:9:258:9 | a [MyInt] | main.rs:260:13:260:13 | a [MyInt] | provenance | | +| main.rs:258:13:258:38 | MyInt {...} [MyInt] | main.rs:258:9:258:9 | a [MyInt] | provenance | | +| main.rs:258:28:258:36 | source(...) | main.rs:258:13:258:38 | MyInt {...} [MyInt] | provenance | | +| main.rs:260:9:260:9 | c [MyInt] | main.rs:261:10:261:10 | c [MyInt] | provenance | | +| main.rs:260:13:260:13 | a [MyInt] | main.rs:236:12:236:15 | SelfParam [MyInt] | provenance | | +| main.rs:260:13:260:13 | a [MyInt] | main.rs:260:13:260:17 | ... + ... [MyInt] | provenance | | +| main.rs:260:13:260:17 | ... + ... [MyInt] | main.rs:260:9:260:9 | c [MyInt] | provenance | | +| main.rs:261:10:261:10 | c [MyInt] | main.rs:261:10:261:16 | c.value | provenance | | +| main.rs:268:9:268:9 | a [MyInt] | main.rs:270:13:270:13 | a [MyInt] | provenance | | +| main.rs:268:13:268:38 | MyInt {...} [MyInt] | main.rs:268:9:268:9 | a [MyInt] | provenance | | +| main.rs:268:28:268:36 | source(...) | main.rs:268:13:268:38 | MyInt {...} [MyInt] | provenance | | +| main.rs:270:9:270:9 | d [MyInt] | main.rs:271:10:271:10 | d [MyInt] | provenance | | +| main.rs:270:13:270:13 | a [MyInt] | main.rs:236:12:236:15 | SelfParam [MyInt] | provenance | | +| main.rs:270:13:270:13 | a [MyInt] | main.rs:270:13:270:20 | a.add(...) [MyInt] | provenance | | +| main.rs:270:13:270:20 | a.add(...) [MyInt] | main.rs:270:9:270:9 | d [MyInt] | provenance | | +| main.rs:271:10:271:10 | d [MyInt] | main.rs:271:10:271:16 | d.value | provenance | | +| main.rs:275:9:275:9 | b [MyInt] | main.rs:277:35:277:35 | b [MyInt] | provenance | | +| main.rs:275:13:275:39 | MyInt {...} [MyInt] | main.rs:275:9:275:9 | b [MyInt] | provenance | | +| main.rs:275:28:275:37 | source(...) | main.rs:275:13:275:39 | MyInt {...} [MyInt] | provenance | | +| main.rs:277:27:277:32 | [post] &mut a [&ref, MyInt] | main.rs:277:32:277:32 | [post] a [MyInt] | provenance | | +| main.rs:277:32:277:32 | [post] a [MyInt] | main.rs:278:10:278:10 | a [MyInt] | provenance | | +| main.rs:277:35:277:35 | b [MyInt] | main.rs:243:30:243:39 | ...: MyInt [MyInt] | provenance | | +| main.rs:277:35:277:35 | b [MyInt] | main.rs:277:27:277:32 | [post] &mut a [&ref, MyInt] | provenance | | +| main.rs:278:10:278:10 | a [MyInt] | main.rs:278:10:278:16 | a.value | provenance | | +| main.rs:281:9:281:9 | b [MyInt] | main.rs:282:10:282:10 | b [MyInt] | provenance | | +| main.rs:281:13:281:39 | MyInt {...} [MyInt] | main.rs:281:9:281:9 | b [MyInt] | provenance | | +| main.rs:281:28:281:37 | source(...) | main.rs:281:13:281:39 | MyInt {...} [MyInt] | provenance | | +| main.rs:282:10:282:10 | b [MyInt] | main.rs:243:30:243:39 | ...: MyInt [MyInt] | provenance | | +| main.rs:282:10:282:10 | b [MyInt] | main.rs:283:10:283:10 | a [MyInt] | provenance | | +| main.rs:283:10:283:10 | a [MyInt] | main.rs:283:10:283:16 | a.value | provenance | | +| main.rs:286:9:286:9 | a [MyInt] | main.rs:288:28:288:28 | a [MyInt] | provenance | | +| main.rs:286:13:286:39 | MyInt {...} [MyInt] | main.rs:286:9:286:9 | a [MyInt] | provenance | | +| main.rs:286:28:286:37 | source(...) | main.rs:286:13:286:39 | MyInt {...} [MyInt] | provenance | | +| main.rs:288:9:288:9 | c | main.rs:289:10:289:10 | c | provenance | | +| main.rs:288:13:288:29 | * ... | main.rs:288:9:288:9 | c | provenance | | +| main.rs:288:14:288:29 | ...::deref(...) [&ref] | main.rs:288:13:288:29 | * ... | provenance | MaD:1 | +| main.rs:288:27:288:28 | &a [&ref, MyInt] | main.rs:251:14:251:18 | SelfParam [&ref, MyInt] | provenance | | +| main.rs:288:27:288:28 | &a [&ref, MyInt] | main.rs:288:14:288:29 | ...::deref(...) [&ref] | provenance | MaD:1 | +| main.rs:288:28:288:28 | a [MyInt] | main.rs:288:27:288:28 | &a [&ref, MyInt] | provenance | | +| main.rs:291:9:291:9 | a [MyInt] | main.rs:292:14:292:14 | a [MyInt] | provenance | | +| main.rs:291:13:291:39 | MyInt {...} [MyInt] | main.rs:291:9:291:9 | a [MyInt] | provenance | | +| main.rs:291:28:291:37 | source(...) | main.rs:291:13:291:39 | MyInt {...} [MyInt] | provenance | | +| main.rs:292:9:292:9 | c | main.rs:293:10:293:10 | c | provenance | | +| main.rs:292:13:292:14 | * ... | main.rs:292:9:292:9 | c | provenance | | +| main.rs:292:14:292:14 | a [MyInt] | main.rs:251:14:251:18 | SelfParam [&ref, MyInt] | provenance | | +| main.rs:292:14:292:14 | a [MyInt] | main.rs:292:13:292:14 | * ... | provenance | MaD:1 | +| main.rs:309:18:309:21 | SelfParam [MyInt] | main.rs:309:48:311:5 | { ... } [MyInt] | provenance | | +| main.rs:313:26:313:37 | ...: MyInt [MyInt] | main.rs:313:49:315:5 | { ... } [MyInt] | provenance | | +| main.rs:319:9:319:9 | a [MyInt] | main.rs:321:50:321:50 | a [MyInt] | provenance | | +| main.rs:319:13:319:38 | MyInt {...} [MyInt] | main.rs:319:9:319:9 | a [MyInt] | provenance | | +| main.rs:319:28:319:36 | source(...) | main.rs:319:13:319:38 | MyInt {...} [MyInt] | provenance | | +| main.rs:321:9:321:26 | MyInt {...} [MyInt] | main.rs:321:24:321:24 | c | provenance | | +| main.rs:321:24:321:24 | c | main.rs:322:10:322:10 | c | provenance | | +| main.rs:321:30:321:54 | ...::take_self(...) [MyInt] | main.rs:321:9:321:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:321:50:321:50 | a [MyInt] | main.rs:309:18:309:21 | SelfParam [MyInt] | provenance | | +| main.rs:321:50:321:50 | a [MyInt] | main.rs:321:30:321:54 | ...::take_self(...) [MyInt] | provenance | | +| main.rs:325:9:325:9 | b [MyInt] | main.rs:326:55:326:55 | b [MyInt] | provenance | | +| main.rs:325:13:325:39 | MyInt {...} [MyInt] | main.rs:325:9:325:9 | b [MyInt] | provenance | | +| main.rs:325:28:325:37 | source(...) | main.rs:325:13:325:39 | MyInt {...} [MyInt] | provenance | | +| main.rs:326:9:326:26 | MyInt {...} [MyInt] | main.rs:326:24:326:24 | c | provenance | | +| main.rs:326:24:326:24 | c | main.rs:327:10:327:10 | c | provenance | | +| main.rs:326:30:326:56 | ...::take_second(...) [MyInt] | main.rs:326:9:326:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:326:55:326:55 | b [MyInt] | main.rs:313:26:313:37 | ...: MyInt [MyInt] | provenance | | +| main.rs:326:55:326:55 | b [MyInt] | main.rs:326:30:326:56 | ...::take_second(...) [MyInt] | provenance | | +| main.rs:335:32:339:1 | { ... } | main.rs:342:13:342:26 | async_source(...) | provenance | | +| main.rs:335:32:339:1 | { ... } | main.rs:354:41:354:54 | async_source(...) | provenance | | +| main.rs:336:9:336:9 | a | main.rs:335:32:339:1 | { ... } | provenance | | +| main.rs:336:9:336:9 | a | main.rs:337:10:337:10 | a | provenance | | +| main.rs:336:13:336:21 | source(...) | main.rs:336:9:336:9 | a | provenance | | +| main.rs:342:9:342:9 | a | main.rs:343:10:343:10 | a | provenance | | +| main.rs:342:13:342:26 | async_source(...) | main.rs:342:9:342:9 | a | provenance | | +| main.rs:346:13:346:13 | c | main.rs:347:14:347:14 | c | provenance | | +| main.rs:346:17:346:25 | source(...) | main.rs:346:13:346:13 | c | provenance | | +| main.rs:354:9:354:9 | a | main.rs:355:10:355:10 | a | provenance | | +| main.rs:354:13:354:55 | ...::block_on(...) | main.rs:354:9:354:9 | a | provenance | | +| main.rs:354:41:354:54 | async_source(...) | main.rs:354:13:354:55 | ...::block_on(...) | provenance | MaD:3 | +| main.rs:366:44:368:9 | { ... } | main.rs:403:18:403:38 | t.get_double_number() | provenance | | +| main.rs:366:44:368:9 | { ... } | main.rs:407:18:407:50 | ...::get_double_number(...) | provenance | | +| main.rs:367:13:367:29 | self.get_number() | main.rs:367:13:367:33 | ... * ... | provenance | MaD:2 | +| main.rs:367:13:367:33 | ... * ... | main.rs:366:44:368:9 | { ... } | provenance | | +| main.rs:370:33:372:9 | { ... } | main.rs:411:18:411:37 | ...::get_default(...) | provenance | | +| main.rs:371:13:371:21 | source(...) | main.rs:370:33:372:9 | { ... } | provenance | | +| main.rs:378:37:380:9 | { ... } | main.rs:367:13:367:29 | self.get_number() | provenance | | +| main.rs:379:13:379:21 | source(...) | main.rs:378:37:380:9 | { ... } | provenance | | +| main.rs:390:44:392:9 | { ... } | main.rs:415:18:415:38 | i.get_double_number() | provenance | | +| main.rs:391:13:391:22 | source(...) | main.rs:390:44:392:9 | { ... } | provenance | | +| main.rs:394:33:396:9 | { ... } | main.rs:418:18:418:41 | ...::get_default(...) | provenance | | +| main.rs:395:13:395:21 | source(...) | main.rs:394:33:396:9 | { ... } | provenance | | +| main.rs:403:13:403:14 | n1 | main.rs:404:14:404:15 | n1 | provenance | | +| main.rs:403:18:403:38 | t.get_double_number() | main.rs:403:13:403:14 | n1 | provenance | | +| main.rs:407:13:407:14 | n2 | main.rs:408:14:408:15 | n2 | provenance | | +| main.rs:407:18:407:50 | ...::get_double_number(...) | main.rs:407:13:407:14 | n2 | provenance | | +| main.rs:411:13:411:14 | n3 | main.rs:412:14:412:15 | n3 | provenance | | +| main.rs:411:18:411:37 | ...::get_default(...) | main.rs:411:13:411:14 | n3 | provenance | | +| main.rs:415:13:415:14 | n4 | main.rs:416:14:416:15 | n4 | provenance | | +| main.rs:415:18:415:38 | i.get_double_number() | main.rs:415:13:415:14 | n4 | provenance | | +| main.rs:418:13:418:14 | n5 | main.rs:419:14:419:15 | n5 | provenance | | +| main.rs:418:18:418:41 | ...::get_default(...) | main.rs:418:13:418:14 | n5 | provenance | | nodes | main.rs:12:28:14:1 | { ... } | semmle.label | { ... } | | main.rs:13:5:13:13 | source(...) | semmle.label | source(...) | @@ -189,14 +227,12 @@ nodes | main.rs:18:10:18:10 | a | semmle.label | a | | main.rs:26:17:26:25 | SelfParam [Return] [&ref, MyStruct] | semmle.label | SelfParam [Return] [&ref, MyStruct] | | main.rs:26:28:26:33 | ...: i64 | semmle.label | ...: i64 | -| main.rs:27:10:27:14 | [post] * ... [MyStruct] | semmle.label | [post] * ... [MyStruct] | -| main.rs:27:11:27:14 | [post] self [&ref, MyStruct] | semmle.label | [post] self [&ref, MyStruct] | -| main.rs:27:24:27:24 | n | semmle.label | n | +| main.rs:27:9:27:12 | [post] self [&ref, MyStruct] | semmle.label | [post] self [&ref, MyStruct] | +| main.rs:27:21:27:21 | n | semmle.label | n | | main.rs:30:17:30:21 | SelfParam [&ref, MyStruct] | semmle.label | SelfParam [&ref, MyStruct] | | main.rs:30:31:32:5 | { ... } | semmle.label | { ... } | -| main.rs:31:9:31:20 | ... .data | semmle.label | ... .data | -| main.rs:31:10:31:14 | * ... [MyStruct] | semmle.label | * ... [MyStruct] | -| main.rs:31:11:31:14 | self [&ref, MyStruct] | semmle.label | self [&ref, MyStruct] | +| main.rs:31:9:31:12 | self [&ref, MyStruct] | semmle.label | self [&ref, MyStruct] | +| main.rs:31:9:31:17 | self.data | semmle.label | self.data | | main.rs:38:6:38:11 | [post] &mut a [&ref, MyStruct] | semmle.label | [post] &mut a [&ref, MyStruct] | | main.rs:38:11:38:11 | [post] a [MyStruct] | semmle.label | [post] a [MyStruct] | | main.rs:38:23:38:31 | source(...) | semmle.label | source(...) | @@ -235,151 +271,193 @@ nodes | main.rs:87:10:87:10 | b | semmle.label | b | | main.rs:104:22:104:27 | ...: i64 | semmle.label | ...: i64 | | main.rs:105:14:105:14 | n | semmle.label | n | -| main.rs:108:30:110:5 | { ... } | semmle.label | { ... } | -| main.rs:109:35:109:43 | source(...) | semmle.label | source(...) | -| main.rs:112:27:112:32 | ...: i64 | semmle.label | ...: i64 | -| main.rs:112:42:114:5 | { ... } | semmle.label | { ... } | -| main.rs:118:28:118:33 | ...: i64 | semmle.label | ...: i64 | -| main.rs:119:14:119:14 | n | semmle.label | n | -| main.rs:122:36:124:5 | { ... } | semmle.label | { ... } | -| main.rs:123:35:123:44 | source(...) | semmle.label | source(...) | -| main.rs:126:33:126:38 | ...: i64 | semmle.label | ...: i64 | -| main.rs:126:48:128:5 | { ... } | semmle.label | { ... } | -| main.rs:132:9:132:9 | a | semmle.label | a | -| main.rs:132:13:132:30 | x.get_data_trait() | semmle.label | x.get_data_trait() | -| main.rs:133:10:133:10 | a | semmle.label | a | -| main.rs:138:9:138:9 | a | semmle.label | a | -| main.rs:138:13:138:25 | mn.get_data() | semmle.label | mn.get_data() | -| main.rs:139:10:139:10 | a | semmle.label | a | -| main.rs:142:9:142:9 | a | semmle.label | a | -| main.rs:142:13:142:31 | mn.get_data_trait() | semmle.label | mn.get_data_trait() | -| main.rs:143:10:143:10 | a | semmle.label | a | -| main.rs:149:9:149:9 | a | semmle.label | a | -| main.rs:149:13:149:22 | source(...) | semmle.label | source(...) | -| main.rs:150:21:150:21 | a | semmle.label | a | -| main.rs:155:9:155:9 | a | semmle.label | a | -| main.rs:155:13:155:21 | source(...) | semmle.label | source(...) | -| main.rs:156:16:156:16 | a | semmle.label | a | -| main.rs:159:9:159:9 | a | semmle.label | a | -| main.rs:159:13:159:22 | source(...) | semmle.label | source(...) | -| main.rs:160:22:160:22 | a | semmle.label | a | -| main.rs:166:9:166:9 | a | semmle.label | a | -| main.rs:166:13:166:22 | source(...) | semmle.label | source(...) | -| main.rs:167:9:167:9 | b | semmle.label | b | -| main.rs:167:13:167:35 | x.data_through_trait(...) | semmle.label | x.data_through_trait(...) | -| main.rs:167:34:167:34 | a | semmle.label | a | -| main.rs:168:10:168:10 | b | semmle.label | b | -| main.rs:173:9:173:9 | a | semmle.label | a | -| main.rs:173:13:173:21 | source(...) | semmle.label | source(...) | -| main.rs:174:9:174:9 | b | semmle.label | b | -| main.rs:174:13:174:30 | mn.data_through(...) | semmle.label | mn.data_through(...) | -| main.rs:174:29:174:29 | a | semmle.label | a | -| main.rs:175:10:175:10 | b | semmle.label | b | -| main.rs:178:9:178:9 | a | semmle.label | a | -| main.rs:178:13:178:22 | source(...) | semmle.label | source(...) | -| main.rs:179:9:179:9 | b | semmle.label | b | -| main.rs:179:13:179:36 | mn.data_through_trait(...) | semmle.label | mn.data_through_trait(...) | -| main.rs:179:35:179:35 | a | semmle.label | a | -| main.rs:180:10:180:10 | b | semmle.label | b | -| main.rs:187:9:187:9 | a | semmle.label | a | -| main.rs:187:13:187:21 | source(...) | semmle.label | source(...) | -| main.rs:188:25:188:25 | a | semmle.label | a | -| main.rs:193:9:193:9 | a | semmle.label | a | -| main.rs:193:13:193:22 | source(...) | semmle.label | source(...) | -| main.rs:194:9:194:9 | b | semmle.label | b | -| main.rs:194:13:194:39 | ...::data_through(...) | semmle.label | ...::data_through(...) | -| main.rs:194:38:194:38 | a | semmle.label | a | -| main.rs:195:10:195:10 | b | semmle.label | b | -| main.rs:206:12:206:17 | ...: i64 | semmle.label | ...: i64 | -| main.rs:206:28:208:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | -| main.rs:207:9:207:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:207:24:207:24 | n | semmle.label | n | -| main.rs:212:9:212:9 | n [MyInt] | semmle.label | n [MyInt] | -| main.rs:212:13:212:34 | ...::new(...) [MyInt] | semmle.label | ...::new(...) [MyInt] | -| main.rs:212:24:212:33 | source(...) | semmle.label | source(...) | -| main.rs:213:9:213:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:213:24:213:24 | m | semmle.label | m | -| main.rs:214:10:214:10 | m | semmle.label | m | -| main.rs:220:12:220:15 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | -| main.rs:220:42:223:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | -| main.rs:222:9:222:35 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:222:24:222:27 | self [MyInt] | semmle.label | self [MyInt] | -| main.rs:222:24:222:33 | self.value | semmle.label | self.value | -| main.rs:227:19:227:27 | SelfParam [Return] [&ref, MyInt] | semmle.label | SelfParam [Return] [&ref, MyInt] | -| main.rs:227:30:227:39 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] | -| main.rs:228:10:228:14 | [post] * ... [MyInt] | semmle.label | [post] * ... [MyInt] | -| main.rs:228:11:228:14 | [post] self [&ref, MyInt] | semmle.label | [post] self [&ref, MyInt] | -| main.rs:228:25:228:27 | rhs [MyInt] | semmle.label | rhs [MyInt] | -| main.rs:228:25:228:33 | rhs.value | semmle.label | rhs.value | -| main.rs:235:14:235:18 | SelfParam [&ref, MyInt] | semmle.label | SelfParam [&ref, MyInt] | -| main.rs:235:38:237:5 | { ... } [&ref] | semmle.label | { ... } [&ref] | -| main.rs:236:9:236:22 | &... [&ref] | semmle.label | &... [&ref] | -| main.rs:236:10:236:22 | ... .value | semmle.label | ... .value | -| main.rs:236:11:236:15 | * ... [MyInt] | semmle.label | * ... [MyInt] | -| main.rs:236:12:236:15 | self [&ref, MyInt] | semmle.label | self [&ref, MyInt] | -| main.rs:242:9:242:9 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:242:13:242:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:242:28:242:36 | source(...) | semmle.label | source(...) | -| main.rs:244:9:244:9 | c [MyInt] | semmle.label | c [MyInt] | -| main.rs:244:13:244:13 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:244:13:244:17 | ... + ... [MyInt] | semmle.label | ... + ... [MyInt] | -| main.rs:245:10:245:10 | c [MyInt] | semmle.label | c [MyInt] | -| main.rs:245:10:245:16 | c.value | semmle.label | c.value | -| main.rs:252:9:252:9 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:252:13:252:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:252:28:252:36 | source(...) | semmle.label | source(...) | -| main.rs:254:9:254:9 | d [MyInt] | semmle.label | d [MyInt] | -| main.rs:254:13:254:20 | a.add(...) [MyInt] | semmle.label | a.add(...) [MyInt] | -| main.rs:255:10:255:10 | d [MyInt] | semmle.label | d [MyInt] | -| main.rs:255:10:255:16 | d.value | semmle.label | d.value | -| main.rs:259:9:259:9 | b [MyInt] | semmle.label | b [MyInt] | -| main.rs:259:13:259:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:259:28:259:37 | source(...) | semmle.label | source(...) | -| main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | semmle.label | [post] &mut a [&ref, MyInt] | -| main.rs:261:32:261:32 | [post] a [MyInt] | semmle.label | [post] a [MyInt] | -| main.rs:261:35:261:35 | b [MyInt] | semmle.label | b [MyInt] | -| main.rs:262:10:262:10 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:262:10:262:16 | a.value | semmle.label | a.value | -| main.rs:270:9:270:9 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:270:13:270:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:270:28:270:37 | source(...) | semmle.label | source(...) | -| main.rs:272:9:272:9 | c | semmle.label | c | -| main.rs:272:13:272:29 | * ... | semmle.label | * ... | -| main.rs:272:14:272:29 | ...::deref(...) [&ref] | semmle.label | ...::deref(...) [&ref] | -| main.rs:272:27:272:28 | &a [&ref, MyInt] | semmle.label | &a [&ref, MyInt] | -| main.rs:272:28:272:28 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:273:10:273:10 | c | semmle.label | c | -| main.rs:289:18:289:21 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | -| main.rs:289:48:291:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | -| main.rs:293:26:293:37 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] | -| main.rs:293:49:295:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | -| main.rs:299:9:299:9 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:299:13:299:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:299:28:299:36 | source(...) | semmle.label | source(...) | -| main.rs:301:9:301:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:301:24:301:24 | c | semmle.label | c | -| main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | semmle.label | ...::take_self(...) [MyInt] | -| main.rs:301:50:301:50 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:302:10:302:10 | c | semmle.label | c | -| main.rs:305:9:305:9 | b [MyInt] | semmle.label | b [MyInt] | -| main.rs:305:13:305:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:305:28:305:37 | source(...) | semmle.label | source(...) | -| main.rs:306:9:306:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:306:24:306:24 | c | semmle.label | c | -| main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | semmle.label | ...::take_second(...) [MyInt] | -| main.rs:306:55:306:55 | b [MyInt] | semmle.label | b [MyInt] | -| main.rs:307:10:307:10 | c | semmle.label | c | -| main.rs:315:32:319:1 | { ... } | semmle.label | { ... } | -| main.rs:316:9:316:9 | a | semmle.label | a | -| main.rs:316:13:316:21 | source(...) | semmle.label | source(...) | -| main.rs:317:10:317:10 | a | semmle.label | a | -| main.rs:326:13:326:13 | c | semmle.label | c | -| main.rs:326:17:326:25 | source(...) | semmle.label | source(...) | -| main.rs:327:14:327:14 | c | semmle.label | c | -| main.rs:334:9:334:9 | a | semmle.label | a | -| main.rs:334:13:334:55 | ...::block_on(...) | semmle.label | ...::block_on(...) | -| main.rs:334:41:334:54 | async_source(...) | semmle.label | async_source(...) | -| main.rs:335:10:335:10 | a | semmle.label | a | +| main.rs:108:30:114:5 | { ... } | semmle.label | { ... } | +| main.rs:112:13:112:21 | source(...) | semmle.label | source(...) | +| main.rs:116:27:116:32 | ...: i64 | semmle.label | ...: i64 | +| main.rs:116:42:122:5 | { ... } | semmle.label | { ... } | +| main.rs:126:28:126:33 | ...: i64 | semmle.label | ...: i64 | +| main.rs:127:14:127:14 | n | semmle.label | n | +| main.rs:130:36:136:5 | { ... } | semmle.label | { ... } | +| main.rs:134:13:134:22 | source(...) | semmle.label | source(...) | +| main.rs:138:33:138:38 | ...: i64 | semmle.label | ...: i64 | +| main.rs:138:48:144:5 | { ... } | semmle.label | { ... } | +| main.rs:148:9:148:9 | a | semmle.label | a | +| main.rs:148:13:148:30 | x.get_data_trait() | semmle.label | x.get_data_trait() | +| main.rs:149:10:149:10 | a | semmle.label | a | +| main.rs:154:9:154:9 | a | semmle.label | a | +| main.rs:154:13:154:25 | mn.get_data() | semmle.label | mn.get_data() | +| main.rs:155:10:155:10 | a | semmle.label | a | +| main.rs:158:9:158:9 | a | semmle.label | a | +| main.rs:158:13:158:31 | mn.get_data_trait() | semmle.label | mn.get_data_trait() | +| main.rs:159:10:159:10 | a | semmle.label | a | +| main.rs:165:9:165:9 | a | semmle.label | a | +| main.rs:165:13:165:22 | source(...) | semmle.label | source(...) | +| main.rs:166:21:166:21 | a | semmle.label | a | +| main.rs:171:9:171:9 | a | semmle.label | a | +| main.rs:171:13:171:21 | source(...) | semmle.label | source(...) | +| main.rs:172:16:172:16 | a | semmle.label | a | +| main.rs:175:9:175:9 | a | semmle.label | a | +| main.rs:175:13:175:22 | source(...) | semmle.label | source(...) | +| main.rs:176:22:176:22 | a | semmle.label | a | +| main.rs:182:9:182:9 | a | semmle.label | a | +| main.rs:182:13:182:22 | source(...) | semmle.label | source(...) | +| main.rs:183:9:183:9 | b | semmle.label | b | +| main.rs:183:13:183:35 | x.data_through_trait(...) | semmle.label | x.data_through_trait(...) | +| main.rs:183:34:183:34 | a | semmle.label | a | +| main.rs:184:10:184:10 | b | semmle.label | b | +| main.rs:189:9:189:9 | a | semmle.label | a | +| main.rs:189:13:189:21 | source(...) | semmle.label | source(...) | +| main.rs:190:9:190:9 | b | semmle.label | b | +| main.rs:190:13:190:30 | mn.data_through(...) | semmle.label | mn.data_through(...) | +| main.rs:190:29:190:29 | a | semmle.label | a | +| main.rs:191:10:191:10 | b | semmle.label | b | +| main.rs:194:9:194:9 | a | semmle.label | a | +| main.rs:194:13:194:22 | source(...) | semmle.label | source(...) | +| main.rs:195:9:195:9 | b | semmle.label | b | +| main.rs:195:13:195:36 | mn.data_through_trait(...) | semmle.label | mn.data_through_trait(...) | +| main.rs:195:35:195:35 | a | semmle.label | a | +| main.rs:196:10:196:10 | b | semmle.label | b | +| main.rs:203:9:203:9 | a | semmle.label | a | +| main.rs:203:13:203:21 | source(...) | semmle.label | source(...) | +| main.rs:204:25:204:25 | a | semmle.label | a | +| main.rs:209:9:209:9 | a | semmle.label | a | +| main.rs:209:13:209:22 | source(...) | semmle.label | source(...) | +| main.rs:210:9:210:9 | b | semmle.label | b | +| main.rs:210:13:210:39 | ...::data_through(...) | semmle.label | ...::data_through(...) | +| main.rs:210:38:210:38 | a | semmle.label | a | +| main.rs:211:10:211:10 | b | semmle.label | b | +| main.rs:222:12:222:17 | ...: i64 | semmle.label | ...: i64 | +| main.rs:222:28:224:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:223:9:223:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:223:24:223:24 | n | semmle.label | n | +| main.rs:228:9:228:9 | n [MyInt] | semmle.label | n [MyInt] | +| main.rs:228:13:228:34 | ...::new(...) [MyInt] | semmle.label | ...::new(...) [MyInt] | +| main.rs:228:24:228:33 | source(...) | semmle.label | source(...) | +| main.rs:229:9:229:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:229:24:229:24 | m | semmle.label | m | +| main.rs:230:10:230:10 | m | semmle.label | m | +| main.rs:236:12:236:15 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | +| main.rs:236:42:239:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:238:9:238:35 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:238:24:238:27 | self [MyInt] | semmle.label | self [MyInt] | +| main.rs:238:24:238:33 | self.value | semmle.label | self.value | +| main.rs:243:19:243:27 | SelfParam [Return] [&ref, MyInt] | semmle.label | SelfParam [Return] [&ref, MyInt] | +| main.rs:243:30:243:39 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] | +| main.rs:244:9:244:12 | [post] self [&ref, MyInt] | semmle.label | [post] self [&ref, MyInt] | +| main.rs:244:22:244:24 | rhs [MyInt] | semmle.label | rhs [MyInt] | +| main.rs:244:22:244:30 | rhs.value | semmle.label | rhs.value | +| main.rs:251:14:251:18 | SelfParam [&ref, MyInt] | semmle.label | SelfParam [&ref, MyInt] | +| main.rs:251:38:253:5 | { ... } [&ref] | semmle.label | { ... } [&ref] | +| main.rs:252:9:252:22 | &... [&ref] | semmle.label | &... [&ref] | +| main.rs:252:10:252:22 | ... .value | semmle.label | ... .value | +| main.rs:252:11:252:15 | * ... [MyInt] | semmle.label | * ... [MyInt] | +| main.rs:252:12:252:15 | self [&ref, MyInt] | semmle.label | self [&ref, MyInt] | +| main.rs:258:9:258:9 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:258:13:258:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:258:28:258:36 | source(...) | semmle.label | source(...) | +| main.rs:260:9:260:9 | c [MyInt] | semmle.label | c [MyInt] | +| main.rs:260:13:260:13 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:260:13:260:17 | ... + ... [MyInt] | semmle.label | ... + ... [MyInt] | +| main.rs:261:10:261:10 | c [MyInt] | semmle.label | c [MyInt] | +| main.rs:261:10:261:16 | c.value | semmle.label | c.value | +| main.rs:268:9:268:9 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:268:13:268:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:268:28:268:36 | source(...) | semmle.label | source(...) | +| main.rs:270:9:270:9 | d [MyInt] | semmle.label | d [MyInt] | +| main.rs:270:13:270:13 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:270:13:270:20 | a.add(...) [MyInt] | semmle.label | a.add(...) [MyInt] | +| main.rs:271:10:271:10 | d [MyInt] | semmle.label | d [MyInt] | +| main.rs:271:10:271:16 | d.value | semmle.label | d.value | +| main.rs:275:9:275:9 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:275:13:275:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:275:28:275:37 | source(...) | semmle.label | source(...) | +| main.rs:277:27:277:32 | [post] &mut a [&ref, MyInt] | semmle.label | [post] &mut a [&ref, MyInt] | +| main.rs:277:32:277:32 | [post] a [MyInt] | semmle.label | [post] a [MyInt] | +| main.rs:277:35:277:35 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:278:10:278:10 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:278:10:278:16 | a.value | semmle.label | a.value | +| main.rs:281:9:281:9 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:281:13:281:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:281:28:281:37 | source(...) | semmle.label | source(...) | +| main.rs:282:10:282:10 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:283:10:283:10 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:283:10:283:16 | a.value | semmle.label | a.value | +| main.rs:286:9:286:9 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:286:13:286:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:286:28:286:37 | source(...) | semmle.label | source(...) | +| main.rs:288:9:288:9 | c | semmle.label | c | +| main.rs:288:13:288:29 | * ... | semmle.label | * ... | +| main.rs:288:14:288:29 | ...::deref(...) [&ref] | semmle.label | ...::deref(...) [&ref] | +| main.rs:288:27:288:28 | &a [&ref, MyInt] | semmle.label | &a [&ref, MyInt] | +| main.rs:288:28:288:28 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:289:10:289:10 | c | semmle.label | c | +| main.rs:291:9:291:9 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:291:13:291:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:291:28:291:37 | source(...) | semmle.label | source(...) | +| main.rs:292:9:292:9 | c | semmle.label | c | +| main.rs:292:13:292:14 | * ... | semmle.label | * ... | +| main.rs:292:14:292:14 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:293:10:293:10 | c | semmle.label | c | +| main.rs:309:18:309:21 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | +| main.rs:309:48:311:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:313:26:313:37 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] | +| main.rs:313:49:315:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:319:9:319:9 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:319:13:319:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:319:28:319:36 | source(...) | semmle.label | source(...) | +| main.rs:321:9:321:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:321:24:321:24 | c | semmle.label | c | +| main.rs:321:30:321:54 | ...::take_self(...) [MyInt] | semmle.label | ...::take_self(...) [MyInt] | +| main.rs:321:50:321:50 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:322:10:322:10 | c | semmle.label | c | +| main.rs:325:9:325:9 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:325:13:325:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:325:28:325:37 | source(...) | semmle.label | source(...) | +| main.rs:326:9:326:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:326:24:326:24 | c | semmle.label | c | +| main.rs:326:30:326:56 | ...::take_second(...) [MyInt] | semmle.label | ...::take_second(...) [MyInt] | +| main.rs:326:55:326:55 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:327:10:327:10 | c | semmle.label | c | +| main.rs:335:32:339:1 | { ... } | semmle.label | { ... } | +| main.rs:336:9:336:9 | a | semmle.label | a | +| main.rs:336:13:336:21 | source(...) | semmle.label | source(...) | +| main.rs:337:10:337:10 | a | semmle.label | a | +| main.rs:342:9:342:9 | a | semmle.label | a | +| main.rs:342:13:342:26 | async_source(...) | semmle.label | async_source(...) | +| main.rs:343:10:343:10 | a | semmle.label | a | +| main.rs:346:13:346:13 | c | semmle.label | c | +| main.rs:346:17:346:25 | source(...) | semmle.label | source(...) | +| main.rs:347:14:347:14 | c | semmle.label | c | +| main.rs:354:9:354:9 | a | semmle.label | a | +| main.rs:354:13:354:55 | ...::block_on(...) | semmle.label | ...::block_on(...) | +| main.rs:354:41:354:54 | async_source(...) | semmle.label | async_source(...) | +| main.rs:355:10:355:10 | a | semmle.label | a | +| main.rs:366:44:368:9 | { ... } | semmle.label | { ... } | +| main.rs:367:13:367:29 | self.get_number() | semmle.label | self.get_number() | +| main.rs:367:13:367:33 | ... * ... | semmle.label | ... * ... | +| main.rs:370:33:372:9 | { ... } | semmle.label | { ... } | +| main.rs:371:13:371:21 | source(...) | semmle.label | source(...) | +| main.rs:378:37:380:9 | { ... } | semmle.label | { ... } | +| main.rs:379:13:379:21 | source(...) | semmle.label | source(...) | +| main.rs:390:44:392:9 | { ... } | semmle.label | { ... } | +| main.rs:391:13:391:22 | source(...) | semmle.label | source(...) | +| main.rs:394:33:396:9 | { ... } | semmle.label | { ... } | +| main.rs:395:13:395:21 | source(...) | semmle.label | source(...) | +| main.rs:403:13:403:14 | n1 | semmle.label | n1 | +| main.rs:403:18:403:38 | t.get_double_number() | semmle.label | t.get_double_number() | +| main.rs:404:14:404:15 | n1 | semmle.label | n1 | +| main.rs:407:13:407:14 | n2 | semmle.label | n2 | +| main.rs:407:18:407:50 | ...::get_double_number(...) | semmle.label | ...::get_double_number(...) | +| main.rs:408:14:408:15 | n2 | semmle.label | n2 | +| main.rs:411:13:411:14 | n3 | semmle.label | n3 | +| main.rs:411:18:411:37 | ...::get_default(...) | semmle.label | ...::get_default(...) | +| main.rs:412:14:412:15 | n3 | semmle.label | n3 | +| main.rs:415:13:415:14 | n4 | semmle.label | n4 | +| main.rs:415:18:415:38 | i.get_double_number() | semmle.label | i.get_double_number() | +| main.rs:416:14:416:15 | n4 | semmle.label | n4 | +| main.rs:418:13:418:14 | n5 | semmle.label | n5 | +| main.rs:418:18:418:41 | ...::get_default(...) | semmle.label | ...::get_default(...) | +| main.rs:419:14:419:15 | n5 | semmle.label | n5 | subpaths | main.rs:38:23:38:31 | source(...) | main.rs:26:28:26:33 | ...: i64 | main.rs:26:17:26:25 | SelfParam [Return] [&ref, MyStruct] | main.rs:38:6:38:11 | [post] &mut a [&ref, MyStruct] | | main.rs:39:10:39:10 | a [MyStruct] | main.rs:30:17:30:21 | SelfParam [&ref, MyStruct] | main.rs:30:31:32:5 | { ... } | main.rs:39:10:39:21 | a.get_data() | @@ -388,17 +466,19 @@ subpaths | main.rs:67:26:67:26 | a | main.rs:61:17:61:22 | ...: i64 | main.rs:61:32:63:1 | { ... } | main.rs:67:13:67:27 | pass_through(...) | | main.rs:72:26:75:5 | { ... } | main.rs:61:17:61:22 | ...: i64 | main.rs:61:32:63:1 | { ... } | main.rs:72:13:75:6 | pass_through(...) | | main.rs:86:26:86:26 | a | main.rs:82:21:82:26 | ...: i64 | main.rs:82:36:84:5 | { ... } | main.rs:86:13:86:27 | pass_through(...) | -| main.rs:167:34:167:34 | a | main.rs:126:33:126:38 | ...: i64 | main.rs:126:48:128:5 | { ... } | main.rs:167:13:167:35 | x.data_through_trait(...) | -| main.rs:174:29:174:29 | a | main.rs:112:27:112:32 | ...: i64 | main.rs:112:42:114:5 | { ... } | main.rs:174:13:174:30 | mn.data_through(...) | -| main.rs:179:35:179:35 | a | main.rs:126:33:126:38 | ...: i64 | main.rs:126:48:128:5 | { ... } | main.rs:179:13:179:36 | mn.data_through_trait(...) | -| main.rs:194:38:194:38 | a | main.rs:112:27:112:32 | ...: i64 | main.rs:112:42:114:5 | { ... } | main.rs:194:13:194:39 | ...::data_through(...) | -| main.rs:212:24:212:33 | source(...) | main.rs:206:12:206:17 | ...: i64 | main.rs:206:28:208:5 | { ... } [MyInt] | main.rs:212:13:212:34 | ...::new(...) [MyInt] | -| main.rs:244:13:244:13 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | main.rs:220:42:223:5 | { ... } [MyInt] | main.rs:244:13:244:17 | ... + ... [MyInt] | -| main.rs:252:9:252:9 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | main.rs:220:42:223:5 | { ... } [MyInt] | main.rs:254:13:254:20 | a.add(...) [MyInt] | -| main.rs:261:35:261:35 | b [MyInt] | main.rs:227:30:227:39 | ...: MyInt [MyInt] | main.rs:227:19:227:27 | SelfParam [Return] [&ref, MyInt] | main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | -| main.rs:272:27:272:28 | &a [&ref, MyInt] | main.rs:235:14:235:18 | SelfParam [&ref, MyInt] | main.rs:235:38:237:5 | { ... } [&ref] | main.rs:272:14:272:29 | ...::deref(...) [&ref] | -| main.rs:301:50:301:50 | a [MyInt] | main.rs:289:18:289:21 | SelfParam [MyInt] | main.rs:289:48:291:5 | { ... } [MyInt] | main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | -| main.rs:306:55:306:55 | b [MyInt] | main.rs:293:26:293:37 | ...: MyInt [MyInt] | main.rs:293:49:295:5 | { ... } [MyInt] | main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | +| main.rs:183:34:183:34 | a | main.rs:138:33:138:38 | ...: i64 | main.rs:138:48:144:5 | { ... } | main.rs:183:13:183:35 | x.data_through_trait(...) | +| main.rs:190:29:190:29 | a | main.rs:116:27:116:32 | ...: i64 | main.rs:116:42:122:5 | { ... } | main.rs:190:13:190:30 | mn.data_through(...) | +| main.rs:195:35:195:35 | a | main.rs:138:33:138:38 | ...: i64 | main.rs:138:48:144:5 | { ... } | main.rs:195:13:195:36 | mn.data_through_trait(...) | +| main.rs:210:38:210:38 | a | main.rs:116:27:116:32 | ...: i64 | main.rs:116:42:122:5 | { ... } | main.rs:210:13:210:39 | ...::data_through(...) | +| main.rs:228:24:228:33 | source(...) | main.rs:222:12:222:17 | ...: i64 | main.rs:222:28:224:5 | { ... } [MyInt] | main.rs:228:13:228:34 | ...::new(...) [MyInt] | +| main.rs:260:13:260:13 | a [MyInt] | main.rs:236:12:236:15 | SelfParam [MyInt] | main.rs:236:42:239:5 | { ... } [MyInt] | main.rs:260:13:260:17 | ... + ... [MyInt] | +| main.rs:270:13:270:13 | a [MyInt] | main.rs:236:12:236:15 | SelfParam [MyInt] | main.rs:236:42:239:5 | { ... } [MyInt] | main.rs:270:13:270:20 | a.add(...) [MyInt] | +| main.rs:277:35:277:35 | b [MyInt] | main.rs:243:30:243:39 | ...: MyInt [MyInt] | main.rs:243:19:243:27 | SelfParam [Return] [&ref, MyInt] | main.rs:277:27:277:32 | [post] &mut a [&ref, MyInt] | +| main.rs:282:10:282:10 | b [MyInt] | main.rs:243:30:243:39 | ...: MyInt [MyInt] | main.rs:243:19:243:27 | SelfParam [Return] [&ref, MyInt] | main.rs:283:10:283:10 | a [MyInt] | +| main.rs:288:27:288:28 | &a [&ref, MyInt] | main.rs:251:14:251:18 | SelfParam [&ref, MyInt] | main.rs:251:38:253:5 | { ... } [&ref] | main.rs:288:14:288:29 | ...::deref(...) [&ref] | +| main.rs:292:14:292:14 | a [MyInt] | main.rs:251:14:251:18 | SelfParam [&ref, MyInt] | main.rs:251:38:253:5 | { ... } [&ref] | main.rs:292:13:292:14 | * ... | +| main.rs:321:50:321:50 | a [MyInt] | main.rs:309:18:309:21 | SelfParam [MyInt] | main.rs:309:48:311:5 | { ... } [MyInt] | main.rs:321:30:321:54 | ...::take_self(...) [MyInt] | +| main.rs:326:55:326:55 | b [MyInt] | main.rs:313:26:313:37 | ...: MyInt [MyInt] | main.rs:313:49:315:5 | { ... } [MyInt] | main.rs:326:30:326:56 | ...::take_second(...) [MyInt] | testFailures #select | main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) | source(...) | @@ -408,24 +488,32 @@ testFailures | main.rs:68:10:68:10 | b | main.rs:66:13:66:21 | source(...) | main.rs:68:10:68:10 | b | $@ | main.rs:66:13:66:21 | source(...) | source(...) | | main.rs:76:10:76:10 | a | main.rs:74:9:74:18 | source(...) | main.rs:76:10:76:10 | a | $@ | main.rs:74:9:74:18 | source(...) | source(...) | | main.rs:87:10:87:10 | b | main.rs:80:13:80:22 | source(...) | main.rs:87:10:87:10 | b | $@ | main.rs:80:13:80:22 | source(...) | source(...) | -| main.rs:105:14:105:14 | n | main.rs:155:13:155:21 | source(...) | main.rs:105:14:105:14 | n | $@ | main.rs:155:13:155:21 | source(...) | source(...) | -| main.rs:105:14:105:14 | n | main.rs:187:13:187:21 | source(...) | main.rs:105:14:105:14 | n | $@ | main.rs:187:13:187:21 | source(...) | source(...) | -| main.rs:119:14:119:14 | n | main.rs:149:13:149:22 | source(...) | main.rs:119:14:119:14 | n | $@ | main.rs:149:13:149:22 | source(...) | source(...) | -| main.rs:119:14:119:14 | n | main.rs:159:13:159:22 | source(...) | main.rs:119:14:119:14 | n | $@ | main.rs:159:13:159:22 | source(...) | source(...) | -| main.rs:133:10:133:10 | a | main.rs:123:35:123:44 | source(...) | main.rs:133:10:133:10 | a | $@ | main.rs:123:35:123:44 | source(...) | source(...) | -| main.rs:139:10:139:10 | a | main.rs:109:35:109:43 | source(...) | main.rs:139:10:139:10 | a | $@ | main.rs:109:35:109:43 | source(...) | source(...) | -| main.rs:143:10:143:10 | a | main.rs:123:35:123:44 | source(...) | main.rs:143:10:143:10 | a | $@ | main.rs:123:35:123:44 | source(...) | source(...) | -| main.rs:168:10:168:10 | b | main.rs:166:13:166:22 | source(...) | main.rs:168:10:168:10 | b | $@ | main.rs:166:13:166:22 | source(...) | source(...) | -| main.rs:175:10:175:10 | b | main.rs:173:13:173:21 | source(...) | main.rs:175:10:175:10 | b | $@ | main.rs:173:13:173:21 | source(...) | source(...) | -| main.rs:180:10:180:10 | b | main.rs:178:13:178:22 | source(...) | main.rs:180:10:180:10 | b | $@ | main.rs:178:13:178:22 | source(...) | source(...) | -| main.rs:195:10:195:10 | b | main.rs:193:13:193:22 | source(...) | main.rs:195:10:195:10 | b | $@ | main.rs:193:13:193:22 | source(...) | source(...) | -| main.rs:214:10:214:10 | m | main.rs:212:24:212:33 | source(...) | main.rs:214:10:214:10 | m | $@ | main.rs:212:24:212:33 | source(...) | source(...) | -| main.rs:245:10:245:16 | c.value | main.rs:242:28:242:36 | source(...) | main.rs:245:10:245:16 | c.value | $@ | main.rs:242:28:242:36 | source(...) | source(...) | -| main.rs:255:10:255:16 | d.value | main.rs:252:28:252:36 | source(...) | main.rs:255:10:255:16 | d.value | $@ | main.rs:252:28:252:36 | source(...) | source(...) | -| main.rs:262:10:262:16 | a.value | main.rs:259:28:259:37 | source(...) | main.rs:262:10:262:16 | a.value | $@ | main.rs:259:28:259:37 | source(...) | source(...) | -| main.rs:273:10:273:10 | c | main.rs:270:28:270:37 | source(...) | main.rs:273:10:273:10 | c | $@ | main.rs:270:28:270:37 | source(...) | source(...) | -| main.rs:302:10:302:10 | c | main.rs:299:28:299:36 | source(...) | main.rs:302:10:302:10 | c | $@ | main.rs:299:28:299:36 | source(...) | source(...) | -| main.rs:307:10:307:10 | c | main.rs:305:28:305:37 | source(...) | main.rs:307:10:307:10 | c | $@ | main.rs:305:28:305:37 | source(...) | source(...) | -| main.rs:317:10:317:10 | a | main.rs:316:13:316:21 | source(...) | main.rs:317:10:317:10 | a | $@ | main.rs:316:13:316:21 | source(...) | source(...) | -| main.rs:327:14:327:14 | c | main.rs:326:17:326:25 | source(...) | main.rs:327:14:327:14 | c | $@ | main.rs:326:17:326:25 | source(...) | source(...) | -| main.rs:335:10:335:10 | a | main.rs:316:13:316:21 | source(...) | main.rs:335:10:335:10 | a | $@ | main.rs:316:13:316:21 | source(...) | source(...) | +| main.rs:105:14:105:14 | n | main.rs:171:13:171:21 | source(...) | main.rs:105:14:105:14 | n | $@ | main.rs:171:13:171:21 | source(...) | source(...) | +| main.rs:105:14:105:14 | n | main.rs:203:13:203:21 | source(...) | main.rs:105:14:105:14 | n | $@ | main.rs:203:13:203:21 | source(...) | source(...) | +| main.rs:127:14:127:14 | n | main.rs:165:13:165:22 | source(...) | main.rs:127:14:127:14 | n | $@ | main.rs:165:13:165:22 | source(...) | source(...) | +| main.rs:127:14:127:14 | n | main.rs:175:13:175:22 | source(...) | main.rs:127:14:127:14 | n | $@ | main.rs:175:13:175:22 | source(...) | source(...) | +| main.rs:149:10:149:10 | a | main.rs:134:13:134:22 | source(...) | main.rs:149:10:149:10 | a | $@ | main.rs:134:13:134:22 | source(...) | source(...) | +| main.rs:155:10:155:10 | a | main.rs:112:13:112:21 | source(...) | main.rs:155:10:155:10 | a | $@ | main.rs:112:13:112:21 | source(...) | source(...) | +| main.rs:159:10:159:10 | a | main.rs:134:13:134:22 | source(...) | main.rs:159:10:159:10 | a | $@ | main.rs:134:13:134:22 | source(...) | source(...) | +| main.rs:184:10:184:10 | b | main.rs:182:13:182:22 | source(...) | main.rs:184:10:184:10 | b | $@ | main.rs:182:13:182:22 | source(...) | source(...) | +| main.rs:191:10:191:10 | b | main.rs:189:13:189:21 | source(...) | main.rs:191:10:191:10 | b | $@ | main.rs:189:13:189:21 | source(...) | source(...) | +| main.rs:196:10:196:10 | b | main.rs:194:13:194:22 | source(...) | main.rs:196:10:196:10 | b | $@ | main.rs:194:13:194:22 | source(...) | source(...) | +| main.rs:211:10:211:10 | b | main.rs:209:13:209:22 | source(...) | main.rs:211:10:211:10 | b | $@ | main.rs:209:13:209:22 | source(...) | source(...) | +| main.rs:230:10:230:10 | m | main.rs:228:24:228:33 | source(...) | main.rs:230:10:230:10 | m | $@ | main.rs:228:24:228:33 | source(...) | source(...) | +| main.rs:261:10:261:16 | c.value | main.rs:258:28:258:36 | source(...) | main.rs:261:10:261:16 | c.value | $@ | main.rs:258:28:258:36 | source(...) | source(...) | +| main.rs:271:10:271:16 | d.value | main.rs:268:28:268:36 | source(...) | main.rs:271:10:271:16 | d.value | $@ | main.rs:268:28:268:36 | source(...) | source(...) | +| main.rs:278:10:278:16 | a.value | main.rs:275:28:275:37 | source(...) | main.rs:278:10:278:16 | a.value | $@ | main.rs:275:28:275:37 | source(...) | source(...) | +| main.rs:283:10:283:16 | a.value | main.rs:281:28:281:37 | source(...) | main.rs:283:10:283:16 | a.value | $@ | main.rs:281:28:281:37 | source(...) | source(...) | +| main.rs:289:10:289:10 | c | main.rs:286:28:286:37 | source(...) | main.rs:289:10:289:10 | c | $@ | main.rs:286:28:286:37 | source(...) | source(...) | +| main.rs:293:10:293:10 | c | main.rs:291:28:291:37 | source(...) | main.rs:293:10:293:10 | c | $@ | main.rs:291:28:291:37 | source(...) | source(...) | +| main.rs:322:10:322:10 | c | main.rs:319:28:319:36 | source(...) | main.rs:322:10:322:10 | c | $@ | main.rs:319:28:319:36 | source(...) | source(...) | +| main.rs:327:10:327:10 | c | main.rs:325:28:325:37 | source(...) | main.rs:327:10:327:10 | c | $@ | main.rs:325:28:325:37 | source(...) | source(...) | +| main.rs:337:10:337:10 | a | main.rs:336:13:336:21 | source(...) | main.rs:337:10:337:10 | a | $@ | main.rs:336:13:336:21 | source(...) | source(...) | +| main.rs:343:10:343:10 | a | main.rs:336:13:336:21 | source(...) | main.rs:343:10:343:10 | a | $@ | main.rs:336:13:336:21 | source(...) | source(...) | +| main.rs:347:14:347:14 | c | main.rs:346:17:346:25 | source(...) | main.rs:347:14:347:14 | c | $@ | main.rs:346:17:346:25 | source(...) | source(...) | +| main.rs:355:10:355:10 | a | main.rs:336:13:336:21 | source(...) | main.rs:355:10:355:10 | a | $@ | main.rs:336:13:336:21 | source(...) | source(...) | +| main.rs:404:14:404:15 | n1 | main.rs:379:13:379:21 | source(...) | main.rs:404:14:404:15 | n1 | $@ | main.rs:379:13:379:21 | source(...) | source(...) | +| main.rs:408:14:408:15 | n2 | main.rs:379:13:379:21 | source(...) | main.rs:408:14:408:15 | n2 | $@ | main.rs:379:13:379:21 | source(...) | source(...) | +| main.rs:412:14:412:15 | n3 | main.rs:371:13:371:21 | source(...) | main.rs:412:14:412:15 | n3 | $@ | main.rs:371:13:371:21 | source(...) | source(...) | +| main.rs:416:14:416:15 | n4 | main.rs:391:13:391:22 | source(...) | main.rs:416:14:416:15 | n4 | $@ | main.rs:391:13:391:22 | source(...) | source(...) | +| main.rs:419:14:419:15 | n5 | main.rs:395:13:395:21 | source(...) | main.rs:419:14:419:15 | n5 | $@ | main.rs:395:13:395:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.ql b/rust/ql/test/library-tests/dataflow/global/inline-flow.ql index e399ea0e5d7..5dcb7ee70a9 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.ql +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.ql @@ -5,8 +5,8 @@ import rust import utils.test.InlineFlowTest import DefaultFlowTest -import ValueFlow::PathGraph +import TaintFlow::PathGraph -from ValueFlow::PathNode source, ValueFlow::PathNode sink -where ValueFlow::flowPath(source, sink) +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/global/main.rs b/rust/ql/test/library-tests/dataflow/global/main.rs index e378f16b4de..bd910c03b42 100644 --- a/rust/ql/test/library-tests/dataflow/global/main.rs +++ b/rust/ql/test/library-tests/dataflow/global/main.rs @@ -24,11 +24,11 @@ struct MyStruct { impl MyStruct { fn set_data(&mut self, n: i64) { - (*self).data = n // todo: implicit deref not yet supported + self.data = n } fn get_data(&self) -> i64 { - (*self).data // todo: implicit deref not yet supported + self.data } } @@ -106,11 +106,19 @@ impl MyFlag { } fn get_data(self) -> i64 { - if self.flag { 0 } else { source(2) } + if self.flag { + 0 + } else { + source(2) + } } fn data_through(self, n: i64) -> i64 { - if self.flag { 0 } else { n } + if self.flag { + 0 + } else { + n + } } } @@ -120,11 +128,19 @@ impl MyTrait for MyFlag { } fn get_data_trait(self) -> i64 { - if self.flag { 0 } else { source(21) } + if self.flag { + 0 + } else { + source(21) + } } fn data_through_trait(self, n: i64) -> i64 { - if self.flag { 0 } else { n } + if self.flag { + 0 + } else { + n + } } } @@ -225,7 +241,7 @@ impl Add for MyInt { impl MulAssign for MyInt { fn mul_assign(&mut self, rhs: MyInt) { - (*self).value = rhs.value; // todo: implicit deref not yet supported + self.value = rhs.value; } } @@ -264,7 +280,7 @@ fn test_operator_overloading() { let mut a = MyInt { value: 0 }; let b = MyInt { value: source(35) }; a *= b; - sink(a.value); // $ MISSING: hasValueFlow=35 + sink(a.value); // $ hasValueFlow=35 // Tests for deref operator. let a = MyInt { value: source(27) }; @@ -274,7 +290,11 @@ fn test_operator_overloading() { let a = MyInt { value: source(28) }; let c = *a; - sink(c); // $ hasTaintFlow=28 MISSING: hasValueFlow=28 + sink(c); // $ hasValueFlow=28 + + let a = MyInt { value: source(29) }; + let c = a.min(1042); + sink(c); // $ MISSING: hasValueFlow=29 } trait MyTrait2 { @@ -320,7 +340,7 @@ async fn async_source() -> i64 { async fn test_async_await_async_part() { let a = async_source().await; - sink(a); // $ MISSING: hasValueFlow=1 + sink(a); // $ hasTaintFlow=1 MISSING: hasValueFlow=1 let b = async { let c = source(2); @@ -337,6 +357,69 @@ fn test_async_await() { futures::executor::block_on(test_async_await_async_part()); } +mod not_trait_dispatch { + use super::{sink, source}; + + trait HasNumbers { + fn get_number(&self) -> i64; + + fn get_double_number(&self) -> i64 { + self.get_number() * 2 + } + + fn get_default() -> i64 { + source(0) + } + } + + struct Three; + + impl HasNumbers for Three { + fn get_number(&self) -> i64 { + source(3) + } + } + + struct TwentyTwo; + + impl HasNumbers for TwentyTwo { + fn get_number(&self) -> i64 { + 22 + } + + fn get_double_number(&self) -> i64 { + source(44) + } + + fn get_default() -> i64 { + source(1) + } + } + + fn test_non_trait_dispatch() { + let t = Three; + + // This call is to the default method implementation. + let n1 = t.get_double_number(); + sink(n1); // $ hasTaintFlow=3 + + // This call is to the default method implementation. + let n2 = HasNumbers::get_double_number(&t); + sink(n2); // $ hasTaintFlow=3 + + // This call is to the default function implementation. + let n3 = Three::get_default(); + sink(n3); // $ hasValueFlow=0 + + let i = TwentyTwo; + let n4 = i.get_double_number(); + sink(n4); // $ hasValueFlow=44 + + let n5 = TwentyTwo::get_default(); + sink(n5); // $ hasValueFlow=1 + } +} + fn main() { data_out_of_call(); data_out_of_call_side_effect1(); diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index e26d70d80d6..d90eebdf5e5 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -1,3 +1,4 @@ +| main.rs:2:5:2:12 | ... + ... | {EXTERNAL LOCATION} | fn add | | main.rs:13:5:13:13 | source(...) | main.rs:1:1:3:1 | fn source | | main.rs:17:13:17:23 | get_data(...) | main.rs:12:1:14:1 | fn get_data | | main.rs:18:5:18:11 | sink(...) | main.rs:5:1:7:1 | fn sink | @@ -24,91 +25,112 @@ | main.rs:86:13:86:27 | pass_through(...) | main.rs:82:5:84:5 | fn pass_through | | main.rs:87:5:87:11 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:105:9:105:15 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:109:35:109:43 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:119:9:119:15 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:123:35:123:44 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:132:13:132:30 | x.get_data_trait() | main.rs:122:5:124:5 | fn get_data_trait | -| main.rs:133:5:133:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:138:13:138:25 | mn.get_data() | main.rs:108:5:110:5 | fn get_data | -| main.rs:139:5:139:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:142:13:142:31 | mn.get_data_trait() | main.rs:122:5:124:5 | fn get_data_trait | -| main.rs:143:5:143:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:145:5:145:60 | data_out_of_method_trait_dispatch(...) | main.rs:131:1:134:1 | fn data_out_of_method_trait_dispatch | -| main.rs:149:13:149:22 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:150:5:150:22 | x.data_in_trait(...) | main.rs:118:5:120:5 | fn data_in_trait | -| main.rs:155:13:155:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:156:5:156:17 | mn.data_in(...) | main.rs:104:5:106:5 | fn data_in | -| main.rs:159:13:159:22 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:160:5:160:23 | mn.data_in_trait(...) | main.rs:118:5:120:5 | fn data_in_trait | -| main.rs:162:5:162:64 | data_in_to_method_call_trait_dispatch(...) | main.rs:148:1:151:1 | fn data_in_to_method_call_trait_dispatch | -| main.rs:166:13:166:22 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:167:13:167:35 | x.data_through_trait(...) | main.rs:126:5:128:5 | fn data_through_trait | -| main.rs:168:5:168:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:173:13:173:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:174:13:174:30 | mn.data_through(...) | main.rs:112:5:114:5 | fn data_through | -| main.rs:175:5:175:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:178:13:178:22 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:179:13:179:36 | mn.data_through_trait(...) | main.rs:126:5:128:5 | fn data_through_trait | -| main.rs:180:5:180:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:182:5:182:61 | data_through_method_trait_dispatch(...) | main.rs:165:1:169:1 | fn data_through_method_trait_dispatch | -| main.rs:187:13:187:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:188:5:188:26 | ...::data_in(...) | main.rs:104:5:106:5 | fn data_in | -| main.rs:193:13:193:22 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:194:13:194:39 | ...::data_through(...) | main.rs:112:5:114:5 | fn data_through | -| main.rs:195:5:195:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:212:13:212:34 | ...::new(...) | main.rs:205:5:208:5 | fn new | -| main.rs:212:24:212:33 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:214:5:214:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:242:28:242:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:244:13:244:17 | ... + ... | main.rs:220:5:223:5 | fn add | -| main.rs:245:5:245:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:248:28:248:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:249:13:249:17 | ... + ... | main.rs:220:5:223:5 | fn add | -| main.rs:250:5:250:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:252:28:252:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:254:13:254:20 | a.add(...) | main.rs:220:5:223:5 | fn add | -| main.rs:255:5:255:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:259:28:259:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:261:5:261:36 | ...::mul_assign(...) | main.rs:227:5:229:5 | fn mul_assign | -| main.rs:262:5:262:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:265:28:265:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:266:5:266:10 | ... *= ... | main.rs:227:5:229:5 | fn mul_assign | -| main.rs:267:5:267:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:270:28:270:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:272:14:272:29 | ...::deref(...) | main.rs:235:5:237:5 | fn deref | -| main.rs:273:5:273:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:112:13:112:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:127:9:127:15 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:134:13:134:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:148:13:148:30 | x.get_data_trait() | main.rs:130:5:136:5 | fn get_data_trait | +| main.rs:149:5:149:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:154:13:154:25 | mn.get_data() | main.rs:108:5:114:5 | fn get_data | +| main.rs:155:5:155:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:158:13:158:31 | mn.get_data_trait() | main.rs:130:5:136:5 | fn get_data_trait | +| main.rs:159:5:159:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:161:5:161:60 | data_out_of_method_trait_dispatch(...) | main.rs:147:1:150:1 | fn data_out_of_method_trait_dispatch | +| main.rs:165:13:165:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:166:5:166:22 | x.data_in_trait(...) | main.rs:126:5:128:5 | fn data_in_trait | +| main.rs:171:13:171:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:172:5:172:17 | mn.data_in(...) | main.rs:104:5:106:5 | fn data_in | +| main.rs:175:13:175:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:176:5:176:23 | mn.data_in_trait(...) | main.rs:126:5:128:5 | fn data_in_trait | +| main.rs:178:5:178:64 | data_in_to_method_call_trait_dispatch(...) | main.rs:164:1:167:1 | fn data_in_to_method_call_trait_dispatch | +| main.rs:182:13:182:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:183:13:183:35 | x.data_through_trait(...) | main.rs:138:5:144:5 | fn data_through_trait | +| main.rs:184:5:184:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:189:13:189:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:190:13:190:30 | mn.data_through(...) | main.rs:116:5:122:5 | fn data_through | +| main.rs:191:5:191:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:194:13:194:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:195:13:195:36 | mn.data_through_trait(...) | main.rs:138:5:144:5 | fn data_through_trait | +| main.rs:196:5:196:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:198:5:198:61 | data_through_method_trait_dispatch(...) | main.rs:181:1:185:1 | fn data_through_method_trait_dispatch | +| main.rs:203:13:203:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:204:5:204:26 | ...::data_in(...) | main.rs:104:5:106:5 | fn data_in | +| main.rs:209:13:209:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:210:13:210:39 | ...::data_through(...) | main.rs:116:5:122:5 | fn data_through | +| main.rs:211:5:211:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:228:13:228:34 | ...::new(...) | main.rs:221:5:224:5 | fn new | +| main.rs:228:24:228:33 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:230:5:230:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:252:11:252:15 | * ... | {EXTERNAL LOCATION} | fn deref | +| main.rs:258:28:258:36 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:260:13:260:17 | ... + ... | main.rs:236:5:239:5 | fn add | +| main.rs:261:5:261:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:264:28:264:36 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:265:13:265:17 | ... + ... | main.rs:236:5:239:5 | fn add | +| main.rs:266:5:266:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:268:28:268:36 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:270:13:270:20 | a.add(...) | main.rs:236:5:239:5 | fn add | +| main.rs:271:5:271:17 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:275:28:275:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:276:13:276:14 | * ... | main.rs:235:5:237:5 | fn deref | -| main.rs:277:5:277:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:299:28:299:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:301:30:301:54 | ...::take_self(...) | main.rs:289:5:291:5 | fn take_self | -| main.rs:302:5:302:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:305:28:305:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:306:30:306:56 | ...::take_second(...) | main.rs:293:5:295:5 | fn take_second | -| main.rs:307:5:307:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:310:28:310:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:311:30:311:54 | ...::take_self(...) | main.rs:289:5:291:5 | fn take_self | -| main.rs:312:5:312:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:316:13:316:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:317:5:317:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:322:13:322:26 | async_source(...) | main.rs:315:1:319:1 | fn async_source | -| main.rs:323:5:323:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:326:17:326:25 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:327:9:327:15 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:330:5:330:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:334:13:334:55 | ...::block_on(...) | {EXTERNAL LOCATION} | fn block_on | -| main.rs:334:41:334:54 | async_source(...) | main.rs:315:1:319:1 | fn async_source | -| main.rs:335:5:335:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:337:5:337:62 | ...::block_on(...) | {EXTERNAL LOCATION} | fn block_on | -| main.rs:337:33:337:61 | test_async_await_async_part(...) | main.rs:321:1:331:1 | fn test_async_await_async_part | -| main.rs:341:5:341:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | -| main.rs:342:5:342:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 | -| main.rs:343:5:343:35 | data_out_of_call_side_effect2(...) | main.rs:42:1:50:1 | fn data_out_of_call_side_effect2 | -| main.rs:344:5:344:21 | data_in_to_call(...) | main.rs:56:1:59:1 | fn data_in_to_call | -| main.rs:345:5:345:23 | data_through_call(...) | main.rs:65:1:69:1 | fn data_through_call | -| main.rs:346:5:346:34 | data_through_nested_function(...) | main.rs:79:1:88:1 | fn data_through_nested_function | -| main.rs:348:5:348:24 | data_out_of_method(...) | main.rs:136:1:146:1 | fn data_out_of_method | -| main.rs:349:5:349:28 | data_in_to_method_call(...) | main.rs:153:1:163:1 | fn data_in_to_method_call | -| main.rs:350:5:350:25 | data_through_method(...) | main.rs:171:1:183:1 | fn data_through_method | -| main.rs:352:5:352:31 | test_operator_overloading(...) | main.rs:240:1:278:1 | fn test_operator_overloading | -| main.rs:353:5:353:22 | test_async_await(...) | main.rs:333:1:338:1 | fn test_async_await | +| main.rs:277:5:277:36 | ...::mul_assign(...) | main.rs:243:5:245:5 | fn mul_assign | +| main.rs:278:5:278:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:281:28:281:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:282:5:282:10 | ... *= ... | main.rs:243:5:245:5 | fn mul_assign | +| main.rs:283:5:283:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:286:28:286:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:288:13:288:29 | * ... | {EXTERNAL LOCATION} | fn deref | +| main.rs:288:14:288:29 | ...::deref(...) | main.rs:251:5:253:5 | fn deref | +| main.rs:289:5:289:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:291:28:291:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:292:13:292:14 | * ... | main.rs:251:5:253:5 | fn deref | +| main.rs:293:5:293:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:295:28:295:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:297:5:297:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:319:28:319:36 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:321:30:321:54 | ...::take_self(...) | main.rs:309:5:311:5 | fn take_self | +| main.rs:322:5:322:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:325:28:325:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:326:30:326:56 | ...::take_second(...) | main.rs:313:5:315:5 | fn take_second | +| main.rs:327:5:327:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:330:28:330:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:331:30:331:54 | ...::take_self(...) | main.rs:309:5:311:5 | fn take_self | +| main.rs:332:5:332:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:336:13:336:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:337:5:337:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:342:13:342:26 | async_source(...) | main.rs:335:1:339:1 | fn async_source | +| main.rs:343:5:343:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:346:17:346:25 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:347:9:347:15 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:350:5:350:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:354:13:354:55 | ...::block_on(...) | {EXTERNAL LOCATION} | fn block_on | +| main.rs:354:41:354:54 | async_source(...) | main.rs:335:1:339:1 | fn async_source | +| main.rs:355:5:355:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:357:5:357:62 | ...::block_on(...) | {EXTERNAL LOCATION} | fn block_on | +| main.rs:357:33:357:61 | test_async_await_async_part(...) | main.rs:341:1:351:1 | fn test_async_await_async_part | +| main.rs:367:13:367:29 | self.get_number() | main.rs:378:9:380:9 | fn get_number | +| main.rs:367:13:367:29 | self.get_number() | main.rs:386:9:388:9 | fn get_number | +| main.rs:367:13:367:33 | ... * ... | {EXTERNAL LOCATION} | fn mul | +| main.rs:371:13:371:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:379:13:379:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:391:13:391:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:395:13:395:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:403:18:403:38 | t.get_double_number() | main.rs:366:9:368:9 | fn get_double_number | +| main.rs:404:9:404:16 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:407:18:407:50 | ...::get_double_number(...) | main.rs:366:9:368:9 | fn get_double_number | +| main.rs:408:9:408:16 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:411:18:411:37 | ...::get_default(...) | main.rs:370:9:372:9 | fn get_default | +| main.rs:412:9:412:16 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:415:18:415:38 | i.get_double_number() | main.rs:390:9:392:9 | fn get_double_number | +| main.rs:416:9:416:16 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:418:18:418:41 | ...::get_default(...) | main.rs:394:9:396:9 | fn get_default | +| main.rs:419:9:419:16 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:424:5:424:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | +| main.rs:425:5:425:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 | +| main.rs:426:5:426:35 | data_out_of_call_side_effect2(...) | main.rs:42:1:50:1 | fn data_out_of_call_side_effect2 | +| main.rs:427:5:427:21 | data_in_to_call(...) | main.rs:56:1:59:1 | fn data_in_to_call | +| main.rs:428:5:428:23 | data_through_call(...) | main.rs:65:1:69:1 | fn data_through_call | +| main.rs:429:5:429:34 | data_through_nested_function(...) | main.rs:79:1:88:1 | fn data_through_nested_function | +| main.rs:431:5:431:24 | data_out_of_method(...) | main.rs:152:1:162:1 | fn data_out_of_method | +| main.rs:432:5:432:28 | data_in_to_method_call(...) | main.rs:169:1:179:1 | fn data_in_to_method_call | +| main.rs:433:5:433:25 | data_through_method(...) | main.rs:187:1:199:1 | fn data_through_method | +| main.rs:435:5:435:31 | test_operator_overloading(...) | main.rs:256:1:298:1 | fn test_operator_overloading | +| main.rs:436:5:436:22 | test_async_await(...) | main.rs:353:1:358:1 | fn test_async_await | diff --git a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ql b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ql index e399ea0e5d7..5dcb7ee70a9 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ql +++ b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ql @@ -5,8 +5,8 @@ import rust import utils.test.InlineFlowTest import DefaultFlowTest -import ValueFlow::PathGraph +import TaintFlow::PathGraph -from ValueFlow::PathNode source, ValueFlow::PathNode sink -where ValueFlow::flowPath(source, sink) +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index a7df3fdf7b3..d607e5fe31c 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -82,12 +82,14 @@ localStep | main.rs:57:9:57:9 | a | main.rs:57:9:57:9 | [SSA] a | | main.rs:57:9:57:9 | a | main.rs:57:9:57:9 | a | | main.rs:57:13:59:5 | loop { ... } | main.rs:57:9:57:9 | a | +| main.rs:57:18:59:5 | { ... } | main.rs:57:13:59:5 | loop { ... } | | main.rs:58:9:58:15 | break 1 | main.rs:57:13:59:5 | loop { ... } | | main.rs:58:15:58:15 | 1 | main.rs:58:9:58:15 | break 1 | | main.rs:61:9:61:9 | [SSA] b | main.rs:64:10:64:10 | b | | main.rs:61:9:61:9 | b | main.rs:61:9:61:9 | [SSA] b | | main.rs:61:9:61:9 | b | main.rs:61:9:61:9 | b | | main.rs:61:13:63:5 | loop { ... } | main.rs:61:9:61:9 | b | +| main.rs:61:18:63:5 | { ... } | main.rs:61:13:63:5 | loop { ... } | | main.rs:62:9:62:23 | break ... | main.rs:61:13:63:5 | loop { ... } | | main.rs:62:15:62:23 | source(...) | main.rs:62:9:62:23 | break ... | | main.rs:68:9:68:13 | mut i | main.rs:68:13:68:13 | i | @@ -131,6 +133,7 @@ localStep | main.rs:92:9:92:9 | a | main.rs:92:9:92:9 | [SSA] a | | main.rs:92:9:92:9 | a | main.rs:92:9:92:9 | a | | main.rs:92:13:97:5 | 'block: { ... } | main.rs:92:9:92:9 | a | +| main.rs:93:14:95:9 | { ... } | main.rs:93:9:95:9 | if b {...} | | main.rs:94:13:94:26 | break 'block 1 | main.rs:92:13:97:5 | 'block: { ... } | | main.rs:94:26:94:26 | 1 | main.rs:94:13:94:26 | break 'block 1 | | main.rs:96:9:96:9 | 2 | main.rs:92:13:97:5 | 'block: { ... } | @@ -143,6 +146,7 @@ localStep | main.rs:102:9:102:9 | a | main.rs:102:9:102:9 | [SSA] a | | main.rs:102:9:102:9 | a | main.rs:102:9:102:9 | a | | main.rs:102:13:107:5 | 'block: { ... } | main.rs:102:9:102:9 | a | +| main.rs:103:14:105:9 | { ... } | main.rs:103:9:105:9 | if b {...} | | main.rs:104:13:104:26 | break 'block 1 | main.rs:102:13:107:5 | 'block: { ... } | | main.rs:104:26:104:26 | 1 | main.rs:104:13:104:26 | break 'block 1 | | main.rs:106:9:106:22 | break 'block 2 | main.rs:102:13:107:5 | 'block: { ... } | @@ -152,8 +156,6 @@ localStep | main.rs:115:9:115:9 | i | main.rs:115:9:115:9 | [SSA] i | | main.rs:115:9:115:9 | i | main.rs:115:9:115:9 | i | | main.rs:115:13:115:31 | ...::new(...) | main.rs:115:9:115:9 | i | -| main.rs:116:11:116:11 | [post] receiver for i | main.rs:116:11:116:11 | [post] i | -| main.rs:116:11:116:11 | i | main.rs:116:11:116:11 | receiver for i | | main.rs:123:9:123:9 | [SSA] a | main.rs:124:10:124:10 | a | | main.rs:123:9:123:9 | a | main.rs:123:9:123:9 | [SSA] a | | main.rs:123:9:123:9 | a | main.rs:123:9:123:9 | a | @@ -336,32 +338,22 @@ localStep | main.rs:278:9:278:10 | s1 | main.rs:278:9:278:10 | [SSA] s1 | | main.rs:278:9:278:10 | s1 | main.rs:278:9:278:10 | s1 | | main.rs:278:14:278:29 | Some(...) | main.rs:278:9:278:10 | s1 | -| main.rs:279:10:279:11 | [post] receiver for s1 | main.rs:279:10:279:11 | [post] s1 | -| main.rs:279:10:279:11 | s1 | main.rs:279:10:279:11 | receiver for s1 | | main.rs:283:9:283:10 | [SSA] s1 | main.rs:284:10:284:11 | s1 | | main.rs:283:9:283:10 | s1 | main.rs:283:9:283:10 | [SSA] s1 | | main.rs:283:9:283:10 | s1 | main.rs:283:9:283:10 | s1 | | main.rs:283:14:283:29 | Some(...) | main.rs:283:9:283:10 | s1 | -| main.rs:284:10:284:11 | [post] receiver for s1 | main.rs:284:10:284:11 | [post] s1 | -| main.rs:284:10:284:11 | s1 | main.rs:284:10:284:11 | receiver for s1 | | main.rs:286:9:286:10 | [SSA] s2 | main.rs:287:10:287:11 | s2 | | main.rs:286:9:286:10 | s2 | main.rs:286:9:286:10 | [SSA] s2 | | main.rs:286:9:286:10 | s2 | main.rs:286:9:286:10 | s2 | | main.rs:286:14:286:20 | Some(...) | main.rs:286:9:286:10 | s2 | -| main.rs:287:10:287:11 | [post] receiver for s2 | main.rs:287:10:287:11 | [post] s2 | -| main.rs:287:10:287:11 | s2 | main.rs:287:10:287:11 | receiver for s2 | | main.rs:291:9:291:10 | [SSA] s1 | main.rs:292:10:292:11 | s1 | | main.rs:291:9:291:10 | s1 | main.rs:291:9:291:10 | [SSA] s1 | | main.rs:291:9:291:10 | s1 | main.rs:291:9:291:10 | s1 | | main.rs:291:14:291:29 | Some(...) | main.rs:291:9:291:10 | s1 | -| main.rs:292:10:292:11 | [post] receiver for s1 | main.rs:292:10:292:11 | [post] s1 | -| main.rs:292:10:292:11 | s1 | main.rs:292:10:292:11 | receiver for s1 | | main.rs:294:9:294:10 | [SSA] s2 | main.rs:295:10:295:11 | s2 | | main.rs:294:9:294:10 | s2 | main.rs:294:9:294:10 | [SSA] s2 | | main.rs:294:9:294:10 | s2 | main.rs:294:9:294:10 | s2 | | main.rs:294:14:294:17 | None | main.rs:294:9:294:10 | s2 | -| main.rs:295:10:295:11 | [post] receiver for s2 | main.rs:295:10:295:11 | [post] s2 | -| main.rs:295:10:295:11 | s2 | main.rs:295:10:295:11 | receiver for s2 | | main.rs:299:9:299:10 | [SSA] s1 | main.rs:301:14:301:15 | s1 | | main.rs:299:9:299:10 | s1 | main.rs:299:9:299:10 | [SSA] s1 | | main.rs:299:9:299:10 | s1 | main.rs:299:9:299:10 | s1 | @@ -383,20 +375,12 @@ localStep | main.rs:309:9:309:11 | o1a | main.rs:309:9:309:11 | [SSA] o1a | | main.rs:309:9:309:11 | o1a | main.rs:309:9:309:11 | o1a | | main.rs:309:28:309:29 | [post] r1 | main.rs:310:28:310:29 | r1 | -| main.rs:309:28:309:29 | [post] receiver for r1 | main.rs:309:28:309:29 | [post] r1 | -| main.rs:309:28:309:29 | r1 | main.rs:309:28:309:29 | receiver for r1 | | main.rs:309:28:309:29 | r1 | main.rs:310:28:310:29 | r1 | | main.rs:309:28:309:34 | r1.ok() | main.rs:309:9:309:11 | o1a | | main.rs:310:9:310:11 | [SSA] o1b | main.rs:312:10:312:12 | o1b | | main.rs:310:9:310:11 | o1b | main.rs:310:9:310:11 | [SSA] o1b | | main.rs:310:9:310:11 | o1b | main.rs:310:9:310:11 | o1b | -| main.rs:310:28:310:29 | [post] receiver for r1 | main.rs:310:28:310:29 | [post] r1 | -| main.rs:310:28:310:29 | r1 | main.rs:310:28:310:29 | receiver for r1 | | main.rs:310:28:310:35 | r1.err() | main.rs:310:9:310:11 | o1b | -| main.rs:311:10:311:12 | [post] receiver for o1a | main.rs:311:10:311:12 | [post] o1a | -| main.rs:311:10:311:12 | o1a | main.rs:311:10:311:12 | receiver for o1a | -| main.rs:312:10:312:12 | [post] receiver for o1b | main.rs:312:10:312:12 | [post] o1b | -| main.rs:312:10:312:12 | o1b | main.rs:312:10:312:12 | receiver for o1b | | main.rs:314:9:314:10 | [SSA] r2 | main.rs:315:28:315:29 | r2 | | main.rs:314:9:314:10 | r2 | main.rs:314:9:314:10 | [SSA] r2 | | main.rs:314:9:314:10 | r2 | main.rs:314:9:314:10 | r2 | @@ -405,20 +389,12 @@ localStep | main.rs:315:9:315:11 | o2a | main.rs:315:9:315:11 | [SSA] o2a | | main.rs:315:9:315:11 | o2a | main.rs:315:9:315:11 | o2a | | main.rs:315:28:315:29 | [post] r2 | main.rs:316:28:316:29 | r2 | -| main.rs:315:28:315:29 | [post] receiver for r2 | main.rs:315:28:315:29 | [post] r2 | -| main.rs:315:28:315:29 | r2 | main.rs:315:28:315:29 | receiver for r2 | | main.rs:315:28:315:29 | r2 | main.rs:316:28:316:29 | r2 | | main.rs:315:28:315:34 | r2.ok() | main.rs:315:9:315:11 | o2a | | main.rs:316:9:316:11 | [SSA] o2b | main.rs:318:10:318:12 | o2b | | main.rs:316:9:316:11 | o2b | main.rs:316:9:316:11 | [SSA] o2b | | main.rs:316:9:316:11 | o2b | main.rs:316:9:316:11 | o2b | -| main.rs:316:28:316:29 | [post] receiver for r2 | main.rs:316:28:316:29 | [post] r2 | -| main.rs:316:28:316:29 | r2 | main.rs:316:28:316:29 | receiver for r2 | | main.rs:316:28:316:35 | r2.err() | main.rs:316:9:316:11 | o2b | -| main.rs:317:10:317:12 | [post] receiver for o2a | main.rs:317:10:317:12 | [post] o2a | -| main.rs:317:10:317:12 | o2a | main.rs:317:10:317:12 | receiver for o2a | -| main.rs:318:10:318:12 | [post] receiver for o2b | main.rs:318:10:318:12 | [post] o2b | -| main.rs:318:10:318:12 | o2b | main.rs:318:10:318:12 | receiver for o2b | | main.rs:322:9:322:10 | [SSA] s1 | main.rs:325:14:325:15 | s1 | | main.rs:322:9:322:10 | s1 | main.rs:322:9:322:10 | [SSA] s1 | | main.rs:322:9:322:10 | s1 | main.rs:322:9:322:10 | s1 | @@ -448,22 +424,14 @@ localStep | main.rs:335:9:335:10 | s1 | main.rs:335:9:335:10 | [SSA] s1 | | main.rs:335:9:335:10 | s1 | main.rs:335:9:335:10 | s1 | | main.rs:335:32:335:45 | Ok(...) | main.rs:335:9:335:10 | s1 | -| main.rs:336:10:336:11 | [post] receiver for s1 | main.rs:336:10:336:11 | [post] s1 | | main.rs:336:10:336:11 | [post] s1 | main.rs:337:10:337:11 | s1 | -| main.rs:336:10:336:11 | s1 | main.rs:336:10:336:11 | receiver for s1 | | main.rs:336:10:336:11 | s1 | main.rs:337:10:337:11 | s1 | -| main.rs:337:10:337:11 | [post] receiver for s1 | main.rs:337:10:337:11 | [post] s1 | -| main.rs:337:10:337:11 | s1 | main.rs:337:10:337:11 | receiver for s1 | | main.rs:339:9:339:10 | [SSA] s2 | main.rs:340:10:340:11 | s2 | | main.rs:339:9:339:10 | s2 | main.rs:339:9:339:10 | [SSA] s2 | | main.rs:339:9:339:10 | s2 | main.rs:339:9:339:10 | s2 | | main.rs:339:32:339:46 | Err(...) | main.rs:339:9:339:10 | s2 | -| main.rs:340:10:340:11 | [post] receiver for s2 | main.rs:340:10:340:11 | [post] s2 | | main.rs:340:10:340:11 | [post] s2 | main.rs:341:10:341:11 | s2 | -| main.rs:340:10:340:11 | s2 | main.rs:340:10:340:11 | receiver for s2 | | main.rs:340:10:340:11 | s2 | main.rs:341:10:341:11 | s2 | -| main.rs:341:10:341:11 | [post] receiver for s2 | main.rs:341:10:341:11 | [post] s2 | -| main.rs:341:10:341:11 | s2 | main.rs:341:10:341:11 | receiver for s2 | | main.rs:350:9:350:10 | [SSA] s1 | main.rs:352:11:352:12 | s1 | | main.rs:350:9:350:10 | s1 | main.rs:350:9:350:10 | [SSA] s1 | | main.rs:350:9:350:10 | s1 | main.rs:350:9:350:10 | s1 | @@ -700,8 +668,6 @@ localStep | main.rs:478:39:478:72 | ...: Vec::<...> | main.rs:478:39:478:43 | names | | main.rs:479:9:479:20 | default_name | main.rs:479:9:479:20 | [SSA] default_name | | main.rs:479:9:479:20 | default_name | main.rs:479:9:479:20 | default_name | -| main.rs:479:24:479:33 | [post] receiver for source(...) | main.rs:479:24:479:33 | [post] source(...) | -| main.rs:479:24:479:33 | source(...) | main.rs:479:24:479:33 | receiver for source(...) | | main.rs:479:24:479:45 | ... .to_string() | main.rs:479:9:479:20 | default_name | | main.rs:479:24:479:45 | ... .to_string() | main.rs:480:9:480:20 | SSA phi read(default_name) | | main.rs:480:5:486:5 | for ... in ... { ... } | main.rs:478:75:487:1 | { ... } | @@ -713,19 +679,14 @@ localStep | main.rs:480:16:480:19 | name | main.rs:480:16:480:19 | [SSA] name | | main.rs:480:16:480:19 | name | main.rs:480:16:480:19 | name | | main.rs:481:9:485:9 | if cond {...} | main.rs:480:31:486:5 | { ... } | +| main.rs:481:17:485:9 | { ... } | main.rs:481:9:485:9 | if cond {...} | | main.rs:482:17:482:17 | [SSA] n | main.rs:483:18:483:18 | n | | main.rs:482:17:482:17 | n | main.rs:482:17:482:17 | [SSA] n | | main.rs:482:17:482:17 | n | main.rs:482:17:482:17 | n | -| main.rs:482:21:482:24 | [post] receiver for name | main.rs:482:21:482:24 | [post] name | -| main.rs:482:21:482:24 | name | main.rs:482:21:482:24 | receiver for name | | main.rs:482:21:482:68 | name.unwrap_or_else(...) | main.rs:482:17:482:17 | n | | main.rs:482:41:482:67 | [post] default_name | main.rs:480:9:480:20 | SSA phi read(default_name) | | main.rs:482:41:482:67 | closure self in \|...\| ... | main.rs:482:44:482:55 | this | | main.rs:482:41:482:67 | default_name | main.rs:480:9:480:20 | SSA phi read(default_name) | -| main.rs:482:44:482:55 | [post] receiver for default_name | main.rs:482:44:482:55 | [post] default_name | -| main.rs:482:44:482:55 | default_name | main.rs:482:44:482:55 | receiver for default_name | -| main.rs:483:18:483:18 | [post] receiver for n | main.rs:483:18:483:18 | [post] n | -| main.rs:483:18:483:18 | n | main.rs:483:18:483:18 | receiver for n | | main.rs:496:9:496:9 | [SSA] s | main.rs:497:10:497:10 | s | | main.rs:496:9:496:9 | s | main.rs:496:9:496:9 | [SSA] s | | main.rs:496:9:496:9 | s | main.rs:496:9:496:9 | s | @@ -747,29 +708,19 @@ localStep | main.rs:506:9:506:9 | b | main.rs:506:9:506:9 | [SSA] b | | main.rs:506:9:506:9 | b | main.rs:506:9:506:9 | b | | main.rs:506:13:506:13 | [post] a | main.rs:510:10:510:10 | a | -| main.rs:506:13:506:13 | [post] receiver for a | main.rs:506:13:506:13 | [post] a | -| main.rs:506:13:506:13 | a | main.rs:506:13:506:13 | receiver for a | | main.rs:506:13:506:13 | a | main.rs:510:10:510:10 | a | | main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | | main.rs:507:9:507:9 | [SSA] c | main.rs:512:10:512:10 | c | | main.rs:507:9:507:9 | c | main.rs:507:9:507:9 | [SSA] c | | main.rs:507:9:507:9 | c | main.rs:507:9:507:9 | c | | main.rs:507:13:507:13 | [post] b | main.rs:508:18:508:18 | b | -| main.rs:507:13:507:13 | [post] receiver for b | main.rs:507:13:507:13 | [post] b | -| main.rs:507:13:507:13 | b | main.rs:507:13:507:13 | receiver for b | | main.rs:507:13:507:13 | b | main.rs:508:18:508:18 | b | -| main.rs:507:13:507:28 | [post] receiver for b.parse() | main.rs:507:13:507:28 | [post] b.parse() | -| main.rs:507:13:507:28 | b.parse() | main.rs:507:13:507:28 | receiver for b.parse() | | main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | | main.rs:508:9:508:9 | [SSA] d | main.rs:513:10:513:10 | d | | main.rs:508:9:508:9 | d | main.rs:508:9:508:9 | [SSA] d | | main.rs:508:9:508:9 | d | main.rs:508:9:508:9 | d | | main.rs:508:18:508:18 | [post] b | main.rs:511:17:511:17 | b | -| main.rs:508:18:508:18 | [post] receiver for b | main.rs:508:18:508:18 | [post] b | -| main.rs:508:18:508:18 | b | main.rs:508:18:508:18 | receiver for b | | main.rs:508:18:508:18 | b | main.rs:511:17:511:17 | b | -| main.rs:508:18:508:26 | [post] receiver for b.parse() | main.rs:508:18:508:26 | [post] b.parse() | -| main.rs:508:18:508:26 | b.parse() | main.rs:508:18:508:26 | receiver for b.parse() | | main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | | main.rs:517:9:517:10 | [SSA] vs | main.rs:519:10:519:11 | vs | | main.rs:517:9:517:10 | vs | main.rs:517:9:517:10 | [SSA] vs | @@ -777,26 +728,10 @@ localStep | main.rs:517:14:517:34 | [...] | main.rs:517:9:517:10 | vs | | main.rs:519:10:519:11 | [post] vs | main.rs:520:11:520:12 | vs | | main.rs:519:10:519:11 | vs | main.rs:520:11:520:12 | vs | -| main.rs:520:11:520:12 | [post] receiver for vs | main.rs:520:11:520:12 | [post] vs | | main.rs:520:11:520:12 | [post] vs | main.rs:521:11:521:12 | vs | -| main.rs:520:11:520:12 | vs | main.rs:520:11:520:12 | receiver for vs | | main.rs:520:11:520:12 | vs | main.rs:521:11:521:12 | vs | -| main.rs:520:11:520:19 | [post] receiver for vs.iter() | main.rs:520:11:520:19 | [post] vs.iter() | -| main.rs:520:11:520:19 | vs.iter() | main.rs:520:11:520:19 | receiver for vs.iter() | -| main.rs:520:11:520:26 | ... .next() | main.rs:520:11:520:26 | receiver for ... .next() | -| main.rs:520:11:520:26 | [post] receiver for ... .next() | main.rs:520:11:520:26 | [post] ... .next() | -| main.rs:520:11:520:35 | ... .unwrap() | main.rs:520:11:520:35 | receiver for ... .unwrap() | -| main.rs:520:11:520:35 | [post] receiver for ... .unwrap() | main.rs:520:11:520:35 | [post] ... .unwrap() | -| main.rs:521:11:521:12 | [post] receiver for vs | main.rs:521:11:521:12 | [post] vs | | main.rs:521:11:521:12 | [post] vs | main.rs:523:14:523:15 | vs | -| main.rs:521:11:521:12 | vs | main.rs:521:11:521:12 | receiver for vs | | main.rs:521:11:521:12 | vs | main.rs:523:14:523:15 | vs | -| main.rs:521:11:521:19 | [post] receiver for vs.iter() | main.rs:521:11:521:19 | [post] vs.iter() | -| main.rs:521:11:521:19 | vs.iter() | main.rs:521:11:521:19 | receiver for vs.iter() | -| main.rs:521:11:521:26 | ... .nth(...) | main.rs:521:11:521:26 | receiver for ... .nth(...) | -| main.rs:521:11:521:26 | [post] receiver for ... .nth(...) | main.rs:521:11:521:26 | [post] ... .nth(...) | -| main.rs:521:11:521:35 | ... .unwrap() | main.rs:521:11:521:35 | receiver for ... .unwrap() | -| main.rs:521:11:521:35 | [post] receiver for ... .unwrap() | main.rs:521:11:521:35 | [post] ... .unwrap() | | main.rs:523:9:523:9 | [SSA] v | main.rs:524:14:524:14 | v | | main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | [SSA] v | | main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | v | @@ -804,52 +739,32 @@ localStep | main.rs:526:10:526:10 | [SSA] v | main.rs:527:14:527:14 | v | | main.rs:526:10:526:10 | v | main.rs:526:10:526:10 | [SSA] v | | main.rs:526:10:526:10 | v | main.rs:526:10:526:10 | v | -| main.rs:526:15:526:16 | [post] receiver for vs | main.rs:526:15:526:16 | [post] vs | | main.rs:526:15:526:16 | [post] vs | main.rs:530:26:530:27 | vs | -| main.rs:526:15:526:16 | vs | main.rs:526:15:526:16 | receiver for vs | | main.rs:526:15:526:16 | vs | main.rs:530:26:530:27 | vs | | main.rs:530:9:530:11 | [SSA] vs2 | main.rs:531:15:531:17 | vs2 | | main.rs:530:9:530:11 | vs2 | main.rs:530:9:530:11 | [SSA] vs2 | | main.rs:530:9:530:11 | vs2 | main.rs:530:9:530:11 | vs2 | -| main.rs:530:26:530:27 | [post] receiver for vs | main.rs:530:26:530:27 | [post] vs | | main.rs:530:26:530:27 | [post] vs | main.rs:535:5:535:6 | vs | -| main.rs:530:26:530:27 | vs | main.rs:530:26:530:27 | receiver for vs | | main.rs:530:26:530:27 | vs | main.rs:535:5:535:6 | vs | -| main.rs:530:26:530:34 | [post] receiver for vs.iter() | main.rs:530:26:530:34 | [post] vs.iter() | -| main.rs:530:26:530:34 | vs.iter() | main.rs:530:26:530:34 | receiver for vs.iter() | | main.rs:530:26:530:44 | ... .collect() | main.rs:530:9:530:11 | vs2 | | main.rs:531:10:531:10 | [SSA] v | main.rs:532:14:532:14 | v | | main.rs:531:10:531:10 | v | main.rs:531:10:531:10 | [SSA] v | | main.rs:531:10:531:10 | v | main.rs:531:10:531:10 | v | -| main.rs:535:5:535:6 | [post] receiver for vs | main.rs:535:5:535:6 | [post] vs | | main.rs:535:5:535:6 | [post] vs | main.rs:536:5:536:6 | vs | -| main.rs:535:5:535:6 | vs | main.rs:535:5:535:6 | receiver for vs | | main.rs:535:5:535:6 | vs | main.rs:536:5:536:6 | vs | -| main.rs:535:5:535:13 | [post] receiver for vs.iter() | main.rs:535:5:535:13 | [post] vs.iter() | -| main.rs:535:5:535:13 | vs.iter() | main.rs:535:5:535:13 | receiver for vs.iter() | | main.rs:535:20:535:20 | ... | main.rs:535:20:535:20 | x | | main.rs:535:20:535:20 | [SSA] x | main.rs:535:29:535:29 | x | | main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | [SSA] x | | main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | x | -| main.rs:535:29:535:29 | [post] receiver for x | main.rs:535:29:535:29 | [post] x | -| main.rs:535:29:535:29 | x | main.rs:535:29:535:29 | receiver for x | -| main.rs:536:5:536:6 | [post] receiver for vs | main.rs:536:5:536:6 | [post] vs | | main.rs:536:5:536:6 | [post] vs | main.rs:538:14:538:15 | vs | -| main.rs:536:5:536:6 | vs | main.rs:536:5:536:6 | receiver for vs | | main.rs:536:5:536:6 | vs | main.rs:538:14:538:15 | vs | -| main.rs:536:5:536:13 | [post] receiver for vs.iter() | main.rs:536:5:536:13 | [post] vs.iter() | -| main.rs:536:5:536:13 | vs.iter() | main.rs:536:5:536:13 | receiver for vs.iter() | | main.rs:536:25:536:25 | ... | main.rs:536:25:536:25 | x | | main.rs:536:25:536:25 | [SSA] x | main.rs:536:34:536:34 | x | | main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | [SSA] x | | main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | x | -| main.rs:536:34:536:34 | [post] receiver for x | main.rs:536:34:536:34 | [post] x | -| main.rs:536:34:536:34 | x | main.rs:536:34:536:34 | receiver for x | | main.rs:538:9:538:9 | [SSA] v | main.rs:539:14:539:14 | v | | main.rs:538:9:538:9 | v | main.rs:538:9:538:9 | [SSA] v | | main.rs:538:9:538:9 | v | main.rs:538:9:538:9 | v | -| main.rs:538:14:538:15 | [post] receiver for vs | main.rs:538:14:538:15 | [post] vs | -| main.rs:538:14:538:15 | vs | main.rs:538:14:538:15 | receiver for vs | | main.rs:542:9:542:18 | mut vs_mut | main.rs:542:13:542:18 | vs_mut | | main.rs:542:13:542:18 | [SSA] vs_mut | main.rs:544:10:544:15 | vs_mut | | main.rs:542:13:542:18 | vs_mut | main.rs:542:13:542:18 | [SSA] vs_mut | @@ -860,35 +775,17 @@ localStep | main.rs:544:10:544:15 | vs_mut | main.rs:545:11:545:16 | vs_mut | | main.rs:545:11:545:16 | [SSA] vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | | main.rs:545:11:545:16 | [SSA] vs_mut | main.rs:546:11:546:16 | vs_mut | -| main.rs:545:11:545:16 | [post] receiver for vs_mut | main.rs:545:11:545:16 | [post] vs_mut | | main.rs:545:11:545:16 | [post] vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | | main.rs:545:11:545:16 | [post] vs_mut | main.rs:546:11:546:16 | vs_mut | -| main.rs:545:11:545:16 | vs_mut | main.rs:545:11:545:16 | receiver for vs_mut | | main.rs:545:11:545:16 | vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | | main.rs:545:11:545:16 | vs_mut | main.rs:546:11:546:16 | vs_mut | -| main.rs:545:11:545:23 | [post] receiver for vs_mut.iter() | main.rs:545:11:545:23 | [post] vs_mut.iter() | -| main.rs:545:11:545:23 | vs_mut.iter() | main.rs:545:11:545:23 | receiver for vs_mut.iter() | -| main.rs:545:11:545:30 | ... .next() | main.rs:545:11:545:30 | receiver for ... .next() | -| main.rs:545:11:545:30 | [post] receiver for ... .next() | main.rs:545:11:545:30 | [post] ... .next() | -| main.rs:545:11:545:39 | ... .unwrap() | main.rs:545:11:545:39 | receiver for ... .unwrap() | -| main.rs:545:11:545:39 | [post] receiver for ... .unwrap() | main.rs:545:11:545:39 | [post] ... .unwrap() | | main.rs:546:11:546:16 | [SSA] vs_mut | main.rs:548:19:548:24 | vs_mut | -| main.rs:546:11:546:16 | [post] receiver for vs_mut | main.rs:546:11:546:16 | [post] vs_mut | | main.rs:546:11:546:16 | [post] vs_mut | main.rs:548:19:548:24 | vs_mut | -| main.rs:546:11:546:16 | vs_mut | main.rs:546:11:546:16 | receiver for vs_mut | | main.rs:546:11:546:16 | vs_mut | main.rs:548:19:548:24 | vs_mut | -| main.rs:546:11:546:23 | [post] receiver for vs_mut.iter() | main.rs:546:11:546:23 | [post] vs_mut.iter() | -| main.rs:546:11:546:23 | vs_mut.iter() | main.rs:546:11:546:23 | receiver for vs_mut.iter() | -| main.rs:546:11:546:30 | ... .nth(...) | main.rs:546:11:546:30 | receiver for ... .nth(...) | -| main.rs:546:11:546:30 | [post] receiver for ... .nth(...) | main.rs:546:11:546:30 | [post] ... .nth(...) | -| main.rs:546:11:546:39 | ... .unwrap() | main.rs:546:11:546:39 | receiver for ... .unwrap() | -| main.rs:546:11:546:39 | [post] receiver for ... .unwrap() | main.rs:546:11:546:39 | [post] ... .unwrap() | | main.rs:548:5:550:5 | for ... in ... { ... } | main.rs:516:16:551:1 | { ... } | | main.rs:548:14:548:14 | [SSA] v | main.rs:549:14:549:14 | v | | main.rs:548:14:548:14 | v | main.rs:548:14:548:14 | [SSA] v | | main.rs:548:14:548:14 | v | main.rs:548:14:548:14 | v | -| main.rs:548:19:548:24 | [post] receiver for vs_mut | main.rs:548:19:548:24 | [post] vs_mut | -| main.rs:548:19:548:24 | vs_mut | main.rs:548:19:548:24 | receiver for vs_mut | | main.rs:554:9:554:9 | [SSA] a | main.rs:559:10:559:10 | a | | main.rs:554:9:554:9 | a | main.rs:554:9:554:9 | [SSA] a | | main.rs:554:9:554:9 | a | main.rs:554:9:554:9 | a | @@ -907,8 +804,6 @@ localStep | main.rs:557:17:557:18 | &c | main.rs:557:9:557:13 | c_ref | | main.rs:561:14:561:18 | [post] c_ref | main.rs:562:11:562:15 | c_ref | | main.rs:561:14:561:18 | c_ref | main.rs:562:11:562:15 | c_ref | -| main.rs:562:11:562:15 | [post] receiver for c_ref | main.rs:562:11:562:15 | [post] c_ref | -| main.rs:562:11:562:15 | c_ref | main.rs:562:11:562:15 | receiver for c_ref | | main.rs:566:9:566:9 | [SSA] a | main.rs:568:10:568:10 | a | | main.rs:566:9:566:9 | a | main.rs:566:9:566:9 | [SSA] a | | main.rs:566:9:566:9 | a | main.rs:566:9:566:9 | a | @@ -916,8 +811,6 @@ localStep | main.rs:568:10:568:10 | [post] a | main.rs:569:10:569:10 | a | | main.rs:568:10:568:10 | a | main.rs:569:10:569:10 | a | | main.rs:569:10:569:10 | [post] a | main.rs:570:20:570:20 | a | -| main.rs:569:10:569:10 | [post] receiver for a | main.rs:569:10:569:10 | [post] a | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:10 | receiver for a | | main.rs:569:10:569:10 | a | main.rs:570:20:570:20 | a | | main.rs:572:9:572:9 | [SSA] b | main.rs:574:10:574:10 | b | | main.rs:572:9:572:9 | b | main.rs:572:9:572:9 | [SSA] b | @@ -926,16 +819,14 @@ localStep | main.rs:574:10:574:10 | [post] b | main.rs:575:10:575:10 | b | | main.rs:574:10:574:10 | b | main.rs:575:10:575:10 | b | | main.rs:575:10:575:10 | [post] b | main.rs:576:20:576:20 | b | -| main.rs:575:10:575:10 | [post] receiver for b | main.rs:575:10:575:10 | [post] b | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:10 | receiver for b | | main.rs:575:10:575:10 | b | main.rs:576:20:576:20 | b | | main.rs:604:13:604:33 | result_questionmark(...) | main.rs:604:9:604:9 | _ | | main.rs:616:36:616:39 | ...::new(...) | main.rs:616:36:616:41 | MacroExpr | | main.rs:616:36:616:41 | [post] MacroExpr | main.rs:616:36:616:39 | [post] ...::new(...) | readStep | main.rs:50:9:50:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:50:14:50:14 | _ | -| main.rs:116:11:116:11 | [post] receiver for i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | [post] i | -| main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:10:116:11 | * ... | +| main.rs:116:10:116:11 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:116:10:116:11 | * ... | +| main.rs:116:11:116:11 | [post] i [borrowed] | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | [post] i | | main.rs:124:10:124:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:124:10:124:12 | a.0 | | main.rs:125:10:125:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:125:10:125:12 | a.1 | | main.rs:130:9:130:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:130:10:130:11 | a0 | @@ -1013,53 +904,62 @@ readStep | main.rs:418:28:418:43 | D {...} | main.rs:385:9:385:20 | D | main.rs:418:41:418:41 | n | | main.rs:421:9:421:24 | C {...} | main.rs:384:9:384:20 | C | main.rs:421:22:421:22 | n | | main.rs:422:9:422:24 | D {...} | main.rs:385:9:385:20 | D | main.rs:422:22:422:22 | n | -| main.rs:431:14:431:17 | arr1 | file://:0:0:0:0 | element | main.rs:431:14:431:20 | arr1[2] | -| main.rs:435:14:435:17 | arr2 | file://:0:0:0:0 | element | main.rs:435:14:435:20 | arr2[4] | -| main.rs:439:14:439:17 | arr3 | file://:0:0:0:0 | element | main.rs:439:14:439:20 | arr3[2] | +| main.rs:431:14:431:17 | [post] arr1 [borrowed] | file://:0:0:0:0 | &ref | main.rs:431:14:431:17 | [post] arr1 | +| main.rs:431:14:431:20 | arr1[2] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:431:14:431:20 | arr1[2] | +| main.rs:435:14:435:17 | [post] arr2 [borrowed] | file://:0:0:0:0 | &ref | main.rs:435:14:435:17 | [post] arr2 | +| main.rs:435:14:435:20 | arr2[4] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:435:14:435:20 | arr2[4] | +| main.rs:439:14:439:17 | [post] arr3 [borrowed] | file://:0:0:0:0 | &ref | main.rs:439:14:439:17 | [post] arr3 | +| main.rs:439:14:439:20 | arr3[2] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:439:14:439:20 | arr3[2] | | main.rs:445:15:445:18 | arr1 | file://:0:0:0:0 | element | main.rs:445:9:445:10 | n1 | | main.rs:450:15:450:18 | arr2 | file://:0:0:0:0 | element | main.rs:450:9:450:10 | n2 | | main.rs:458:9:458:17 | SlicePat | file://:0:0:0:0 | element | main.rs:458:10:458:10 | a | | main.rs:458:9:458:17 | SlicePat | file://:0:0:0:0 | element | main.rs:458:13:458:13 | b | | main.rs:458:9:458:17 | SlicePat | file://:0:0:0:0 | element | main.rs:458:16:458:16 | c | -| main.rs:468:10:468:16 | mut_arr | file://:0:0:0:0 | element | main.rs:468:10:468:19 | mut_arr[1] | -| main.rs:470:5:470:11 | mut_arr | file://:0:0:0:0 | element | main.rs:470:5:470:14 | mut_arr[1] | -| main.rs:471:13:471:19 | mut_arr | file://:0:0:0:0 | element | main.rs:471:13:471:22 | mut_arr[1] | -| main.rs:473:10:473:16 | mut_arr | file://:0:0:0:0 | element | main.rs:473:10:473:19 | mut_arr[0] | -| main.rs:479:24:479:33 | [post] receiver for source(...) | file://:0:0:0:0 | &ref | main.rs:479:24:479:33 | [post] source(...) | +| main.rs:468:10:468:16 | [post] mut_arr [borrowed] | file://:0:0:0:0 | &ref | main.rs:468:10:468:16 | [post] mut_arr | +| main.rs:468:10:468:19 | mut_arr[1] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:468:10:468:19 | mut_arr[1] | +| main.rs:470:5:470:11 | [post] mut_arr [borrowed] | file://:0:0:0:0 | &ref | main.rs:470:5:470:11 | [post] mut_arr | +| main.rs:470:5:470:14 | mut_arr[1] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:470:5:470:14 | mut_arr[1] | +| main.rs:471:13:471:19 | [post] mut_arr [borrowed] | file://:0:0:0:0 | &ref | main.rs:471:13:471:19 | [post] mut_arr | +| main.rs:471:13:471:22 | mut_arr[1] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:471:13:471:22 | mut_arr[1] | +| main.rs:473:10:473:16 | [post] mut_arr [borrowed] | file://:0:0:0:0 | &ref | main.rs:473:10:473:16 | [post] mut_arr | +| main.rs:473:10:473:19 | mut_arr[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:473:10:473:19 | mut_arr[0] | +| main.rs:479:24:479:33 | [post] source(...) [borrowed] | file://:0:0:0:0 | &ref | main.rs:479:24:479:33 | [post] source(...) | | main.rs:480:9:480:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:480:10:480:13 | cond | | main.rs:480:9:480:20 | TuplePat | file://:0:0:0:0 | tuple.1 | main.rs:480:16:480:19 | name | | main.rs:480:25:480:29 | names | file://:0:0:0:0 | element | main.rs:480:9:480:20 | TuplePat | | main.rs:482:41:482:67 | [post] \|...\| ... | main.rs:479:9:479:20 | captured default_name | main.rs:482:41:482:67 | [post] default_name | -| main.rs:482:44:482:55 | [post] receiver for default_name | file://:0:0:0:0 | &ref | main.rs:482:44:482:55 | [post] default_name | +| main.rs:482:44:482:55 | [post] default_name [borrowed] | file://:0:0:0:0 | &ref | main.rs:482:44:482:55 | [post] default_name | | main.rs:482:44:482:55 | this | main.rs:479:9:479:20 | captured default_name | main.rs:482:44:482:55 | default_name | -| main.rs:483:18:483:18 | [post] receiver for n | file://:0:0:0:0 | &ref | main.rs:483:18:483:18 | [post] n | -| main.rs:506:13:506:13 | [post] receiver for a | file://:0:0:0:0 | &ref | main.rs:506:13:506:13 | [post] a | -| main.rs:519:10:519:11 | vs | file://:0:0:0:0 | element | main.rs:519:10:519:14 | vs[0] | -| main.rs:520:11:520:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:520:10:520:35 | * ... | -| main.rs:520:11:520:35 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | [post] ... .unwrap() | -| main.rs:521:11:521:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:521:10:521:35 | * ... | -| main.rs:521:11:521:35 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | [post] ... .unwrap() | +| main.rs:483:18:483:18 | [post] n [borrowed] | file://:0:0:0:0 | &ref | main.rs:483:18:483:18 | [post] n | +| main.rs:506:13:506:13 | [post] a [borrowed] | file://:0:0:0:0 | &ref | main.rs:506:13:506:13 | [post] a | +| main.rs:519:10:519:11 | [post] vs [borrowed] | file://:0:0:0:0 | &ref | main.rs:519:10:519:11 | [post] vs | +| main.rs:519:10:519:14 | vs[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:519:10:519:14 | vs[0] | +| main.rs:520:10:520:35 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:520:10:520:35 | * ... | +| main.rs:520:11:520:35 | [post] ... .unwrap() [borrowed] | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | [post] ... .unwrap() | +| main.rs:521:10:521:35 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:521:10:521:35 | * ... | +| main.rs:521:11:521:35 | [post] ... .unwrap() [borrowed] | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | [post] ... .unwrap() | | main.rs:523:14:523:15 | vs | file://:0:0:0:0 | element | main.rs:523:9:523:9 | v | | main.rs:526:9:526:10 | &... | file://:0:0:0:0 | &ref | main.rs:526:10:526:10 | v | | main.rs:526:15:526:23 | vs.iter() | file://:0:0:0:0 | element | main.rs:526:9:526:10 | &... | | main.rs:531:9:531:10 | &... | file://:0:0:0:0 | &ref | main.rs:531:10:531:10 | v | | main.rs:531:15:531:17 | vs2 | file://:0:0:0:0 | element | main.rs:531:9:531:10 | &... | -| main.rs:535:29:535:29 | [post] receiver for x | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | [post] x | -| main.rs:535:29:535:29 | x | file://:0:0:0:0 | &ref | main.rs:535:28:535:29 | * ... | -| main.rs:536:34:536:34 | [post] receiver for x | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | [post] x | -| main.rs:536:34:536:34 | x | file://:0:0:0:0 | &ref | main.rs:536:33:536:34 | * ... | +| main.rs:535:28:535:29 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:535:28:535:29 | * ... | +| main.rs:535:29:535:29 | [post] x [borrowed] | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | [post] x | +| main.rs:536:33:536:34 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:536:33:536:34 | * ... | +| main.rs:536:34:536:34 | [post] x [borrowed] | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | [post] x | | main.rs:538:14:538:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:538:9:538:9 | v | -| main.rs:544:10:544:15 | vs_mut | file://:0:0:0:0 | element | main.rs:544:10:544:18 | vs_mut[0] | -| main.rs:545:11:545:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:10:545:39 | * ... | -| main.rs:545:11:545:39 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | [post] ... .unwrap() | -| main.rs:546:11:546:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:10:546:39 | * ... | -| main.rs:546:11:546:39 | [post] receiver for ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | [post] ... .unwrap() | +| main.rs:544:10:544:15 | [post] vs_mut [borrowed] | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | [post] vs_mut | +| main.rs:544:10:544:18 | vs_mut[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:544:10:544:18 | vs_mut[0] | +| main.rs:545:10:545:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:545:10:545:39 | * ... | +| main.rs:545:11:545:39 | [post] ... .unwrap() [borrowed] | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | [post] ... .unwrap() | +| main.rs:546:10:546:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:546:10:546:39 | * ... | +| main.rs:546:11:546:39 | [post] ... .unwrap() [borrowed] | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | [post] ... .unwrap() | | main.rs:548:9:548:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:548:14:548:14 | v | | main.rs:548:19:548:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:548:9:548:14 | &mut ... | -| main.rs:562:11:562:15 | [post] receiver for c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | [post] c_ref | -| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... | +| main.rs:562:10:562:15 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... | +| main.rs:562:11:562:15 | [post] c_ref [borrowed] | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | [post] c_ref | storeStep -| main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | receiver for i | +| main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | i [borrowed] | | main.rs:123:14:123:22 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:123:13:123:26 | TupleExpr | | main.rs:123:25:123:25 | 2 | file://:0:0:0:0 | tuple.1 | main.rs:123:13:123:26 | TupleExpr | | main.rs:129:14:129:14 | 2 | file://:0:0:0:0 | tuple.0 | main.rs:129:13:129:30 | TupleExpr | @@ -1121,10 +1021,13 @@ storeStep | main.rs:430:17:430:17 | 1 | file://:0:0:0:0 | element | main.rs:430:16:430:33 | [...] | | main.rs:430:20:430:20 | 2 | file://:0:0:0:0 | element | main.rs:430:16:430:33 | [...] | | main.rs:430:23:430:32 | source(...) | file://:0:0:0:0 | element | main.rs:430:16:430:33 | [...] | +| main.rs:431:14:431:17 | arr1 | file://:0:0:0:0 | &ref | main.rs:431:14:431:17 | arr1 [borrowed] | | main.rs:434:17:434:26 | source(...) | file://:0:0:0:0 | element | main.rs:434:16:434:31 | [...; 10] | +| main.rs:435:14:435:17 | arr2 | file://:0:0:0:0 | &ref | main.rs:435:14:435:17 | arr2 [borrowed] | | main.rs:438:17:438:17 | 1 | file://:0:0:0:0 | element | main.rs:438:16:438:24 | [...] | | main.rs:438:20:438:20 | 2 | file://:0:0:0:0 | element | main.rs:438:16:438:24 | [...] | | main.rs:438:23:438:23 | 3 | file://:0:0:0:0 | element | main.rs:438:16:438:24 | [...] | +| main.rs:439:14:439:17 | arr3 | file://:0:0:0:0 | &ref | main.rs:439:14:439:17 | arr3 [borrowed] | | main.rs:444:17:444:17 | 1 | file://:0:0:0:0 | element | main.rs:444:16:444:33 | [...] | | main.rs:444:20:444:20 | 2 | file://:0:0:0:0 | element | main.rs:444:16:444:33 | [...] | | main.rs:444:23:444:32 | source(...) | file://:0:0:0:0 | element | main.rs:444:16:444:33 | [...] | @@ -1137,27 +1040,34 @@ storeStep | main.rs:467:24:467:24 | 1 | file://:0:0:0:0 | element | main.rs:467:23:467:31 | [...] | | main.rs:467:27:467:27 | 2 | file://:0:0:0:0 | element | main.rs:467:23:467:31 | [...] | | main.rs:467:30:467:30 | 3 | file://:0:0:0:0 | element | main.rs:467:23:467:31 | [...] | +| main.rs:468:10:468:16 | mut_arr | file://:0:0:0:0 | &ref | main.rs:468:10:468:16 | mut_arr [borrowed] | +| main.rs:470:5:470:11 | mut_arr | file://:0:0:0:0 | &ref | main.rs:470:5:470:11 | mut_arr [borrowed] | +| main.rs:470:18:470:27 | source(...) | file://:0:0:0:0 | &ref | main.rs:470:5:470:14 | [post] mut_arr[1] [pre-dereferenced] | | main.rs:470:18:470:27 | source(...) | file://:0:0:0:0 | element | main.rs:470:5:470:11 | [post] mut_arr | -| main.rs:479:24:479:33 | source(...) | file://:0:0:0:0 | &ref | main.rs:479:24:479:33 | receiver for source(...) | +| main.rs:471:13:471:19 | mut_arr | file://:0:0:0:0 | &ref | main.rs:471:13:471:19 | mut_arr [borrowed] | +| main.rs:473:10:473:16 | mut_arr | file://:0:0:0:0 | &ref | main.rs:473:10:473:16 | mut_arr [borrowed] | +| main.rs:479:24:479:33 | source(...) | file://:0:0:0:0 | &ref | main.rs:479:24:479:33 | source(...) [borrowed] | | main.rs:482:41:482:67 | default_name | main.rs:479:9:479:20 | captured default_name | main.rs:482:41:482:67 | \|...\| ... | -| main.rs:482:44:482:55 | default_name | file://:0:0:0:0 | &ref | main.rs:482:44:482:55 | receiver for default_name | -| main.rs:483:18:483:18 | n | file://:0:0:0:0 | &ref | main.rs:483:18:483:18 | receiver for n | -| main.rs:506:13:506:13 | a | file://:0:0:0:0 | &ref | main.rs:506:13:506:13 | receiver for a | +| main.rs:482:44:482:55 | default_name | file://:0:0:0:0 | &ref | main.rs:482:44:482:55 | default_name [borrowed] | +| main.rs:483:18:483:18 | n | file://:0:0:0:0 | &ref | main.rs:483:18:483:18 | n [borrowed] | +| main.rs:506:13:506:13 | a | file://:0:0:0:0 | &ref | main.rs:506:13:506:13 | a [borrowed] | | main.rs:517:15:517:24 | source(...) | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | | main.rs:517:27:517:27 | 2 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | | main.rs:517:30:517:30 | 3 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | | main.rs:517:33:517:33 | 4 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | -| main.rs:520:11:520:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | receiver for ... .unwrap() | -| main.rs:521:11:521:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | receiver for ... .unwrap() | -| main.rs:535:29:535:29 | x | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | receiver for x | -| main.rs:536:34:536:34 | x | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | receiver for x | +| main.rs:519:10:519:11 | vs | file://:0:0:0:0 | &ref | main.rs:519:10:519:11 | vs [borrowed] | +| main.rs:520:11:520:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | ... .unwrap() [borrowed] | +| main.rs:521:11:521:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | ... .unwrap() [borrowed] | +| main.rs:535:29:535:29 | x | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | x [borrowed] | +| main.rs:536:34:536:34 | x | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | x [borrowed] | | main.rs:542:23:542:32 | source(...) | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | | main.rs:542:35:542:35 | 2 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | | main.rs:542:38:542:38 | 3 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | | main.rs:542:41:542:41 | 4 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | -| main.rs:545:11:545:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | receiver for ... .unwrap() | -| main.rs:546:11:546:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | receiver for ... .unwrap() | +| main.rs:544:10:544:15 | vs_mut | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | vs_mut [borrowed] | +| main.rs:545:11:545:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | ... .unwrap() [borrowed] | +| main.rs:546:11:546:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | ... .unwrap() [borrowed] | | main.rs:557:18:557:18 | c | file://:0:0:0:0 | &ref | main.rs:557:17:557:18 | &c | | main.rs:560:15:560:15 | b | file://:0:0:0:0 | &ref | main.rs:560:14:560:15 | &b | -| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | receiver for c_ref | +| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | c_ref [borrowed] | | main.rs:583:27:583:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:583:22:583:28 | Some(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index 00640ed9aa4..61c4771068b 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -1,14 +1,22 @@ models -| 1 | Summary: ::new; Argument[0]; ReturnValue.Reference; value | -| 2 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 3 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | -| 4 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 5 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 6 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 7 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 8 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 9 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | -| 10 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | +| 2 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self].Reference; ReturnValue; taint | +| 3 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | +| 4 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 5 | Summary: ::deref; Argument[self].Reference.Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | +| 6 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | +| 7 | Summary: ::from; Argument[0]; ReturnValue; taint | +| 8 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 9 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | +| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 12 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 13 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 14 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | +| 16 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 18 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | edges | main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | | | main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | | @@ -34,10 +42,10 @@ edges | main.rs:81:9:81:13 | mut l | main.rs:82:5:82:5 | l | provenance | | | main.rs:81:17:81:25 | source(...) | main.rs:81:9:81:13 | mut l | provenance | | | main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | | -| main.rs:115:9:115:9 | i [&ref] | main.rs:116:11:116:11 | i [&ref] | provenance | | -| main.rs:115:13:115:31 | ...::new(...) [&ref] | main.rs:115:9:115:9 | i [&ref] | provenance | | -| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:1 | -| main.rs:116:11:116:11 | i [&ref] | main.rs:116:10:116:11 | * ... | provenance | | +| main.rs:115:9:115:9 | i [Box(0)] | main.rs:116:11:116:11 | i [Box(0)] | provenance | | +| main.rs:115:13:115:31 | ...::new(...) [Box(0)] | main.rs:115:9:115:9 | i [Box(0)] | provenance | | +| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [Box(0)] | provenance | MaD:6 | +| main.rs:116:11:116:11 | i [Box(0)] | main.rs:116:10:116:11 | * ... | provenance | MaD:5 | | main.rs:123:9:123:9 | a [tuple.0] | main.rs:124:10:124:10 | a [tuple.0] | provenance | | | main.rs:123:13:123:26 | TupleExpr [tuple.0] | main.rs:123:9:123:9 | a [tuple.0] | provenance | | | main.rs:123:14:123:22 | source(...) | main.rs:123:13:123:26 | TupleExpr [tuple.0] | provenance | | @@ -117,45 +125,54 @@ edges | main.rs:267:12:267:18 | Some(...) [Some] | main.rs:267:17:267:17 | n | provenance | | | main.rs:267:17:267:17 | n | main.rs:269:18:269:18 | n | provenance | | | main.rs:267:17:267:17 | n | main.rs:273:14:273:14 | n | provenance | | -| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:2 | +| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:11 | s1 [Some] | provenance | | | main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | | | main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | | -| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:4 | +| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:8 | +| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:11 | s1 [Some] | provenance | | | main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | | | main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | | -| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:3 | -| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:6 | +| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:10 | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:9 | +| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:11 | s1 [Some] | provenance | | | main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | | | main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | | -| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:5 | +| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:12 | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:11 | | main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | | | main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | | | main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | | | main.rs:301:9:301:10 | i1 | main.rs:302:10:302:11 | i1 | provenance | | | main.rs:301:14:301:15 | s1 [Some] | main.rs:301:14:301:16 | TryExpr | provenance | | | main.rs:301:14:301:16 | TryExpr | main.rs:301:9:301:10 | i1 | provenance | | -| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:10 | +| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:29 | r1 [Ok] | provenance | | | main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | | | main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | | -| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:2 | +| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:12 | o1a [Some] | provenance | | +| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:16 | | main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | -| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:7 | +| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:8 | +| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:29 | r2 [Err] | provenance | | | main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | | | main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | | -| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:2 | +| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:12 | o2b [Some] | provenance | | +| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:13 | | main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | +| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:8 | | main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | | | main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | | | main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | | | main.rs:325:9:325:10 | i1 | main.rs:327:10:327:11 | i1 | provenance | | | main.rs:325:14:325:15 | s1 [Ok] | main.rs:325:14:325:16 | TryExpr | provenance | | | main.rs:325:14:325:16 | TryExpr | main.rs:325:9:325:10 | i1 | provenance | | -| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:8 | +| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:11 | s1 [Ok] | provenance | | | main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | | | main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | | -| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:9 | +| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:14 | +| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:11 | s2 [Err] | provenance | | | main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | | | main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | | +| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:15 | | main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | | | main.rs:350:14:350:39 | ...::A(...) [A] | main.rs:350:9:350:10 | s1 [A] | provenance | | | main.rs:350:29:350:38 | source(...) | main.rs:350:14:350:39 | ...::A(...) [A] | provenance | | @@ -163,8 +180,9 @@ edges | main.rs:352:11:352:12 | s1 [A] | main.rs:356:11:356:12 | s1 [A] | provenance | | | main.rs:353:9:353:25 | ...::A(...) [A] | main.rs:353:24:353:24 | n | provenance | | | main.rs:353:24:353:24 | n | main.rs:353:35:353:35 | n | provenance | | -| main.rs:356:11:356:12 | s1 [A] | main.rs:357:9:357:25 | ...::A(...) [A] | provenance | | +| main.rs:356:11:356:12 | s1 [A] | main.rs:357:9:357:45 | ... \| ... [A] | provenance | | | main.rs:357:9:357:25 | ...::A(...) [A] | main.rs:357:24:357:24 | n | provenance | | +| main.rs:357:9:357:45 | ... \| ... [A] | main.rs:357:9:357:25 | ...::A(...) [A] | provenance | | | main.rs:357:24:357:24 | n | main.rs:357:55:357:55 | n | provenance | | | main.rs:368:9:368:10 | s1 [A] | main.rs:370:11:370:12 | s1 [A] | provenance | | | main.rs:368:14:368:26 | A(...) [A] | main.rs:368:9:368:10 | s1 [A] | provenance | | @@ -173,8 +191,9 @@ edges | main.rs:370:11:370:12 | s1 [A] | main.rs:374:11:374:12 | s1 [A] | provenance | | | main.rs:371:9:371:12 | A(...) [A] | main.rs:371:11:371:11 | n | provenance | | | main.rs:371:11:371:11 | n | main.rs:371:22:371:22 | n | provenance | | -| main.rs:374:11:374:12 | s1 [A] | main.rs:375:9:375:12 | A(...) [A] | provenance | | +| main.rs:374:11:374:12 | s1 [A] | main.rs:375:9:375:19 | ... \| ... [A] | provenance | | | main.rs:375:9:375:12 | A(...) [A] | main.rs:375:11:375:11 | n | provenance | | +| main.rs:375:9:375:19 | ... \| ... [A] | main.rs:375:9:375:12 | A(...) [A] | provenance | | | main.rs:375:11:375:11 | n | main.rs:375:29:375:29 | n | provenance | | | main.rs:389:9:389:10 | s1 [C] | main.rs:393:11:393:12 | s1 [C] | provenance | | | main.rs:389:14:391:5 | ...::C {...} [C] | main.rs:389:9:389:10 | s1 [C] | provenance | | @@ -183,8 +202,9 @@ edges | main.rs:393:11:393:12 | s1 [C] | main.rs:397:11:397:12 | s1 [C] | provenance | | | main.rs:394:9:394:38 | ...::C {...} [C] | main.rs:394:36:394:36 | n | provenance | | | main.rs:394:36:394:36 | n | main.rs:394:48:394:48 | n | provenance | | -| main.rs:397:11:397:12 | s1 [C] | main.rs:398:9:398:38 | ...::C {...} [C] | provenance | | +| main.rs:397:11:397:12 | s1 [C] | main.rs:398:9:398:71 | ... \| ... [C] | provenance | | | main.rs:398:9:398:38 | ...::C {...} [C] | main.rs:398:36:398:36 | n | provenance | | +| main.rs:398:9:398:71 | ... \| ... [C] | main.rs:398:9:398:38 | ...::C {...} [C] | provenance | | | main.rs:398:36:398:36 | n | main.rs:398:81:398:81 | n | provenance | | | main.rs:409:9:409:10 | s1 [C] | main.rs:413:11:413:12 | s1 [C] | provenance | | | main.rs:409:14:411:5 | C {...} [C] | main.rs:409:9:409:10 | s1 [C] | provenance | | @@ -193,20 +213,21 @@ edges | main.rs:413:11:413:12 | s1 [C] | main.rs:417:11:417:12 | s1 [C] | provenance | | | main.rs:414:9:414:24 | C {...} [C] | main.rs:414:22:414:22 | n | provenance | | | main.rs:414:22:414:22 | n | main.rs:414:34:414:34 | n | provenance | | -| main.rs:417:11:417:12 | s1 [C] | main.rs:418:9:418:24 | C {...} [C] | provenance | | +| main.rs:417:11:417:12 | s1 [C] | main.rs:418:9:418:43 | ... \| ... [C] | provenance | | | main.rs:418:9:418:24 | C {...} [C] | main.rs:418:22:418:22 | n | provenance | | +| main.rs:418:9:418:43 | ... \| ... [C] | main.rs:418:9:418:24 | C {...} [C] | provenance | | | main.rs:418:22:418:22 | n | main.rs:418:53:418:53 | n | provenance | | | main.rs:430:9:430:12 | arr1 [element] | main.rs:431:14:431:17 | arr1 [element] | provenance | | | main.rs:430:16:430:33 | [...] [element] | main.rs:430:9:430:12 | arr1 [element] | provenance | | | main.rs:430:23:430:32 | source(...) | main.rs:430:16:430:33 | [...] [element] | provenance | | | main.rs:431:9:431:10 | n1 | main.rs:432:10:432:11 | n1 | provenance | | -| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | | +| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:4 | | main.rs:431:14:431:20 | arr1[2] | main.rs:431:9:431:10 | n1 | provenance | | | main.rs:434:9:434:12 | arr2 [element] | main.rs:435:14:435:17 | arr2 [element] | provenance | | | main.rs:434:16:434:31 | [...; 10] [element] | main.rs:434:9:434:12 | arr2 [element] | provenance | | | main.rs:434:17:434:26 | source(...) | main.rs:434:16:434:31 | [...; 10] [element] | provenance | | | main.rs:435:9:435:10 | n2 | main.rs:436:10:436:11 | n2 | provenance | | -| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | | +| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:4 | | main.rs:435:14:435:20 | arr2[4] | main.rs:435:9:435:10 | n2 | provenance | | | main.rs:444:9:444:12 | arr1 [element] | main.rs:445:15:445:18 | arr1 [element] | provenance | | | main.rs:444:16:444:33 | [...] [element] | main.rs:444:9:444:12 | arr1 [element] | provenance | | @@ -227,32 +248,57 @@ edges | main.rs:470:5:470:11 | [post] mut_arr [element] | main.rs:473:10:473:16 | mut_arr [element] | provenance | | | main.rs:470:18:470:27 | source(...) | main.rs:470:5:470:11 | [post] mut_arr [element] | provenance | | | main.rs:471:9:471:9 | d | main.rs:472:10:472:10 | d | provenance | | -| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | | +| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:4 | | main.rs:471:13:471:22 | mut_arr[1] | main.rs:471:9:471:9 | d | provenance | | -| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | | +| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:4 | | main.rs:496:9:496:9 | s | main.rs:497:10:497:10 | s | provenance | | | main.rs:496:25:496:26 | source(...) | main.rs:496:9:496:9 | s | provenance | | +| main.rs:505:9:505:9 | a | main.rs:506:13:506:13 | a | provenance | | | main.rs:505:9:505:9 | a | main.rs:510:10:510:10 | a | provenance | | | main.rs:505:13:505:22 | source(...) | main.rs:505:9:505:9 | a | provenance | | +| main.rs:506:9:506:9 | b | main.rs:507:13:507:13 | b | provenance | | +| main.rs:506:9:506:9 | b | main.rs:508:18:508:18 | b | provenance | | +| main.rs:506:9:506:9 | b | main.rs:511:17:511:17 | b | provenance | | +| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:2 | +| main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | provenance | | +| main.rs:507:9:507:9 | c | main.rs:512:10:512:10 | c | provenance | | +| main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:18 | +| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:17 | +| main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | provenance | | +| main.rs:508:9:508:9 | d | main.rs:513:10:513:10 | d | provenance | | +| main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:18 | +| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:17 | +| main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:519:10:519:11 | vs [element] | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:523:14:523:15 | vs [element] | provenance | | | main.rs:517:14:517:34 | [...] [element] | main.rs:517:9:517:10 | vs [element] | provenance | | | main.rs:517:15:517:24 | source(...) | main.rs:517:14:517:34 | [...] [element] | provenance | | -| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | | +| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:4 | | main.rs:523:9:523:9 | v | main.rs:524:14:524:14 | v | provenance | | | main.rs:523:14:523:15 | vs [element] | main.rs:523:9:523:9 | v | provenance | | | main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:544:10:544:15 | vs_mut [element] | provenance | | | main.rs:542:22:542:42 | [...] [element] | main.rs:542:9:542:18 | mut vs_mut [element] | provenance | | | main.rs:542:23:542:32 | source(...) | main.rs:542:22:542:42 | [...] [element] | provenance | | -| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | | +| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:4 | | main.rs:554:9:554:9 | a | main.rs:559:10:559:10 | a | provenance | | | main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | provenance | | +| main.rs:555:9:555:9 | b | main.rs:560:15:560:15 | b | provenance | | +| main.rs:555:13:555:22 | source(...) | main.rs:555:9:555:9 | b | provenance | | | main.rs:556:9:556:9 | c | main.rs:557:18:557:18 | c | provenance | | | main.rs:556:13:556:22 | source(...) | main.rs:556:9:556:9 | c | provenance | | +| main.rs:557:9:557:13 | c_ref [&ref] | main.rs:561:14:561:18 | c_ref | provenance | | | main.rs:557:9:557:13 | c_ref [&ref] | main.rs:562:11:562:15 | c_ref [&ref] | provenance | | | main.rs:557:17:557:18 | &c [&ref] | main.rs:557:9:557:13 | c_ref [&ref] | provenance | | | main.rs:557:18:557:18 | c | main.rs:557:17:557:18 | &c [&ref] | provenance | | -| main.rs:562:11:562:15 | c_ref [&ref] | main.rs:562:10:562:15 | * ... | provenance | | +| main.rs:560:15:560:15 | b | main.rs:560:14:560:15 | &b | provenance | | +| main.rs:562:11:562:15 | c_ref [&ref] | main.rs:562:10:562:15 | * ... | provenance | MaD:1 | +| main.rs:566:9:566:9 | a | main.rs:568:10:568:17 | a as i64 | provenance | | +| main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | provenance | | +| main.rs:572:9:572:9 | b | main.rs:574:10:574:17 | b as i64 | provenance | | +| main.rs:572:9:572:9 | b | main.rs:576:20:576:20 | b | provenance | | +| main.rs:572:18:572:27 | source(...) | main.rs:572:9:572:9 | b | provenance | | +| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:3 | +| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:7 | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | @@ -286,11 +332,11 @@ nodes | main.rs:81:17:81:25 | source(...) | semmle.label | source(...) | | main.rs:82:5:82:5 | l | semmle.label | l | | main.rs:83:10:83:10 | l | semmle.label | l | -| main.rs:115:9:115:9 | i [&ref] | semmle.label | i [&ref] | -| main.rs:115:13:115:31 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| main.rs:115:9:115:9 | i [Box(0)] | semmle.label | i [Box(0)] | +| main.rs:115:13:115:31 | ...::new(...) [Box(0)] | semmle.label | ...::new(...) [Box(0)] | | main.rs:115:22:115:30 | source(...) | semmle.label | source(...) | | main.rs:116:10:116:11 | * ... | semmle.label | * ... | -| main.rs:116:11:116:11 | i [&ref] | semmle.label | i [&ref] | +| main.rs:116:11:116:11 | i [Box(0)] | semmle.label | i [Box(0)] | | main.rs:123:9:123:9 | a [tuple.0] | semmle.label | a [tuple.0] | | main.rs:123:13:123:26 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | | main.rs:123:14:123:22 | source(...) | semmle.label | source(...) | @@ -387,16 +433,19 @@ nodes | main.rs:278:9:278:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:278:14:278:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:278:19:278:28 | source(...) | semmle.label | source(...) | +| main.rs:279:10:279:11 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:279:10:279:20 | s1.unwrap() | semmle.label | s1.unwrap() | | main.rs:283:9:283:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:283:14:283:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:283:19:283:28 | source(...) | semmle.label | source(...) | +| main.rs:284:10:284:11 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:284:10:284:24 | s1.unwrap_or(...) | semmle.label | s1.unwrap_or(...) | | main.rs:287:10:287:33 | s2.unwrap_or(...) | semmle.label | s2.unwrap_or(...) | | main.rs:287:23:287:32 | source(...) | semmle.label | source(...) | | main.rs:291:9:291:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:291:14:291:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:291:19:291:28 | source(...) | semmle.label | source(...) | +| main.rs:292:10:292:11 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | semmle.label | s1.unwrap_or_else(...) | | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | semmle.label | s2.unwrap_or_else(...) | | main.rs:295:31:295:40 | source(...) | semmle.label | source(...) | @@ -411,13 +460,17 @@ nodes | main.rs:308:32:308:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | | main.rs:308:35:308:44 | source(...) | semmle.label | source(...) | | main.rs:309:9:309:11 | o1a [Some] | semmle.label | o1a [Some] | +| main.rs:309:28:309:29 | r1 [Ok] | semmle.label | r1 [Ok] | | main.rs:309:28:309:34 | r1.ok() [Some] | semmle.label | r1.ok() [Some] | +| main.rs:311:10:311:12 | o1a [Some] | semmle.label | o1a [Some] | | main.rs:311:10:311:21 | o1a.unwrap() | semmle.label | o1a.unwrap() | | main.rs:314:9:314:10 | r2 [Err] | semmle.label | r2 [Err] | | main.rs:314:32:314:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | | main.rs:314:36:314:45 | source(...) | semmle.label | source(...) | | main.rs:316:9:316:11 | o2b [Some] | semmle.label | o2b [Some] | +| main.rs:316:28:316:29 | r2 [Err] | semmle.label | r2 [Err] | | main.rs:316:28:316:35 | r2.err() [Some] | semmle.label | r2.err() [Some] | +| main.rs:318:10:318:12 | o2b [Some] | semmle.label | o2b [Some] | | main.rs:318:10:318:21 | o2b.unwrap() | semmle.label | o2b.unwrap() | | main.rs:322:9:322:10 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:322:32:322:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | @@ -429,10 +482,12 @@ nodes | main.rs:335:9:335:10 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:335:32:335:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | | main.rs:335:35:335:44 | source(...) | semmle.label | source(...) | +| main.rs:336:10:336:11 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:336:10:336:22 | s1.expect(...) | semmle.label | s1.expect(...) | | main.rs:339:9:339:10 | s2 [Err] | semmle.label | s2 [Err] | | main.rs:339:32:339:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | | main.rs:339:36:339:45 | source(...) | semmle.label | source(...) | +| main.rs:341:10:341:11 | s2 [Err] | semmle.label | s2 [Err] | | main.rs:341:10:341:26 | s2.expect_err(...) | semmle.label | s2.expect_err(...) | | main.rs:350:9:350:10 | s1 [A] | semmle.label | s1 [A] | | main.rs:350:14:350:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | @@ -443,6 +498,7 @@ nodes | main.rs:353:35:353:35 | n | semmle.label | n | | main.rs:356:11:356:12 | s1 [A] | semmle.label | s1 [A] | | main.rs:357:9:357:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:357:9:357:45 | ... \| ... [A] | semmle.label | ... \| ... [A] | | main.rs:357:24:357:24 | n | semmle.label | n | | main.rs:357:55:357:55 | n | semmle.label | n | | main.rs:368:9:368:10 | s1 [A] | semmle.label | s1 [A] | @@ -454,6 +510,7 @@ nodes | main.rs:371:22:371:22 | n | semmle.label | n | | main.rs:374:11:374:12 | s1 [A] | semmle.label | s1 [A] | | main.rs:375:9:375:12 | A(...) [A] | semmle.label | A(...) [A] | +| main.rs:375:9:375:19 | ... \| ... [A] | semmle.label | ... \| ... [A] | | main.rs:375:11:375:11 | n | semmle.label | n | | main.rs:375:29:375:29 | n | semmle.label | n | | main.rs:389:9:389:10 | s1 [C] | semmle.label | s1 [C] | @@ -465,6 +522,7 @@ nodes | main.rs:394:48:394:48 | n | semmle.label | n | | main.rs:397:11:397:12 | s1 [C] | semmle.label | s1 [C] | | main.rs:398:9:398:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:398:9:398:71 | ... \| ... [C] | semmle.label | ... \| ... [C] | | main.rs:398:36:398:36 | n | semmle.label | n | | main.rs:398:81:398:81 | n | semmle.label | n | | main.rs:409:9:409:10 | s1 [C] | semmle.label | s1 [C] | @@ -476,6 +534,7 @@ nodes | main.rs:414:34:414:34 | n | semmle.label | n | | main.rs:417:11:417:12 | s1 [C] | semmle.label | s1 [C] | | main.rs:418:9:418:24 | C {...} [C] | semmle.label | C {...} [C] | +| main.rs:418:9:418:43 | ... \| ... [C] | semmle.label | ... \| ... [C] | | main.rs:418:22:418:22 | n | semmle.label | n | | main.rs:418:53:418:53 | n | semmle.label | n | | main.rs:430:9:430:12 | arr1 [element] | semmle.label | arr1 [element] | @@ -522,7 +581,21 @@ nodes | main.rs:497:10:497:10 | s | semmle.label | s | | main.rs:505:9:505:9 | a | semmle.label | a | | main.rs:505:13:505:22 | source(...) | semmle.label | source(...) | +| main.rs:506:9:506:9 | b | semmle.label | b | +| main.rs:506:13:506:13 | a | semmle.label | a | +| main.rs:506:13:506:25 | a.to_string() | semmle.label | a.to_string() | +| main.rs:507:9:507:9 | c | semmle.label | c | +| main.rs:507:13:507:13 | b | semmle.label | b | +| main.rs:507:13:507:28 | b.parse() [Ok] | semmle.label | b.parse() [Ok] | +| main.rs:507:13:507:37 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:508:9:508:9 | d | semmle.label | d | +| main.rs:508:18:508:18 | b | semmle.label | b | +| main.rs:508:18:508:26 | b.parse() [Ok] | semmle.label | b.parse() [Ok] | +| main.rs:508:18:508:35 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:510:10:510:10 | a | semmle.label | a | +| main.rs:511:17:511:17 | b | semmle.label | b | +| main.rs:512:10:512:10 | c | semmle.label | c | +| main.rs:513:10:513:10 | d | semmle.label | d | | main.rs:517:9:517:10 | vs [element] | semmle.label | vs [element] | | main.rs:517:14:517:34 | [...] [element] | semmle.label | [...] [element] | | main.rs:517:15:517:24 | source(...) | semmle.label | source(...) | @@ -538,14 +611,27 @@ nodes | main.rs:544:10:544:18 | vs_mut[0] | semmle.label | vs_mut[0] | | main.rs:554:9:554:9 | a | semmle.label | a | | main.rs:554:13:554:22 | source(...) | semmle.label | source(...) | +| main.rs:555:9:555:9 | b | semmle.label | b | +| main.rs:555:13:555:22 | source(...) | semmle.label | source(...) | | main.rs:556:9:556:9 | c | semmle.label | c | | main.rs:556:13:556:22 | source(...) | semmle.label | source(...) | | main.rs:557:9:557:13 | c_ref [&ref] | semmle.label | c_ref [&ref] | | main.rs:557:17:557:18 | &c [&ref] | semmle.label | &c [&ref] | | main.rs:557:18:557:18 | c | semmle.label | c | | main.rs:559:10:559:10 | a | semmle.label | a | +| main.rs:560:14:560:15 | &b | semmle.label | &b | +| main.rs:560:15:560:15 | b | semmle.label | b | +| main.rs:561:14:561:18 | c_ref | semmle.label | c_ref | | main.rs:562:10:562:15 | * ... | semmle.label | * ... | | main.rs:562:11:562:15 | c_ref [&ref] | semmle.label | c_ref [&ref] | +| main.rs:566:9:566:9 | a | semmle.label | a | +| main.rs:566:18:566:27 | source(...) | semmle.label | source(...) | +| main.rs:568:10:568:17 | a as i64 | semmle.label | a as i64 | +| main.rs:572:9:572:9 | b | semmle.label | b | +| main.rs:572:18:572:27 | source(...) | semmle.label | source(...) | +| main.rs:574:10:574:17 | b as i64 | semmle.label | b as i64 | +| main.rs:576:10:576:21 | ...::from(...) | semmle.label | ...::from(...) | +| main.rs:576:20:576:20 | b | semmle.label | b | subpaths testFailures #select @@ -607,8 +693,16 @@ testFailures | main.rs:473:10:473:19 | mut_arr[0] | main.rs:470:18:470:27 | source(...) | main.rs:473:10:473:19 | mut_arr[0] | $@ | main.rs:470:18:470:27 | source(...) | source(...) | | main.rs:497:10:497:10 | s | main.rs:496:25:496:26 | source(...) | main.rs:497:10:497:10 | s | $@ | main.rs:496:25:496:26 | source(...) | source(...) | | main.rs:510:10:510:10 | a | main.rs:505:13:505:22 | source(...) | main.rs:510:10:510:10 | a | $@ | main.rs:505:13:505:22 | source(...) | source(...) | +| main.rs:511:17:511:17 | b | main.rs:505:13:505:22 | source(...) | main.rs:511:17:511:17 | b | $@ | main.rs:505:13:505:22 | source(...) | source(...) | +| main.rs:512:10:512:10 | c | main.rs:505:13:505:22 | source(...) | main.rs:512:10:512:10 | c | $@ | main.rs:505:13:505:22 | source(...) | source(...) | +| main.rs:513:10:513:10 | d | main.rs:505:13:505:22 | source(...) | main.rs:513:10:513:10 | d | $@ | main.rs:505:13:505:22 | source(...) | source(...) | | main.rs:519:10:519:14 | vs[0] | main.rs:517:15:517:24 | source(...) | main.rs:519:10:519:14 | vs[0] | $@ | main.rs:517:15:517:24 | source(...) | source(...) | | main.rs:524:14:524:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:524:14:524:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | | main.rs:544:10:544:18 | vs_mut[0] | main.rs:542:23:542:32 | source(...) | main.rs:544:10:544:18 | vs_mut[0] | $@ | main.rs:542:23:542:32 | source(...) | source(...) | | main.rs:559:10:559:10 | a | main.rs:554:13:554:22 | source(...) | main.rs:559:10:559:10 | a | $@ | main.rs:554:13:554:22 | source(...) | source(...) | +| main.rs:560:14:560:15 | &b | main.rs:555:13:555:22 | source(...) | main.rs:560:14:560:15 | &b | $@ | main.rs:555:13:555:22 | source(...) | source(...) | +| main.rs:561:14:561:18 | c_ref | main.rs:556:13:556:22 | source(...) | main.rs:561:14:561:18 | c_ref | $@ | main.rs:556:13:556:22 | source(...) | source(...) | | main.rs:562:10:562:15 | * ... | main.rs:556:13:556:22 | source(...) | main.rs:562:10:562:15 | * ... | $@ | main.rs:556:13:556:22 | source(...) | source(...) | +| main.rs:568:10:568:17 | a as i64 | main.rs:566:18:566:27 | source(...) | main.rs:568:10:568:17 | a as i64 | $@ | main.rs:566:18:566:27 | source(...) | source(...) | +| main.rs:574:10:574:17 | b as i64 | main.rs:572:18:572:27 | source(...) | main.rs:574:10:574:17 | b as i64 | $@ | main.rs:572:18:572:27 | source(...) | source(...) | +| main.rs:576:10:576:21 | ...::from(...) | main.rs:572:18:572:27 | source(...) | main.rs:576:10:576:21 | ...::from(...) | $@ | main.rs:572:18:572:27 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.ql b/rust/ql/test/library-tests/dataflow/local/inline-flow.ql index e399ea0e5d7..5dcb7ee70a9 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.ql +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.ql @@ -5,8 +5,8 @@ import rust import utils.test.InlineFlowTest import DefaultFlowTest -import ValueFlow::PathGraph +import TaintFlow::PathGraph -from ValueFlow::PathNode source, ValueFlow::PathNode sink -where ValueFlow::flowPath(source, sink) +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected index 3a9e28258d5..043809e6339 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected @@ -1,54 +1,67 @@ models -| 1 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: ::into_pin; Argument[0]; ReturnValue; value | -| 3 | Summary: ::new; Argument[0]; ReturnValue.Reference; value | -| 4 | Summary: ::pin; Argument[0]; ReturnValue.Reference; value | -| 5 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | -| 6 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 7 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | -| 8 | Summary: ::into_inner; Argument[0]; ReturnValue; value | -| 9 | Summary: ::into_inner_unchecked; Argument[0]; ReturnValue; value | -| 10 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 11 | Summary: ::new; Argument[0]; ReturnValue; value | -| 12 | Summary: ::new_unchecked; Argument[0].Reference; ReturnValue; value | -| 13 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 14 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value | -| 15 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value | +| 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | +| 2 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 3 | Summary: <_ as core::cmp::Ord>::clamp; Argument[self,0,1]; ReturnValue; value | +| 4 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | +| 5 | Summary: <_ as core::cmp::Ord>::min; Argument[self,0]; ReturnValue; value | +| 6 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | +| 7 | Summary: <_ as core::ops::arith::Add>::add; Argument[0]; ReturnValue; taint | +| 8 | Summary: ::into_pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 9 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | +| 10 | Summary: ::pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; value | +| 11 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 12 | Summary: ::map_or; Argument[1].ReturnValue; ReturnValue; value | +| 13 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | +| 15 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | +| 16 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Reference; ReturnValue.Reference; value | +| 17 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 18 | Summary: ::into_inner_unchecked; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 19 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 20 | Summary: ::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 21 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 22 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value | +| 23 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value | edges -| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:6 | +| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:10 | a [Some] | provenance | | | main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | | | main.rs:12:13:12:28 | Some(...) [Some] | main.rs:12:9:12:9 | a [Some] | provenance | | | main.rs:12:18:12:27 | source(...) | main.rs:12:13:12:28 | Some(...) [Some] | provenance | | -| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:6 | -| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:1 | +| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:13 | +| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:10 | b [Some] | provenance | | +| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:2 | | main.rs:14:13:14:21 | a.clone() [Some] | main.rs:14:9:14:9 | b [Some] | provenance | | -| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:13 | +| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:13 | +| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:10 | a [Ok] | provenance | | | main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | | | main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | | | main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | | -| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:13 | -| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:1 | +| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:21 | +| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:10 | b [Ok] | provenance | | +| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:2 | | main.rs:21:13:21:21 | a.clone() [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | | +| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:21 | | main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | | | main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:1 | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:5 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:2 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:11 | | main.rs:28:13:28:21 | a.clone() | main.rs:28:9:28:9 | b | provenance | | -| main.rs:43:18:43:22 | SelfParam [Wrapper] | main.rs:44:26:44:29 | self [Wrapper] | provenance | | +| main.rs:43:18:43:22 | SelfParam [&ref, Wrapper] | main.rs:44:26:44:29 | self [&ref, Wrapper] | provenance | | | main.rs:44:13:44:33 | Wrapper {...} [Wrapper] | main.rs:43:33:45:9 | { ... } [Wrapper] | provenance | | -| main.rs:44:26:44:29 | self [Wrapper] | main.rs:44:26:44:31 | self.n | provenance | | +| main.rs:44:26:44:29 | self [&ref, Wrapper] | main.rs:44:26:44:31 | self.n | provenance | | | main.rs:44:26:44:31 | self.n | main.rs:44:13:44:33 | Wrapper {...} [Wrapper] | provenance | | | main.rs:49:13:49:13 | w [Wrapper] | main.rs:50:15:50:15 | w [Wrapper] | provenance | | | main.rs:49:17:49:41 | Wrapper {...} [Wrapper] | main.rs:49:13:49:13 | w [Wrapper] | provenance | | | main.rs:49:30:49:39 | source(...) | main.rs:49:17:49:41 | Wrapper {...} [Wrapper] | provenance | | -| main.rs:50:15:50:15 | w [Wrapper] | main.rs:43:18:43:22 | SelfParam [Wrapper] | provenance | | | main.rs:50:15:50:15 | w [Wrapper] | main.rs:51:13:51:28 | Wrapper {...} [Wrapper] | provenance | | -| main.rs:50:15:50:15 | w [Wrapper] | main.rs:53:17:53:25 | w.clone() [Wrapper] | provenance | | +| main.rs:50:15:50:15 | w [Wrapper] | main.rs:53:17:53:17 | w [Wrapper] | provenance | | | main.rs:51:13:51:28 | Wrapper {...} [Wrapper] | main.rs:51:26:51:26 | n | provenance | | | main.rs:51:26:51:26 | n | main.rs:51:38:51:38 | n | provenance | | | main.rs:53:13:53:13 | u [Wrapper] | main.rs:54:15:54:15 | u [Wrapper] | provenance | | +| main.rs:53:17:53:17 | w [Wrapper] | main.rs:43:18:43:22 | SelfParam [&ref, Wrapper] | provenance | | +| main.rs:53:17:53:17 | w [Wrapper] | main.rs:53:17:53:25 | w.clone() [Wrapper] | provenance | | | main.rs:53:17:53:25 | w.clone() [Wrapper] | main.rs:53:13:53:13 | u [Wrapper] | provenance | | | main.rs:54:15:54:15 | u [Wrapper] | main.rs:55:13:55:28 | Wrapper {...} [Wrapper] | provenance | | | main.rs:55:13:55:28 | Wrapper {...} [Wrapper] | main.rs:55:26:55:26 | n | provenance | | @@ -58,72 +71,115 @@ edges | main.rs:66:22:66:31 | source(...) | main.rs:66:17:66:32 | Some(...) [Some] | provenance | | | main.rs:67:13:67:13 | z [Some, tuple.1] | main.rs:68:15:68:15 | z [Some, tuple.1] | provenance | | | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | main.rs:67:13:67:13 | z [Some, tuple.1] | provenance | | -| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:7 | +| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:14 | | main.rs:68:15:68:15 | z [Some, tuple.1] | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | provenance | | | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | main.rs:69:18:69:23 | TuplePat [tuple.1] | provenance | | | main.rs:69:18:69:23 | TuplePat [tuple.1] | main.rs:69:22:69:22 | m | provenance | | | main.rs:69:22:69:22 | m | main.rs:71:22:71:22 | m | provenance | | +| main.rs:79:13:79:13 | b | main.rs:80:14:80:14 | b | provenance | | +| main.rs:79:17:79:47 | a.map_or(...) | main.rs:79:13:79:13 | b | provenance | | +| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:12 | +| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:6 | +| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:7 | | main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | | -| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:15 | -| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:14 | +| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:23 | +| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:22 | | main.rs:108:13:108:17 | mut i | main.rs:109:34:109:34 | i | provenance | | | main.rs:108:13:108:17 | mut i | main.rs:110:33:110:33 | i | provenance | | | main.rs:108:13:108:17 | mut i | main.rs:111:47:111:47 | i | provenance | | +| main.rs:108:13:108:17 | mut i | main.rs:112:24:112:27 | mut pinned | provenance | | | main.rs:108:13:108:17 | mut i | main.rs:113:14:113:14 | i | provenance | | | main.rs:108:21:108:30 | source(...) | main.rs:108:13:108:17 | mut i | provenance | | -| main.rs:109:13:109:20 | mut pin1 [&ref] | main.rs:114:15:114:18 | pin1 [&ref] | provenance | | -| main.rs:109:13:109:20 | mut pin1 [&ref] | main.rs:115:31:115:34 | pin1 [&ref] | provenance | | -| main.rs:109:24:109:35 | ...::new(...) [&ref] | main.rs:109:13:109:20 | mut pin1 [&ref] | provenance | | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [&ref] | provenance | MaD:11 | +| main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | main.rs:114:15:114:18 | pin1 [Pin, &ref] | provenance | | +| main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | main.rs:115:31:115:34 | pin1 [Pin, &ref] | provenance | | +| main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | provenance | | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:19 | | main.rs:109:34:109:34 | i | main.rs:109:33:109:34 | &i [&ref] | provenance | | -| main.rs:110:13:110:20 | mut pin2 [&ref] | main.rs:116:15:116:18 | pin2 [&ref] | provenance | | -| main.rs:110:24:110:34 | ...::pin(...) [&ref] | main.rs:110:13:110:20 | mut pin2 [&ref] | provenance | | -| main.rs:110:33:110:33 | i | main.rs:110:24:110:34 | ...::pin(...) [&ref] | provenance | MaD:4 | -| main.rs:111:13:111:20 | mut pin3 [&ref] | main.rs:117:15:117:18 | pin3 [&ref] | provenance | | -| main.rs:111:24:111:49 | ...::into_pin(...) [&ref] | main.rs:111:13:111:20 | mut pin3 [&ref] | provenance | | -| main.rs:111:38:111:48 | ...::new(...) [&ref] | main.rs:111:24:111:49 | ...::into_pin(...) [&ref] | provenance | MaD:2 | -| main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [&ref] | provenance | MaD:3 | -| main.rs:114:15:114:18 | pin1 [&ref] | main.rs:114:14:114:18 | * ... | provenance | | -| main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | main.rs:115:14:115:35 | * ... | provenance | | -| main.rs:115:31:115:34 | pin1 [&ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:8 | -| main.rs:116:15:116:18 | pin2 [&ref] | main.rs:116:14:116:18 | * ... | provenance | | -| main.rs:117:15:117:18 | pin3 [&ref] | main.rs:117:14:117:18 | * ... | provenance | | +| main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | provenance | | +| main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | provenance | | +| main.rs:110:33:110:33 | i | main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | provenance | MaD:10 | +| main.rs:111:13:111:20 | mut pin3 [Pin, Box(0)] | main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | provenance | | +| main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | main.rs:111:13:111:20 | mut pin3 [Pin, Box(0)] | provenance | | +| main.rs:111:38:111:48 | ...::new(...) [Box(0)] | main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | provenance | MaD:8 | +| main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | provenance | MaD:9 | +| main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | main.rs:118:15:118:18 | pin4 [Pin, &ref] | provenance | | +| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:20 | +| main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | provenance | | +| main.rs:112:24:112:27 | mut pinned | main.rs:112:24:112:27 | pinned | provenance | | +| main.rs:112:24:112:27 | pinned | main.rs:112:24:112:27 | &mut pinned [&ref] | provenance | | +| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:16 | +| main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | main.rs:115:14:115:35 | * ... | provenance | MaD:1 | +| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:17 | +| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | main.rs:116:14:116:18 | * ... | provenance | MaD:15 | +| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | main.rs:117:14:117:18 | * ... | provenance | MaD:15 | +| main.rs:118:15:118:18 | pin4 [Pin, &ref] | main.rs:118:14:118:18 | * ... | provenance | MaD:16 | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:123:34:123:35 | ms [MyStruct] | provenance | | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:127:14:127:15 | ms [MyStruct] | provenance | | | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | main.rs:122:13:122:18 | mut ms [MyStruct] | provenance | | | main.rs:122:38:122:47 | source(...) | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | provenance | | -| main.rs:123:13:123:20 | mut pin1 [MyStruct] | main.rs:129:30:129:33 | pin1 [MyStruct] | provenance | | -| main.rs:123:24:123:36 | ...::new(...) [MyStruct] | main.rs:123:13:123:20 | mut pin1 [MyStruct] | provenance | | -| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [MyStruct] | provenance | MaD:10 | +| main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | provenance | | +| main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | provenance | | +| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | provenance | MaD:19 | | main.rs:123:34:123:35 | ms [MyStruct] | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | provenance | | | main.rs:127:14:127:15 | ms [MyStruct] | main.rs:127:14:127:19 | ms.val | provenance | | -| main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | | -| main.rs:129:30:129:33 | pin1 [MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | provenance | MaD:8 | +| main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | | +| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | provenance | MaD:17 | | main.rs:136:13:136:18 | mut ms [MyStruct] | main.rs:137:44:137:45 | ms [MyStruct] | provenance | | | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | main.rs:136:13:136:18 | mut ms [MyStruct] | provenance | | | main.rs:136:38:136:47 | source(...) | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | provenance | | -| main.rs:137:13:137:20 | mut pin5 [MyStruct] | main.rs:139:40:139:43 | pin5 [MyStruct] | provenance | | -| main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | main.rs:137:13:137:20 | mut pin5 [MyStruct] | provenance | | -| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | provenance | MaD:12 | +| main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | provenance | | +| main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | provenance | | +| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | provenance | MaD:20 | | main.rs:137:44:137:45 | ms [MyStruct] | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | provenance | | -| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | | -| main.rs:139:40:139:43 | pin5 [MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | provenance | MaD:9 | +| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | | +| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | provenance | MaD:18 | +| main.rs:153:9:153:9 | a | main.rs:155:13:155:13 | a | provenance | | +| main.rs:153:13:153:22 | source(...) | main.rs:153:9:153:9 | a | provenance | | +| main.rs:154:9:154:9 | b | main.rs:155:19:155:19 | b | provenance | | +| main.rs:154:13:154:22 | source(...) | main.rs:154:9:154:9 | b | provenance | | +| main.rs:155:9:155:9 | c | main.rs:156:10:156:10 | c | provenance | | +| main.rs:155:13:155:13 | a | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:5 | +| main.rs:155:13:155:20 | a.min(...) | main.rs:155:9:155:9 | c | provenance | | +| main.rs:155:19:155:19 | b | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:5 | +| main.rs:158:9:158:9 | d | main.rs:160:13:160:13 | d | provenance | | +| main.rs:158:13:158:22 | source(...) | main.rs:158:9:158:9 | d | provenance | | +| main.rs:159:9:159:9 | e | main.rs:160:19:160:19 | e | provenance | | +| main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | e | provenance | | +| main.rs:160:9:160:9 | f | main.rs:161:10:161:10 | f | provenance | | +| main.rs:160:13:160:13 | d | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:4 | +| main.rs:160:13:160:20 | d.max(...) | main.rs:160:9:160:9 | f | provenance | | +| main.rs:160:19:160:19 | e | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:4 | +| main.rs:163:9:163:9 | g | main.rs:166:13:166:13 | g | provenance | | +| main.rs:163:13:163:22 | source(...) | main.rs:163:9:163:9 | g | provenance | | +| main.rs:164:9:164:9 | h | main.rs:166:21:166:21 | h | provenance | | +| main.rs:164:13:164:22 | source(...) | main.rs:164:9:164:9 | h | provenance | | +| main.rs:165:9:165:9 | i | main.rs:166:24:166:24 | i | provenance | | +| main.rs:165:13:165:22 | source(...) | main.rs:165:9:165:9 | i | provenance | | +| main.rs:166:9:166:9 | j | main.rs:167:10:167:10 | j | provenance | | +| main.rs:166:13:166:13 | g | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:3 | +| main.rs:166:13:166:25 | g.clamp(...) | main.rs:166:9:166:9 | j | provenance | | +| main.rs:166:21:166:21 | h | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:3 | +| main.rs:166:24:166:24 | i | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:3 | nodes | main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] | | main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:12:18:12:27 | source(...) | semmle.label | source(...) | +| main.rs:13:10:13:10 | a [Some] | semmle.label | a [Some] | | main.rs:13:10:13:19 | a.unwrap() | semmle.label | a.unwrap() | | main.rs:14:9:14:9 | b [Some] | semmle.label | b [Some] | | main.rs:14:13:14:13 | a [Some] | semmle.label | a [Some] | | main.rs:14:13:14:21 | a.clone() [Some] | semmle.label | a.clone() [Some] | +| main.rs:15:10:15:10 | b [Some] | semmle.label | b [Some] | | main.rs:15:10:15:19 | b.unwrap() | semmle.label | b.unwrap() | | main.rs:19:9:19:9 | a [Ok] | semmle.label | a [Ok] | | main.rs:19:31:19:44 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | | main.rs:19:34:19:43 | source(...) | semmle.label | source(...) | +| main.rs:20:10:20:10 | a [Ok] | semmle.label | a [Ok] | | main.rs:20:10:20:19 | a.unwrap() | semmle.label | a.unwrap() | | main.rs:21:9:21:9 | b [Ok] | semmle.label | b [Ok] | | main.rs:21:13:21:13 | a [Ok] | semmle.label | a [Ok] | | main.rs:21:13:21:21 | a.clone() [Ok] | semmle.label | a.clone() [Ok] | +| main.rs:22:10:22:10 | b [Ok] | semmle.label | b [Ok] | | main.rs:22:10:22:19 | b.unwrap() | semmle.label | b.unwrap() | | main.rs:26:9:26:9 | a | semmle.label | a | | main.rs:26:13:26:22 | source(...) | semmle.label | source(...) | @@ -132,10 +188,10 @@ nodes | main.rs:28:13:28:13 | a | semmle.label | a | | main.rs:28:13:28:21 | a.clone() | semmle.label | a.clone() | | main.rs:29:10:29:10 | b | semmle.label | b | -| main.rs:43:18:43:22 | SelfParam [Wrapper] | semmle.label | SelfParam [Wrapper] | +| main.rs:43:18:43:22 | SelfParam [&ref, Wrapper] | semmle.label | SelfParam [&ref, Wrapper] | | main.rs:43:33:45:9 | { ... } [Wrapper] | semmle.label | { ... } [Wrapper] | | main.rs:44:13:44:33 | Wrapper {...} [Wrapper] | semmle.label | Wrapper {...} [Wrapper] | -| main.rs:44:26:44:29 | self [Wrapper] | semmle.label | self [Wrapper] | +| main.rs:44:26:44:29 | self [&ref, Wrapper] | semmle.label | self [&ref, Wrapper] | | main.rs:44:26:44:31 | self.n | semmle.label | self.n | | main.rs:49:13:49:13 | w [Wrapper] | semmle.label | w [Wrapper] | | main.rs:49:17:49:41 | Wrapper {...} [Wrapper] | semmle.label | Wrapper {...} [Wrapper] | @@ -145,6 +201,7 @@ nodes | main.rs:51:26:51:26 | n | semmle.label | n | | main.rs:51:38:51:38 | n | semmle.label | n | | main.rs:53:13:53:13 | u [Wrapper] | semmle.label | u [Wrapper] | +| main.rs:53:17:53:17 | w [Wrapper] | semmle.label | w [Wrapper] | | main.rs:53:17:53:25 | w.clone() [Wrapper] | semmle.label | w.clone() [Wrapper] | | main.rs:54:15:54:15 | u [Wrapper] | semmle.label | u [Wrapper] | | main.rs:55:13:55:28 | Wrapper {...} [Wrapper] | semmle.label | Wrapper {...} [Wrapper] | @@ -161,57 +218,99 @@ nodes | main.rs:69:18:69:23 | TuplePat [tuple.1] | semmle.label | TuplePat [tuple.1] | | main.rs:69:22:69:22 | m | semmle.label | m | | main.rs:71:22:71:22 | m | semmle.label | m | +| main.rs:79:13:79:13 | b | semmle.label | b | +| main.rs:79:17:79:47 | a.map_or(...) | semmle.label | a.map_or(...) | +| main.rs:79:33:79:46 | ... + ... | semmle.label | ... + ... | +| main.rs:79:37:79:46 | source(...) | semmle.label | source(...) | +| main.rs:80:14:80:14 | b | semmle.label | b | | main.rs:92:29:92:29 | [post] y [&ref] | semmle.label | [post] y [&ref] | | main.rs:92:32:92:41 | source(...) | semmle.label | source(...) | | main.rs:93:18:93:34 | ...::read(...) | semmle.label | ...::read(...) | | main.rs:93:33:93:33 | y [&ref] | semmle.label | y [&ref] | | main.rs:108:13:108:17 | mut i | semmle.label | mut i | | main.rs:108:21:108:30 | source(...) | semmle.label | source(...) | -| main.rs:109:13:109:20 | mut pin1 [&ref] | semmle.label | mut pin1 [&ref] | -| main.rs:109:24:109:35 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | semmle.label | mut pin1 [Pin, &ref] | +| main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | | main.rs:109:33:109:34 | &i [&ref] | semmle.label | &i [&ref] | | main.rs:109:34:109:34 | i | semmle.label | i | -| main.rs:110:13:110:20 | mut pin2 [&ref] | semmle.label | mut pin2 [&ref] | -| main.rs:110:24:110:34 | ...::pin(...) [&ref] | semmle.label | ...::pin(...) [&ref] | +| main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | semmle.label | mut pin2 [Pin, Box(0)] | +| main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | semmle.label | ...::pin(...) [Pin, Box(0)] | | main.rs:110:33:110:33 | i | semmle.label | i | -| main.rs:111:13:111:20 | mut pin3 [&ref] | semmle.label | mut pin3 [&ref] | -| main.rs:111:24:111:49 | ...::into_pin(...) [&ref] | semmle.label | ...::into_pin(...) [&ref] | -| main.rs:111:38:111:48 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| main.rs:111:13:111:20 | mut pin3 [Pin, Box(0)] | semmle.label | mut pin3 [Pin, Box(0)] | +| main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | semmle.label | ...::into_pin(...) [Pin, Box(0)] | +| main.rs:111:38:111:48 | ...::new(...) [Box(0)] | semmle.label | ...::new(...) [Box(0)] | | main.rs:111:47:111:47 | i | semmle.label | i | +| main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | semmle.label | mut pin4 [Pin, &ref] | +| main.rs:112:24:112:27 | &mut pinned [&ref] | semmle.label | &mut pinned [&ref] | +| main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | semmle.label | ...::new_unchecked(...) [Pin, &ref] | +| main.rs:112:24:112:27 | mut pinned | semmle.label | mut pinned | +| main.rs:112:24:112:27 | pinned | semmle.label | pinned | | main.rs:113:14:113:14 | i | semmle.label | i | | main.rs:114:14:114:18 | * ... | semmle.label | * ... | -| main.rs:114:15:114:18 | pin1 [&ref] | semmle.label | pin1 [&ref] | +| main.rs:114:15:114:18 | pin1 [Pin, &ref] | semmle.label | pin1 [Pin, &ref] | | main.rs:115:14:115:35 | * ... | semmle.label | * ... | | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | semmle.label | ...::into_inner(...) [&ref] | -| main.rs:115:31:115:34 | pin1 [&ref] | semmle.label | pin1 [&ref] | +| main.rs:115:31:115:34 | pin1 [Pin, &ref] | semmle.label | pin1 [Pin, &ref] | | main.rs:116:14:116:18 | * ... | semmle.label | * ... | -| main.rs:116:15:116:18 | pin2 [&ref] | semmle.label | pin2 [&ref] | +| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | semmle.label | pin2 [Pin, Box(0)] | | main.rs:117:14:117:18 | * ... | semmle.label | * ... | -| main.rs:117:15:117:18 | pin3 [&ref] | semmle.label | pin3 [&ref] | +| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | semmle.label | pin3 [Pin, Box(0)] | +| main.rs:118:14:118:18 | * ... | semmle.label | * ... | +| main.rs:118:15:118:18 | pin4 [Pin, &ref] | semmle.label | pin4 [Pin, &ref] | | main.rs:122:13:122:18 | mut ms [MyStruct] | semmle.label | mut ms [MyStruct] | | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | semmle.label | MyStruct {...} [MyStruct] | | main.rs:122:38:122:47 | source(...) | semmle.label | source(...) | -| main.rs:123:13:123:20 | mut pin1 [MyStruct] | semmle.label | mut pin1 [MyStruct] | -| main.rs:123:24:123:36 | ...::new(...) [MyStruct] | semmle.label | ...::new(...) [MyStruct] | +| main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | semmle.label | mut pin1 [Pin, &ref, MyStruct] | +| main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | semmle.label | ...::new(...) [Pin, &ref, MyStruct] | | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | semmle.label | &ms [&ref, MyStruct] | | main.rs:123:34:123:35 | ms [MyStruct] | semmle.label | ms [MyStruct] | | main.rs:127:14:127:15 | ms [MyStruct] | semmle.label | ms [MyStruct] | | main.rs:127:14:127:19 | ms.val | semmle.label | ms.val | -| main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | semmle.label | ...::into_inner(...) [MyStruct] | +| main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | semmle.label | ...::into_inner(...) [&ref, MyStruct] | | main.rs:129:14:129:38 | ... .val | semmle.label | ... .val | -| main.rs:129:30:129:33 | pin1 [MyStruct] | semmle.label | pin1 [MyStruct] | +| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | semmle.label | pin1 [Pin, &ref, MyStruct] | | main.rs:136:13:136:18 | mut ms [MyStruct] | semmle.label | mut ms [MyStruct] | | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | semmle.label | MyStruct {...} [MyStruct] | | main.rs:136:38:136:47 | source(...) | semmle.label | source(...) | -| main.rs:137:13:137:20 | mut pin5 [MyStruct] | semmle.label | mut pin5 [MyStruct] | -| main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | semmle.label | ...::new_unchecked(...) [MyStruct] | +| main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | semmle.label | mut pin5 [Pin, &ref, MyStruct] | +| main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | semmle.label | ...::new_unchecked(...) [Pin, &ref, MyStruct] | | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | semmle.label | &ms [&ref, MyStruct] | | main.rs:137:44:137:45 | ms [MyStruct] | semmle.label | ms [MyStruct] | -| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | semmle.label | ...::into_inner_unchecked(...) [MyStruct] | +| main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | semmle.label | ...::into_inner_unchecked(...) [&ref, MyStruct] | | main.rs:139:14:139:48 | ... .val | semmle.label | ... .val | -| main.rs:139:40:139:43 | pin5 [MyStruct] | semmle.label | pin5 [MyStruct] | +| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | semmle.label | pin5 [Pin, &ref, MyStruct] | +| main.rs:153:9:153:9 | a | semmle.label | a | +| main.rs:153:13:153:22 | source(...) | semmle.label | source(...) | +| main.rs:154:9:154:9 | b | semmle.label | b | +| main.rs:154:13:154:22 | source(...) | semmle.label | source(...) | +| main.rs:155:9:155:9 | c | semmle.label | c | +| main.rs:155:13:155:13 | a | semmle.label | a | +| main.rs:155:13:155:20 | a.min(...) | semmle.label | a.min(...) | +| main.rs:155:19:155:19 | b | semmle.label | b | +| main.rs:156:10:156:10 | c | semmle.label | c | +| main.rs:158:9:158:9 | d | semmle.label | d | +| main.rs:158:13:158:22 | source(...) | semmle.label | source(...) | +| main.rs:159:9:159:9 | e | semmle.label | e | +| main.rs:159:13:159:22 | source(...) | semmle.label | source(...) | +| main.rs:160:9:160:9 | f | semmle.label | f | +| main.rs:160:13:160:13 | d | semmle.label | d | +| main.rs:160:13:160:20 | d.max(...) | semmle.label | d.max(...) | +| main.rs:160:19:160:19 | e | semmle.label | e | +| main.rs:161:10:161:10 | f | semmle.label | f | +| main.rs:163:9:163:9 | g | semmle.label | g | +| main.rs:163:13:163:22 | source(...) | semmle.label | source(...) | +| main.rs:164:9:164:9 | h | semmle.label | h | +| main.rs:164:13:164:22 | source(...) | semmle.label | source(...) | +| main.rs:165:9:165:9 | i | semmle.label | i | +| main.rs:165:13:165:22 | source(...) | semmle.label | source(...) | +| main.rs:166:9:166:9 | j | semmle.label | j | +| main.rs:166:13:166:13 | g | semmle.label | g | +| main.rs:166:13:166:25 | g.clamp(...) | semmle.label | g.clamp(...) | +| main.rs:166:21:166:21 | h | semmle.label | h | +| main.rs:166:24:166:24 | i | semmle.label | i | +| main.rs:167:10:167:10 | j | semmle.label | j | subpaths -| main.rs:50:15:50:15 | w [Wrapper] | main.rs:43:18:43:22 | SelfParam [Wrapper] | main.rs:43:33:45:9 | { ... } [Wrapper] | main.rs:53:17:53:25 | w.clone() [Wrapper] | +| main.rs:53:17:53:17 | w [Wrapper] | main.rs:43:18:43:22 | SelfParam [&ref, Wrapper] | main.rs:43:33:45:9 | { ... } [Wrapper] | main.rs:53:17:53:25 | w.clone() [Wrapper] | testFailures #select | main.rs:13:10:13:19 | a.unwrap() | main.rs:12:18:12:27 | source(...) | main.rs:13:10:13:19 | a.unwrap() | $@ | main.rs:12:18:12:27 | source(...) | source(...) | @@ -223,12 +322,21 @@ testFailures | main.rs:51:38:51:38 | n | main.rs:49:30:49:39 | source(...) | main.rs:51:38:51:38 | n | $@ | main.rs:49:30:49:39 | source(...) | source(...) | | main.rs:55:38:55:38 | n | main.rs:49:30:49:39 | source(...) | main.rs:55:38:55:38 | n | $@ | main.rs:49:30:49:39 | source(...) | source(...) | | main.rs:71:22:71:22 | m | main.rs:66:22:66:31 | source(...) | main.rs:71:22:71:22 | m | $@ | main.rs:66:22:66:31 | source(...) | source(...) | +| main.rs:80:14:80:14 | b | main.rs:79:37:79:46 | source(...) | main.rs:80:14:80:14 | b | $@ | main.rs:79:37:79:46 | source(...) | source(...) | | main.rs:93:18:93:34 | ...::read(...) | main.rs:92:32:92:41 | source(...) | main.rs:93:18:93:34 | ...::read(...) | $@ | main.rs:92:32:92:41 | source(...) | source(...) | | main.rs:113:14:113:14 | i | main.rs:108:21:108:30 | source(...) | main.rs:113:14:113:14 | i | $@ | main.rs:108:21:108:30 | source(...) | source(...) | | main.rs:114:14:114:18 | * ... | main.rs:108:21:108:30 | source(...) | main.rs:114:14:114:18 | * ... | $@ | main.rs:108:21:108:30 | source(...) | source(...) | | main.rs:115:14:115:35 | * ... | main.rs:108:21:108:30 | source(...) | main.rs:115:14:115:35 | * ... | $@ | main.rs:108:21:108:30 | source(...) | source(...) | | main.rs:116:14:116:18 | * ... | main.rs:108:21:108:30 | source(...) | main.rs:116:14:116:18 | * ... | $@ | main.rs:108:21:108:30 | source(...) | source(...) | | main.rs:117:14:117:18 | * ... | main.rs:108:21:108:30 | source(...) | main.rs:117:14:117:18 | * ... | $@ | main.rs:108:21:108:30 | source(...) | source(...) | +| main.rs:118:14:118:18 | * ... | main.rs:108:21:108:30 | source(...) | main.rs:118:14:118:18 | * ... | $@ | main.rs:108:21:108:30 | source(...) | source(...) | | main.rs:127:14:127:19 | ms.val | main.rs:122:38:122:47 | source(...) | main.rs:127:14:127:19 | ms.val | $@ | main.rs:122:38:122:47 | source(...) | source(...) | | main.rs:129:14:129:38 | ... .val | main.rs:122:38:122:47 | source(...) | main.rs:129:14:129:38 | ... .val | $@ | main.rs:122:38:122:47 | source(...) | source(...) | | main.rs:139:14:139:48 | ... .val | main.rs:136:38:136:47 | source(...) | main.rs:139:14:139:48 | ... .val | $@ | main.rs:136:38:136:47 | source(...) | source(...) | +| main.rs:156:10:156:10 | c | main.rs:153:13:153:22 | source(...) | main.rs:156:10:156:10 | c | $@ | main.rs:153:13:153:22 | source(...) | source(...) | +| main.rs:156:10:156:10 | c | main.rs:154:13:154:22 | source(...) | main.rs:156:10:156:10 | c | $@ | main.rs:154:13:154:22 | source(...) | source(...) | +| main.rs:161:10:161:10 | f | main.rs:158:13:158:22 | source(...) | main.rs:161:10:161:10 | f | $@ | main.rs:158:13:158:22 | source(...) | source(...) | +| main.rs:161:10:161:10 | f | main.rs:159:13:159:22 | source(...) | main.rs:161:10:161:10 | f | $@ | main.rs:159:13:159:22 | source(...) | source(...) | +| main.rs:167:10:167:10 | j | main.rs:163:13:163:22 | source(...) | main.rs:167:10:167:10 | j | $@ | main.rs:163:13:163:22 | source(...) | source(...) | +| main.rs:167:10:167:10 | j | main.rs:164:13:164:22 | source(...) | main.rs:167:10:167:10 | j | $@ | main.rs:164:13:164:22 | source(...) | source(...) | +| main.rs:167:10:167:10 | j | main.rs:165:13:165:22 | source(...) | main.rs:167:10:167:10 | j | $@ | main.rs:165:13:165:22 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.ql b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.ql index e399ea0e5d7..5dcb7ee70a9 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.ql +++ b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.ql @@ -5,8 +5,8 @@ import rust import utils.test.InlineFlowTest import DefaultFlowTest -import ValueFlow::PathGraph +import TaintFlow::PathGraph -from ValueFlow::PathNode source, ValueFlow::PathNode sink -where ValueFlow::flowPath(source, sink) +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/modeled/main.rs b/rust/ql/test/library-tests/dataflow/modeled/main.rs index 66a92878226..09943a81b8a 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/main.rs +++ b/rust/ql/test/library-tests/dataflow/modeled/main.rs @@ -115,7 +115,7 @@ fn test_pin() { sink(*Pin::into_inner(pin1)); // $ hasValueFlow=40 sink(*pin2); // $ hasValueFlow=40 sink(*pin3); // $ hasValueFlow=40 - sink(*pin4); // $ hasTaintFlow=40 + sink(*pin4); // $ hasValueFlow=40 } { @@ -149,10 +149,29 @@ fn test_pin() { } } +fn test_ord() { + let a = source(50); + let b = source(51); + let c = a.min(b); + sink(c); // $ hasValueFlow=50 hasValueFlow=51 + + let d = source(52); + let e = source(53); + let f = d.max(e); + sink(f); // $ hasValueFlow=52 hasValueFlow=53 + + let g = source(54); + let h = source(55); + let i = source(56); + let j = g.clamp(h, i); + sink(j); // $ hasValueFlow=54 hasValueFlow=55 hasValueFlow=56 +} + fn main() { option_clone(); result_clone(); i64_clone(); my_clone::wrapper_clone(); test_pin(); + test_ord(); } diff --git a/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 7db15783781..00000000000 --- a/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| main.rs:389:14:389:30 | ... .lt(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index 7daa883996f..7395205a7fc 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -31,6 +31,20 @@ enum MyPosEnum { B(i64), } +// has a manual flow model with flow from second argument to the return value +// and a wrong generated model with flow from first argument to the return value +fn snd(a: i64, b: i64) -> i64 { + 0 +} + +fn test_snd() { + let s1 = source(99); + sink(snd(0, s1)); // $ hasValueFlow=99 + + let s2 = source(88); + sink(snd(s2, 0)); +} + // has a flow model fn get_var_pos(e: MyPosEnum) -> i64 { 0 diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 955b0b81b44..f9848542dd7 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -7,22 +7,24 @@ models | 6 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | | 7 | Source: main::simple_source; ReturnValue; test-source | | 8 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | -| 9 | Summary: <_ as core::cmp::Ord>::max; Argument[self]; ReturnValue; value | +| 9 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | | 10 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint | -| 11 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 12 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 13 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 14 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 15 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 16 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 17 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 18 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 19 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 20 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 21 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 22 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 23 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 24 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 11 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 12 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 13 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 14 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 15 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 16 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 17 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 18 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 19 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 20 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 21 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 22 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 23 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 24 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 25 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 26 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -32,285 +34,291 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:13 | -| main.rs:40:9:40:9 | s | main.rs:41:27:41:27 | s | provenance | | -| main.rs:40:9:40:9 | s | main.rs:41:27:41:27 | s | provenance | | -| main.rs:40:13:40:21 | source(...) | main.rs:40:9:40:9 | s | provenance | | -| main.rs:40:13:40:21 | source(...) | main.rs:40:9:40:9 | s | provenance | | -| main.rs:41:9:41:10 | e1 [A] | main.rs:42:22:42:23 | e1 [A] | provenance | | -| main.rs:41:9:41:10 | e1 [A] | main.rs:42:22:42:23 | e1 [A] | provenance | | -| main.rs:41:14:41:28 | ...::A(...) [A] | main.rs:41:9:41:10 | e1 [A] | provenance | | -| main.rs:41:14:41:28 | ...::A(...) [A] | main.rs:41:9:41:10 | e1 [A] | provenance | | -| main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | | -| main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | | -| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:19 | -| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:19 | -| main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | | -| main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | | -| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | s | provenance | | -| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | s | provenance | | -| main.rs:54:9:54:10 | e1 [B] | main.rs:55:11:55:12 | e1 [B] | provenance | | -| main.rs:54:9:54:10 | e1 [B] | main.rs:55:11:55:12 | e1 [B] | provenance | | -| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | | -| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | | -| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:24 | -| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:24 | -| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | | -| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | | -| main.rs:57:9:57:23 | ...::B(...) [B] | main.rs:57:22:57:22 | i | provenance | | -| main.rs:57:9:57:23 | ...::B(...) [B] | main.rs:57:22:57:22 | i | provenance | | -| main.rs:57:22:57:22 | i | main.rs:57:33:57:33 | i | provenance | | -| main.rs:57:22:57:22 | i | main.rs:57:33:57:33 | i | provenance | | -| main.rs:72:9:72:9 | s | main.rs:73:40:73:40 | s | provenance | | -| main.rs:72:9:72:9 | s | main.rs:73:40:73:40 | s | provenance | | -| main.rs:72:13:72:21 | source(...) | main.rs:72:9:72:9 | s | provenance | | -| main.rs:72:13:72:21 | source(...) | main.rs:72:9:72:9 | s | provenance | | -| main.rs:73:9:73:10 | e1 [C] | main.rs:74:24:74:25 | e1 [C] | provenance | | -| main.rs:73:9:73:10 | e1 [C] | main.rs:74:24:74:25 | e1 [C] | provenance | | -| main.rs:73:14:73:42 | ...::C {...} [C] | main.rs:73:9:73:10 | e1 [C] | provenance | | -| main.rs:73:14:73:42 | ...::C {...} [C] | main.rs:73:9:73:10 | e1 [C] | provenance | | -| main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | | -| main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | | -| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:18 | -| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:18 | -| main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | | -| main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | | -| main.rs:85:13:85:21 | source(...) | main.rs:85:9:85:9 | s | provenance | | -| main.rs:85:13:85:21 | source(...) | main.rs:85:9:85:9 | s | provenance | | -| main.rs:86:9:86:10 | e1 [D] | main.rs:87:11:87:12 | e1 [D] | provenance | | -| main.rs:86:9:86:10 | e1 [D] | main.rs:87:11:87:12 | e1 [D] | provenance | | -| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | | -| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | | -| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:23 | -| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:23 | -| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | | -| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | | -| main.rs:89:9:89:37 | ...::D {...} [D] | main.rs:89:35:89:35 | i | provenance | | -| main.rs:89:9:89:37 | ...::D {...} [D] | main.rs:89:35:89:35 | i | provenance | | -| main.rs:89:35:89:35 | i | main.rs:89:47:89:47 | i | provenance | | -| main.rs:89:35:89:35 | i | main.rs:89:47:89:47 | i | provenance | | -| main.rs:104:9:104:9 | s | main.rs:106:17:106:17 | s | provenance | | -| main.rs:104:9:104:9 | s | main.rs:106:17:106:17 | s | provenance | | -| main.rs:104:13:104:21 | source(...) | main.rs:104:9:104:9 | s | provenance | | -| main.rs:104:13:104:21 | source(...) | main.rs:104:9:104:9 | s | provenance | | -| main.rs:105:9:105:17 | my_struct [MyStruct.field1] | main.rs:109:27:109:35 | my_struct [MyStruct.field1] | provenance | | -| main.rs:105:9:105:17 | my_struct [MyStruct.field1] | main.rs:109:27:109:35 | my_struct [MyStruct.field1] | provenance | | -| main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | main.rs:105:9:105:17 | my_struct [MyStruct.field1] | provenance | | -| main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | main.rs:105:9:105:17 | my_struct [MyStruct.field1] | provenance | | -| main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:16 | -| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:16 | -| main.rs:126:9:126:9 | s | main.rs:127:38:127:38 | s | provenance | | -| main.rs:126:9:126:9 | s | main.rs:127:38:127:38 | s | provenance | | -| main.rs:126:13:126:21 | source(...) | main.rs:126:9:126:9 | s | provenance | | -| main.rs:126:13:126:21 | source(...) | main.rs:126:9:126:9 | s | provenance | | -| main.rs:127:9:127:17 | my_struct [MyStruct.field2] | main.rs:129:10:129:18 | my_struct [MyStruct.field2] | provenance | | -| main.rs:127:9:127:17 | my_struct [MyStruct.field2] | main.rs:129:10:129:18 | my_struct [MyStruct.field2] | provenance | | -| main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | main.rs:127:9:127:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | main.rs:127:9:127:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:127:38:127:38 | s | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:21 | -| main.rs:127:38:127:38 | s | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:21 | -| main.rs:129:10:129:18 | my_struct [MyStruct.field2] | main.rs:129:10:129:25 | my_struct.field2 | provenance | | -| main.rs:129:10:129:18 | my_struct [MyStruct.field2] | main.rs:129:10:129:25 | my_struct.field2 | provenance | | -| main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | | -| main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | | -| main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | s | provenance | | -| main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | s | provenance | | -| main.rs:139:28:139:30 | [...] [element] | main.rs:139:10:139:31 | get_array_element(...) | provenance | MaD:14 | -| main.rs:139:28:139:30 | [...] [element] | main.rs:139:10:139:31 | get_array_element(...) | provenance | MaD:14 | -| main.rs:139:29:139:29 | s | main.rs:139:28:139:30 | [...] [element] | provenance | | -| main.rs:139:29:139:29 | s | main.rs:139:28:139:30 | [...] [element] | provenance | | -| main.rs:148:9:148:9 | s | main.rs:149:33:149:33 | s | provenance | | -| main.rs:148:9:148:9 | s | main.rs:149:33:149:33 | s | provenance | | -| main.rs:148:13:148:21 | source(...) | main.rs:148:9:148:9 | s | provenance | | -| main.rs:148:13:148:21 | source(...) | main.rs:148:9:148:9 | s | provenance | | -| main.rs:149:9:149:11 | arr [element] | main.rs:150:10:150:12 | arr [element] | provenance | | -| main.rs:149:9:149:11 | arr [element] | main.rs:150:10:150:12 | arr [element] | provenance | | -| main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | | -| main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | | -| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:20 | -| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:20 | -| main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | | -| main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | | -| main.rs:159:9:159:9 | s | main.rs:160:14:160:14 | s | provenance | | -| main.rs:159:9:159:9 | s | main.rs:160:14:160:14 | s | provenance | | -| main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | s | provenance | | -| main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | s | provenance | | -| main.rs:160:9:160:9 | t [tuple.0] | main.rs:161:28:161:28 | t [tuple.0] | provenance | | -| main.rs:160:9:160:9 | t [tuple.0] | main.rs:161:28:161:28 | t [tuple.0] | provenance | | -| main.rs:160:13:160:18 | TupleExpr [tuple.0] | main.rs:160:9:160:9 | t [tuple.0] | provenance | | -| main.rs:160:13:160:18 | TupleExpr [tuple.0] | main.rs:160:9:160:9 | t [tuple.0] | provenance | | -| main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:17 | -| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:17 | -| main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | | -| main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | | -| main.rs:172:13:172:22 | source(...) | main.rs:172:9:172:9 | s | provenance | | -| main.rs:172:13:172:22 | source(...) | main.rs:172:9:172:9 | s | provenance | | -| main.rs:173:9:173:9 | t [tuple.1] | main.rs:175:10:175:10 | t [tuple.1] | provenance | | -| main.rs:173:9:173:9 | t [tuple.1] | main.rs:175:10:175:10 | t [tuple.1] | provenance | | -| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | | -| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | | -| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:22 | -| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:22 | -| main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | | -| main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | | -| main.rs:187:9:187:9 | s | main.rs:192:11:192:11 | s | provenance | | -| main.rs:187:9:187:9 | s | main.rs:192:11:192:11 | s | provenance | | -| main.rs:187:13:187:22 | source(...) | main.rs:187:9:187:9 | s | provenance | | -| main.rs:187:13:187:22 | source(...) | main.rs:187:9:187:9 | s | provenance | | -| main.rs:188:14:188:14 | ... | main.rs:189:14:189:14 | n | provenance | | -| main.rs:188:14:188:14 | ... | main.rs:189:14:189:14 | n | provenance | | -| main.rs:192:11:192:11 | s | main.rs:188:14:188:14 | ... | provenance | MaD:11 | -| main.rs:192:11:192:11 | s | main.rs:188:14:188:14 | ... | provenance | MaD:11 | -| main.rs:196:13:196:22 | source(...) | main.rs:198:23:198:23 | f [captured s] | provenance | | -| main.rs:196:13:196:22 | source(...) | main.rs:198:23:198:23 | f [captured s] | provenance | | -| main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | provenance | | -| main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | provenance | | -| main.rs:198:9:198:9 | t | main.rs:199:10:199:10 | t | provenance | | -| main.rs:198:9:198:9 | t | main.rs:199:10:199:10 | t | provenance | | -| main.rs:198:13:198:24 | apply(...) | main.rs:198:9:198:9 | t | provenance | | -| main.rs:198:13:198:24 | apply(...) | main.rs:198:9:198:9 | t | provenance | | -| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:11 | -| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:11 | -| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:12 | -| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:12 | -| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:11 | -| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:11 | -| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:12 | -| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:12 | -| main.rs:203:9:203:9 | s | main.rs:205:19:205:19 | s | provenance | | -| main.rs:203:9:203:9 | s | main.rs:205:19:205:19 | s | provenance | | -| main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | -| main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | -| main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | provenance | | -| main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | provenance | | -| main.rs:205:9:205:9 | t | main.rs:206:10:206:10 | t | provenance | | -| main.rs:205:9:205:9 | t | main.rs:206:10:206:10 | t | provenance | | -| main.rs:205:13:205:23 | apply(...) | main.rs:205:9:205:9 | t | provenance | | -| main.rs:205:13:205:23 | apply(...) | main.rs:205:9:205:9 | t | provenance | | -| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | provenance | MaD:11 | -| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | provenance | MaD:11 | -| main.rs:205:19:205:19 | s | main.rs:205:13:205:23 | apply(...) | provenance | MaD:11 | -| main.rs:205:19:205:19 | s | main.rs:205:13:205:23 | apply(...) | provenance | MaD:11 | -| main.rs:215:9:215:9 | s | main.rs:216:30:216:30 | s | provenance | | -| main.rs:215:9:215:9 | s | main.rs:216:30:216:30 | s | provenance | | -| main.rs:215:13:215:22 | source(...) | main.rs:215:9:215:9 | s | provenance | | -| main.rs:215:13:215:22 | source(...) | main.rs:215:9:215:9 | s | provenance | | -| main.rs:216:9:216:9 | t | main.rs:217:10:217:10 | t | provenance | | -| main.rs:216:9:216:9 | t | main.rs:217:10:217:10 | t | provenance | | -| main.rs:216:13:216:31 | get_async_number(...) [future] | main.rs:216:13:216:37 | await ... | provenance | | -| main.rs:216:13:216:31 | get_async_number(...) [future] | main.rs:216:13:216:37 | await ... | provenance | | -| main.rs:216:13:216:37 | await ... | main.rs:216:9:216:9 | t | provenance | | -| main.rs:216:13:216:37 | await ... | main.rs:216:9:216:9 | t | provenance | | -| main.rs:216:30:216:30 | s | main.rs:216:13:216:31 | get_async_number(...) [future] | provenance | MaD:15 | -| main.rs:216:30:216:30 | s | main.rs:216:13:216:31 | get_async_number(...) [future] | provenance | MaD:15 | -| main.rs:236:9:236:9 | s [D] | main.rs:237:11:237:11 | s [D] | provenance | | -| main.rs:236:9:236:9 | s [D] | main.rs:237:11:237:11 | s [D] | provenance | | -| main.rs:236:13:236:23 | enum_source | main.rs:236:13:236:27 | enum_source(...) [D] | provenance | Src:MaD:6 | -| main.rs:236:13:236:23 | enum_source | main.rs:236:13:236:27 | enum_source(...) [D] | provenance | Src:MaD:6 | -| main.rs:236:13:236:27 | enum_source(...) [D] | main.rs:236:9:236:9 | s [D] | provenance | | -| main.rs:236:13:236:27 | enum_source(...) [D] | main.rs:236:9:236:9 | s [D] | provenance | | -| main.rs:237:11:237:11 | s [D] | main.rs:239:9:239:37 | ...::D {...} [D] | provenance | | -| main.rs:237:11:237:11 | s [D] | main.rs:239:9:239:37 | ...::D {...} [D] | provenance | | -| main.rs:239:9:239:37 | ...::D {...} [D] | main.rs:239:35:239:35 | i | provenance | | -| main.rs:239:9:239:37 | ...::D {...} [D] | main.rs:239:35:239:35 | i | provenance | | -| main.rs:239:35:239:35 | i | main.rs:239:47:239:47 | i | provenance | | -| main.rs:239:35:239:35 | i | main.rs:239:47:239:47 | i | provenance | | -| main.rs:245:9:245:9 | s [C] | main.rs:246:11:246:11 | s [C] | provenance | | -| main.rs:245:9:245:9 | s [C] | main.rs:246:11:246:11 | s [C] | provenance | | -| main.rs:245:13:245:24 | e.source(...) [C] | main.rs:245:9:245:9 | s [C] | provenance | | -| main.rs:245:13:245:24 | e.source(...) [C] | main.rs:245:9:245:9 | s [C] | provenance | | -| main.rs:245:15:245:20 | source | main.rs:245:13:245:24 | e.source(...) [C] | provenance | Src:MaD:4 | -| main.rs:245:15:245:20 | source | main.rs:245:13:245:24 | e.source(...) [C] | provenance | Src:MaD:4 | -| main.rs:246:11:246:11 | s [C] | main.rs:247:9:247:37 | ...::C {...} [C] | provenance | | -| main.rs:246:11:246:11 | s [C] | main.rs:247:9:247:37 | ...::C {...} [C] | provenance | | -| main.rs:247:9:247:37 | ...::C {...} [C] | main.rs:247:35:247:35 | i | provenance | | -| main.rs:247:9:247:37 | ...::C {...} [C] | main.rs:247:35:247:35 | i | provenance | | -| main.rs:247:35:247:35 | i | main.rs:247:47:247:47 | i | provenance | | -| main.rs:247:35:247:35 | i | main.rs:247:47:247:47 | i | provenance | | -| main.rs:261:18:261:18 | ... | main.rs:261:26:261:26 | a | provenance | | -| main.rs:261:18:261:18 | ... | main.rs:261:26:261:26 | a | provenance | | -| main.rs:262:9:262:19 | pass_source | main.rs:261:18:261:18 | ... | provenance | Src:MaD:8 | -| main.rs:262:9:262:19 | pass_source | main.rs:261:18:261:18 | ... | provenance | Src:MaD:8 | -| main.rs:264:9:264:19 | pass_source | main.rs:264:25:264:25 | ... | provenance | Src:MaD:8 | -| main.rs:264:9:264:19 | pass_source | main.rs:264:25:264:25 | ... | provenance | Src:MaD:8 | -| main.rs:264:25:264:25 | ... | main.rs:265:18:265:18 | a | provenance | | -| main.rs:264:25:264:25 | ... | main.rs:265:18:265:18 | a | provenance | | -| main.rs:268:14:268:19 | ...: i64 | main.rs:269:18:269:18 | a | provenance | | -| main.rs:268:14:268:19 | ...: i64 | main.rs:269:18:269:18 | a | provenance | | -| main.rs:271:9:271:19 | pass_source | main.rs:268:14:268:19 | ...: i64 | provenance | Src:MaD:8 | -| main.rs:271:9:271:19 | pass_source | main.rs:268:14:268:19 | ...: i64 | provenance | Src:MaD:8 | -| main.rs:273:9:273:19 | pass_source | main.rs:273:36:273:36 | ... | provenance | Src:MaD:8 | -| main.rs:273:9:273:19 | pass_source | main.rs:273:36:273:36 | ... | provenance | Src:MaD:8 | -| main.rs:273:36:273:36 | ... | main.rs:274:18:274:18 | a | provenance | | -| main.rs:273:36:273:36 | ... | main.rs:274:18:274:18 | a | provenance | | -| main.rs:283:9:283:9 | s | main.rs:284:41:284:41 | s | provenance | | -| main.rs:283:9:283:9 | s | main.rs:284:41:284:41 | s | provenance | | -| main.rs:283:13:283:22 | source(...) | main.rs:283:9:283:9 | s | provenance | | -| main.rs:283:13:283:22 | source(...) | main.rs:283:9:283:9 | s | provenance | | -| main.rs:284:15:284:43 | ...::C {...} [C] | main.rs:284:5:284:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | -| main.rs:284:15:284:43 | ...::C {...} [C] | main.rs:284:5:284:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | -| main.rs:284:41:284:41 | s | main.rs:284:15:284:43 | ...::C {...} [C] | provenance | | -| main.rs:284:41:284:41 | s | main.rs:284:15:284:43 | ...::C {...} [C] | provenance | | -| main.rs:289:9:289:9 | s | main.rs:290:39:290:39 | s | provenance | | -| main.rs:289:9:289:9 | s | main.rs:290:39:290:39 | s | provenance | | -| main.rs:289:13:289:22 | source(...) | main.rs:289:9:289:9 | s | provenance | | -| main.rs:289:13:289:22 | source(...) | main.rs:289:9:289:9 | s | provenance | | -| main.rs:290:9:290:9 | e [D] | main.rs:291:5:291:5 | e [D] | provenance | | -| main.rs:290:9:290:9 | e [D] | main.rs:291:5:291:5 | e [D] | provenance | | -| main.rs:290:13:290:41 | ...::D {...} [D] | main.rs:290:9:290:9 | e [D] | provenance | | -| main.rs:290:13:290:41 | ...::D {...} [D] | main.rs:290:9:290:9 | e [D] | provenance | | -| main.rs:290:39:290:39 | s | main.rs:290:13:290:41 | ...::D {...} [D] | provenance | | -| main.rs:290:39:290:39 | s | main.rs:290:13:290:41 | ...::D {...} [D] | provenance | | -| main.rs:291:5:291:5 | e [D] | main.rs:291:7:291:10 | sink | provenance | MaD:1 Sink:MaD:1 | -| main.rs:291:5:291:5 | e [D] | main.rs:291:7:291:10 | sink | provenance | MaD:1 Sink:MaD:1 | -| main.rs:300:9:300:9 | s | main.rs:301:10:301:10 | s | provenance | | -| main.rs:300:9:300:9 | s | main.rs:301:10:301:10 | s | provenance | | -| main.rs:300:13:300:25 | simple_source | main.rs:300:13:300:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | -| main.rs:300:13:300:25 | simple_source | main.rs:300:13:300:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | -| main.rs:300:13:300:29 | simple_source(...) | main.rs:300:9:300:9 | s | provenance | | -| main.rs:300:13:300:29 | simple_source(...) | main.rs:300:9:300:9 | s | provenance | | -| main.rs:308:9:308:9 | s | main.rs:309:17:309:17 | s | provenance | | -| main.rs:308:9:308:9 | s | main.rs:309:17:309:17 | s | provenance | | -| main.rs:308:13:308:22 | source(...) | main.rs:308:9:308:9 | s | provenance | | -| main.rs:308:13:308:22 | source(...) | main.rs:308:9:308:9 | s | provenance | | -| main.rs:309:17:309:17 | s | main.rs:309:5:309:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:309:17:309:17 | s | main.rs:309:5:309:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:317:5:317:14 | arg_source | main.rs:317:16:317:16 | [post] i | provenance | Src:MaD:5 MaD:5 | -| main.rs:317:5:317:14 | arg_source | main.rs:317:16:317:16 | [post] i | provenance | Src:MaD:5 MaD:5 | -| main.rs:317:16:317:16 | [post] i | main.rs:318:10:318:10 | i | provenance | | -| main.rs:317:16:317:16 | [post] i | main.rs:318:10:318:10 | i | provenance | | -| main.rs:370:9:370:10 | x1 | main.rs:371:10:371:11 | x1 | provenance | | -| main.rs:370:9:370:10 | x1 | main.rs:371:10:371:11 | x1 | provenance | | -| main.rs:370:14:370:23 | source(...) | main.rs:370:14:370:30 | ... .max(...) | provenance | MaD:9 | -| main.rs:370:14:370:23 | source(...) | main.rs:370:14:370:30 | ... .max(...) | provenance | MaD:9 | -| main.rs:370:14:370:30 | ... .max(...) | main.rs:370:9:370:10 | x1 | provenance | | -| main.rs:370:14:370:30 | ... .max(...) | main.rs:370:9:370:10 | x1 | provenance | | -| main.rs:373:9:373:10 | x2 [MyStruct.field1] | main.rs:381:10:381:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:373:9:373:10 | x2 [MyStruct.field1] | main.rs:381:10:381:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:373:14:380:6 | ... .max(...) [MyStruct.field1] | main.rs:373:9:373:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:373:14:380:6 | ... .max(...) [MyStruct.field1] | main.rs:373:9:373:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:373:15:376:5 | MyStruct {...} [MyStruct.field1] | main.rs:373:14:380:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:9 | -| main.rs:373:15:376:5 | MyStruct {...} [MyStruct.field1] | main.rs:373:14:380:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:9 | -| main.rs:374:17:374:26 | source(...) | main.rs:373:15:376:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:374:17:374:26 | source(...) | main.rs:373:15:376:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:381:10:381:11 | x2 [MyStruct.field1] | main.rs:381:10:381:18 | x2.field1 | provenance | | -| main.rs:381:10:381:11 | x2 [MyStruct.field1] | main.rs:381:10:381:18 | x2.field1 | provenance | | -| main.rs:386:9:386:10 | x4 | main.rs:387:10:387:11 | x4 | provenance | | -| main.rs:386:9:386:10 | x4 | main.rs:387:10:387:11 | x4 | provenance | | -| main.rs:386:14:386:23 | source(...) | main.rs:386:14:386:30 | ... .max(...) | provenance | MaD:9 | -| main.rs:386:14:386:23 | source(...) | main.rs:386:14:386:30 | ... .max(...) | provenance | MaD:9 | -| main.rs:386:14:386:30 | ... .max(...) | main.rs:386:9:386:10 | x4 | provenance | | -| main.rs:386:14:386:30 | ... .max(...) | main.rs:386:9:386:10 | x4 | provenance | | -| main.rs:389:9:389:10 | x5 | main.rs:390:10:390:11 | x5 | provenance | | -| main.rs:389:14:389:23 | source(...) | main.rs:389:14:389:30 | ... .lt(...) | provenance | MaD:10 | -| main.rs:389:14:389:30 | ... .lt(...) | main.rs:389:9:389:10 | x5 | provenance | | -| main.rs:392:9:392:10 | x6 | main.rs:393:10:393:11 | x6 | provenance | | -| main.rs:392:14:392:23 | source(...) | main.rs:392:14:392:27 | ... < ... | provenance | MaD:10 | -| main.rs:392:14:392:27 | ... < ... | main.rs:392:9:392:10 | x6 | provenance | | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:14 | +| main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | +| main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | +| main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | +| main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:26 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:26 | +| main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | +| main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | +| main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | +| main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | +| main.rs:55:9:55:10 | e1 [A] | main.rs:56:22:56:23 | e1 [A] | provenance | | +| main.rs:55:9:55:10 | e1 [A] | main.rs:56:22:56:23 | e1 [A] | provenance | | +| main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | +| main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | +| main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | +| main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:20 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:20 | +| main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | +| main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | +| main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | +| main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | +| main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | +| main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | +| main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | +| main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:25 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:25 | +| main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | +| main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | +| main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | +| main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | +| main.rs:71:22:71:22 | i | main.rs:71:33:71:33 | i | provenance | | +| main.rs:71:22:71:22 | i | main.rs:71:33:71:33 | i | provenance | | +| main.rs:86:9:86:9 | s | main.rs:87:40:87:40 | s | provenance | | +| main.rs:86:9:86:9 | s | main.rs:87:40:87:40 | s | provenance | | +| main.rs:86:13:86:21 | source(...) | main.rs:86:9:86:9 | s | provenance | | +| main.rs:86:13:86:21 | source(...) | main.rs:86:9:86:9 | s | provenance | | +| main.rs:87:9:87:10 | e1 [C] | main.rs:88:24:88:25 | e1 [C] | provenance | | +| main.rs:87:9:87:10 | e1 [C] | main.rs:88:24:88:25 | e1 [C] | provenance | | +| main.rs:87:14:87:42 | ...::C {...} [C] | main.rs:87:9:87:10 | e1 [C] | provenance | | +| main.rs:87:14:87:42 | ...::C {...} [C] | main.rs:87:9:87:10 | e1 [C] | provenance | | +| main.rs:87:40:87:40 | s | main.rs:87:14:87:42 | ...::C {...} [C] | provenance | | +| main.rs:87:40:87:40 | s | main.rs:87:14:87:42 | ...::C {...} [C] | provenance | | +| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:19 | +| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:19 | +| main.rs:99:9:99:9 | s | main.rs:100:28:100:28 | s | provenance | | +| main.rs:99:9:99:9 | s | main.rs:100:28:100:28 | s | provenance | | +| main.rs:99:13:99:21 | source(...) | main.rs:99:9:99:9 | s | provenance | | +| main.rs:99:13:99:21 | source(...) | main.rs:99:9:99:9 | s | provenance | | +| main.rs:100:9:100:10 | e1 [D] | main.rs:101:11:101:12 | e1 [D] | provenance | | +| main.rs:100:9:100:10 | e1 [D] | main.rs:101:11:101:12 | e1 [D] | provenance | | +| main.rs:100:14:100:29 | set_var_field(...) [D] | main.rs:100:9:100:10 | e1 [D] | provenance | | +| main.rs:100:14:100:29 | set_var_field(...) [D] | main.rs:100:9:100:10 | e1 [D] | provenance | | +| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:24 | +| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:24 | +| main.rs:101:11:101:12 | e1 [D] | main.rs:103:9:103:37 | ...::D {...} [D] | provenance | | +| main.rs:101:11:101:12 | e1 [D] | main.rs:103:9:103:37 | ...::D {...} [D] | provenance | | +| main.rs:103:9:103:37 | ...::D {...} [D] | main.rs:103:35:103:35 | i | provenance | | +| main.rs:103:9:103:37 | ...::D {...} [D] | main.rs:103:35:103:35 | i | provenance | | +| main.rs:103:35:103:35 | i | main.rs:103:47:103:47 | i | provenance | | +| main.rs:103:35:103:35 | i | main.rs:103:47:103:47 | i | provenance | | +| main.rs:118:9:118:9 | s | main.rs:120:17:120:17 | s | provenance | | +| main.rs:118:9:118:9 | s | main.rs:120:17:120:17 | s | provenance | | +| main.rs:118:13:118:21 | source(...) | main.rs:118:9:118:9 | s | provenance | | +| main.rs:118:13:118:21 | source(...) | main.rs:118:9:118:9 | s | provenance | | +| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | main.rs:123:27:123:35 | my_struct [MyStruct.field1] | provenance | | +| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | main.rs:123:27:123:35 | my_struct [MyStruct.field1] | provenance | | +| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | main.rs:119:9:119:17 | my_struct [MyStruct.field1] | provenance | | +| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | main.rs:119:9:119:17 | my_struct [MyStruct.field1] | provenance | | +| main.rs:120:17:120:17 | s | main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:120:17:120:17 | s | main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:17 | +| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:17 | +| main.rs:140:9:140:9 | s | main.rs:141:38:141:38 | s | provenance | | +| main.rs:140:9:140:9 | s | main.rs:141:38:141:38 | s | provenance | | +| main.rs:140:13:140:21 | source(...) | main.rs:140:9:140:9 | s | provenance | | +| main.rs:140:13:140:21 | source(...) | main.rs:140:9:140:9 | s | provenance | | +| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | main.rs:143:10:143:18 | my_struct [MyStruct.field2] | provenance | | +| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | main.rs:143:10:143:18 | my_struct [MyStruct.field2] | provenance | | +| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | main.rs:141:9:141:17 | my_struct [MyStruct.field2] | provenance | | +| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | main.rs:141:9:141:17 | my_struct [MyStruct.field2] | provenance | | +| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:22 | +| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:22 | +| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | main.rs:143:10:143:25 | my_struct.field2 | provenance | | +| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | main.rs:143:10:143:25 | my_struct.field2 | provenance | | +| main.rs:152:9:152:9 | s | main.rs:153:29:153:29 | s | provenance | | +| main.rs:152:9:152:9 | s | main.rs:153:29:153:29 | s | provenance | | +| main.rs:152:13:152:21 | source(...) | main.rs:152:9:152:9 | s | provenance | | +| main.rs:152:13:152:21 | source(...) | main.rs:152:9:152:9 | s | provenance | | +| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:15 | +| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:15 | +| main.rs:153:29:153:29 | s | main.rs:153:28:153:30 | [...] [element] | provenance | | +| main.rs:153:29:153:29 | s | main.rs:153:28:153:30 | [...] [element] | provenance | | +| main.rs:162:9:162:9 | s | main.rs:163:33:163:33 | s | provenance | | +| main.rs:162:9:162:9 | s | main.rs:163:33:163:33 | s | provenance | | +| main.rs:162:13:162:21 | source(...) | main.rs:162:9:162:9 | s | provenance | | +| main.rs:162:13:162:21 | source(...) | main.rs:162:9:162:9 | s | provenance | | +| main.rs:163:9:163:11 | arr [element] | main.rs:164:10:164:12 | arr [element] | provenance | | +| main.rs:163:9:163:11 | arr [element] | main.rs:164:10:164:12 | arr [element] | provenance | | +| main.rs:163:15:163:34 | set_array_element(...) [element] | main.rs:163:9:163:11 | arr [element] | provenance | | +| main.rs:163:15:163:34 | set_array_element(...) [element] | main.rs:163:9:163:11 | arr [element] | provenance | | +| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:21 | +| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:21 | +| main.rs:164:10:164:12 | arr [element] | main.rs:164:10:164:15 | arr[0] | provenance | MaD:11 | +| main.rs:164:10:164:12 | arr [element] | main.rs:164:10:164:15 | arr[0] | provenance | MaD:11 | +| main.rs:173:9:173:9 | s | main.rs:174:14:174:14 | s | provenance | | +| main.rs:173:9:173:9 | s | main.rs:174:14:174:14 | s | provenance | | +| main.rs:173:13:173:22 | source(...) | main.rs:173:9:173:9 | s | provenance | | +| main.rs:173:13:173:22 | source(...) | main.rs:173:9:173:9 | s | provenance | | +| main.rs:174:9:174:9 | t [tuple.0] | main.rs:175:28:175:28 | t [tuple.0] | provenance | | +| main.rs:174:9:174:9 | t [tuple.0] | main.rs:175:28:175:28 | t [tuple.0] | provenance | | +| main.rs:174:13:174:18 | TupleExpr [tuple.0] | main.rs:174:9:174:9 | t [tuple.0] | provenance | | +| main.rs:174:13:174:18 | TupleExpr [tuple.0] | main.rs:174:9:174:9 | t [tuple.0] | provenance | | +| main.rs:174:14:174:14 | s | main.rs:174:13:174:18 | TupleExpr [tuple.0] | provenance | | +| main.rs:174:14:174:14 | s | main.rs:174:13:174:18 | TupleExpr [tuple.0] | provenance | | +| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:18 | +| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:18 | +| main.rs:186:9:186:9 | s | main.rs:187:31:187:31 | s | provenance | | +| main.rs:186:9:186:9 | s | main.rs:187:31:187:31 | s | provenance | | +| main.rs:186:13:186:22 | source(...) | main.rs:186:9:186:9 | s | provenance | | +| main.rs:186:13:186:22 | source(...) | main.rs:186:9:186:9 | s | provenance | | +| main.rs:187:9:187:9 | t [tuple.1] | main.rs:189:10:189:10 | t [tuple.1] | provenance | | +| main.rs:187:9:187:9 | t [tuple.1] | main.rs:189:10:189:10 | t [tuple.1] | provenance | | +| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | main.rs:187:9:187:9 | t [tuple.1] | provenance | | +| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | main.rs:187:9:187:9 | t [tuple.1] | provenance | | +| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:23 | +| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:23 | +| main.rs:189:10:189:10 | t [tuple.1] | main.rs:189:10:189:12 | t.1 | provenance | | +| main.rs:189:10:189:10 | t [tuple.1] | main.rs:189:10:189:12 | t.1 | provenance | | +| main.rs:201:9:201:9 | s | main.rs:206:11:206:11 | s | provenance | | +| main.rs:201:9:201:9 | s | main.rs:206:11:206:11 | s | provenance | | +| main.rs:201:13:201:22 | source(...) | main.rs:201:9:201:9 | s | provenance | | +| main.rs:201:13:201:22 | source(...) | main.rs:201:9:201:9 | s | provenance | | +| main.rs:202:14:202:14 | ... | main.rs:203:14:203:14 | n | provenance | | +| main.rs:202:14:202:14 | ... | main.rs:203:14:203:14 | n | provenance | | +| main.rs:206:11:206:11 | s | main.rs:202:14:202:14 | ... | provenance | MaD:12 | +| main.rs:206:11:206:11 | s | main.rs:202:14:202:14 | ... | provenance | MaD:12 | +| main.rs:210:13:210:22 | source(...) | main.rs:212:23:212:23 | f [captured s] | provenance | | +| main.rs:210:13:210:22 | source(...) | main.rs:212:23:212:23 | f [captured s] | provenance | | +| main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | provenance | | +| main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | provenance | | +| main.rs:212:9:212:9 | t | main.rs:213:10:213:10 | t | provenance | | +| main.rs:212:9:212:9 | t | main.rs:213:10:213:10 | t | provenance | | +| main.rs:212:13:212:24 | apply(...) | main.rs:212:9:212:9 | t | provenance | | +| main.rs:212:13:212:24 | apply(...) | main.rs:212:9:212:9 | t | provenance | | +| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:12 | +| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:12 | +| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:13 | +| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:13 | +| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:12 | +| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:12 | +| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:13 | +| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:13 | +| main.rs:217:9:217:9 | s | main.rs:219:19:219:19 | s | provenance | | +| main.rs:217:9:217:9 | s | main.rs:219:19:219:19 | s | provenance | | +| main.rs:217:13:217:22 | source(...) | main.rs:217:9:217:9 | s | provenance | | +| main.rs:217:13:217:22 | source(...) | main.rs:217:9:217:9 | s | provenance | | +| main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | provenance | | +| main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | provenance | | +| main.rs:219:9:219:9 | t | main.rs:220:10:220:10 | t | provenance | | +| main.rs:219:9:219:9 | t | main.rs:220:10:220:10 | t | provenance | | +| main.rs:219:13:219:23 | apply(...) | main.rs:219:9:219:9 | t | provenance | | +| main.rs:219:13:219:23 | apply(...) | main.rs:219:9:219:9 | t | provenance | | +| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | provenance | MaD:12 | +| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | provenance | MaD:12 | +| main.rs:219:19:219:19 | s | main.rs:219:13:219:23 | apply(...) | provenance | MaD:12 | +| main.rs:219:19:219:19 | s | main.rs:219:13:219:23 | apply(...) | provenance | MaD:12 | +| main.rs:229:9:229:9 | s | main.rs:230:30:230:30 | s | provenance | | +| main.rs:229:9:229:9 | s | main.rs:230:30:230:30 | s | provenance | | +| main.rs:229:13:229:22 | source(...) | main.rs:229:9:229:9 | s | provenance | | +| main.rs:229:13:229:22 | source(...) | main.rs:229:9:229:9 | s | provenance | | +| main.rs:230:9:230:9 | t | main.rs:231:10:231:10 | t | provenance | | +| main.rs:230:9:230:9 | t | main.rs:231:10:231:10 | t | provenance | | +| main.rs:230:13:230:31 | get_async_number(...) [future] | main.rs:230:13:230:37 | await ... | provenance | | +| main.rs:230:13:230:31 | get_async_number(...) [future] | main.rs:230:13:230:37 | await ... | provenance | | +| main.rs:230:13:230:37 | await ... | main.rs:230:9:230:9 | t | provenance | | +| main.rs:230:13:230:37 | await ... | main.rs:230:9:230:9 | t | provenance | | +| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:16 | +| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:16 | +| main.rs:250:9:250:9 | s [D] | main.rs:251:11:251:11 | s [D] | provenance | | +| main.rs:250:9:250:9 | s [D] | main.rs:251:11:251:11 | s [D] | provenance | | +| main.rs:250:13:250:23 | enum_source | main.rs:250:13:250:27 | enum_source(...) [D] | provenance | Src:MaD:6 | +| main.rs:250:13:250:23 | enum_source | main.rs:250:13:250:27 | enum_source(...) [D] | provenance | Src:MaD:6 | +| main.rs:250:13:250:27 | enum_source(...) [D] | main.rs:250:9:250:9 | s [D] | provenance | | +| main.rs:250:13:250:27 | enum_source(...) [D] | main.rs:250:9:250:9 | s [D] | provenance | | +| main.rs:251:11:251:11 | s [D] | main.rs:253:9:253:37 | ...::D {...} [D] | provenance | | +| main.rs:251:11:251:11 | s [D] | main.rs:253:9:253:37 | ...::D {...} [D] | provenance | | +| main.rs:253:9:253:37 | ...::D {...} [D] | main.rs:253:35:253:35 | i | provenance | | +| main.rs:253:9:253:37 | ...::D {...} [D] | main.rs:253:35:253:35 | i | provenance | | +| main.rs:253:35:253:35 | i | main.rs:253:47:253:47 | i | provenance | | +| main.rs:253:35:253:35 | i | main.rs:253:47:253:47 | i | provenance | | +| main.rs:259:9:259:9 | s [C] | main.rs:260:11:260:11 | s [C] | provenance | | +| main.rs:259:9:259:9 | s [C] | main.rs:260:11:260:11 | s [C] | provenance | | +| main.rs:259:13:259:24 | e.source(...) [C] | main.rs:259:9:259:9 | s [C] | provenance | | +| main.rs:259:13:259:24 | e.source(...) [C] | main.rs:259:9:259:9 | s [C] | provenance | | +| main.rs:259:15:259:20 | source | main.rs:259:13:259:24 | e.source(...) [C] | provenance | Src:MaD:4 | +| main.rs:259:15:259:20 | source | main.rs:259:13:259:24 | e.source(...) [C] | provenance | Src:MaD:4 | +| main.rs:260:11:260:11 | s [C] | main.rs:261:9:261:37 | ...::C {...} [C] | provenance | | +| main.rs:260:11:260:11 | s [C] | main.rs:261:9:261:37 | ...::C {...} [C] | provenance | | +| main.rs:261:9:261:37 | ...::C {...} [C] | main.rs:261:35:261:35 | i | provenance | | +| main.rs:261:9:261:37 | ...::C {...} [C] | main.rs:261:35:261:35 | i | provenance | | +| main.rs:261:35:261:35 | i | main.rs:261:47:261:47 | i | provenance | | +| main.rs:261:35:261:35 | i | main.rs:261:47:261:47 | i | provenance | | +| main.rs:275:18:275:18 | ... | main.rs:275:26:275:26 | a | provenance | | +| main.rs:275:18:275:18 | ... | main.rs:275:26:275:26 | a | provenance | | +| main.rs:276:9:276:19 | pass_source | main.rs:275:18:275:18 | ... | provenance | Src:MaD:8 | +| main.rs:276:9:276:19 | pass_source | main.rs:275:18:275:18 | ... | provenance | Src:MaD:8 | +| main.rs:278:9:278:19 | pass_source | main.rs:278:25:278:25 | ... | provenance | Src:MaD:8 | +| main.rs:278:9:278:19 | pass_source | main.rs:278:25:278:25 | ... | provenance | Src:MaD:8 | +| main.rs:278:25:278:25 | ... | main.rs:279:18:279:18 | a | provenance | | +| main.rs:278:25:278:25 | ... | main.rs:279:18:279:18 | a | provenance | | +| main.rs:282:14:282:19 | ...: i64 | main.rs:283:18:283:18 | a | provenance | | +| main.rs:282:14:282:19 | ...: i64 | main.rs:283:18:283:18 | a | provenance | | +| main.rs:285:9:285:19 | pass_source | main.rs:282:14:282:19 | ...: i64 | provenance | Src:MaD:8 | +| main.rs:285:9:285:19 | pass_source | main.rs:282:14:282:19 | ...: i64 | provenance | Src:MaD:8 | +| main.rs:287:9:287:19 | pass_source | main.rs:287:36:287:36 | ... | provenance | Src:MaD:8 | +| main.rs:287:9:287:19 | pass_source | main.rs:287:36:287:36 | ... | provenance | Src:MaD:8 | +| main.rs:287:36:287:36 | ... | main.rs:288:18:288:18 | a | provenance | | +| main.rs:287:36:287:36 | ... | main.rs:288:18:288:18 | a | provenance | | +| main.rs:297:9:297:9 | s | main.rs:298:41:298:41 | s | provenance | | +| main.rs:297:9:297:9 | s | main.rs:298:41:298:41 | s | provenance | | +| main.rs:297:13:297:22 | source(...) | main.rs:297:9:297:9 | s | provenance | | +| main.rs:297:13:297:22 | source(...) | main.rs:297:9:297:9 | s | provenance | | +| main.rs:298:15:298:43 | ...::C {...} [C] | main.rs:298:5:298:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | +| main.rs:298:15:298:43 | ...::C {...} [C] | main.rs:298:5:298:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | +| main.rs:298:41:298:41 | s | main.rs:298:15:298:43 | ...::C {...} [C] | provenance | | +| main.rs:298:41:298:41 | s | main.rs:298:15:298:43 | ...::C {...} [C] | provenance | | +| main.rs:303:9:303:9 | s | main.rs:304:39:304:39 | s | provenance | | +| main.rs:303:9:303:9 | s | main.rs:304:39:304:39 | s | provenance | | +| main.rs:303:13:303:22 | source(...) | main.rs:303:9:303:9 | s | provenance | | +| main.rs:303:13:303:22 | source(...) | main.rs:303:9:303:9 | s | provenance | | +| main.rs:304:9:304:9 | e [D] | main.rs:305:5:305:5 | e [D] | provenance | | +| main.rs:304:9:304:9 | e [D] | main.rs:305:5:305:5 | e [D] | provenance | | +| main.rs:304:13:304:41 | ...::D {...} [D] | main.rs:304:9:304:9 | e [D] | provenance | | +| main.rs:304:13:304:41 | ...::D {...} [D] | main.rs:304:9:304:9 | e [D] | provenance | | +| main.rs:304:39:304:39 | s | main.rs:304:13:304:41 | ...::D {...} [D] | provenance | | +| main.rs:304:39:304:39 | s | main.rs:304:13:304:41 | ...::D {...} [D] | provenance | | +| main.rs:305:5:305:5 | e [D] | main.rs:305:7:305:10 | sink | provenance | MaD:1 Sink:MaD:1 | +| main.rs:305:5:305:5 | e [D] | main.rs:305:7:305:10 | sink | provenance | MaD:1 Sink:MaD:1 | +| main.rs:314:9:314:9 | s | main.rs:315:10:315:10 | s | provenance | | +| main.rs:314:9:314:9 | s | main.rs:315:10:315:10 | s | provenance | | +| main.rs:314:13:314:25 | simple_source | main.rs:314:13:314:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | +| main.rs:314:13:314:25 | simple_source | main.rs:314:13:314:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | +| main.rs:314:13:314:29 | simple_source(...) | main.rs:314:9:314:9 | s | provenance | | +| main.rs:314:13:314:29 | simple_source(...) | main.rs:314:9:314:9 | s | provenance | | +| main.rs:322:9:322:9 | s | main.rs:323:17:323:17 | s | provenance | | +| main.rs:322:9:322:9 | s | main.rs:323:17:323:17 | s | provenance | | +| main.rs:322:13:322:22 | source(...) | main.rs:322:9:322:9 | s | provenance | | +| main.rs:322:13:322:22 | source(...) | main.rs:322:9:322:9 | s | provenance | | +| main.rs:323:17:323:17 | s | main.rs:323:5:323:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | +| main.rs:323:17:323:17 | s | main.rs:323:5:323:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | +| main.rs:331:5:331:14 | arg_source | main.rs:331:16:331:16 | [post] i | provenance | Src:MaD:5 MaD:5 | +| main.rs:331:5:331:14 | arg_source | main.rs:331:16:331:16 | [post] i | provenance | Src:MaD:5 MaD:5 | +| main.rs:331:16:331:16 | [post] i | main.rs:332:10:332:10 | i | provenance | | +| main.rs:331:16:331:16 | [post] i | main.rs:332:10:332:10 | i | provenance | | +| main.rs:384:9:384:10 | x1 | main.rs:385:10:385:11 | x1 | provenance | | +| main.rs:384:9:384:10 | x1 | main.rs:385:10:385:11 | x1 | provenance | | +| main.rs:384:14:384:23 | source(...) | main.rs:384:14:384:30 | ... .max(...) | provenance | MaD:9 | +| main.rs:384:14:384:23 | source(...) | main.rs:384:14:384:30 | ... .max(...) | provenance | MaD:9 | +| main.rs:384:14:384:30 | ... .max(...) | main.rs:384:9:384:10 | x1 | provenance | | +| main.rs:384:14:384:30 | ... .max(...) | main.rs:384:9:384:10 | x1 | provenance | | +| main.rs:387:9:387:10 | x2 [MyStruct.field1] | main.rs:395:10:395:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:387:9:387:10 | x2 [MyStruct.field1] | main.rs:395:10:395:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | main.rs:387:9:387:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | main.rs:387:9:387:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:9 | +| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:9 | +| main.rs:388:17:388:26 | source(...) | main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:388:17:388:26 | source(...) | main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:395:10:395:11 | x2 [MyStruct.field1] | main.rs:395:10:395:18 | x2.field1 | provenance | | +| main.rs:395:10:395:11 | x2 [MyStruct.field1] | main.rs:395:10:395:18 | x2.field1 | provenance | | +| main.rs:400:9:400:10 | x4 | main.rs:401:10:401:11 | x4 | provenance | | +| main.rs:400:9:400:10 | x4 | main.rs:401:10:401:11 | x4 | provenance | | +| main.rs:400:14:400:23 | source(...) | main.rs:400:14:400:30 | ... .max(...) | provenance | MaD:9 | +| main.rs:400:14:400:23 | source(...) | main.rs:400:14:400:30 | ... .max(...) | provenance | MaD:9 | +| main.rs:400:14:400:30 | ... .max(...) | main.rs:400:9:400:10 | x4 | provenance | | +| main.rs:400:14:400:30 | ... .max(...) | main.rs:400:9:400:10 | x4 | provenance | | +| main.rs:403:9:403:10 | x5 | main.rs:404:10:404:11 | x5 | provenance | | +| main.rs:403:14:403:23 | source(...) | main.rs:403:14:403:30 | ... .lt(...) | provenance | MaD:10 | +| main.rs:403:14:403:30 | ... .lt(...) | main.rs:403:9:403:10 | x5 | provenance | | +| main.rs:406:9:406:10 | x6 | main.rs:407:10:407:11 | x6 | provenance | | +| main.rs:406:14:406:23 | source(...) | main.rs:406:14:406:27 | ... < ... | provenance | MaD:10 | +| main.rs:406:14:406:27 | ... < ... | main.rs:406:9:406:10 | x6 | provenance | | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -324,404 +332,414 @@ nodes | main.rs:25:13:25:22 | source(...) | semmle.label | source(...) | | main.rs:26:10:26:18 | coerce(...) | semmle.label | coerce(...) | | main.rs:26:17:26:17 | s | semmle.label | s | -| main.rs:40:9:40:9 | s | semmle.label | s | -| main.rs:40:9:40:9 | s | semmle.label | s | -| main.rs:40:13:40:21 | source(...) | semmle.label | source(...) | -| main.rs:40:13:40:21 | source(...) | semmle.label | source(...) | -| main.rs:41:9:41:10 | e1 [A] | semmle.label | e1 [A] | -| main.rs:41:9:41:10 | e1 [A] | semmle.label | e1 [A] | -| main.rs:41:14:41:28 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:41:14:41:28 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:41:27:41:27 | s | semmle.label | s | -| main.rs:41:27:41:27 | s | semmle.label | s | -| main.rs:42:10:42:24 | get_var_pos(...) | semmle.label | get_var_pos(...) | -| main.rs:42:10:42:24 | get_var_pos(...) | semmle.label | get_var_pos(...) | -| main.rs:42:22:42:23 | e1 [A] | semmle.label | e1 [A] | -| main.rs:42:22:42:23 | e1 [A] | semmle.label | e1 [A] | -| main.rs:53:9:53:9 | s | semmle.label | s | -| main.rs:53:9:53:9 | s | semmle.label | s | -| main.rs:53:13:53:21 | source(...) | semmle.label | source(...) | -| main.rs:53:13:53:21 | source(...) | semmle.label | source(...) | -| main.rs:54:9:54:10 | e1 [B] | semmle.label | e1 [B] | -| main.rs:54:9:54:10 | e1 [B] | semmle.label | e1 [B] | -| main.rs:54:14:54:27 | set_var_pos(...) [B] | semmle.label | set_var_pos(...) [B] | -| main.rs:54:14:54:27 | set_var_pos(...) [B] | semmle.label | set_var_pos(...) [B] | -| main.rs:54:26:54:26 | s | semmle.label | s | -| main.rs:54:26:54:26 | s | semmle.label | s | -| main.rs:55:11:55:12 | e1 [B] | semmle.label | e1 [B] | -| main.rs:55:11:55:12 | e1 [B] | semmle.label | e1 [B] | -| main.rs:57:9:57:23 | ...::B(...) [B] | semmle.label | ...::B(...) [B] | -| main.rs:57:9:57:23 | ...::B(...) [B] | semmle.label | ...::B(...) [B] | -| main.rs:57:22:57:22 | i | semmle.label | i | -| main.rs:57:22:57:22 | i | semmle.label | i | -| main.rs:57:33:57:33 | i | semmle.label | i | -| main.rs:57:33:57:33 | i | semmle.label | i | -| main.rs:72:9:72:9 | s | semmle.label | s | -| main.rs:72:9:72:9 | s | semmle.label | s | -| main.rs:72:13:72:21 | source(...) | semmle.label | source(...) | -| main.rs:72:13:72:21 | source(...) | semmle.label | source(...) | -| main.rs:73:9:73:10 | e1 [C] | semmle.label | e1 [C] | -| main.rs:73:9:73:10 | e1 [C] | semmle.label | e1 [C] | -| main.rs:73:14:73:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:73:14:73:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:73:40:73:40 | s | semmle.label | s | -| main.rs:73:40:73:40 | s | semmle.label | s | -| main.rs:74:10:74:26 | get_var_field(...) | semmle.label | get_var_field(...) | -| main.rs:74:10:74:26 | get_var_field(...) | semmle.label | get_var_field(...) | -| main.rs:74:24:74:25 | e1 [C] | semmle.label | e1 [C] | -| main.rs:74:24:74:25 | e1 [C] | semmle.label | e1 [C] | -| main.rs:85:9:85:9 | s | semmle.label | s | -| main.rs:85:9:85:9 | s | semmle.label | s | -| main.rs:85:13:85:21 | source(...) | semmle.label | source(...) | -| main.rs:85:13:85:21 | source(...) | semmle.label | source(...) | -| main.rs:86:9:86:10 | e1 [D] | semmle.label | e1 [D] | -| main.rs:86:9:86:10 | e1 [D] | semmle.label | e1 [D] | -| main.rs:86:14:86:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | -| main.rs:86:14:86:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | -| main.rs:86:28:86:28 | s | semmle.label | s | -| main.rs:86:28:86:28 | s | semmle.label | s | -| main.rs:87:11:87:12 | e1 [D] | semmle.label | e1 [D] | -| main.rs:87:11:87:12 | e1 [D] | semmle.label | e1 [D] | -| main.rs:89:9:89:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:89:9:89:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:89:35:89:35 | i | semmle.label | i | -| main.rs:89:35:89:35 | i | semmle.label | i | -| main.rs:89:47:89:47 | i | semmle.label | i | -| main.rs:89:47:89:47 | i | semmle.label | i | -| main.rs:104:9:104:9 | s | semmle.label | s | -| main.rs:104:9:104:9 | s | semmle.label | s | -| main.rs:104:13:104:21 | source(...) | semmle.label | source(...) | -| main.rs:104:13:104:21 | source(...) | semmle.label | source(...) | -| main.rs:105:9:105:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:105:9:105:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:106:17:106:17 | s | semmle.label | s | -| main.rs:106:17:106:17 | s | semmle.label | s | -| main.rs:109:10:109:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | -| main.rs:109:10:109:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | -| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:126:9:126:9 | s | semmle.label | s | -| main.rs:126:9:126:9 | s | semmle.label | s | -| main.rs:126:13:126:21 | source(...) | semmle.label | source(...) | -| main.rs:126:13:126:21 | source(...) | semmle.label | source(...) | -| main.rs:127:9:127:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:127:9:127:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | -| main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | -| main.rs:127:38:127:38 | s | semmle.label | s | -| main.rs:127:38:127:38 | s | semmle.label | s | -| main.rs:129:10:129:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:129:10:129:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:129:10:129:25 | my_struct.field2 | semmle.label | my_struct.field2 | -| main.rs:129:10:129:25 | my_struct.field2 | semmle.label | my_struct.field2 | -| main.rs:138:9:138:9 | s | semmle.label | s | -| main.rs:138:9:138:9 | s | semmle.label | s | -| main.rs:138:13:138:21 | source(...) | semmle.label | source(...) | -| main.rs:138:13:138:21 | source(...) | semmle.label | source(...) | -| main.rs:139:10:139:31 | get_array_element(...) | semmle.label | get_array_element(...) | -| main.rs:139:10:139:31 | get_array_element(...) | semmle.label | get_array_element(...) | -| main.rs:139:28:139:30 | [...] [element] | semmle.label | [...] [element] | -| main.rs:139:28:139:30 | [...] [element] | semmle.label | [...] [element] | -| main.rs:139:29:139:29 | s | semmle.label | s | -| main.rs:139:29:139:29 | s | semmle.label | s | -| main.rs:148:9:148:9 | s | semmle.label | s | -| main.rs:148:9:148:9 | s | semmle.label | s | -| main.rs:148:13:148:21 | source(...) | semmle.label | source(...) | -| main.rs:148:13:148:21 | source(...) | semmle.label | source(...) | -| main.rs:149:9:149:11 | arr [element] | semmle.label | arr [element] | -| main.rs:149:9:149:11 | arr [element] | semmle.label | arr [element] | -| main.rs:149:15:149:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | -| main.rs:149:15:149:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | -| main.rs:149:33:149:33 | s | semmle.label | s | -| main.rs:149:33:149:33 | s | semmle.label | s | -| main.rs:150:10:150:12 | arr [element] | semmle.label | arr [element] | -| main.rs:150:10:150:12 | arr [element] | semmle.label | arr [element] | -| main.rs:150:10:150:15 | arr[0] | semmle.label | arr[0] | -| main.rs:150:10:150:15 | arr[0] | semmle.label | arr[0] | -| main.rs:159:9:159:9 | s | semmle.label | s | -| main.rs:159:9:159:9 | s | semmle.label | s | -| main.rs:159:13:159:22 | source(...) | semmle.label | source(...) | -| main.rs:159:13:159:22 | source(...) | semmle.label | source(...) | -| main.rs:160:9:160:9 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:160:9:160:9 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:160:13:160:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| main.rs:160:13:160:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| main.rs:160:14:160:14 | s | semmle.label | s | -| main.rs:160:14:160:14 | s | semmle.label | s | -| main.rs:161:10:161:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | -| main.rs:161:10:161:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | -| main.rs:161:28:161:28 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:161:28:161:28 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:172:9:172:9 | s | semmle.label | s | -| main.rs:172:9:172:9 | s | semmle.label | s | -| main.rs:172:13:172:22 | source(...) | semmle.label | source(...) | -| main.rs:172:13:172:22 | source(...) | semmle.label | source(...) | -| main.rs:173:9:173:9 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:173:9:173:9 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | -| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | -| main.rs:173:31:173:31 | s | semmle.label | s | -| main.rs:173:31:173:31 | s | semmle.label | s | -| main.rs:175:10:175:10 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:175:10:175:10 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:175:10:175:12 | t.1 | semmle.label | t.1 | -| main.rs:175:10:175:12 | t.1 | semmle.label | t.1 | -| main.rs:187:9:187:9 | s | semmle.label | s | -| main.rs:187:9:187:9 | s | semmle.label | s | -| main.rs:187:13:187:22 | source(...) | semmle.label | source(...) | -| main.rs:187:13:187:22 | source(...) | semmle.label | source(...) | -| main.rs:188:14:188:14 | ... | semmle.label | ... | -| main.rs:188:14:188:14 | ... | semmle.label | ... | -| main.rs:189:14:189:14 | n | semmle.label | n | -| main.rs:189:14:189:14 | n | semmle.label | n | -| main.rs:192:11:192:11 | s | semmle.label | s | -| main.rs:192:11:192:11 | s | semmle.label | s | -| main.rs:196:13:196:22 | source(...) | semmle.label | source(...) | -| main.rs:196:13:196:22 | source(...) | semmle.label | source(...) | -| main.rs:197:17:197:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:197:17:197:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:197:40:197:40 | s | semmle.label | s | -| main.rs:197:40:197:40 | s | semmle.label | s | -| main.rs:198:9:198:9 | t | semmle.label | t | -| main.rs:198:9:198:9 | t | semmle.label | t | -| main.rs:198:13:198:24 | apply(...) | semmle.label | apply(...) | -| main.rs:198:13:198:24 | apply(...) | semmle.label | apply(...) | -| main.rs:198:23:198:23 | f [captured s] | semmle.label | f [captured s] | -| main.rs:198:23:198:23 | f [captured s] | semmle.label | f [captured s] | -| main.rs:199:10:199:10 | t | semmle.label | t | -| main.rs:199:10:199:10 | t | semmle.label | t | -| main.rs:203:9:203:9 | s | semmle.label | s | -| main.rs:203:9:203:9 | s | semmle.label | s | -| main.rs:203:13:203:22 | source(...) | semmle.label | source(...) | -| main.rs:203:13:203:22 | source(...) | semmle.label | source(...) | -| main.rs:204:14:204:14 | ... | semmle.label | ... | -| main.rs:204:14:204:14 | ... | semmle.label | ... | -| main.rs:204:17:204:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:204:17:204:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:205:9:205:9 | t | semmle.label | t | -| main.rs:205:9:205:9 | t | semmle.label | t | -| main.rs:205:13:205:23 | apply(...) | semmle.label | apply(...) | -| main.rs:205:13:205:23 | apply(...) | semmle.label | apply(...) | -| main.rs:205:19:205:19 | s | semmle.label | s | -| main.rs:205:19:205:19 | s | semmle.label | s | -| main.rs:206:10:206:10 | t | semmle.label | t | -| main.rs:206:10:206:10 | t | semmle.label | t | -| main.rs:215:9:215:9 | s | semmle.label | s | -| main.rs:215:9:215:9 | s | semmle.label | s | -| main.rs:215:13:215:22 | source(...) | semmle.label | source(...) | -| main.rs:215:13:215:22 | source(...) | semmle.label | source(...) | -| main.rs:216:9:216:9 | t | semmle.label | t | -| main.rs:216:9:216:9 | t | semmle.label | t | -| main.rs:216:13:216:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | -| main.rs:216:13:216:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | -| main.rs:216:13:216:37 | await ... | semmle.label | await ... | -| main.rs:216:13:216:37 | await ... | semmle.label | await ... | -| main.rs:216:30:216:30 | s | semmle.label | s | -| main.rs:216:30:216:30 | s | semmle.label | s | -| main.rs:217:10:217:10 | t | semmle.label | t | -| main.rs:217:10:217:10 | t | semmle.label | t | -| main.rs:236:9:236:9 | s [D] | semmle.label | s [D] | -| main.rs:236:9:236:9 | s [D] | semmle.label | s [D] | -| main.rs:236:13:236:23 | enum_source | semmle.label | enum_source | -| main.rs:236:13:236:23 | enum_source | semmle.label | enum_source | -| main.rs:236:13:236:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | -| main.rs:236:13:236:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | -| main.rs:237:11:237:11 | s [D] | semmle.label | s [D] | -| main.rs:237:11:237:11 | s [D] | semmle.label | s [D] | -| main.rs:239:9:239:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:239:9:239:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:239:35:239:35 | i | semmle.label | i | -| main.rs:239:35:239:35 | i | semmle.label | i | -| main.rs:239:47:239:47 | i | semmle.label | i | -| main.rs:239:47:239:47 | i | semmle.label | i | -| main.rs:245:9:245:9 | s [C] | semmle.label | s [C] | -| main.rs:245:9:245:9 | s [C] | semmle.label | s [C] | -| main.rs:245:13:245:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:245:13:245:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:245:15:245:20 | source | semmle.label | source | -| main.rs:245:15:245:20 | source | semmle.label | source | -| main.rs:246:11:246:11 | s [C] | semmle.label | s [C] | -| main.rs:246:11:246:11 | s [C] | semmle.label | s [C] | -| main.rs:247:9:247:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:247:9:247:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:247:35:247:35 | i | semmle.label | i | -| main.rs:247:35:247:35 | i | semmle.label | i | -| main.rs:247:47:247:47 | i | semmle.label | i | -| main.rs:247:47:247:47 | i | semmle.label | i | -| main.rs:261:18:261:18 | ... | semmle.label | ... | -| main.rs:261:18:261:18 | ... | semmle.label | ... | -| main.rs:261:26:261:26 | a | semmle.label | a | -| main.rs:261:26:261:26 | a | semmle.label | a | -| main.rs:262:9:262:19 | pass_source | semmle.label | pass_source | -| main.rs:262:9:262:19 | pass_source | semmle.label | pass_source | -| main.rs:264:9:264:19 | pass_source | semmle.label | pass_source | -| main.rs:264:9:264:19 | pass_source | semmle.label | pass_source | -| main.rs:264:25:264:25 | ... | semmle.label | ... | -| main.rs:264:25:264:25 | ... | semmle.label | ... | -| main.rs:265:18:265:18 | a | semmle.label | a | -| main.rs:265:18:265:18 | a | semmle.label | a | -| main.rs:268:14:268:19 | ...: i64 | semmle.label | ...: i64 | -| main.rs:268:14:268:19 | ...: i64 | semmle.label | ...: i64 | -| main.rs:269:18:269:18 | a | semmle.label | a | -| main.rs:269:18:269:18 | a | semmle.label | a | -| main.rs:271:9:271:19 | pass_source | semmle.label | pass_source | -| main.rs:271:9:271:19 | pass_source | semmle.label | pass_source | -| main.rs:273:9:273:19 | pass_source | semmle.label | pass_source | -| main.rs:273:9:273:19 | pass_source | semmle.label | pass_source | -| main.rs:273:36:273:36 | ... | semmle.label | ... | -| main.rs:273:36:273:36 | ... | semmle.label | ... | -| main.rs:274:18:274:18 | a | semmle.label | a | -| main.rs:274:18:274:18 | a | semmle.label | a | -| main.rs:283:9:283:9 | s | semmle.label | s | -| main.rs:283:9:283:9 | s | semmle.label | s | -| main.rs:283:13:283:22 | source(...) | semmle.label | source(...) | -| main.rs:283:13:283:22 | source(...) | semmle.label | source(...) | -| main.rs:284:5:284:13 | enum_sink | semmle.label | enum_sink | -| main.rs:284:5:284:13 | enum_sink | semmle.label | enum_sink | -| main.rs:284:15:284:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:284:15:284:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:284:41:284:41 | s | semmle.label | s | -| main.rs:284:41:284:41 | s | semmle.label | s | -| main.rs:289:9:289:9 | s | semmle.label | s | -| main.rs:289:9:289:9 | s | semmle.label | s | -| main.rs:289:13:289:22 | source(...) | semmle.label | source(...) | -| main.rs:289:13:289:22 | source(...) | semmle.label | source(...) | -| main.rs:290:9:290:9 | e [D] | semmle.label | e [D] | -| main.rs:290:9:290:9 | e [D] | semmle.label | e [D] | -| main.rs:290:13:290:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:290:13:290:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:290:39:290:39 | s | semmle.label | s | -| main.rs:290:39:290:39 | s | semmle.label | s | -| main.rs:291:5:291:5 | e [D] | semmle.label | e [D] | -| main.rs:291:5:291:5 | e [D] | semmle.label | e [D] | -| main.rs:291:7:291:10 | sink | semmle.label | sink | -| main.rs:291:7:291:10 | sink | semmle.label | sink | -| main.rs:300:9:300:9 | s | semmle.label | s | -| main.rs:300:9:300:9 | s | semmle.label | s | -| main.rs:300:13:300:25 | simple_source | semmle.label | simple_source | -| main.rs:300:13:300:25 | simple_source | semmle.label | simple_source | -| main.rs:300:13:300:29 | simple_source(...) | semmle.label | simple_source(...) | -| main.rs:300:13:300:29 | simple_source(...) | semmle.label | simple_source(...) | -| main.rs:301:10:301:10 | s | semmle.label | s | -| main.rs:301:10:301:10 | s | semmle.label | s | -| main.rs:308:9:308:9 | s | semmle.label | s | -| main.rs:308:9:308:9 | s | semmle.label | s | -| main.rs:308:13:308:22 | source(...) | semmle.label | source(...) | -| main.rs:308:13:308:22 | source(...) | semmle.label | source(...) | -| main.rs:309:5:309:15 | simple_sink | semmle.label | simple_sink | -| main.rs:309:5:309:15 | simple_sink | semmle.label | simple_sink | -| main.rs:309:17:309:17 | s | semmle.label | s | -| main.rs:309:17:309:17 | s | semmle.label | s | -| main.rs:317:5:317:14 | arg_source | semmle.label | arg_source | -| main.rs:317:5:317:14 | arg_source | semmle.label | arg_source | -| main.rs:317:16:317:16 | [post] i | semmle.label | [post] i | -| main.rs:317:16:317:16 | [post] i | semmle.label | [post] i | -| main.rs:318:10:318:10 | i | semmle.label | i | -| main.rs:318:10:318:10 | i | semmle.label | i | -| main.rs:370:9:370:10 | x1 | semmle.label | x1 | -| main.rs:370:9:370:10 | x1 | semmle.label | x1 | -| main.rs:370:14:370:23 | source(...) | semmle.label | source(...) | -| main.rs:370:14:370:23 | source(...) | semmle.label | source(...) | -| main.rs:370:14:370:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:370:14:370:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:371:10:371:11 | x1 | semmle.label | x1 | -| main.rs:371:10:371:11 | x1 | semmle.label | x1 | -| main.rs:373:9:373:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:373:9:373:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:373:14:380:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:373:14:380:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:373:15:376:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:373:15:376:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:374:17:374:26 | source(...) | semmle.label | source(...) | -| main.rs:374:17:374:26 | source(...) | semmle.label | source(...) | -| main.rs:381:10:381:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:381:10:381:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:381:10:381:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:381:10:381:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:386:9:386:10 | x4 | semmle.label | x4 | -| main.rs:386:9:386:10 | x4 | semmle.label | x4 | -| main.rs:386:14:386:23 | source(...) | semmle.label | source(...) | -| main.rs:386:14:386:23 | source(...) | semmle.label | source(...) | -| main.rs:386:14:386:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:386:14:386:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:387:10:387:11 | x4 | semmle.label | x4 | -| main.rs:387:10:387:11 | x4 | semmle.label | x4 | -| main.rs:389:9:389:10 | x5 | semmle.label | x5 | -| main.rs:389:14:389:23 | source(...) | semmle.label | source(...) | -| main.rs:389:14:389:30 | ... .lt(...) | semmle.label | ... .lt(...) | -| main.rs:390:10:390:11 | x5 | semmle.label | x5 | -| main.rs:392:9:392:10 | x6 | semmle.label | x6 | -| main.rs:392:14:392:23 | source(...) | semmle.label | source(...) | -| main.rs:392:14:392:27 | ... < ... | semmle.label | ... < ... | -| main.rs:393:10:393:11 | x6 | semmle.label | x6 | +| main.rs:41:9:41:10 | s1 | semmle.label | s1 | +| main.rs:41:9:41:10 | s1 | semmle.label | s1 | +| main.rs:41:14:41:23 | source(...) | semmle.label | source(...) | +| main.rs:41:14:41:23 | source(...) | semmle.label | source(...) | +| main.rs:42:10:42:19 | snd(...) | semmle.label | snd(...) | +| main.rs:42:10:42:19 | snd(...) | semmle.label | snd(...) | +| main.rs:42:17:42:18 | s1 | semmle.label | s1 | +| main.rs:42:17:42:18 | s1 | semmle.label | s1 | +| main.rs:54:9:54:9 | s | semmle.label | s | +| main.rs:54:9:54:9 | s | semmle.label | s | +| main.rs:54:13:54:21 | source(...) | semmle.label | source(...) | +| main.rs:54:13:54:21 | source(...) | semmle.label | source(...) | +| main.rs:55:9:55:10 | e1 [A] | semmle.label | e1 [A] | +| main.rs:55:9:55:10 | e1 [A] | semmle.label | e1 [A] | +| main.rs:55:14:55:28 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:55:14:55:28 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:55:27:55:27 | s | semmle.label | s | +| main.rs:55:27:55:27 | s | semmle.label | s | +| main.rs:56:10:56:24 | get_var_pos(...) | semmle.label | get_var_pos(...) | +| main.rs:56:10:56:24 | get_var_pos(...) | semmle.label | get_var_pos(...) | +| main.rs:56:22:56:23 | e1 [A] | semmle.label | e1 [A] | +| main.rs:56:22:56:23 | e1 [A] | semmle.label | e1 [A] | +| main.rs:67:9:67:9 | s | semmle.label | s | +| main.rs:67:9:67:9 | s | semmle.label | s | +| main.rs:67:13:67:21 | source(...) | semmle.label | source(...) | +| main.rs:67:13:67:21 | source(...) | semmle.label | source(...) | +| main.rs:68:9:68:10 | e1 [B] | semmle.label | e1 [B] | +| main.rs:68:9:68:10 | e1 [B] | semmle.label | e1 [B] | +| main.rs:68:14:68:27 | set_var_pos(...) [B] | semmle.label | set_var_pos(...) [B] | +| main.rs:68:14:68:27 | set_var_pos(...) [B] | semmle.label | set_var_pos(...) [B] | +| main.rs:68:26:68:26 | s | semmle.label | s | +| main.rs:68:26:68:26 | s | semmle.label | s | +| main.rs:69:11:69:12 | e1 [B] | semmle.label | e1 [B] | +| main.rs:69:11:69:12 | e1 [B] | semmle.label | e1 [B] | +| main.rs:71:9:71:23 | ...::B(...) [B] | semmle.label | ...::B(...) [B] | +| main.rs:71:9:71:23 | ...::B(...) [B] | semmle.label | ...::B(...) [B] | +| main.rs:71:22:71:22 | i | semmle.label | i | +| main.rs:71:22:71:22 | i | semmle.label | i | +| main.rs:71:33:71:33 | i | semmle.label | i | +| main.rs:71:33:71:33 | i | semmle.label | i | +| main.rs:86:9:86:9 | s | semmle.label | s | +| main.rs:86:9:86:9 | s | semmle.label | s | +| main.rs:86:13:86:21 | source(...) | semmle.label | source(...) | +| main.rs:86:13:86:21 | source(...) | semmle.label | source(...) | +| main.rs:87:9:87:10 | e1 [C] | semmle.label | e1 [C] | +| main.rs:87:9:87:10 | e1 [C] | semmle.label | e1 [C] | +| main.rs:87:14:87:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:87:14:87:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:87:40:87:40 | s | semmle.label | s | +| main.rs:87:40:87:40 | s | semmle.label | s | +| main.rs:88:10:88:26 | get_var_field(...) | semmle.label | get_var_field(...) | +| main.rs:88:10:88:26 | get_var_field(...) | semmle.label | get_var_field(...) | +| main.rs:88:24:88:25 | e1 [C] | semmle.label | e1 [C] | +| main.rs:88:24:88:25 | e1 [C] | semmle.label | e1 [C] | +| main.rs:99:9:99:9 | s | semmle.label | s | +| main.rs:99:9:99:9 | s | semmle.label | s | +| main.rs:99:13:99:21 | source(...) | semmle.label | source(...) | +| main.rs:99:13:99:21 | source(...) | semmle.label | source(...) | +| main.rs:100:9:100:10 | e1 [D] | semmle.label | e1 [D] | +| main.rs:100:9:100:10 | e1 [D] | semmle.label | e1 [D] | +| main.rs:100:14:100:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | +| main.rs:100:14:100:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | +| main.rs:100:28:100:28 | s | semmle.label | s | +| main.rs:100:28:100:28 | s | semmle.label | s | +| main.rs:101:11:101:12 | e1 [D] | semmle.label | e1 [D] | +| main.rs:101:11:101:12 | e1 [D] | semmle.label | e1 [D] | +| main.rs:103:9:103:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:103:9:103:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:103:35:103:35 | i | semmle.label | i | +| main.rs:103:35:103:35 | i | semmle.label | i | +| main.rs:103:47:103:47 | i | semmle.label | i | +| main.rs:103:47:103:47 | i | semmle.label | i | +| main.rs:118:9:118:9 | s | semmle.label | s | +| main.rs:118:9:118:9 | s | semmle.label | s | +| main.rs:118:13:118:21 | source(...) | semmle.label | source(...) | +| main.rs:118:13:118:21 | source(...) | semmle.label | source(...) | +| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:120:17:120:17 | s | semmle.label | s | +| main.rs:120:17:120:17 | s | semmle.label | s | +| main.rs:123:10:123:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | +| main.rs:123:10:123:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | +| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:140:9:140:9 | s | semmle.label | s | +| main.rs:140:9:140:9 | s | semmle.label | s | +| main.rs:140:13:140:21 | source(...) | semmle.label | source(...) | +| main.rs:140:13:140:21 | source(...) | semmle.label | source(...) | +| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | +| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | +| main.rs:141:38:141:38 | s | semmle.label | s | +| main.rs:141:38:141:38 | s | semmle.label | s | +| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:143:10:143:25 | my_struct.field2 | semmle.label | my_struct.field2 | +| main.rs:143:10:143:25 | my_struct.field2 | semmle.label | my_struct.field2 | +| main.rs:152:9:152:9 | s | semmle.label | s | +| main.rs:152:9:152:9 | s | semmle.label | s | +| main.rs:152:13:152:21 | source(...) | semmle.label | source(...) | +| main.rs:152:13:152:21 | source(...) | semmle.label | source(...) | +| main.rs:153:10:153:31 | get_array_element(...) | semmle.label | get_array_element(...) | +| main.rs:153:10:153:31 | get_array_element(...) | semmle.label | get_array_element(...) | +| main.rs:153:28:153:30 | [...] [element] | semmle.label | [...] [element] | +| main.rs:153:28:153:30 | [...] [element] | semmle.label | [...] [element] | +| main.rs:153:29:153:29 | s | semmle.label | s | +| main.rs:153:29:153:29 | s | semmle.label | s | +| main.rs:162:9:162:9 | s | semmle.label | s | +| main.rs:162:9:162:9 | s | semmle.label | s | +| main.rs:162:13:162:21 | source(...) | semmle.label | source(...) | +| main.rs:162:13:162:21 | source(...) | semmle.label | source(...) | +| main.rs:163:9:163:11 | arr [element] | semmle.label | arr [element] | +| main.rs:163:9:163:11 | arr [element] | semmle.label | arr [element] | +| main.rs:163:15:163:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | +| main.rs:163:15:163:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | +| main.rs:163:33:163:33 | s | semmle.label | s | +| main.rs:163:33:163:33 | s | semmle.label | s | +| main.rs:164:10:164:12 | arr [element] | semmle.label | arr [element] | +| main.rs:164:10:164:12 | arr [element] | semmle.label | arr [element] | +| main.rs:164:10:164:15 | arr[0] | semmle.label | arr[0] | +| main.rs:164:10:164:15 | arr[0] | semmle.label | arr[0] | +| main.rs:173:9:173:9 | s | semmle.label | s | +| main.rs:173:9:173:9 | s | semmle.label | s | +| main.rs:173:13:173:22 | source(...) | semmle.label | source(...) | +| main.rs:173:13:173:22 | source(...) | semmle.label | source(...) | +| main.rs:174:9:174:9 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:174:9:174:9 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:174:13:174:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| main.rs:174:13:174:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| main.rs:174:14:174:14 | s | semmle.label | s | +| main.rs:174:14:174:14 | s | semmle.label | s | +| main.rs:175:10:175:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | +| main.rs:175:10:175:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | +| main.rs:175:28:175:28 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:175:28:175:28 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:186:9:186:9 | s | semmle.label | s | +| main.rs:186:9:186:9 | s | semmle.label | s | +| main.rs:186:13:186:22 | source(...) | semmle.label | source(...) | +| main.rs:186:13:186:22 | source(...) | semmle.label | source(...) | +| main.rs:187:9:187:9 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:187:9:187:9 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | +| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | +| main.rs:187:31:187:31 | s | semmle.label | s | +| main.rs:187:31:187:31 | s | semmle.label | s | +| main.rs:189:10:189:10 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:189:10:189:10 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:189:10:189:12 | t.1 | semmle.label | t.1 | +| main.rs:189:10:189:12 | t.1 | semmle.label | t.1 | +| main.rs:201:9:201:9 | s | semmle.label | s | +| main.rs:201:9:201:9 | s | semmle.label | s | +| main.rs:201:13:201:22 | source(...) | semmle.label | source(...) | +| main.rs:201:13:201:22 | source(...) | semmle.label | source(...) | +| main.rs:202:14:202:14 | ... | semmle.label | ... | +| main.rs:202:14:202:14 | ... | semmle.label | ... | +| main.rs:203:14:203:14 | n | semmle.label | n | +| main.rs:203:14:203:14 | n | semmle.label | n | +| main.rs:206:11:206:11 | s | semmle.label | s | +| main.rs:206:11:206:11 | s | semmle.label | s | +| main.rs:210:13:210:22 | source(...) | semmle.label | source(...) | +| main.rs:210:13:210:22 | source(...) | semmle.label | source(...) | +| main.rs:211:17:211:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:211:17:211:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:211:40:211:40 | s | semmle.label | s | +| main.rs:211:40:211:40 | s | semmle.label | s | +| main.rs:212:9:212:9 | t | semmle.label | t | +| main.rs:212:9:212:9 | t | semmle.label | t | +| main.rs:212:13:212:24 | apply(...) | semmle.label | apply(...) | +| main.rs:212:13:212:24 | apply(...) | semmle.label | apply(...) | +| main.rs:212:23:212:23 | f [captured s] | semmle.label | f [captured s] | +| main.rs:212:23:212:23 | f [captured s] | semmle.label | f [captured s] | +| main.rs:213:10:213:10 | t | semmle.label | t | +| main.rs:213:10:213:10 | t | semmle.label | t | +| main.rs:217:9:217:9 | s | semmle.label | s | +| main.rs:217:9:217:9 | s | semmle.label | s | +| main.rs:217:13:217:22 | source(...) | semmle.label | source(...) | +| main.rs:217:13:217:22 | source(...) | semmle.label | source(...) | +| main.rs:218:14:218:14 | ... | semmle.label | ... | +| main.rs:218:14:218:14 | ... | semmle.label | ... | +| main.rs:218:17:218:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:218:17:218:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:219:9:219:9 | t | semmle.label | t | +| main.rs:219:9:219:9 | t | semmle.label | t | +| main.rs:219:13:219:23 | apply(...) | semmle.label | apply(...) | +| main.rs:219:13:219:23 | apply(...) | semmle.label | apply(...) | +| main.rs:219:19:219:19 | s | semmle.label | s | +| main.rs:219:19:219:19 | s | semmle.label | s | +| main.rs:220:10:220:10 | t | semmle.label | t | +| main.rs:220:10:220:10 | t | semmle.label | t | +| main.rs:229:9:229:9 | s | semmle.label | s | +| main.rs:229:9:229:9 | s | semmle.label | s | +| main.rs:229:13:229:22 | source(...) | semmle.label | source(...) | +| main.rs:229:13:229:22 | source(...) | semmle.label | source(...) | +| main.rs:230:9:230:9 | t | semmle.label | t | +| main.rs:230:9:230:9 | t | semmle.label | t | +| main.rs:230:13:230:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | +| main.rs:230:13:230:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | +| main.rs:230:13:230:37 | await ... | semmle.label | await ... | +| main.rs:230:13:230:37 | await ... | semmle.label | await ... | +| main.rs:230:30:230:30 | s | semmle.label | s | +| main.rs:230:30:230:30 | s | semmle.label | s | +| main.rs:231:10:231:10 | t | semmle.label | t | +| main.rs:231:10:231:10 | t | semmle.label | t | +| main.rs:250:9:250:9 | s [D] | semmle.label | s [D] | +| main.rs:250:9:250:9 | s [D] | semmle.label | s [D] | +| main.rs:250:13:250:23 | enum_source | semmle.label | enum_source | +| main.rs:250:13:250:23 | enum_source | semmle.label | enum_source | +| main.rs:250:13:250:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | +| main.rs:250:13:250:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | +| main.rs:251:11:251:11 | s [D] | semmle.label | s [D] | +| main.rs:251:11:251:11 | s [D] | semmle.label | s [D] | +| main.rs:253:9:253:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:253:9:253:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:253:35:253:35 | i | semmle.label | i | +| main.rs:253:35:253:35 | i | semmle.label | i | +| main.rs:253:47:253:47 | i | semmle.label | i | +| main.rs:253:47:253:47 | i | semmle.label | i | +| main.rs:259:9:259:9 | s [C] | semmle.label | s [C] | +| main.rs:259:9:259:9 | s [C] | semmle.label | s [C] | +| main.rs:259:13:259:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | +| main.rs:259:13:259:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | +| main.rs:259:15:259:20 | source | semmle.label | source | +| main.rs:259:15:259:20 | source | semmle.label | source | +| main.rs:260:11:260:11 | s [C] | semmle.label | s [C] | +| main.rs:260:11:260:11 | s [C] | semmle.label | s [C] | +| main.rs:261:9:261:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:261:9:261:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:261:35:261:35 | i | semmle.label | i | +| main.rs:261:35:261:35 | i | semmle.label | i | +| main.rs:261:47:261:47 | i | semmle.label | i | +| main.rs:261:47:261:47 | i | semmle.label | i | +| main.rs:275:18:275:18 | ... | semmle.label | ... | +| main.rs:275:18:275:18 | ... | semmle.label | ... | +| main.rs:275:26:275:26 | a | semmle.label | a | +| main.rs:275:26:275:26 | a | semmle.label | a | +| main.rs:276:9:276:19 | pass_source | semmle.label | pass_source | +| main.rs:276:9:276:19 | pass_source | semmle.label | pass_source | +| main.rs:278:9:278:19 | pass_source | semmle.label | pass_source | +| main.rs:278:9:278:19 | pass_source | semmle.label | pass_source | +| main.rs:278:25:278:25 | ... | semmle.label | ... | +| main.rs:278:25:278:25 | ... | semmle.label | ... | +| main.rs:279:18:279:18 | a | semmle.label | a | +| main.rs:279:18:279:18 | a | semmle.label | a | +| main.rs:282:14:282:19 | ...: i64 | semmle.label | ...: i64 | +| main.rs:282:14:282:19 | ...: i64 | semmle.label | ...: i64 | +| main.rs:283:18:283:18 | a | semmle.label | a | +| main.rs:283:18:283:18 | a | semmle.label | a | +| main.rs:285:9:285:19 | pass_source | semmle.label | pass_source | +| main.rs:285:9:285:19 | pass_source | semmle.label | pass_source | +| main.rs:287:9:287:19 | pass_source | semmle.label | pass_source | +| main.rs:287:9:287:19 | pass_source | semmle.label | pass_source | +| main.rs:287:36:287:36 | ... | semmle.label | ... | +| main.rs:287:36:287:36 | ... | semmle.label | ... | +| main.rs:288:18:288:18 | a | semmle.label | a | +| main.rs:288:18:288:18 | a | semmle.label | a | +| main.rs:297:9:297:9 | s | semmle.label | s | +| main.rs:297:9:297:9 | s | semmle.label | s | +| main.rs:297:13:297:22 | source(...) | semmle.label | source(...) | +| main.rs:297:13:297:22 | source(...) | semmle.label | source(...) | +| main.rs:298:5:298:13 | enum_sink | semmle.label | enum_sink | +| main.rs:298:5:298:13 | enum_sink | semmle.label | enum_sink | +| main.rs:298:15:298:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:298:15:298:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:298:41:298:41 | s | semmle.label | s | +| main.rs:298:41:298:41 | s | semmle.label | s | +| main.rs:303:9:303:9 | s | semmle.label | s | +| main.rs:303:9:303:9 | s | semmle.label | s | +| main.rs:303:13:303:22 | source(...) | semmle.label | source(...) | +| main.rs:303:13:303:22 | source(...) | semmle.label | source(...) | +| main.rs:304:9:304:9 | e [D] | semmle.label | e [D] | +| main.rs:304:9:304:9 | e [D] | semmle.label | e [D] | +| main.rs:304:13:304:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:304:13:304:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:304:39:304:39 | s | semmle.label | s | +| main.rs:304:39:304:39 | s | semmle.label | s | +| main.rs:305:5:305:5 | e [D] | semmle.label | e [D] | +| main.rs:305:5:305:5 | e [D] | semmle.label | e [D] | +| main.rs:305:7:305:10 | sink | semmle.label | sink | +| main.rs:305:7:305:10 | sink | semmle.label | sink | +| main.rs:314:9:314:9 | s | semmle.label | s | +| main.rs:314:9:314:9 | s | semmle.label | s | +| main.rs:314:13:314:25 | simple_source | semmle.label | simple_source | +| main.rs:314:13:314:25 | simple_source | semmle.label | simple_source | +| main.rs:314:13:314:29 | simple_source(...) | semmle.label | simple_source(...) | +| main.rs:314:13:314:29 | simple_source(...) | semmle.label | simple_source(...) | +| main.rs:315:10:315:10 | s | semmle.label | s | +| main.rs:315:10:315:10 | s | semmle.label | s | +| main.rs:322:9:322:9 | s | semmle.label | s | +| main.rs:322:9:322:9 | s | semmle.label | s | +| main.rs:322:13:322:22 | source(...) | semmle.label | source(...) | +| main.rs:322:13:322:22 | source(...) | semmle.label | source(...) | +| main.rs:323:5:323:15 | simple_sink | semmle.label | simple_sink | +| main.rs:323:5:323:15 | simple_sink | semmle.label | simple_sink | +| main.rs:323:17:323:17 | s | semmle.label | s | +| main.rs:323:17:323:17 | s | semmle.label | s | +| main.rs:331:5:331:14 | arg_source | semmle.label | arg_source | +| main.rs:331:5:331:14 | arg_source | semmle.label | arg_source | +| main.rs:331:16:331:16 | [post] i | semmle.label | [post] i | +| main.rs:331:16:331:16 | [post] i | semmle.label | [post] i | +| main.rs:332:10:332:10 | i | semmle.label | i | +| main.rs:332:10:332:10 | i | semmle.label | i | +| main.rs:384:9:384:10 | x1 | semmle.label | x1 | +| main.rs:384:9:384:10 | x1 | semmle.label | x1 | +| main.rs:384:14:384:23 | source(...) | semmle.label | source(...) | +| main.rs:384:14:384:23 | source(...) | semmle.label | source(...) | +| main.rs:384:14:384:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:384:14:384:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:385:10:385:11 | x1 | semmle.label | x1 | +| main.rs:385:10:385:11 | x1 | semmle.label | x1 | +| main.rs:387:9:387:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:387:9:387:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:388:17:388:26 | source(...) | semmle.label | source(...) | +| main.rs:388:17:388:26 | source(...) | semmle.label | source(...) | +| main.rs:395:10:395:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:395:10:395:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:395:10:395:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:395:10:395:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:400:9:400:10 | x4 | semmle.label | x4 | +| main.rs:400:9:400:10 | x4 | semmle.label | x4 | +| main.rs:400:14:400:23 | source(...) | semmle.label | source(...) | +| main.rs:400:14:400:23 | source(...) | semmle.label | source(...) | +| main.rs:400:14:400:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:400:14:400:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:401:10:401:11 | x4 | semmle.label | x4 | +| main.rs:401:10:401:11 | x4 | semmle.label | x4 | +| main.rs:403:9:403:10 | x5 | semmle.label | x5 | +| main.rs:403:14:403:23 | source(...) | semmle.label | source(...) | +| main.rs:403:14:403:30 | ... .lt(...) | semmle.label | ... .lt(...) | +| main.rs:404:10:404:11 | x5 | semmle.label | x5 | +| main.rs:406:9:406:10 | x6 | semmle.label | x6 | +| main.rs:406:14:406:23 | source(...) | semmle.label | source(...) | +| main.rs:406:14:406:27 | ... < ... | semmle.label | ... < ... | +| main.rs:407:10:407:11 | x6 | semmle.label | x6 | subpaths -| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | main.rs:198:13:198:24 | apply(...) | -| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | main.rs:198:13:198:24 | apply(...) | -| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | main.rs:205:13:205:23 | apply(...) | -| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | main.rs:205:13:205:23 | apply(...) | +| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | main.rs:212:13:212:24 | apply(...) | +| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | main.rs:212:13:212:24 | apply(...) | +| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | main.rs:219:13:219:23 | apply(...) | +| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | main.rs:219:13:219:23 | apply(...) | testFailures invalidSpecComponent #select | main.rs:16:10:16:20 | identity(...) | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:20 | identity(...) | $@ | main.rs:15:13:15:21 | source(...) | source(...) | | main.rs:16:10:16:20 | identity(...) | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:20 | identity(...) | $@ | main.rs:15:13:15:21 | source(...) | source(...) | | main.rs:26:10:26:18 | coerce(...) | main.rs:25:13:25:22 | source(...) | main.rs:26:10:26:18 | coerce(...) | $@ | main.rs:25:13:25:22 | source(...) | source(...) | -| main.rs:42:10:42:24 | get_var_pos(...) | main.rs:40:13:40:21 | source(...) | main.rs:42:10:42:24 | get_var_pos(...) | $@ | main.rs:40:13:40:21 | source(...) | source(...) | -| main.rs:42:10:42:24 | get_var_pos(...) | main.rs:40:13:40:21 | source(...) | main.rs:42:10:42:24 | get_var_pos(...) | $@ | main.rs:40:13:40:21 | source(...) | source(...) | -| main.rs:57:33:57:33 | i | main.rs:53:13:53:21 | source(...) | main.rs:57:33:57:33 | i | $@ | main.rs:53:13:53:21 | source(...) | source(...) | -| main.rs:57:33:57:33 | i | main.rs:53:13:53:21 | source(...) | main.rs:57:33:57:33 | i | $@ | main.rs:53:13:53:21 | source(...) | source(...) | -| main.rs:74:10:74:26 | get_var_field(...) | main.rs:72:13:72:21 | source(...) | main.rs:74:10:74:26 | get_var_field(...) | $@ | main.rs:72:13:72:21 | source(...) | source(...) | -| main.rs:74:10:74:26 | get_var_field(...) | main.rs:72:13:72:21 | source(...) | main.rs:74:10:74:26 | get_var_field(...) | $@ | main.rs:72:13:72:21 | source(...) | source(...) | -| main.rs:89:47:89:47 | i | main.rs:85:13:85:21 | source(...) | main.rs:89:47:89:47 | i | $@ | main.rs:85:13:85:21 | source(...) | source(...) | -| main.rs:89:47:89:47 | i | main.rs:85:13:85:21 | source(...) | main.rs:89:47:89:47 | i | $@ | main.rs:85:13:85:21 | source(...) | source(...) | -| main.rs:109:10:109:36 | get_struct_field(...) | main.rs:104:13:104:21 | source(...) | main.rs:109:10:109:36 | get_struct_field(...) | $@ | main.rs:104:13:104:21 | source(...) | source(...) | -| main.rs:109:10:109:36 | get_struct_field(...) | main.rs:104:13:104:21 | source(...) | main.rs:109:10:109:36 | get_struct_field(...) | $@ | main.rs:104:13:104:21 | source(...) | source(...) | -| main.rs:129:10:129:25 | my_struct.field2 | main.rs:126:13:126:21 | source(...) | main.rs:129:10:129:25 | my_struct.field2 | $@ | main.rs:126:13:126:21 | source(...) | source(...) | -| main.rs:129:10:129:25 | my_struct.field2 | main.rs:126:13:126:21 | source(...) | main.rs:129:10:129:25 | my_struct.field2 | $@ | main.rs:126:13:126:21 | source(...) | source(...) | -| main.rs:139:10:139:31 | get_array_element(...) | main.rs:138:13:138:21 | source(...) | main.rs:139:10:139:31 | get_array_element(...) | $@ | main.rs:138:13:138:21 | source(...) | source(...) | -| main.rs:139:10:139:31 | get_array_element(...) | main.rs:138:13:138:21 | source(...) | main.rs:139:10:139:31 | get_array_element(...) | $@ | main.rs:138:13:138:21 | source(...) | source(...) | -| main.rs:150:10:150:15 | arr[0] | main.rs:148:13:148:21 | source(...) | main.rs:150:10:150:15 | arr[0] | $@ | main.rs:148:13:148:21 | source(...) | source(...) | -| main.rs:150:10:150:15 | arr[0] | main.rs:148:13:148:21 | source(...) | main.rs:150:10:150:15 | arr[0] | $@ | main.rs:148:13:148:21 | source(...) | source(...) | -| main.rs:161:10:161:29 | get_tuple_element(...) | main.rs:159:13:159:22 | source(...) | main.rs:161:10:161:29 | get_tuple_element(...) | $@ | main.rs:159:13:159:22 | source(...) | source(...) | -| main.rs:161:10:161:29 | get_tuple_element(...) | main.rs:159:13:159:22 | source(...) | main.rs:161:10:161:29 | get_tuple_element(...) | $@ | main.rs:159:13:159:22 | source(...) | source(...) | -| main.rs:175:10:175:12 | t.1 | main.rs:172:13:172:22 | source(...) | main.rs:175:10:175:12 | t.1 | $@ | main.rs:172:13:172:22 | source(...) | source(...) | -| main.rs:175:10:175:12 | t.1 | main.rs:172:13:172:22 | source(...) | main.rs:175:10:175:12 | t.1 | $@ | main.rs:172:13:172:22 | source(...) | source(...) | -| main.rs:189:14:189:14 | n | main.rs:187:13:187:22 | source(...) | main.rs:189:14:189:14 | n | $@ | main.rs:187:13:187:22 | source(...) | source(...) | -| main.rs:189:14:189:14 | n | main.rs:187:13:187:22 | source(...) | main.rs:189:14:189:14 | n | $@ | main.rs:187:13:187:22 | source(...) | source(...) | -| main.rs:199:10:199:10 | t | main.rs:196:13:196:22 | source(...) | main.rs:199:10:199:10 | t | $@ | main.rs:196:13:196:22 | source(...) | source(...) | -| main.rs:199:10:199:10 | t | main.rs:196:13:196:22 | source(...) | main.rs:199:10:199:10 | t | $@ | main.rs:196:13:196:22 | source(...) | source(...) | -| main.rs:206:10:206:10 | t | main.rs:203:13:203:22 | source(...) | main.rs:206:10:206:10 | t | $@ | main.rs:203:13:203:22 | source(...) | source(...) | -| main.rs:206:10:206:10 | t | main.rs:203:13:203:22 | source(...) | main.rs:206:10:206:10 | t | $@ | main.rs:203:13:203:22 | source(...) | source(...) | -| main.rs:217:10:217:10 | t | main.rs:215:13:215:22 | source(...) | main.rs:217:10:217:10 | t | $@ | main.rs:215:13:215:22 | source(...) | source(...) | -| main.rs:217:10:217:10 | t | main.rs:215:13:215:22 | source(...) | main.rs:217:10:217:10 | t | $@ | main.rs:215:13:215:22 | source(...) | source(...) | -| main.rs:239:47:239:47 | i | main.rs:236:13:236:23 | enum_source | main.rs:239:47:239:47 | i | $@ | main.rs:236:13:236:23 | enum_source | enum_source | -| main.rs:239:47:239:47 | i | main.rs:236:13:236:23 | enum_source | main.rs:239:47:239:47 | i | $@ | main.rs:236:13:236:23 | enum_source | enum_source | -| main.rs:247:47:247:47 | i | main.rs:245:15:245:20 | source | main.rs:247:47:247:47 | i | $@ | main.rs:245:15:245:20 | source | source | -| main.rs:247:47:247:47 | i | main.rs:245:15:245:20 | source | main.rs:247:47:247:47 | i | $@ | main.rs:245:15:245:20 | source | source | -| main.rs:261:26:261:26 | a | main.rs:262:9:262:19 | pass_source | main.rs:261:26:261:26 | a | $@ | main.rs:262:9:262:19 | pass_source | pass_source | -| main.rs:261:26:261:26 | a | main.rs:262:9:262:19 | pass_source | main.rs:261:26:261:26 | a | $@ | main.rs:262:9:262:19 | pass_source | pass_source | -| main.rs:265:18:265:18 | a | main.rs:264:9:264:19 | pass_source | main.rs:265:18:265:18 | a | $@ | main.rs:264:9:264:19 | pass_source | pass_source | -| main.rs:265:18:265:18 | a | main.rs:264:9:264:19 | pass_source | main.rs:265:18:265:18 | a | $@ | main.rs:264:9:264:19 | pass_source | pass_source | -| main.rs:269:18:269:18 | a | main.rs:271:9:271:19 | pass_source | main.rs:269:18:269:18 | a | $@ | main.rs:271:9:271:19 | pass_source | pass_source | -| main.rs:269:18:269:18 | a | main.rs:271:9:271:19 | pass_source | main.rs:269:18:269:18 | a | $@ | main.rs:271:9:271:19 | pass_source | pass_source | -| main.rs:274:18:274:18 | a | main.rs:273:9:273:19 | pass_source | main.rs:274:18:274:18 | a | $@ | main.rs:273:9:273:19 | pass_source | pass_source | -| main.rs:274:18:274:18 | a | main.rs:273:9:273:19 | pass_source | main.rs:274:18:274:18 | a | $@ | main.rs:273:9:273:19 | pass_source | pass_source | -| main.rs:284:5:284:13 | enum_sink | main.rs:283:13:283:22 | source(...) | main.rs:284:5:284:13 | enum_sink | $@ | main.rs:283:13:283:22 | source(...) | source(...) | -| main.rs:284:5:284:13 | enum_sink | main.rs:283:13:283:22 | source(...) | main.rs:284:5:284:13 | enum_sink | $@ | main.rs:283:13:283:22 | source(...) | source(...) | -| main.rs:291:7:291:10 | sink | main.rs:289:13:289:22 | source(...) | main.rs:291:7:291:10 | sink | $@ | main.rs:289:13:289:22 | source(...) | source(...) | -| main.rs:291:7:291:10 | sink | main.rs:289:13:289:22 | source(...) | main.rs:291:7:291:10 | sink | $@ | main.rs:289:13:289:22 | source(...) | source(...) | -| main.rs:301:10:301:10 | s | main.rs:300:13:300:25 | simple_source | main.rs:301:10:301:10 | s | $@ | main.rs:300:13:300:25 | simple_source | simple_source | -| main.rs:301:10:301:10 | s | main.rs:300:13:300:25 | simple_source | main.rs:301:10:301:10 | s | $@ | main.rs:300:13:300:25 | simple_source | simple_source | -| main.rs:309:5:309:15 | simple_sink | main.rs:308:13:308:22 | source(...) | main.rs:309:5:309:15 | simple_sink | $@ | main.rs:308:13:308:22 | source(...) | source(...) | -| main.rs:309:5:309:15 | simple_sink | main.rs:308:13:308:22 | source(...) | main.rs:309:5:309:15 | simple_sink | $@ | main.rs:308:13:308:22 | source(...) | source(...) | -| main.rs:318:10:318:10 | i | main.rs:317:5:317:14 | arg_source | main.rs:318:10:318:10 | i | $@ | main.rs:317:5:317:14 | arg_source | arg_source | -| main.rs:318:10:318:10 | i | main.rs:317:5:317:14 | arg_source | main.rs:318:10:318:10 | i | $@ | main.rs:317:5:317:14 | arg_source | arg_source | -| main.rs:371:10:371:11 | x1 | main.rs:370:14:370:23 | source(...) | main.rs:371:10:371:11 | x1 | $@ | main.rs:370:14:370:23 | source(...) | source(...) | -| main.rs:371:10:371:11 | x1 | main.rs:370:14:370:23 | source(...) | main.rs:371:10:371:11 | x1 | $@ | main.rs:370:14:370:23 | source(...) | source(...) | -| main.rs:381:10:381:18 | x2.field1 | main.rs:374:17:374:26 | source(...) | main.rs:381:10:381:18 | x2.field1 | $@ | main.rs:374:17:374:26 | source(...) | source(...) | -| main.rs:381:10:381:18 | x2.field1 | main.rs:374:17:374:26 | source(...) | main.rs:381:10:381:18 | x2.field1 | $@ | main.rs:374:17:374:26 | source(...) | source(...) | -| main.rs:387:10:387:11 | x4 | main.rs:386:14:386:23 | source(...) | main.rs:387:10:387:11 | x4 | $@ | main.rs:386:14:386:23 | source(...) | source(...) | -| main.rs:387:10:387:11 | x4 | main.rs:386:14:386:23 | source(...) | main.rs:387:10:387:11 | x4 | $@ | main.rs:386:14:386:23 | source(...) | source(...) | -| main.rs:390:10:390:11 | x5 | main.rs:389:14:389:23 | source(...) | main.rs:390:10:390:11 | x5 | $@ | main.rs:389:14:389:23 | source(...) | source(...) | -| main.rs:393:10:393:11 | x6 | main.rs:392:14:392:23 | source(...) | main.rs:393:10:393:11 | x6 | $@ | main.rs:392:14:392:23 | source(...) | source(...) | +| main.rs:42:10:42:19 | snd(...) | main.rs:41:14:41:23 | source(...) | main.rs:42:10:42:19 | snd(...) | $@ | main.rs:41:14:41:23 | source(...) | source(...) | +| main.rs:42:10:42:19 | snd(...) | main.rs:41:14:41:23 | source(...) | main.rs:42:10:42:19 | snd(...) | $@ | main.rs:41:14:41:23 | source(...) | source(...) | +| main.rs:56:10:56:24 | get_var_pos(...) | main.rs:54:13:54:21 | source(...) | main.rs:56:10:56:24 | get_var_pos(...) | $@ | main.rs:54:13:54:21 | source(...) | source(...) | +| main.rs:56:10:56:24 | get_var_pos(...) | main.rs:54:13:54:21 | source(...) | main.rs:56:10:56:24 | get_var_pos(...) | $@ | main.rs:54:13:54:21 | source(...) | source(...) | +| main.rs:71:33:71:33 | i | main.rs:67:13:67:21 | source(...) | main.rs:71:33:71:33 | i | $@ | main.rs:67:13:67:21 | source(...) | source(...) | +| main.rs:71:33:71:33 | i | main.rs:67:13:67:21 | source(...) | main.rs:71:33:71:33 | i | $@ | main.rs:67:13:67:21 | source(...) | source(...) | +| main.rs:88:10:88:26 | get_var_field(...) | main.rs:86:13:86:21 | source(...) | main.rs:88:10:88:26 | get_var_field(...) | $@ | main.rs:86:13:86:21 | source(...) | source(...) | +| main.rs:88:10:88:26 | get_var_field(...) | main.rs:86:13:86:21 | source(...) | main.rs:88:10:88:26 | get_var_field(...) | $@ | main.rs:86:13:86:21 | source(...) | source(...) | +| main.rs:103:47:103:47 | i | main.rs:99:13:99:21 | source(...) | main.rs:103:47:103:47 | i | $@ | main.rs:99:13:99:21 | source(...) | source(...) | +| main.rs:103:47:103:47 | i | main.rs:99:13:99:21 | source(...) | main.rs:103:47:103:47 | i | $@ | main.rs:99:13:99:21 | source(...) | source(...) | +| main.rs:123:10:123:36 | get_struct_field(...) | main.rs:118:13:118:21 | source(...) | main.rs:123:10:123:36 | get_struct_field(...) | $@ | main.rs:118:13:118:21 | source(...) | source(...) | +| main.rs:123:10:123:36 | get_struct_field(...) | main.rs:118:13:118:21 | source(...) | main.rs:123:10:123:36 | get_struct_field(...) | $@ | main.rs:118:13:118:21 | source(...) | source(...) | +| main.rs:143:10:143:25 | my_struct.field2 | main.rs:140:13:140:21 | source(...) | main.rs:143:10:143:25 | my_struct.field2 | $@ | main.rs:140:13:140:21 | source(...) | source(...) | +| main.rs:143:10:143:25 | my_struct.field2 | main.rs:140:13:140:21 | source(...) | main.rs:143:10:143:25 | my_struct.field2 | $@ | main.rs:140:13:140:21 | source(...) | source(...) | +| main.rs:153:10:153:31 | get_array_element(...) | main.rs:152:13:152:21 | source(...) | main.rs:153:10:153:31 | get_array_element(...) | $@ | main.rs:152:13:152:21 | source(...) | source(...) | +| main.rs:153:10:153:31 | get_array_element(...) | main.rs:152:13:152:21 | source(...) | main.rs:153:10:153:31 | get_array_element(...) | $@ | main.rs:152:13:152:21 | source(...) | source(...) | +| main.rs:164:10:164:15 | arr[0] | main.rs:162:13:162:21 | source(...) | main.rs:164:10:164:15 | arr[0] | $@ | main.rs:162:13:162:21 | source(...) | source(...) | +| main.rs:164:10:164:15 | arr[0] | main.rs:162:13:162:21 | source(...) | main.rs:164:10:164:15 | arr[0] | $@ | main.rs:162:13:162:21 | source(...) | source(...) | +| main.rs:175:10:175:29 | get_tuple_element(...) | main.rs:173:13:173:22 | source(...) | main.rs:175:10:175:29 | get_tuple_element(...) | $@ | main.rs:173:13:173:22 | source(...) | source(...) | +| main.rs:175:10:175:29 | get_tuple_element(...) | main.rs:173:13:173:22 | source(...) | main.rs:175:10:175:29 | get_tuple_element(...) | $@ | main.rs:173:13:173:22 | source(...) | source(...) | +| main.rs:189:10:189:12 | t.1 | main.rs:186:13:186:22 | source(...) | main.rs:189:10:189:12 | t.1 | $@ | main.rs:186:13:186:22 | source(...) | source(...) | +| main.rs:189:10:189:12 | t.1 | main.rs:186:13:186:22 | source(...) | main.rs:189:10:189:12 | t.1 | $@ | main.rs:186:13:186:22 | source(...) | source(...) | +| main.rs:203:14:203:14 | n | main.rs:201:13:201:22 | source(...) | main.rs:203:14:203:14 | n | $@ | main.rs:201:13:201:22 | source(...) | source(...) | +| main.rs:203:14:203:14 | n | main.rs:201:13:201:22 | source(...) | main.rs:203:14:203:14 | n | $@ | main.rs:201:13:201:22 | source(...) | source(...) | +| main.rs:213:10:213:10 | t | main.rs:210:13:210:22 | source(...) | main.rs:213:10:213:10 | t | $@ | main.rs:210:13:210:22 | source(...) | source(...) | +| main.rs:213:10:213:10 | t | main.rs:210:13:210:22 | source(...) | main.rs:213:10:213:10 | t | $@ | main.rs:210:13:210:22 | source(...) | source(...) | +| main.rs:220:10:220:10 | t | main.rs:217:13:217:22 | source(...) | main.rs:220:10:220:10 | t | $@ | main.rs:217:13:217:22 | source(...) | source(...) | +| main.rs:220:10:220:10 | t | main.rs:217:13:217:22 | source(...) | main.rs:220:10:220:10 | t | $@ | main.rs:217:13:217:22 | source(...) | source(...) | +| main.rs:231:10:231:10 | t | main.rs:229:13:229:22 | source(...) | main.rs:231:10:231:10 | t | $@ | main.rs:229:13:229:22 | source(...) | source(...) | +| main.rs:231:10:231:10 | t | main.rs:229:13:229:22 | source(...) | main.rs:231:10:231:10 | t | $@ | main.rs:229:13:229:22 | source(...) | source(...) | +| main.rs:253:47:253:47 | i | main.rs:250:13:250:23 | enum_source | main.rs:253:47:253:47 | i | $@ | main.rs:250:13:250:23 | enum_source | enum_source | +| main.rs:253:47:253:47 | i | main.rs:250:13:250:23 | enum_source | main.rs:253:47:253:47 | i | $@ | main.rs:250:13:250:23 | enum_source | enum_source | +| main.rs:261:47:261:47 | i | main.rs:259:15:259:20 | source | main.rs:261:47:261:47 | i | $@ | main.rs:259:15:259:20 | source | source | +| main.rs:261:47:261:47 | i | main.rs:259:15:259:20 | source | main.rs:261:47:261:47 | i | $@ | main.rs:259:15:259:20 | source | source | +| main.rs:275:26:275:26 | a | main.rs:276:9:276:19 | pass_source | main.rs:275:26:275:26 | a | $@ | main.rs:276:9:276:19 | pass_source | pass_source | +| main.rs:275:26:275:26 | a | main.rs:276:9:276:19 | pass_source | main.rs:275:26:275:26 | a | $@ | main.rs:276:9:276:19 | pass_source | pass_source | +| main.rs:279:18:279:18 | a | main.rs:278:9:278:19 | pass_source | main.rs:279:18:279:18 | a | $@ | main.rs:278:9:278:19 | pass_source | pass_source | +| main.rs:279:18:279:18 | a | main.rs:278:9:278:19 | pass_source | main.rs:279:18:279:18 | a | $@ | main.rs:278:9:278:19 | pass_source | pass_source | +| main.rs:283:18:283:18 | a | main.rs:285:9:285:19 | pass_source | main.rs:283:18:283:18 | a | $@ | main.rs:285:9:285:19 | pass_source | pass_source | +| main.rs:283:18:283:18 | a | main.rs:285:9:285:19 | pass_source | main.rs:283:18:283:18 | a | $@ | main.rs:285:9:285:19 | pass_source | pass_source | +| main.rs:288:18:288:18 | a | main.rs:287:9:287:19 | pass_source | main.rs:288:18:288:18 | a | $@ | main.rs:287:9:287:19 | pass_source | pass_source | +| main.rs:288:18:288:18 | a | main.rs:287:9:287:19 | pass_source | main.rs:288:18:288:18 | a | $@ | main.rs:287:9:287:19 | pass_source | pass_source | +| main.rs:298:5:298:13 | enum_sink | main.rs:297:13:297:22 | source(...) | main.rs:298:5:298:13 | enum_sink | $@ | main.rs:297:13:297:22 | source(...) | source(...) | +| main.rs:298:5:298:13 | enum_sink | main.rs:297:13:297:22 | source(...) | main.rs:298:5:298:13 | enum_sink | $@ | main.rs:297:13:297:22 | source(...) | source(...) | +| main.rs:305:7:305:10 | sink | main.rs:303:13:303:22 | source(...) | main.rs:305:7:305:10 | sink | $@ | main.rs:303:13:303:22 | source(...) | source(...) | +| main.rs:305:7:305:10 | sink | main.rs:303:13:303:22 | source(...) | main.rs:305:7:305:10 | sink | $@ | main.rs:303:13:303:22 | source(...) | source(...) | +| main.rs:315:10:315:10 | s | main.rs:314:13:314:25 | simple_source | main.rs:315:10:315:10 | s | $@ | main.rs:314:13:314:25 | simple_source | simple_source | +| main.rs:315:10:315:10 | s | main.rs:314:13:314:25 | simple_source | main.rs:315:10:315:10 | s | $@ | main.rs:314:13:314:25 | simple_source | simple_source | +| main.rs:323:5:323:15 | simple_sink | main.rs:322:13:322:22 | source(...) | main.rs:323:5:323:15 | simple_sink | $@ | main.rs:322:13:322:22 | source(...) | source(...) | +| main.rs:323:5:323:15 | simple_sink | main.rs:322:13:322:22 | source(...) | main.rs:323:5:323:15 | simple_sink | $@ | main.rs:322:13:322:22 | source(...) | source(...) | +| main.rs:332:10:332:10 | i | main.rs:331:5:331:14 | arg_source | main.rs:332:10:332:10 | i | $@ | main.rs:331:5:331:14 | arg_source | arg_source | +| main.rs:332:10:332:10 | i | main.rs:331:5:331:14 | arg_source | main.rs:332:10:332:10 | i | $@ | main.rs:331:5:331:14 | arg_source | arg_source | +| main.rs:385:10:385:11 | x1 | main.rs:384:14:384:23 | source(...) | main.rs:385:10:385:11 | x1 | $@ | main.rs:384:14:384:23 | source(...) | source(...) | +| main.rs:385:10:385:11 | x1 | main.rs:384:14:384:23 | source(...) | main.rs:385:10:385:11 | x1 | $@ | main.rs:384:14:384:23 | source(...) | source(...) | +| main.rs:395:10:395:18 | x2.field1 | main.rs:388:17:388:26 | source(...) | main.rs:395:10:395:18 | x2.field1 | $@ | main.rs:388:17:388:26 | source(...) | source(...) | +| main.rs:395:10:395:18 | x2.field1 | main.rs:388:17:388:26 | source(...) | main.rs:395:10:395:18 | x2.field1 | $@ | main.rs:388:17:388:26 | source(...) | source(...) | +| main.rs:401:10:401:11 | x4 | main.rs:400:14:400:23 | source(...) | main.rs:401:10:401:11 | x4 | $@ | main.rs:400:14:400:23 | source(...) | source(...) | +| main.rs:401:10:401:11 | x4 | main.rs:400:14:400:23 | source(...) | main.rs:401:10:401:11 | x4 | $@ | main.rs:400:14:400:23 | source(...) | source(...) | +| main.rs:404:10:404:11 | x5 | main.rs:403:14:403:23 | source(...) | main.rs:404:10:404:11 | x5 | $@ | main.rs:403:14:403:23 | source(...) | source(...) | +| main.rs:407:10:407:11 | x6 | main.rs:406:14:406:23 | source(...) | main.rs:407:10:407:11 | x6 | $@ | main.rs:406:14:406:23 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 52342e88022..01333c4e6a5 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -20,6 +20,9 @@ extensions: extensible: summaryModel data: - ["main::coerce", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["main::snd", "Argument[1]", "ReturnValue", "value", "manual"] + # Wrong generated model which should not take effect due to the manual model above + - ["main::snd", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::get_var_pos", "Argument[0].Field[main::MyPosEnum::A(0)]", "ReturnValue", "value", "manual"] - ["main::set_var_pos", "Argument[0]", "ReturnValue.Field[main::MyPosEnum::B(0)]", "value", "manual"] - ["main::get_var_field", "Argument[0].Field[main::MyFieldEnum::C::field_c]", "ReturnValue", "value", "manual"] @@ -33,5 +36,4 @@ extensions: - ["main::apply", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"] - ["main::apply", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] - ["main::get_async_number", "Argument[0]", "ReturnValue.Future", "value", "manual"] - - ["<_ as core::cmp::Ord>::max", "Argument[self]", "ReturnValue", "value", "manual"] - ["<_ as core::cmp::PartialOrd>::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] diff --git a/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected b/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected index 8da24883ea7..55b07f9efcc 100644 --- a/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected @@ -1,4 +1,6 @@ models +| 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | +| 2 | Summary: <&mut as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | edges | main.rs:17:13:17:13 | a | main.rs:18:18:18:18 | a | provenance | | | main.rs:17:17:17:26 | source(...) | main.rs:17:13:17:13 | a | provenance | | @@ -7,7 +9,7 @@ edges | main.rs:18:18:18:18 | a | main.rs:18:17:18:18 | &a [&ref] | provenance | | | main.rs:19:13:19:13 | c | main.rs:20:14:20:14 | c | provenance | | | main.rs:19:17:19:18 | * ... | main.rs:19:13:19:13 | c | provenance | | -| main.rs:19:18:19:18 | b [&ref] | main.rs:19:17:19:18 | * ... | provenance | | +| main.rs:19:18:19:18 | b [&ref] | main.rs:19:17:19:18 | * ... | provenance | MaD:1 | | main.rs:23:29:23:30 | &... [&ref] | main.rs:23:30:23:30 | n | provenance | | | main.rs:23:29:23:36 | ...: ... [&ref] | main.rs:23:29:23:30 | &... [&ref] | provenance | | | main.rs:23:30:23:30 | n | main.rs:24:14:24:14 | n | provenance | | @@ -28,7 +30,7 @@ edges | main.rs:51:17:51:26 | source(...) | main.rs:51:13:51:13 | a | provenance | | | main.rs:52:13:52:17 | ref p | main.rs:52:17:52:17 | p [&ref] | provenance | | | main.rs:52:17:52:17 | p [&ref] | main.rs:53:15:53:15 | p [&ref] | provenance | | -| main.rs:53:15:53:15 | p [&ref] | main.rs:53:14:53:15 | * ... | provenance | | +| main.rs:53:15:53:15 | p [&ref] | main.rs:53:14:53:15 | * ... | provenance | MaD:1 | | main.rs:57:13:57:13 | a [Some] | main.rs:58:15:58:15 | a [Some] | provenance | | | main.rs:57:17:57:32 | Some(...) [Some] | main.rs:57:13:57:13 | a [Some] | provenance | | | main.rs:57:22:57:31 | source(...) | main.rs:57:17:57:32 | Some(...) [Some] | provenance | | @@ -36,17 +38,20 @@ edges | main.rs:59:13:59:23 | Some(...) [Some] | main.rs:59:18:59:22 | ref p | provenance | | | main.rs:59:18:59:22 | ref p | main.rs:59:22:59:22 | p [&ref] | provenance | | | main.rs:59:22:59:22 | p [&ref] | main.rs:59:34:59:34 | p [&ref] | provenance | | -| main.rs:59:34:59:34 | p [&ref] | main.rs:59:33:59:34 | * ... | provenance | | +| main.rs:59:34:59:34 | p [&ref] | main.rs:59:33:59:34 | * ... | provenance | MaD:1 | | main.rs:73:10:73:10 | [post] b [&ref] | main.rs:74:15:74:15 | b [&ref] | provenance | | | main.rs:73:14:73:23 | source(...) | main.rs:73:10:73:10 | [post] b [&ref] | provenance | | -| main.rs:74:15:74:15 | b [&ref] | main.rs:74:14:74:15 | * ... | provenance | | +| main.rs:74:15:74:15 | b [&ref] | main.rs:74:14:74:15 | * ... | provenance | MaD:2 | +| main.rs:90:11:90:16 | [post] &mut a [&ref] | main.rs:90:16:90:16 | [post] a | provenance | | +| main.rs:90:16:90:16 | [post] a | main.rs:91:14:91:14 | a | provenance | | +| main.rs:90:21:90:30 | source(...) | main.rs:90:11:90:16 | [post] &mut a [&ref] | provenance | | | main.rs:105:10:105:10 | [post] c [&ref] | main.rs:106:15:106:15 | c [&ref] | provenance | | | main.rs:105:14:105:23 | source(...) | main.rs:105:10:105:10 | [post] c [&ref] | provenance | | -| main.rs:106:15:106:15 | c [&ref] | main.rs:106:14:106:15 | * ... | provenance | | +| main.rs:106:15:106:15 | c [&ref] | main.rs:106:14:106:15 | * ... | provenance | MaD:2 | | main.rs:112:13:112:21 | ref mut a | main.rs:112:21:112:21 | a [&ref] | provenance | | | main.rs:112:21:112:21 | a [&ref] | main.rs:113:15:113:15 | a [&ref] | provenance | | | main.rs:112:25:112:34 | source(...) | main.rs:112:13:112:21 | ref mut a | provenance | | -| main.rs:113:15:113:15 | a [&ref] | main.rs:113:14:113:15 | * ... | provenance | | +| main.rs:113:15:113:15 | a [&ref] | main.rs:113:14:113:15 | * ... | provenance | MaD:2 | | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | main.rs:150:11:150:11 | m [MyNumber] | provenance | | | main.rs:150:11:150:11 | m [MyNumber] | main.rs:151:9:151:34 | ...::MyNumber(...) [MyNumber] | provenance | | | main.rs:151:9:151:34 | ...::MyNumber(...) [MyNumber] | main.rs:151:28:151:33 | number | provenance | | @@ -60,10 +65,11 @@ edges | main.rs:164:13:164:39 | &... [&ref, MyNumber] | main.rs:164:14:164:39 | ...::MyNumber(...) [MyNumber] | provenance | | | main.rs:164:14:164:39 | ...::MyNumber(...) [MyNumber] | main.rs:164:33:164:38 | number | provenance | | | main.rs:164:33:164:38 | number | main.rs:162:26:166:5 | { ... } | provenance | | -| main.rs:174:13:174:21 | my_number [MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | provenance | | -| main.rs:174:13:174:21 | my_number [MyNumber] | main.rs:175:14:175:34 | my_number.to_number() | provenance | | +| main.rs:174:13:174:21 | my_number [MyNumber] | main.rs:175:14:175:22 | my_number [MyNumber] | provenance | | | main.rs:174:25:174:54 | ...::MyNumber(...) [MyNumber] | main.rs:174:13:174:21 | my_number [MyNumber] | provenance | | | main.rs:174:44:174:53 | source(...) | main.rs:174:25:174:54 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:175:14:175:22 | my_number [MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | provenance | | +| main.rs:175:14:175:22 | my_number [MyNumber] | main.rs:175:14:175:34 | my_number.to_number() | provenance | | | main.rs:179:13:179:21 | my_number [MyNumber] | main.rs:180:16:180:24 | my_number [MyNumber] | provenance | | | main.rs:179:25:179:54 | ...::MyNumber(...) [MyNumber] | main.rs:179:13:179:21 | my_number [MyNumber] | provenance | | | main.rs:179:44:179:53 | source(...) | main.rs:179:25:179:54 | ...::MyNumber(...) [MyNumber] | provenance | | @@ -87,7 +93,7 @@ edges | main.rs:210:17:210:17 | [post] p [&ref] | main.rs:211:15:211:15 | p [&ref] | provenance | | | main.rs:210:20:210:29 | source(...) | main.rs:200:29:200:38 | ...: i64 | provenance | | | main.rs:210:20:210:29 | source(...) | main.rs:210:17:210:17 | [post] p [&ref] | provenance | | -| main.rs:211:15:211:15 | p [&ref] | main.rs:211:14:211:15 | * ... | provenance | | +| main.rs:211:15:211:15 | p [&ref] | main.rs:211:14:211:15 | * ... | provenance | MaD:2 | | main.rs:218:17:218:22 | [post] &mut n [&ref] | main.rs:218:22:218:22 | [post] n | provenance | | | main.rs:218:22:218:22 | [post] n | main.rs:219:14:219:14 | n | provenance | | | main.rs:218:25:218:34 | source(...) | main.rs:200:29:200:38 | ...: i64 | provenance | | @@ -173,6 +179,10 @@ nodes | main.rs:73:14:73:23 | source(...) | semmle.label | source(...) | | main.rs:74:14:74:15 | * ... | semmle.label | * ... | | main.rs:74:15:74:15 | b [&ref] | semmle.label | b [&ref] | +| main.rs:90:11:90:16 | [post] &mut a [&ref] | semmle.label | [post] &mut a [&ref] | +| main.rs:90:16:90:16 | [post] a | semmle.label | [post] a | +| main.rs:90:21:90:30 | source(...) | semmle.label | source(...) | +| main.rs:91:14:91:14 | a | semmle.label | a | | main.rs:105:10:105:10 | [post] c [&ref] | semmle.label | [post] c [&ref] | | main.rs:105:14:105:23 | source(...) | semmle.label | source(...) | | main.rs:106:14:106:15 | * ... | semmle.label | * ... | @@ -201,6 +211,7 @@ nodes | main.rs:174:13:174:21 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | | main.rs:174:25:174:54 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | | main.rs:174:44:174:53 | source(...) | semmle.label | source(...) | +| main.rs:175:14:175:22 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | | main.rs:175:14:175:34 | my_number.to_number() | semmle.label | my_number.to_number() | | main.rs:179:13:179:21 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | | main.rs:179:25:179:54 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | @@ -262,7 +273,7 @@ nodes | main.rs:255:14:255:33 | to_number(...) | semmle.label | to_number(...) | | main.rs:255:24:255:32 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | subpaths -| main.rs:174:13:174:21 | my_number [MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | main.rs:156:31:160:5 | { ... } | main.rs:175:14:175:34 | my_number.to_number() | +| main.rs:175:14:175:22 | my_number [MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | main.rs:156:31:160:5 | { ... } | main.rs:175:14:175:34 | my_number.to_number() | | main.rs:180:15:180:24 | &my_number [&ref, MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | main.rs:162:26:166:5 | { ... } | main.rs:180:14:180:31 | ... .get() | | main.rs:186:14:186:22 | my_number [MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | main.rs:162:26:166:5 | { ... } | main.rs:186:14:186:28 | my_number.get() | | main.rs:192:14:192:22 | my_number [&ref, MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | main.rs:156:31:160:5 | { ... } | main.rs:192:14:192:34 | my_number.to_number() | @@ -285,6 +296,7 @@ testFailures | main.rs:53:14:53:15 | * ... | main.rs:51:17:51:26 | source(...) | main.rs:53:14:53:15 | * ... | $@ | main.rs:51:17:51:26 | source(...) | source(...) | | main.rs:59:33:59:34 | * ... | main.rs:57:22:57:31 | source(...) | main.rs:59:33:59:34 | * ... | $@ | main.rs:57:22:57:31 | source(...) | source(...) | | main.rs:74:14:74:15 | * ... | main.rs:73:14:73:23 | source(...) | main.rs:74:14:74:15 | * ... | $@ | main.rs:73:14:73:23 | source(...) | source(...) | +| main.rs:91:14:91:14 | a | main.rs:90:21:90:30 | source(...) | main.rs:91:14:91:14 | a | $@ | main.rs:90:21:90:30 | source(...) | source(...) | | main.rs:106:14:106:15 | * ... | main.rs:105:14:105:23 | source(...) | main.rs:106:14:106:15 | * ... | $@ | main.rs:105:14:105:23 | source(...) | source(...) | | main.rs:113:14:113:15 | * ... | main.rs:112:25:112:34 | source(...) | main.rs:113:14:113:15 | * ... | $@ | main.rs:112:25:112:34 | source(...) | source(...) | | main.rs:175:14:175:34 | my_number.to_number() | main.rs:174:44:174:53 | source(...) | main.rs:175:14:175:34 | my_number.to_number() | $@ | main.rs:174:44:174:53 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/pointers/inline-flow.ql b/rust/ql/test/library-tests/dataflow/pointers/inline-flow.ql index e399ea0e5d7..5dcb7ee70a9 100644 --- a/rust/ql/test/library-tests/dataflow/pointers/inline-flow.ql +++ b/rust/ql/test/library-tests/dataflow/pointers/inline-flow.ql @@ -5,8 +5,8 @@ import rust import utils.test.InlineFlowTest import DefaultFlowTest -import ValueFlow::PathGraph +import TaintFlow::PathGraph -from ValueFlow::PathNode source, ValueFlow::PathNode sink -where ValueFlow::flowPath(source, sink) +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/pointers/main.rs b/rust/ql/test/library-tests/dataflow/pointers/main.rs index d7e28c9368f..2ebd5ee28df 100644 --- a/rust/ql/test/library-tests/dataflow/pointers/main.rs +++ b/rust/ql/test/library-tests/dataflow/pointers/main.rs @@ -88,7 +88,7 @@ mod intraprocedural_mutable_borrows { let mut a = 1; sink(a); *(&mut a) = source(87); - sink(a); // $ MISSING: hasValueFlow=87 + sink(a); // $ hasValueFlow=87 } pub fn clear_through_borrow() { diff --git a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected index db1e69c43fb..1314393fd0a 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected @@ -50,11 +50,14 @@ edges | test.rs:42:20:42:21 | t1 [element] | test.rs:42:13:42:15 | row | provenance | | | test.rs:48:22:48:30 | query_map | test.rs:50:14:50:24 | ...: i64 | provenance | Src:MaD:3 | | test.rs:50:14:50:24 | ...: i64 | test.rs:51:22:51:27 | values | provenance | | +| test.rs:55:22:55:30 | query_map | test.rs:57:14:57:39 | ...: ... | provenance | Src:MaD:3 | +| test.rs:57:14:57:39 | ...: ... | test.rs:58:22:58:29 | values.0 | provenance | | +| test.rs:57:14:57:39 | ...: ... | test.rs:59:22:59:29 | values.1 | provenance | | +| test.rs:57:14:57:39 | ...: ... | test.rs:60:22:60:29 | values.2 | provenance | | | test.rs:64:13:64:17 | total | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | test.rs:64:21:67:11 | TryExpr | provenance | | | test.rs:64:21:67:11 | TryExpr | test.rs:64:13:64:17 | total | provenance | | | test.rs:64:26:64:35 | query_fold | test.rs:64:76:64:83 | ...: i64 | provenance | Src:MaD:2 | -| test.rs:64:76:64:83 | ...: i64 | test.rs:64:86:67:9 | { ... } | provenance | | | test.rs:64:76:64:83 | ...: i64 | test.rs:65:18:65:20 | row | provenance | | | test.rs:64:76:64:83 | ...: i64 | test.rs:66:19:66:21 | row | provenance | | | test.rs:64:86:67:9 | { ... } | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | provenance | MaD:13 | @@ -62,6 +65,13 @@ edges | test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:11 | | test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:12 | | test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:15 | +| test.rs:70:22:70:31 | query_fold | test.rs:70:83:70:105 | ...: ... | provenance | Src:MaD:2 | +| test.rs:70:83:70:105 | ...: ... | test.rs:71:17:71:18 | id | provenance | | +| test.rs:70:83:70:105 | ...: ... | test.rs:72:17:72:20 | name | provenance | | +| test.rs:70:83:70:105 | ...: ... | test.rs:73:17:73:19 | age | provenance | | +| test.rs:71:17:71:18 | id | test.rs:74:18:74:19 | id | provenance | | +| test.rs:72:17:72:20 | name | test.rs:75:18:75:21 | name | provenance | | +| test.rs:73:17:73:19 | age | test.rs:76:18:76:20 | age | provenance | | | test.rs:105:13:105:14 | v1 | test.rs:106:14:106:15 | v1 | provenance | | | test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:16 | | test.rs:105:24:105:42 | ... .unwrap() | test.rs:105:13:105:14 | v1 | provenance | | @@ -82,12 +92,15 @@ edges | test.rs:114:28:114:35 | take_opt | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | | test.rs:135:22:135:30 | query_map | test.rs:137:14:137:24 | ...: i64 | provenance | Src:MaD:5 | | test.rs:137:14:137:24 | ...: i64 | test.rs:138:22:138:27 | values | provenance | | +| test.rs:142:22:142:30 | query_map | test.rs:144:14:144:39 | ...: ... | provenance | Src:MaD:5 | +| test.rs:144:14:144:39 | ...: ... | test.rs:145:22:145:29 | values.0 | provenance | | +| test.rs:144:14:144:39 | ...: ... | test.rs:146:22:146:29 | values.1 | provenance | | +| test.rs:144:14:144:39 | ...: ... | test.rs:147:22:147:29 | values.2 | provenance | | | test.rs:151:13:151:17 | total | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | test.rs:151:21:154:16 | await ... [Ok] | provenance | | | test.rs:151:21:154:16 | await ... [Ok] | test.rs:151:21:154:17 | TryExpr | provenance | | | test.rs:151:21:154:17 | TryExpr | test.rs:151:13:151:17 | total | provenance | | | test.rs:151:26:151:35 | query_fold | test.rs:151:76:151:83 | ...: i64 | provenance | Src:MaD:4 | -| test.rs:151:76:151:83 | ...: i64 | test.rs:151:86:154:9 | { ... } | provenance | | | test.rs:151:76:151:83 | ...: i64 | test.rs:152:18:152:20 | row | provenance | | | test.rs:151:76:151:83 | ...: i64 | test.rs:153:19:153:21 | row | provenance | | | test.rs:151:86:154:9 | { ... } | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | provenance | MaD:14 | @@ -95,6 +108,13 @@ edges | test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:11 | | test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:12 | | test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:15 | +| test.rs:157:22:157:31 | query_fold | test.rs:157:83:157:105 | ...: ... | provenance | Src:MaD:4 | +| test.rs:157:83:157:105 | ...: ... | test.rs:158:17:158:18 | id | provenance | | +| test.rs:157:83:157:105 | ...: ... | test.rs:159:17:159:20 | name | provenance | | +| test.rs:157:83:157:105 | ...: ... | test.rs:160:17:160:19 | age | provenance | | +| test.rs:158:17:158:18 | id | test.rs:161:18:161:19 | id | provenance | | +| test.rs:159:17:159:20 | name | test.rs:162:18:162:21 | name | provenance | | +| test.rs:160:17:160:19 | age | test.rs:163:18:163:20 | age | provenance | | nodes | test.rs:18:13:18:14 | v1 | semmle.label | v1 | | test.rs:18:24:18:33 | row.get(...) [Some] | semmle.label | row.get(...) [Some] | @@ -137,6 +157,11 @@ nodes | test.rs:48:22:48:30 | query_map | semmle.label | query_map | | test.rs:50:14:50:24 | ...: i64 | semmle.label | ...: i64 | | test.rs:51:22:51:27 | values | semmle.label | values | +| test.rs:55:22:55:30 | query_map | semmle.label | query_map | +| test.rs:57:14:57:39 | ...: ... | semmle.label | ...: ... | +| test.rs:58:22:58:29 | values.0 | semmle.label | values.0 | +| test.rs:59:22:59:29 | values.1 | semmle.label | values.1 | +| test.rs:60:22:60:29 | values.2 | semmle.label | values.2 | | test.rs:64:13:64:17 | total | semmle.label | total | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | semmle.label | conn.query_fold(...) [Ok] | | test.rs:64:21:67:11 | TryExpr | semmle.label | TryExpr | @@ -147,6 +172,14 @@ nodes | test.rs:66:13:66:21 | ... + ... | semmle.label | ... + ... | | test.rs:66:19:66:21 | row | semmle.label | row | | test.rs:68:14:68:18 | total | semmle.label | total | +| test.rs:70:22:70:31 | query_fold | semmle.label | query_fold | +| test.rs:70:83:70:105 | ...: ... | semmle.label | ...: ... | +| test.rs:71:17:71:18 | id | semmle.label | id | +| test.rs:72:17:72:20 | name | semmle.label | name | +| test.rs:73:17:73:19 | age | semmle.label | age | +| test.rs:74:18:74:19 | id | semmle.label | id | +| test.rs:75:18:75:21 | name | semmle.label | name | +| test.rs:76:18:76:20 | age | semmle.label | age | | test.rs:105:13:105:14 | v1 | semmle.label | v1 | | test.rs:105:24:105:33 | row.get(...) [Some] | semmle.label | row.get(...) [Some] | | test.rs:105:24:105:42 | ... .unwrap() | semmle.label | ... .unwrap() | @@ -172,6 +205,11 @@ nodes | test.rs:135:22:135:30 | query_map | semmle.label | query_map | | test.rs:137:14:137:24 | ...: i64 | semmle.label | ...: i64 | | test.rs:138:22:138:27 | values | semmle.label | values | +| test.rs:142:22:142:30 | query_map | semmle.label | query_map | +| test.rs:144:14:144:39 | ...: ... | semmle.label | ...: ... | +| test.rs:145:22:145:29 | values.0 | semmle.label | values.0 | +| test.rs:146:22:146:29 | values.1 | semmle.label | values.1 | +| test.rs:147:22:147:29 | values.2 | semmle.label | values.2 | | test.rs:151:13:151:17 | total | semmle.label | total | | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | semmle.label | conn.query_fold(...) [future, Ok] | | test.rs:151:21:154:16 | await ... [Ok] | semmle.label | await ... [Ok] | @@ -183,6 +221,14 @@ nodes | test.rs:153:13:153:21 | ... + ... | semmle.label | ... + ... | | test.rs:153:19:153:21 | row | semmle.label | row | | test.rs:155:14:155:18 | total | semmle.label | total | +| test.rs:157:22:157:31 | query_fold | semmle.label | query_fold | +| test.rs:157:83:157:105 | ...: ... | semmle.label | ...: ... | +| test.rs:158:17:158:18 | id | semmle.label | id | +| test.rs:159:17:159:20 | name | semmle.label | name | +| test.rs:160:17:160:19 | age | semmle.label | age | +| test.rs:161:18:161:19 | id | semmle.label | id | +| test.rs:162:18:162:21 | name | semmle.label | name | +| test.rs:163:18:163:20 | age | semmle.label | age | subpaths testFailures #select @@ -194,12 +240,24 @@ testFailures | test.rs:41:14:41:70 | ... .unwrap() | test.rs:41:42:41:44 | get | test.rs:41:14:41:70 | ... .unwrap() | $@ | test.rs:41:42:41:44 | get | get | | test.rs:44:22:44:22 | v | test.rs:40:27:40:35 | exec_iter | test.rs:44:22:44:22 | v | $@ | test.rs:40:27:40:35 | exec_iter | exec_iter | | test.rs:51:22:51:27 | values | test.rs:48:22:48:30 | query_map | test.rs:51:22:51:27 | values | $@ | test.rs:48:22:48:30 | query_map | query_map | +| test.rs:58:22:58:29 | values.0 | test.rs:55:22:55:30 | query_map | test.rs:58:22:58:29 | values.0 | $@ | test.rs:55:22:55:30 | query_map | query_map | +| test.rs:59:22:59:29 | values.1 | test.rs:55:22:55:30 | query_map | test.rs:59:22:59:29 | values.1 | $@ | test.rs:55:22:55:30 | query_map | query_map | +| test.rs:60:22:60:29 | values.2 | test.rs:55:22:55:30 | query_map | test.rs:60:22:60:29 | values.2 | $@ | test.rs:55:22:55:30 | query_map | query_map | | test.rs:65:18:65:20 | row | test.rs:64:26:64:35 | query_fold | test.rs:65:18:65:20 | row | $@ | test.rs:64:26:64:35 | query_fold | query_fold | | test.rs:68:14:68:18 | total | test.rs:64:26:64:35 | query_fold | test.rs:68:14:68:18 | total | $@ | test.rs:64:26:64:35 | query_fold | query_fold | +| test.rs:74:18:74:19 | id | test.rs:70:22:70:31 | query_fold | test.rs:74:18:74:19 | id | $@ | test.rs:70:22:70:31 | query_fold | query_fold | +| test.rs:75:18:75:21 | name | test.rs:70:22:70:31 | query_fold | test.rs:75:18:75:21 | name | $@ | test.rs:70:22:70:31 | query_fold | query_fold | +| test.rs:76:18:76:20 | age | test.rs:70:22:70:31 | query_fold | test.rs:76:18:76:20 | age | $@ | test.rs:70:22:70:31 | query_fold | query_fold | | test.rs:106:14:106:15 | v1 | test.rs:105:28:105:30 | get | test.rs:106:14:106:15 | v1 | $@ | test.rs:105:28:105:30 | get | get | | test.rs:109:14:109:15 | v2 | test.rs:108:28:108:34 | get_opt | test.rs:109:14:109:15 | v2 | $@ | test.rs:108:28:108:34 | get_opt | get_opt | | test.rs:112:14:112:15 | v3 | test.rs:111:28:111:31 | take | test.rs:112:14:112:15 | v3 | $@ | test.rs:111:28:111:31 | take | take | | test.rs:115:14:115:15 | v4 | test.rs:114:28:114:35 | take_opt | test.rs:115:14:115:15 | v4 | $@ | test.rs:114:28:114:35 | take_opt | take_opt | | test.rs:138:22:138:27 | values | test.rs:135:22:135:30 | query_map | test.rs:138:22:138:27 | values | $@ | test.rs:135:22:135:30 | query_map | query_map | +| test.rs:145:22:145:29 | values.0 | test.rs:142:22:142:30 | query_map | test.rs:145:22:145:29 | values.0 | $@ | test.rs:142:22:142:30 | query_map | query_map | +| test.rs:146:22:146:29 | values.1 | test.rs:142:22:142:30 | query_map | test.rs:146:22:146:29 | values.1 | $@ | test.rs:142:22:142:30 | query_map | query_map | +| test.rs:147:22:147:29 | values.2 | test.rs:142:22:142:30 | query_map | test.rs:147:22:147:29 | values.2 | $@ | test.rs:142:22:142:30 | query_map | query_map | | test.rs:152:18:152:20 | row | test.rs:151:26:151:35 | query_fold | test.rs:152:18:152:20 | row | $@ | test.rs:151:26:151:35 | query_fold | query_fold | | test.rs:155:14:155:18 | total | test.rs:151:26:151:35 | query_fold | test.rs:155:14:155:18 | total | $@ | test.rs:151:26:151:35 | query_fold | query_fold | +| test.rs:161:18:161:19 | id | test.rs:157:22:157:31 | query_fold | test.rs:161:18:161:19 | id | $@ | test.rs:157:22:157:31 | query_fold | query_fold | +| test.rs:162:18:162:21 | name | test.rs:157:22:157:31 | query_fold | test.rs:162:18:162:21 | name | $@ | test.rs:157:22:157:31 | query_fold | query_fold | +| test.rs:163:18:163:20 | age | test.rs:157:22:157:31 | query_fold | test.rs:163:18:163:20 | age | $@ | test.rs:157:22:157:31 | query_fold | query_fold | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/test.rs b/rust/ql/test/library-tests/dataflow/sources/database/test.rs index 5fbaef71144..618830091a6 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/database/test.rs @@ -55,9 +55,9 @@ mod test_mysql { let _ = conn.query_map( // $ Alert[rust/summary/taint-sources] "SELECT id, name, age FROM person", |values: (i64, String, i32)| -> () { - sink(values.0); // $ MISSING: hasTaintFlow - sink(values.1); // $ MISSING: hasTaintFlow - sink(values.2); // $ MISSING: hasTaintFlow + sink(values.0); // $ hasTaintFlow + sink(values.1); // $ hasTaintFlow + sink(values.2); // $ hasTaintFlow } )?; @@ -71,9 +71,9 @@ mod test_mysql { let id: i64 = row.0; let name: String = row.1; let age: i32 = row.2; - sink(id); // $ MISSING: hasTaintFlow - sink(name); // $ MISSING: hasTaintFlow - sink(age); // $ MISSING: hasTaintFlow + sink(id); // $ hasTaintFlow + sink(name); // $ hasTaintFlow + sink(age); // $ hasTaintFlow acc + 1 })?; @@ -142,9 +142,9 @@ mod test_mysql_async { let _ = conn.query_map( // $ Alert[rust/summary/taint-sources] "SELECT id, name, age FROM person", |values: (i64, String, i32)| -> () { - sink(values.0); // $ MISSING: hasTaintFlow - sink(values.1); // $ MISSING: hasTaintFlow - sink(values.2); // $ MISSING: hasTaintFlow + sink(values.0); // $ hasTaintFlow + sink(values.1); // $ hasTaintFlow + sink(values.2); // $ hasTaintFlow } ).await?; @@ -158,9 +158,9 @@ mod test_mysql_async { let id: i64 = row.0; let name: String = row.1; let age: i32 = row.2; - sink(id); // $ MISSING: hasTaintFlow - sink(name); // $ MISSING: hasTaintFlow - sink(age); // $ MISSING: hasTaintFlow + sink(id); // $ hasTaintFlow + sink(name); // $ hasTaintFlow + sink(age); // $ hasTaintFlow acc + 1 }).await?; diff --git a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected index 00821decfdf..ac8b8c8c334 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected @@ -6,53 +6,64 @@ models | 5 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs | | 6 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | | 7 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment | -| 8 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | -| 9 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 10 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 14 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 8 | Source: std::env::vars; ReturnValue.Element; environment | +| 9 | Source: std::env::vars_os; ReturnValue.Element; environment | +| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | +| 11 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 12 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 13 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 15 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 16 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | edges | test.rs:6:10:6:22 | ...::var | test.rs:6:10:6:30 | ...::var(...) | provenance | Src:MaD:6 | | test.rs:7:10:7:25 | ...::var_os | test.rs:7:10:7:33 | ...::var_os(...) | provenance | Src:MaD:7 | | test.rs:9:9:9:12 | var1 | test.rs:12:10:12:13 | var1 | provenance | | | test.rs:9:16:9:28 | ...::var | test.rs:9:16:9:36 | ...::var(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:12 | +| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:15 | | test.rs:9:16:9:59 | ... .expect(...) | test.rs:9:9:9:12 | var1 | provenance | | | test.rs:10:9:10:12 | var2 | test.rs:13:10:13:13 | var2 | provenance | | | test.rs:10:16:10:31 | ...::var_os | test.rs:10:16:10:39 | ...::var_os(...) [Some] | provenance | Src:MaD:7 | -| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:11 | +| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:14 | | test.rs:10:16:10:48 | ... .unwrap() | test.rs:10:9:10:12 | var2 | provenance | | +| test.rs:15:9:15:20 | TuplePat | test.rs:16:14:16:16 | key | provenance | | +| test.rs:15:9:15:20 | TuplePat | test.rs:17:14:17:18 | value | provenance | | +| test.rs:15:25:15:38 | ...::vars | test.rs:15:25:15:40 | ...::vars(...) [element] | provenance | Src:MaD:8 | +| test.rs:15:25:15:40 | ...::vars(...) [element] | test.rs:15:9:15:20 | TuplePat | provenance | | +| test.rs:20:9:20:20 | TuplePat | test.rs:21:14:21:16 | key | provenance | | +| test.rs:20:9:20:20 | TuplePat | test.rs:22:14:22:18 | value | provenance | | +| test.rs:20:25:20:41 | ...::vars_os | test.rs:20:25:20:43 | ...::vars_os(...) [element] | provenance | Src:MaD:9 | +| test.rs:20:25:20:43 | ...::vars_os(...) [element] | test.rs:20:9:20:20 | TuplePat | provenance | | | test.rs:27:9:27:12 | args [element] | test.rs:28:20:28:23 | args [element] | provenance | | | test.rs:27:9:27:12 | args [element] | test.rs:29:17:29:20 | args [element] | provenance | | | test.rs:27:29:27:42 | ...::args | test.rs:27:29:27:44 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:8 | +| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:10 | | test.rs:27:29:27:54 | ... .collect() [element] | test.rs:27:9:27:12 | args [element] | provenance | | | test.rs:28:9:28:15 | my_path [&ref] | test.rs:34:10:34:16 | my_path | provenance | | | test.rs:28:19:28:26 | &... [&ref] | test.rs:28:9:28:15 | my_path [&ref] | provenance | | -| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | | +| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | MaD:12 | | test.rs:28:20:28:26 | args[0] | test.rs:28:19:28:26 | &... [&ref] | provenance | | | test.rs:29:9:29:12 | arg1 [&ref] | test.rs:35:10:35:13 | arg1 | provenance | | | test.rs:29:16:29:23 | &... [&ref] | test.rs:29:9:29:12 | arg1 [&ref] | provenance | | -| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | | +| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:12 | | test.rs:29:17:29:23 | args[1] | test.rs:29:16:29:23 | &... [&ref] | provenance | | | test.rs:30:9:30:12 | arg2 | test.rs:36:10:36:13 | arg2 | provenance | | | test.rs:30:16:30:29 | ...::args | test.rs:30:16:30:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:9 | -| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:11 | +| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:11 | +| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:14 | | test.rs:30:16:30:47 | ... .unwrap() | test.rs:30:9:30:12 | arg2 | provenance | | | test.rs:31:9:31:12 | arg3 | test.rs:37:10:37:13 | arg3 | provenance | | | test.rs:31:16:31:32 | ...::args_os | test.rs:31:16:31:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | -| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:9 | -| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:11 | +| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:11 | +| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:14 | | test.rs:31:16:31:50 | ... .unwrap() | test.rs:31:9:31:12 | arg3 | provenance | | | test.rs:32:9:32:12 | arg4 | test.rs:38:10:38:13 | arg4 | provenance | | | test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:9 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:11 | -| test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:16:32:64 | ... .parse() [Ok] | provenance | MaD:14 | -| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:13 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:11 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:14 | +| test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:16:32:64 | ... .parse() [Ok] | provenance | MaD:17 | +| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:16 | | test.rs:32:16:32:73 | ... .unwrap() | test.rs:32:9:32:12 | arg4 | provenance | | | test.rs:40:9:40:11 | arg | test.rs:41:14:41:16 | arg | provenance | | | test.rs:40:16:40:29 | ...::args | test.rs:40:16:40:31 | ...::args(...) [element] | provenance | Src:MaD:1 | @@ -62,15 +73,15 @@ edges | test.rs:44:16:44:34 | ...::args_os(...) [element] | test.rs:44:9:44:11 | arg | provenance | | | test.rs:50:9:50:11 | dir | test.rs:54:10:54:12 | dir | provenance | | | test.rs:50:15:50:35 | ...::current_dir | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:3 | -| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:12 | +| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:15 | | test.rs:50:15:50:54 | ... .expect(...) | test.rs:50:9:50:11 | dir | provenance | | | test.rs:51:9:51:11 | exe | test.rs:55:10:55:12 | exe | provenance | | | test.rs:51:15:51:35 | ...::current_exe | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:4 | -| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:12 | +| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:15 | | test.rs:51:15:51:54 | ... .expect(...) | test.rs:51:9:51:11 | exe | provenance | | | test.rs:52:9:52:12 | home | test.rs:56:10:56:13 | home | provenance | | | test.rs:52:16:52:33 | ...::home_dir | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:5 | -| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:10 | +| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:13 | | test.rs:52:16:52:52 | ... .expect(...) | test.rs:52:9:52:12 | home | provenance | | nodes | test.rs:6:10:6:22 | ...::var | semmle.label | ...::var | @@ -87,6 +98,16 @@ nodes | test.rs:10:16:10:48 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:12:10:12:13 | var1 | semmle.label | var1 | | test.rs:13:10:13:13 | var2 | semmle.label | var2 | +| test.rs:15:9:15:20 | TuplePat | semmle.label | TuplePat | +| test.rs:15:25:15:38 | ...::vars | semmle.label | ...::vars | +| test.rs:15:25:15:40 | ...::vars(...) [element] | semmle.label | ...::vars(...) [element] | +| test.rs:16:14:16:16 | key | semmle.label | key | +| test.rs:17:14:17:18 | value | semmle.label | value | +| test.rs:20:9:20:20 | TuplePat | semmle.label | TuplePat | +| test.rs:20:25:20:41 | ...::vars_os | semmle.label | ...::vars_os | +| test.rs:20:25:20:43 | ...::vars_os(...) [element] | semmle.label | ...::vars_os(...) [element] | +| test.rs:21:14:21:16 | key | semmle.label | key | +| test.rs:22:14:22:18 | value | semmle.label | value | | test.rs:27:9:27:12 | args [element] | semmle.label | args [element] | | test.rs:27:29:27:42 | ...::args | semmle.label | ...::args | | test.rs:27:29:27:44 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | @@ -151,6 +172,10 @@ testFailures | test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:25 | ...::var_os | test.rs:7:10:7:33 | ...::var_os(...) | $@ | test.rs:7:10:7:25 | ...::var_os | ...::var_os | | test.rs:12:10:12:13 | var1 | test.rs:9:16:9:28 | ...::var | test.rs:12:10:12:13 | var1 | $@ | test.rs:9:16:9:28 | ...::var | ...::var | | test.rs:13:10:13:13 | var2 | test.rs:10:16:10:31 | ...::var_os | test.rs:13:10:13:13 | var2 | $@ | test.rs:10:16:10:31 | ...::var_os | ...::var_os | +| test.rs:16:14:16:16 | key | test.rs:15:25:15:38 | ...::vars | test.rs:16:14:16:16 | key | $@ | test.rs:15:25:15:38 | ...::vars | ...::vars | +| test.rs:17:14:17:18 | value | test.rs:15:25:15:38 | ...::vars | test.rs:17:14:17:18 | value | $@ | test.rs:15:25:15:38 | ...::vars | ...::vars | +| test.rs:21:14:21:16 | key | test.rs:20:25:20:41 | ...::vars_os | test.rs:21:14:21:16 | key | $@ | test.rs:20:25:20:41 | ...::vars_os | ...::vars_os | +| test.rs:22:14:22:18 | value | test.rs:20:25:20:41 | ...::vars_os | test.rs:22:14:22:18 | value | $@ | test.rs:20:25:20:41 | ...::vars_os | ...::vars_os | | test.rs:34:10:34:16 | my_path | test.rs:27:29:27:42 | ...::args | test.rs:34:10:34:16 | my_path | $@ | test.rs:27:29:27:42 | ...::args | ...::args | | test.rs:35:10:35:13 | arg1 | test.rs:27:29:27:42 | ...::args | test.rs:35:10:35:13 | arg1 | $@ | test.rs:27:29:27:42 | ...::args | ...::args | | test.rs:36:10:36:13 | arg2 | test.rs:30:16:30:29 | ...::args | test.rs:36:10:36:13 | arg2 | $@ | test.rs:30:16:30:29 | ...::args | ...::args | diff --git a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.ql b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.ql index 09b4ab5bf90..9e46b7c3ad2 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.ql +++ b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.ql @@ -16,7 +16,7 @@ module MyFlowConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { any(CallExpr call | call.getFunction().(PathExpr).getPath().getSegment().getIdentifier().getText() = "sink" - ).getArgList().getAnArg() = sink.asExpr().getExpr() + ).getArgList().getAnArg() = sink.asExpr() } predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { diff --git a/rust/ql/test/library-tests/dataflow/sources/env/test.rs b/rust/ql/test/library-tests/dataflow/sources/env/test.rs index e02aa7c8f1b..b5af0b412d3 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/env/test.rs @@ -13,13 +13,13 @@ fn test_env_vars() { sink(var2); // $ hasTaintFlow="PATH" for (key, value) in std::env::vars() { // $ Alert[rust/summary/taint-sources] - sink(key); // $ MISSING: hasTaintFlow - sink(value); // $ MISSING: hasTaintFlow + sink(key); // $ hasTaintFlow + sink(value); // $ hasTaintFlow } for (key, value) in std::env::vars_os() { // $ Alert[rust/summary/taint-sources] - sink(key); // $ MISSING: hasTaintFlow - sink(value); // $ MISSING: hasTaintFlow + sink(key); // $ hasTaintFlow + sink(value); // $ hasTaintFlow } } diff --git a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected index 90d01d250d0..6f012e837a9 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected @@ -10,160 +10,139 @@ models | 9 | Source: ::file_name; ReturnValue; file | | 10 | Source: ::path; ReturnValue; file | | 11 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 12 | Source: std::fs::read; ReturnValue; file | -| 13 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 14 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 15 | Source: std::fs::read_to_string; ReturnValue; file | -| 16 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 17 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 18 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 19 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 20 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 21 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 22 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | -| 23 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | -| 24 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | -| 25 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | -| 26 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 27 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 28 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 29 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | -| 30 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 31 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | -| 32 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 33 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 36 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 37 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 38 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 39 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 40 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 41 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | -| 42 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 43 | Summary: ::as_path; Argument[self]; ReturnValue; value | +| 12 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 13 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 14 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 15 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 16 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 17 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 18 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 19 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | +| 20 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | +| 21 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | +| 22 | Summary: <_ as std::io::Read>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 23 | Summary: <_ as std::io::Read>::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 24 | Summary: <_ as std::io::Read>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 25 | Summary: <_ as std::io::Read>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 26 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | +| 27 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 28 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 29 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 34 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 36 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 37 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | edges | test.rs:12:13:12:18 | buffer | test.rs:13:14:13:19 | buffer | provenance | | -| test.rs:12:31:12:43 | ...::read | test.rs:12:31:12:43 | ...::read [Ok] | provenance | Src:MaD:11 | | test.rs:12:31:12:43 | ...::read | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | Src:MaD:11 | -| test.rs:12:31:12:43 | ...::read [Ok] | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | MaD:12 | | test.rs:12:31:12:55 | ...::read(...) [Ok] | test.rs:12:31:12:56 | TryExpr | provenance | | | test.rs:12:31:12:56 | TryExpr | test.rs:12:13:12:18 | buffer | provenance | | | test.rs:17:13:17:18 | buffer | test.rs:18:14:18:19 | buffer | provenance | | -| test.rs:17:31:17:38 | ...::read | test.rs:17:31:17:38 | ...::read [Ok] | provenance | Src:MaD:11 | | test.rs:17:31:17:38 | ...::read | test.rs:17:31:17:50 | ...::read(...) [Ok] | provenance | Src:MaD:11 | -| test.rs:17:31:17:38 | ...::read [Ok] | test.rs:17:31:17:50 | ...::read(...) [Ok] | provenance | MaD:12 | | test.rs:17:31:17:50 | ...::read(...) [Ok] | test.rs:17:31:17:51 | TryExpr | provenance | | | test.rs:17:31:17:51 | TryExpr | test.rs:17:13:17:18 | buffer | provenance | | | test.rs:22:13:22:18 | buffer | test.rs:23:14:23:19 | buffer | provenance | | -| test.rs:22:22:22:39 | ...::read_to_string | test.rs:22:22:22:39 | ...::read_to_string [Ok] | provenance | Src:MaD:14 | -| test.rs:22:22:22:39 | ...::read_to_string | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:14 | -| test.rs:22:22:22:39 | ...::read_to_string [Ok] | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | provenance | MaD:15 | +| test.rs:22:22:22:39 | ...::read_to_string | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:13 | | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | test.rs:22:22:22:52 | TryExpr | provenance | | | test.rs:22:22:22:52 | TryExpr | test.rs:22:13:22:18 | buffer | provenance | | | test.rs:29:13:29:16 | path | test.rs:30:14:30:17 | path | provenance | | -| test.rs:29:13:29:16 | path | test.rs:30:14:30:25 | path.clone() | provenance | MaD:21 | | test.rs:29:13:29:16 | path | test.rs:31:14:31:17 | path | provenance | | -| test.rs:29:13:29:16 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:21 | | test.rs:29:13:29:16 | path | test.rs:41:14:41:17 | path | provenance | | | test.rs:29:20:29:27 | e.path() | test.rs:29:13:29:16 | path | provenance | | | test.rs:29:22:29:25 | path | test.rs:29:20:29:27 | e.path() | provenance | Src:MaD:4 MaD:4 | -| test.rs:30:14:30:17 | path | test.rs:30:14:30:25 | path.clone() | provenance | MaD:21 | -| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:21 | -| test.rs:31:14:31:25 | path.clone() | test.rs:31:14:31:35 | ... .as_path() | provenance | MaD:43 | +| test.rs:30:14:30:17 | path | test.rs:30:14:30:25 | path.clone() | provenance | MaD:18 | +| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:18 | +| test.rs:31:14:31:25 | path.clone() | test.rs:31:14:31:35 | ... .as_path() | provenance | MaD:37 | | test.rs:43:13:43:21 | file_name | test.rs:44:14:44:22 | file_name | provenance | | -| test.rs:43:13:43:21 | file_name | test.rs:44:14:44:30 | file_name.clone() | provenance | MaD:21 | | test.rs:43:13:43:21 | file_name | test.rs:49:14:49:22 | file_name | provenance | | | test.rs:43:25:43:37 | e.file_name() | test.rs:43:13:43:21 | file_name | provenance | | | test.rs:43:27:43:35 | file_name | test.rs:43:25:43:37 | e.file_name() | provenance | Src:MaD:3 MaD:3 | -| test.rs:44:14:44:22 | file_name | test.rs:44:14:44:30 | file_name.clone() | provenance | MaD:21 | +| test.rs:44:14:44:22 | file_name | test.rs:44:14:44:30 | file_name.clone() | provenance | MaD:18 | | test.rs:65:13:65:18 | target | test.rs:66:14:66:19 | target | provenance | | -| test.rs:65:22:65:34 | ...::read_link | test.rs:65:22:65:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:13 | +| test.rs:65:22:65:34 | ...::read_link | test.rs:65:22:65:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | | test.rs:65:22:65:49 | ...::read_link(...) [Ok] | test.rs:65:22:65:50 | TryExpr | provenance | | | test.rs:65:22:65:50 | TryExpr | test.rs:65:13:65:18 | target | provenance | | | test.rs:74:13:74:18 | buffer | test.rs:75:14:75:19 | buffer | provenance | | -| test.rs:74:31:74:45 | ...::read | test.rs:74:31:74:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:16 | +| test.rs:74:31:74:45 | ...::read | test.rs:74:31:74:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | | test.rs:74:31:74:57 | ...::read(...) [future, Ok] | test.rs:74:31:74:63 | await ... [Ok] | provenance | | | test.rs:74:31:74:63 | await ... [Ok] | test.rs:74:31:74:64 | TryExpr | provenance | | | test.rs:74:31:74:64 | TryExpr | test.rs:74:13:74:18 | buffer | provenance | | | test.rs:79:13:79:18 | buffer | test.rs:80:14:80:19 | buffer | provenance | | -| test.rs:79:31:79:45 | ...::read | test.rs:79:31:79:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:16 | +| test.rs:79:31:79:45 | ...::read | test.rs:79:31:79:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | | test.rs:79:31:79:57 | ...::read(...) [future, Ok] | test.rs:79:31:79:63 | await ... [Ok] | provenance | | | test.rs:79:31:79:63 | await ... [Ok] | test.rs:79:31:79:64 | TryExpr | provenance | | | test.rs:79:31:79:64 | TryExpr | test.rs:79:13:79:18 | buffer | provenance | | | test.rs:84:13:84:18 | buffer | test.rs:85:14:85:19 | buffer | provenance | | -| test.rs:84:22:84:46 | ...::read_to_string | test.rs:84:22:84:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:18 | +| test.rs:84:22:84:46 | ...::read_to_string | test.rs:84:22:84:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:16 | | test.rs:84:22:84:58 | ...::read_to_string(...) [future, Ok] | test.rs:84:22:84:64 | await ... [Ok] | provenance | | | test.rs:84:22:84:64 | await ... [Ok] | test.rs:84:22:84:65 | TryExpr | provenance | | | test.rs:84:22:84:65 | TryExpr | test.rs:84:13:84:18 | buffer | provenance | | | test.rs:90:13:90:16 | path | test.rs:92:14:92:17 | path | provenance | | | test.rs:90:20:90:31 | entry.path() | test.rs:90:13:90:16 | path | provenance | | | test.rs:90:26:90:29 | path | test.rs:90:20:90:31 | entry.path() | provenance | Src:MaD:10 MaD:10 | -| test.rs:90:26:90:29 | path | test.rs:90:20:90:31 | entry.path() | provenance | Src:MaD:10 MaD:10 | | test.rs:91:13:91:21 | file_name | test.rs:93:14:93:22 | file_name | provenance | | | test.rs:91:25:91:41 | entry.file_name() | test.rs:91:13:91:21 | file_name | provenance | | | test.rs:91:31:91:39 | file_name | test.rs:91:25:91:41 | entry.file_name() | provenance | Src:MaD:9 MaD:9 | -| test.rs:91:31:91:39 | file_name | test.rs:91:25:91:41 | entry.file_name() | provenance | Src:MaD:9 MaD:9 | | test.rs:97:13:97:18 | target | test.rs:98:14:98:19 | target | provenance | | -| test.rs:97:22:97:41 | ...::read_link | test.rs:97:22:97:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:17 | +| test.rs:97:22:97:41 | ...::read_link | test.rs:97:22:97:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:15 | | test.rs:97:22:97:56 | ...::read_link(...) [future, Ok] | test.rs:97:22:97:62 | await ... [Ok] | provenance | | | test.rs:97:22:97:62 | await ... [Ok] | test.rs:97:22:97:63 | TryExpr | provenance | | | test.rs:97:22:97:63 | TryExpr | test.rs:97:13:97:18 | target | provenance | | -| test.rs:107:9:107:16 | mut file | test.rs:111:32:111:42 | [post] &mut buffer | provenance | MaD:40 | -| test.rs:107:9:107:16 | mut file | test.rs:111:32:111:42 | [post] &mut buffer [&ref] | provenance | MaD:25 | -| test.rs:107:9:107:16 | mut file | test.rs:117:39:117:49 | [post] &mut buffer | provenance | MaD:41 | -| test.rs:107:9:107:16 | mut file | test.rs:117:39:117:49 | [post] &mut buffer [&ref] | provenance | MaD:27 | -| test.rs:107:9:107:16 | mut file | test.rs:123:42:123:52 | [post] &mut buffer | provenance | MaD:42 | -| test.rs:107:9:107:16 | mut file | test.rs:123:42:123:52 | [post] &mut buffer [&ref] | provenance | MaD:28 | -| test.rs:107:9:107:16 | mut file | test.rs:129:25:129:35 | [post] &mut buffer [&ref] | provenance | MaD:26 | -| test.rs:107:9:107:16 | mut file | test.rs:133:17:133:28 | file.bytes() | provenance | MaD:22 | +| test.rs:107:9:107:16 | mut file | test.rs:111:22:111:25 | file | provenance | | +| test.rs:107:9:107:16 | mut file | test.rs:117:22:117:25 | file | provenance | | +| test.rs:107:9:107:16 | mut file | test.rs:123:22:123:25 | file | provenance | | +| test.rs:107:9:107:16 | mut file | test.rs:129:9:129:12 | file | provenance | | +| test.rs:107:9:107:16 | mut file | test.rs:133:17:133:20 | file | provenance | | | test.rs:107:20:107:38 | ...::open | test.rs:107:20:107:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:107:20:107:50 | ...::open(...) [Ok] | test.rs:107:20:107:51 | TryExpr | provenance | | | test.rs:107:20:107:51 | TryExpr | test.rs:107:9:107:16 | mut file | provenance | | -| test.rs:111:32:111:42 | [post] &mut buffer | test.rs:112:15:112:20 | buffer | provenance | | +| test.rs:111:22:111:25 | file | test.rs:111:32:111:42 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:111:32:111:42 | [post] &mut buffer [&ref] | test.rs:111:37:111:42 | [post] buffer | provenance | | | test.rs:111:37:111:42 | [post] buffer | test.rs:112:15:112:20 | buffer | provenance | | | test.rs:112:15:112:20 | buffer | test.rs:112:14:112:20 | &buffer | provenance | | -| test.rs:117:39:117:49 | [post] &mut buffer | test.rs:118:15:118:20 | buffer | provenance | | +| test.rs:117:22:117:25 | file | test.rs:117:39:117:49 | [post] &mut buffer [&ref] | provenance | MaD:24 | | test.rs:117:39:117:49 | [post] &mut buffer [&ref] | test.rs:117:44:117:49 | [post] buffer | provenance | | | test.rs:117:44:117:49 | [post] buffer | test.rs:118:15:118:20 | buffer | provenance | | | test.rs:118:15:118:20 | buffer | test.rs:118:14:118:20 | &buffer | provenance | | -| test.rs:123:42:123:52 | [post] &mut buffer | test.rs:124:15:124:20 | buffer | provenance | | +| test.rs:123:22:123:25 | file | test.rs:123:42:123:52 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:123:42:123:52 | [post] &mut buffer [&ref] | test.rs:123:47:123:52 | [post] buffer | provenance | | | test.rs:123:47:123:52 | [post] buffer | test.rs:124:15:124:20 | buffer | provenance | | | test.rs:124:15:124:20 | buffer | test.rs:124:14:124:20 | &buffer | provenance | | +| test.rs:129:9:129:12 | file | test.rs:129:25:129:35 | [post] &mut buffer [&ref] | provenance | MaD:23 | | test.rs:129:25:129:35 | [post] &mut buffer [&ref] | test.rs:129:30:129:35 | [post] buffer | provenance | | | test.rs:129:30:129:35 | [post] buffer | test.rs:130:15:130:20 | buffer | provenance | | | test.rs:130:15:130:20 | buffer | test.rs:130:14:130:20 | &buffer | provenance | | +| test.rs:133:17:133:20 | file | test.rs:133:17:133:28 | file.bytes() | provenance | MaD:19 | | test.rs:133:17:133:28 | file.bytes() | test.rs:134:14:134:17 | byte | provenance | | -| test.rs:140:13:140:18 | mut f1 | test.rs:142:30:142:40 | [post] &mut buffer | provenance | MaD:40 | -| test.rs:140:13:140:18 | mut f1 | test.rs:142:30:142:40 | [post] &mut buffer [&ref] | provenance | MaD:25 | -| test.rs:140:22:140:63 | ... .open(...) [Ok] | test.rs:140:22:140:72 | ... .unwrap() | provenance | MaD:39 | +| test.rs:140:13:140:18 | mut f1 | test.rs:142:22:142:23 | f1 | provenance | | +| test.rs:140:22:140:63 | ... .open(...) [Ok] | test.rs:140:22:140:72 | ... .unwrap() | provenance | MaD:36 | | test.rs:140:22:140:72 | ... .unwrap() | test.rs:140:13:140:18 | mut f1 | provenance | | | test.rs:140:50:140:53 | open | test.rs:140:22:140:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:142:30:142:40 | [post] &mut buffer | test.rs:143:15:143:20 | buffer | provenance | | +| test.rs:142:22:142:23 | f1 | test.rs:142:30:142:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:142:30:142:40 | [post] &mut buffer [&ref] | test.rs:142:35:142:40 | [post] buffer | provenance | | | test.rs:142:35:142:40 | [post] buffer | test.rs:143:15:143:20 | buffer | provenance | | | test.rs:143:15:143:20 | buffer | test.rs:143:14:143:20 | &buffer | provenance | | -| test.rs:147:13:147:18 | mut f2 | test.rs:149:30:149:40 | [post] &mut buffer | provenance | MaD:40 | -| test.rs:147:13:147:18 | mut f2 | test.rs:149:30:149:40 | [post] &mut buffer [&ref] | provenance | MaD:25 | -| test.rs:147:22:147:80 | ... .open(...) [Ok] | test.rs:147:22:147:89 | ... .unwrap() | provenance | MaD:39 | +| test.rs:147:13:147:18 | mut f2 | test.rs:149:22:149:23 | f2 | provenance | | +| test.rs:147:22:147:80 | ... .open(...) [Ok] | test.rs:147:22:147:89 | ... .unwrap() | provenance | MaD:36 | | test.rs:147:22:147:89 | ... .unwrap() | test.rs:147:13:147:18 | mut f2 | provenance | | | test.rs:147:67:147:70 | open | test.rs:147:22:147:80 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:149:30:149:40 | [post] &mut buffer | test.rs:150:15:150:20 | buffer | provenance | | +| test.rs:149:22:149:23 | f2 | test.rs:149:30:149:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:149:30:149:40 | [post] &mut buffer [&ref] | test.rs:149:35:149:40 | [post] buffer | provenance | | | test.rs:149:35:149:40 | [post] buffer | test.rs:150:15:150:20 | buffer | provenance | | | test.rs:150:15:150:20 | buffer | test.rs:150:14:150:20 | &buffer | provenance | | -| test.rs:154:13:154:18 | mut f3 | test.rs:156:30:156:40 | [post] &mut buffer | provenance | MaD:40 | -| test.rs:154:13:154:18 | mut f3 | test.rs:156:30:156:40 | [post] &mut buffer [&ref] | provenance | MaD:25 | -| test.rs:154:22:154:114 | ... .open(...) [Ok] | test.rs:154:22:154:123 | ... .unwrap() | provenance | MaD:39 | +| test.rs:154:13:154:18 | mut f3 | test.rs:156:22:156:23 | f3 | provenance | | +| test.rs:154:22:154:114 | ... .open(...) [Ok] | test.rs:154:22:154:123 | ... .unwrap() | provenance | MaD:36 | | test.rs:154:22:154:123 | ... .unwrap() | test.rs:154:13:154:18 | mut f3 | provenance | | | test.rs:154:101:154:104 | open | test.rs:154:22:154:114 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:156:30:156:40 | [post] &mut buffer | test.rs:157:15:157:20 | buffer | provenance | | +| test.rs:156:22:156:23 | f3 | test.rs:156:30:156:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:156:30:156:40 | [post] &mut buffer [&ref] | test.rs:156:35:156:40 | [post] buffer | provenance | | | test.rs:156:35:156:40 | [post] buffer | test.rs:157:15:157:20 | buffer | provenance | | | test.rs:157:15:157:20 | buffer | test.rs:157:14:157:20 | &buffer | provenance | | -| test.rs:164:13:164:17 | file1 | test.rs:166:26:166:43 | file1.chain(...) | provenance | MaD:24 | +| test.rs:164:13:164:17 | file1 | test.rs:166:26:166:30 | file1 | provenance | | | test.rs:164:21:164:39 | ...::open | test.rs:164:21:164:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:164:21:164:51 | ...::open(...) [Ok] | test.rs:164:21:164:52 | TryExpr | provenance | | | test.rs:164:21:164:52 | TryExpr | test.rs:164:13:164:17 | file1 | provenance | | @@ -171,111 +150,118 @@ edges | test.rs:165:21:165:39 | ...::open | test.rs:165:21:165:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:165:21:165:59 | ...::open(...) [Ok] | test.rs:165:21:165:60 | TryExpr | provenance | | | test.rs:165:21:165:60 | TryExpr | test.rs:165:13:165:17 | file2 | provenance | | -| test.rs:166:13:166:22 | mut reader | test.rs:167:31:167:41 | [post] &mut buffer [&ref] | provenance | MaD:28 | +| test.rs:166:13:166:22 | mut reader | test.rs:167:9:167:14 | reader | provenance | | +| test.rs:166:26:166:30 | file1 | test.rs:166:26:166:43 | file1.chain(...) | provenance | MaD:21 | | test.rs:166:26:166:43 | file1.chain(...) | test.rs:166:13:166:22 | mut reader | provenance | | -| test.rs:166:38:166:42 | file2 | test.rs:166:26:166:43 | file1.chain(...) | provenance | MaD:23 | +| test.rs:166:38:166:42 | file2 | test.rs:166:26:166:43 | file1.chain(...) | provenance | MaD:20 | +| test.rs:167:9:167:14 | reader | test.rs:167:31:167:41 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:167:31:167:41 | [post] &mut buffer [&ref] | test.rs:167:36:167:41 | [post] buffer | provenance | | | test.rs:167:36:167:41 | [post] buffer | test.rs:168:15:168:20 | buffer | provenance | | | test.rs:168:15:168:20 | buffer | test.rs:168:14:168:20 | &buffer | provenance | | -| test.rs:173:13:173:17 | file1 | test.rs:174:26:174:40 | file1.take(...) | provenance | MaD:29 | +| test.rs:173:13:173:17 | file1 | test.rs:174:26:174:30 | file1 | provenance | | | test.rs:173:21:173:39 | ...::open | test.rs:173:21:173:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:173:21:173:51 | ...::open(...) [Ok] | test.rs:173:21:173:52 | TryExpr | provenance | | | test.rs:173:21:173:52 | TryExpr | test.rs:173:13:173:17 | file1 | provenance | | -| test.rs:174:13:174:22 | mut reader | test.rs:175:31:175:41 | [post] &mut buffer [&ref] | provenance | MaD:28 | +| test.rs:174:13:174:22 | mut reader | test.rs:175:9:175:14 | reader | provenance | | +| test.rs:174:26:174:30 | file1 | test.rs:174:26:174:40 | file1.take(...) | provenance | MaD:26 | | test.rs:174:26:174:40 | file1.take(...) | test.rs:174:13:174:22 | mut reader | provenance | | +| test.rs:175:9:175:14 | reader | test.rs:175:31:175:41 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:175:31:175:41 | [post] &mut buffer [&ref] | test.rs:175:36:175:41 | [post] buffer | provenance | | | test.rs:175:36:175:41 | [post] buffer | test.rs:176:15:176:20 | buffer | provenance | | | test.rs:176:15:176:20 | buffer | test.rs:176:14:176:20 | &buffer | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:189:32:189:42 | [post] &mut buffer [&ref] | provenance | MaD:30 | -| test.rs:185:9:185:16 | mut file | test.rs:195:39:195:49 | [post] &mut buffer [&ref] | provenance | MaD:36 | -| test.rs:185:9:185:16 | mut file | test.rs:201:42:201:52 | [post] &mut buffer [&ref] | provenance | MaD:37 | -| test.rs:185:9:185:16 | mut file | test.rs:207:25:207:35 | [post] &mut buffer [&ref] | provenance | MaD:32 | -| test.rs:185:9:185:16 | mut file | test.rs:212:18:212:31 | file.read_u8() [future, Ok] | provenance | MaD:38 | -| test.rs:185:9:185:16 | mut file | test.rs:213:18:213:32 | file.read_i16() [future, Ok] | provenance | MaD:34 | -| test.rs:185:9:185:16 | mut file | test.rs:214:18:214:32 | file.read_f32() [future, Ok] | provenance | MaD:33 | -| test.rs:185:9:185:16 | mut file | test.rs:215:18:215:35 | file.read_i64_le() [future, Ok] | provenance | MaD:35 | -| test.rs:185:9:185:16 | mut file | test.rs:224:23:224:33 | [post] &mut buffer [&ref] | provenance | MaD:31 | +| test.rs:185:9:185:16 | mut file | test.rs:189:22:189:25 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:195:22:195:25 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:201:22:201:25 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:207:9:207:12 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:212:18:212:21 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:213:18:213:21 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:214:18:214:21 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:215:18:215:21 | file | provenance | | +| test.rs:185:9:185:16 | mut file | test.rs:224:9:224:12 | file | provenance | | | test.rs:185:20:185:40 | ...::open | test.rs:185:20:185:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:7 | | test.rs:185:20:185:52 | ...::open(...) [future, Ok] | test.rs:185:20:185:58 | await ... [Ok] | provenance | | | test.rs:185:20:185:58 | await ... [Ok] | test.rs:185:20:185:59 | TryExpr | provenance | | | test.rs:185:20:185:59 | TryExpr | test.rs:185:9:185:16 | mut file | provenance | | +| test.rs:189:22:189:25 | file | test.rs:189:32:189:42 | [post] &mut buffer [&ref] | provenance | MaD:27 | | test.rs:189:32:189:42 | [post] &mut buffer [&ref] | test.rs:189:37:189:42 | [post] buffer | provenance | | | test.rs:189:37:189:42 | [post] buffer | test.rs:190:15:190:20 | buffer | provenance | | | test.rs:190:15:190:20 | buffer | test.rs:190:14:190:20 | &buffer | provenance | | +| test.rs:195:22:195:25 | file | test.rs:195:39:195:49 | [post] &mut buffer [&ref] | provenance | MaD:33 | | test.rs:195:39:195:49 | [post] &mut buffer [&ref] | test.rs:195:44:195:49 | [post] buffer | provenance | | | test.rs:195:44:195:49 | [post] buffer | test.rs:196:15:196:20 | buffer | provenance | | | test.rs:196:15:196:20 | buffer | test.rs:196:14:196:20 | &buffer | provenance | | +| test.rs:201:22:201:25 | file | test.rs:201:42:201:52 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:201:42:201:52 | [post] &mut buffer [&ref] | test.rs:201:47:201:52 | [post] buffer | provenance | | | test.rs:201:47:201:52 | [post] buffer | test.rs:202:15:202:20 | buffer | provenance | | | test.rs:202:15:202:20 | buffer | test.rs:202:14:202:20 | &buffer | provenance | | +| test.rs:207:9:207:12 | file | test.rs:207:25:207:35 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:207:25:207:35 | [post] &mut buffer [&ref] | test.rs:207:30:207:35 | [post] buffer | provenance | | | test.rs:207:30:207:35 | [post] buffer | test.rs:208:15:208:20 | buffer | provenance | | | test.rs:208:15:208:20 | buffer | test.rs:208:14:208:20 | &buffer | provenance | | | test.rs:212:13:212:14 | v1 | test.rs:216:14:216:15 | v1 | provenance | | +| test.rs:212:18:212:21 | file | test.rs:212:18:212:31 | file.read_u8() [future, Ok] | provenance | MaD:35 | | test.rs:212:18:212:31 | file.read_u8() [future, Ok] | test.rs:212:18:212:37 | await ... [Ok] | provenance | | | test.rs:212:18:212:37 | await ... [Ok] | test.rs:212:18:212:38 | TryExpr | provenance | | | test.rs:212:18:212:38 | TryExpr | test.rs:212:13:212:14 | v1 | provenance | | | test.rs:213:13:213:14 | v2 | test.rs:217:14:217:15 | v2 | provenance | | +| test.rs:213:18:213:21 | file | test.rs:213:18:213:32 | file.read_i16() [future, Ok] | provenance | MaD:31 | | test.rs:213:18:213:32 | file.read_i16() [future, Ok] | test.rs:213:18:213:38 | await ... [Ok] | provenance | | | test.rs:213:18:213:38 | await ... [Ok] | test.rs:213:18:213:39 | TryExpr | provenance | | | test.rs:213:18:213:39 | TryExpr | test.rs:213:13:213:14 | v2 | provenance | | | test.rs:214:13:214:14 | v3 | test.rs:218:14:218:15 | v3 | provenance | | +| test.rs:214:18:214:21 | file | test.rs:214:18:214:32 | file.read_f32() [future, Ok] | provenance | MaD:30 | | test.rs:214:18:214:32 | file.read_f32() [future, Ok] | test.rs:214:18:214:38 | await ... [Ok] | provenance | | | test.rs:214:18:214:38 | await ... [Ok] | test.rs:214:18:214:39 | TryExpr | provenance | | | test.rs:214:18:214:39 | TryExpr | test.rs:214:13:214:14 | v3 | provenance | | | test.rs:215:13:215:14 | v4 | test.rs:219:14:219:15 | v4 | provenance | | +| test.rs:215:18:215:21 | file | test.rs:215:18:215:35 | file.read_i64_le() [future, Ok] | provenance | MaD:32 | | test.rs:215:18:215:35 | file.read_i64_le() [future, Ok] | test.rs:215:18:215:41 | await ... [Ok] | provenance | | | test.rs:215:18:215:41 | await ... [Ok] | test.rs:215:18:215:42 | TryExpr | provenance | | | test.rs:215:18:215:42 | TryExpr | test.rs:215:13:215:14 | v4 | provenance | | +| test.rs:224:9:224:12 | file | test.rs:224:23:224:33 | [post] &mut buffer [&ref] | provenance | MaD:28 | | test.rs:224:23:224:33 | [post] &mut buffer [&ref] | test.rs:224:28:224:33 | [post] buffer | provenance | | | test.rs:224:28:224:33 | [post] buffer | test.rs:225:15:225:20 | buffer | provenance | | | test.rs:225:15:225:20 | buffer | test.rs:225:14:225:20 | &buffer | provenance | | -| test.rs:231:13:231:18 | mut f1 | test.rs:233:30:233:40 | [post] &mut buffer [&ref] | provenance | MaD:30 | +| test.rs:231:13:231:18 | mut f1 | test.rs:233:22:233:23 | f1 | provenance | | | test.rs:231:22:231:65 | ... .open(...) [future, Ok] | test.rs:231:22:231:71 | await ... [Ok] | provenance | | | test.rs:231:22:231:71 | await ... [Ok] | test.rs:231:22:231:72 | TryExpr | provenance | | | test.rs:231:22:231:72 | TryExpr | test.rs:231:13:231:18 | mut f1 | provenance | | | test.rs:231:52:231:55 | open | test.rs:231:22:231:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:8 | +| test.rs:233:22:233:23 | f1 | test.rs:233:30:233:40 | [post] &mut buffer [&ref] | provenance | MaD:27 | | test.rs:233:30:233:40 | [post] &mut buffer [&ref] | test.rs:233:35:233:40 | [post] buffer | provenance | | | test.rs:233:35:233:40 | [post] buffer | test.rs:234:15:234:20 | buffer | provenance | | | test.rs:234:15:234:20 | buffer | test.rs:234:14:234:20 | &buffer | provenance | | | test.rs:262:9:262:16 | mut file | test.rs:266:22:266:25 | file | provenance | | -| test.rs:262:9:262:16 | mut file | test.rs:266:32:266:42 | [post] &mut buffer [&ref] | provenance | MaD:19 | -| test.rs:262:9:262:16 | mut file | test.rs:266:32:266:42 | [post] &mut buffer [&ref] | provenance | MaD:20 | | test.rs:262:20:262:44 | ...::open | test.rs:262:20:262:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 | | test.rs:262:20:262:56 | ...::open(...) [future, Ok] | test.rs:262:20:262:62 | await ... [Ok] | provenance | | | test.rs:262:20:262:62 | await ... [Ok] | test.rs:262:20:262:63 | TryExpr | provenance | | | test.rs:262:20:262:63 | TryExpr | test.rs:262:9:262:16 | mut file | provenance | | -| test.rs:266:22:266:25 | file | test.rs:266:32:266:42 | [post] &mut buffer [&ref] | provenance | MaD:19 | +| test.rs:266:22:266:25 | file | test.rs:266:32:266:42 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:266:32:266:42 | [post] &mut buffer [&ref] | test.rs:266:37:266:42 | [post] buffer | provenance | | | test.rs:266:37:266:42 | [post] buffer | test.rs:267:15:267:20 | buffer | provenance | | | test.rs:267:15:267:20 | buffer | test.rs:267:14:267:20 | &buffer | provenance | | | test.rs:273:13:273:18 | mut f1 | test.rs:275:22:275:23 | f1 | provenance | | -| test.rs:273:13:273:18 | mut f1 | test.rs:275:30:275:40 | [post] &mut buffer [&ref] | provenance | MaD:19 | -| test.rs:273:13:273:18 | mut f1 | test.rs:275:30:275:40 | [post] &mut buffer [&ref] | provenance | MaD:20 | | test.rs:273:22:273:69 | ... .open(...) [future, Ok] | test.rs:273:22:273:75 | await ... [Ok] | provenance | | | test.rs:273:22:273:75 | await ... [Ok] | test.rs:273:22:273:76 | TryExpr | provenance | | | test.rs:273:22:273:76 | TryExpr | test.rs:273:13:273:18 | mut f1 | provenance | | | test.rs:273:56:273:59 | open | test.rs:273:22:273:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 | -| test.rs:275:22:275:23 | f1 | test.rs:275:30:275:40 | [post] &mut buffer [&ref] | provenance | MaD:19 | +| test.rs:275:22:275:23 | f1 | test.rs:275:30:275:40 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:275:30:275:40 | [post] &mut buffer [&ref] | test.rs:275:35:275:40 | [post] buffer | provenance | | | test.rs:275:35:275:40 | [post] buffer | test.rs:276:15:276:20 | buffer | provenance | | | test.rs:276:15:276:20 | buffer | test.rs:276:14:276:20 | &buffer | provenance | | nodes | test.rs:12:13:12:18 | buffer | semmle.label | buffer | | test.rs:12:31:12:43 | ...::read | semmle.label | ...::read | -| test.rs:12:31:12:43 | ...::read [Ok] | semmle.label | ...::read [Ok] | | test.rs:12:31:12:55 | ...::read(...) [Ok] | semmle.label | ...::read(...) [Ok] | | test.rs:12:31:12:56 | TryExpr | semmle.label | TryExpr | | test.rs:13:14:13:19 | buffer | semmle.label | buffer | | test.rs:17:13:17:18 | buffer | semmle.label | buffer | | test.rs:17:31:17:38 | ...::read | semmle.label | ...::read | -| test.rs:17:31:17:38 | ...::read [Ok] | semmle.label | ...::read [Ok] | | test.rs:17:31:17:50 | ...::read(...) [Ok] | semmle.label | ...::read(...) [Ok] | | test.rs:17:31:17:51 | TryExpr | semmle.label | TryExpr | | test.rs:18:14:18:19 | buffer | semmle.label | buffer | | test.rs:22:13:22:18 | buffer | semmle.label | buffer | | test.rs:22:22:22:39 | ...::read_to_string | semmle.label | ...::read_to_string | -| test.rs:22:22:22:39 | ...::read_to_string [Ok] | semmle.label | ...::read_to_string [Ok] | | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | semmle.label | ...::read_to_string(...) [Ok] | | test.rs:22:22:22:52 | TryExpr | semmle.label | TryExpr | | test.rs:23:14:23:19 | buffer | semmle.label | buffer | @@ -320,11 +306,9 @@ nodes | test.rs:90:13:90:16 | path | semmle.label | path | | test.rs:90:20:90:31 | entry.path() | semmle.label | entry.path() | | test.rs:90:26:90:29 | path | semmle.label | path | -| test.rs:90:26:90:29 | path | semmle.label | path | | test.rs:91:13:91:21 | file_name | semmle.label | file_name | | test.rs:91:25:91:41 | entry.file_name() | semmle.label | entry.file_name() | | test.rs:91:31:91:39 | file_name | semmle.label | file_name | -| test.rs:91:31:91:39 | file_name | semmle.label | file_name | | test.rs:92:14:92:17 | path | semmle.label | path | | test.rs:93:14:93:22 | file_name | semmle.label | file_name | | test.rs:97:13:97:18 | target | semmle.label | target | @@ -337,32 +321,34 @@ nodes | test.rs:107:20:107:38 | ...::open | semmle.label | ...::open | | test.rs:107:20:107:50 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | | test.rs:107:20:107:51 | TryExpr | semmle.label | TryExpr | -| test.rs:111:32:111:42 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:111:22:111:25 | file | semmle.label | file | | test.rs:111:32:111:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:111:37:111:42 | [post] buffer | semmle.label | [post] buffer | | test.rs:112:14:112:20 | &buffer | semmle.label | &buffer | | test.rs:112:15:112:20 | buffer | semmle.label | buffer | -| test.rs:117:39:117:49 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:117:22:117:25 | file | semmle.label | file | | test.rs:117:39:117:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:117:44:117:49 | [post] buffer | semmle.label | [post] buffer | | test.rs:118:14:118:20 | &buffer | semmle.label | &buffer | | test.rs:118:15:118:20 | buffer | semmle.label | buffer | -| test.rs:123:42:123:52 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:123:22:123:25 | file | semmle.label | file | | test.rs:123:42:123:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:123:47:123:52 | [post] buffer | semmle.label | [post] buffer | | test.rs:124:14:124:20 | &buffer | semmle.label | &buffer | | test.rs:124:15:124:20 | buffer | semmle.label | buffer | +| test.rs:129:9:129:12 | file | semmle.label | file | | test.rs:129:25:129:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:129:30:129:35 | [post] buffer | semmle.label | [post] buffer | | test.rs:130:14:130:20 | &buffer | semmle.label | &buffer | | test.rs:130:15:130:20 | buffer | semmle.label | buffer | +| test.rs:133:17:133:20 | file | semmle.label | file | | test.rs:133:17:133:28 | file.bytes() | semmle.label | file.bytes() | | test.rs:134:14:134:17 | byte | semmle.label | byte | | test.rs:140:13:140:18 | mut f1 | semmle.label | mut f1 | | test.rs:140:22:140:63 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | | test.rs:140:22:140:72 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:140:50:140:53 | open | semmle.label | open | -| test.rs:142:30:142:40 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:142:22:142:23 | f1 | semmle.label | f1 | | test.rs:142:30:142:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:142:35:142:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:143:14:143:20 | &buffer | semmle.label | &buffer | @@ -371,7 +357,7 @@ nodes | test.rs:147:22:147:80 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | | test.rs:147:22:147:89 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:147:67:147:70 | open | semmle.label | open | -| test.rs:149:30:149:40 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:149:22:149:23 | f2 | semmle.label | f2 | | test.rs:149:30:149:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:149:35:149:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:150:14:150:20 | &buffer | semmle.label | &buffer | @@ -380,7 +366,7 @@ nodes | test.rs:154:22:154:114 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | | test.rs:154:22:154:123 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:154:101:154:104 | open | semmle.label | open | -| test.rs:156:30:156:40 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:156:22:156:23 | f3 | semmle.label | f3 | | test.rs:156:30:156:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:156:35:156:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:157:14:157:20 | &buffer | semmle.label | &buffer | @@ -394,8 +380,10 @@ nodes | test.rs:165:21:165:59 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | | test.rs:165:21:165:60 | TryExpr | semmle.label | TryExpr | | test.rs:166:13:166:22 | mut reader | semmle.label | mut reader | +| test.rs:166:26:166:30 | file1 | semmle.label | file1 | | test.rs:166:26:166:43 | file1.chain(...) | semmle.label | file1.chain(...) | | test.rs:166:38:166:42 | file2 | semmle.label | file2 | +| test.rs:167:9:167:14 | reader | semmle.label | reader | | test.rs:167:31:167:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:167:36:167:41 | [post] buffer | semmle.label | [post] buffer | | test.rs:168:14:168:20 | &buffer | semmle.label | &buffer | @@ -405,7 +393,9 @@ nodes | test.rs:173:21:173:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | | test.rs:173:21:173:52 | TryExpr | semmle.label | TryExpr | | test.rs:174:13:174:22 | mut reader | semmle.label | mut reader | +| test.rs:174:26:174:30 | file1 | semmle.label | file1 | | test.rs:174:26:174:40 | file1.take(...) | semmle.label | file1.take(...) | +| test.rs:175:9:175:14 | reader | semmle.label | reader | | test.rs:175:31:175:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:175:36:175:41 | [post] buffer | semmle.label | [post] buffer | | test.rs:176:14:176:20 | &buffer | semmle.label | &buffer | @@ -415,35 +405,43 @@ nodes | test.rs:185:20:185:52 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | | test.rs:185:20:185:58 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:185:20:185:59 | TryExpr | semmle.label | TryExpr | +| test.rs:189:22:189:25 | file | semmle.label | file | | test.rs:189:32:189:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:189:37:189:42 | [post] buffer | semmle.label | [post] buffer | | test.rs:190:14:190:20 | &buffer | semmle.label | &buffer | | test.rs:190:15:190:20 | buffer | semmle.label | buffer | +| test.rs:195:22:195:25 | file | semmle.label | file | | test.rs:195:39:195:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:195:44:195:49 | [post] buffer | semmle.label | [post] buffer | | test.rs:196:14:196:20 | &buffer | semmle.label | &buffer | | test.rs:196:15:196:20 | buffer | semmle.label | buffer | +| test.rs:201:22:201:25 | file | semmle.label | file | | test.rs:201:42:201:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:201:47:201:52 | [post] buffer | semmle.label | [post] buffer | | test.rs:202:14:202:20 | &buffer | semmle.label | &buffer | | test.rs:202:15:202:20 | buffer | semmle.label | buffer | +| test.rs:207:9:207:12 | file | semmle.label | file | | test.rs:207:25:207:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:207:30:207:35 | [post] buffer | semmle.label | [post] buffer | | test.rs:208:14:208:20 | &buffer | semmle.label | &buffer | | test.rs:208:15:208:20 | buffer | semmle.label | buffer | | test.rs:212:13:212:14 | v1 | semmle.label | v1 | +| test.rs:212:18:212:21 | file | semmle.label | file | | test.rs:212:18:212:31 | file.read_u8() [future, Ok] | semmle.label | file.read_u8() [future, Ok] | | test.rs:212:18:212:37 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:212:18:212:38 | TryExpr | semmle.label | TryExpr | | test.rs:213:13:213:14 | v2 | semmle.label | v2 | +| test.rs:213:18:213:21 | file | semmle.label | file | | test.rs:213:18:213:32 | file.read_i16() [future, Ok] | semmle.label | file.read_i16() [future, Ok] | | test.rs:213:18:213:38 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:213:18:213:39 | TryExpr | semmle.label | TryExpr | | test.rs:214:13:214:14 | v3 | semmle.label | v3 | +| test.rs:214:18:214:21 | file | semmle.label | file | | test.rs:214:18:214:32 | file.read_f32() [future, Ok] | semmle.label | file.read_f32() [future, Ok] | | test.rs:214:18:214:38 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:214:18:214:39 | TryExpr | semmle.label | TryExpr | | test.rs:215:13:215:14 | v4 | semmle.label | v4 | +| test.rs:215:18:215:21 | file | semmle.label | file | | test.rs:215:18:215:35 | file.read_i64_le() [future, Ok] | semmle.label | file.read_i64_le() [future, Ok] | | test.rs:215:18:215:41 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:215:18:215:42 | TryExpr | semmle.label | TryExpr | @@ -451,6 +449,7 @@ nodes | test.rs:217:14:217:15 | v2 | semmle.label | v2 | | test.rs:218:14:218:15 | v3 | semmle.label | v3 | | test.rs:219:14:219:15 | v4 | semmle.label | v4 | +| test.rs:224:9:224:12 | file | semmle.label | file | | test.rs:224:23:224:33 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:224:28:224:33 | [post] buffer | semmle.label | [post] buffer | | test.rs:225:14:225:20 | &buffer | semmle.label | &buffer | @@ -460,6 +459,7 @@ nodes | test.rs:231:22:231:71 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:231:22:231:72 | TryExpr | semmle.label | TryExpr | | test.rs:231:52:231:55 | open | semmle.label | open | +| test.rs:233:22:233:23 | f1 | semmle.label | f1 | | test.rs:233:30:233:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:233:35:233:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:234:14:234:20 | &buffer | semmle.label | &buffer | @@ -500,8 +500,6 @@ testFailures | test.rs:80:14:80:19 | buffer | test.rs:79:31:79:45 | ...::read | test.rs:80:14:80:19 | buffer | $@ | test.rs:79:31:79:45 | ...::read | ...::read | | test.rs:85:14:85:19 | buffer | test.rs:84:22:84:46 | ...::read_to_string | test.rs:85:14:85:19 | buffer | $@ | test.rs:84:22:84:46 | ...::read_to_string | ...::read_to_string | | test.rs:92:14:92:17 | path | test.rs:90:26:90:29 | path | test.rs:92:14:92:17 | path | $@ | test.rs:90:26:90:29 | path | path | -| test.rs:92:14:92:17 | path | test.rs:90:26:90:29 | path | test.rs:92:14:92:17 | path | $@ | test.rs:90:26:90:29 | path | path | -| test.rs:93:14:93:22 | file_name | test.rs:91:31:91:39 | file_name | test.rs:93:14:93:22 | file_name | $@ | test.rs:91:31:91:39 | file_name | file_name | | test.rs:93:14:93:22 | file_name | test.rs:91:31:91:39 | file_name | test.rs:93:14:93:22 | file_name | $@ | test.rs:91:31:91:39 | file_name | file_name | | test.rs:98:14:98:19 | target | test.rs:97:22:97:41 | ...::read_link | test.rs:98:14:98:19 | target | $@ | test.rs:97:22:97:41 | ...::read_link | ...::read_link | | test.rs:112:14:112:20 | &buffer | test.rs:107:20:107:38 | ...::open | test.rs:112:14:112:20 | &buffer | $@ | test.rs:107:20:107:38 | ...::open | ...::open | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected index d73106fb1cf..0fb17232a39 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected @@ -1,11 +1,10 @@ | test.rs:12:31:12:43 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:12:31:12:43 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:17:31:17:38 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:17:31:17:38 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:22:22:22:39 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:22:22:22:39 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:26:18:26:29 | ...::read_dir | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:29:22:29:25 | path | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:43:27:43:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:51:52:51:59 | read_dir | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:54:22:54:25 | path | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:55:27:55:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:65:22:65:34 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | @@ -13,8 +12,6 @@ | test.rs:79:31:79:45 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:84:22:84:46 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:90:26:90:29 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:90:26:90:29 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:91:31:91:39 | file_name | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:91:31:91:39 | file_name | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:97:22:97:41 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:107:20:107:38 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/test.rs b/rust/ql/test/library-tests/dataflow/sources/file/test.rs index 35a7d2cc1b8..0124d2a094e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/file/test.rs @@ -23,7 +23,7 @@ fn test_fs() -> Result<(), Box> { sink(buffer); // $ hasTaintFlow="file.txt" } - for entry in fs::read_dir("directory")? { + for entry in fs::read_dir("directory")? { // $ Alert[rust/summary/taint-sources] let e = entry?; let path = e.path(); // $ Alert[rust/summary/taint-sources] @@ -48,7 +48,7 @@ fn test_fs() -> Result<(), Box> { sink(file_name.clone().as_encoded_bytes()); // $ MISSING: hasTaintFlow sink(file_name); // $ hasTaintFlow } - for entry in std::path::Path::new("directory").read_dir()? { + for entry in std::path::Path::new("directory").read_dir()? { // $ Alert[rust/summary/taint-sources] let e = entry?; let path = e.path(); // $ Alert[rust/summary/taint-sources] diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected index ca5c386b720..8ca58acd1d0 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected @@ -1,9 +1,6 @@ -multipleCallTargets -| test.rs:59:62:59:77 | ...::from(...) | -| test.rs:66:58:66:73 | ...::from(...) | +multipleResolvedTargets | test.rs:389:30:389:67 | pinned.poll_read(...) | | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) | | test.rs:423:27:423:71 | ... .poll_fill_buf(...) | | test.rs:447:30:447:67 | pinned.poll_read(...) | | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) | -| test.rs:519:50:519:66 | ...::from(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index d29b19fe58a..2b39cf16c42 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -6,67 +6,64 @@ models | 5 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | | 6 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 8 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | -| 9 | Summary: <_ as futures_io::if_std::AsyncRead>::poll_read; Argument[self].Reference; Argument[1].Reference; taint | -| 10 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 11 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 12 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 8 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 9 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | +| 10 | Summary: <_ as futures_io::if_std::AsyncRead>::poll_read; Argument[self].Reference; Argument[1].Reference; taint | +| 11 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 12 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | | 13 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 14 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | -| 15 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 16 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 17 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 18 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 19 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | -| 20 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | -| 21 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | -| 22 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 23 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 24 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 25 | Summary: ::new; Argument[0]; ReturnValue; value | -| 26 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 27 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 29 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 30 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 31 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 33 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 36 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | -| 37 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | -| 38 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | +| 14 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 15 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 16 | Summary: <_ as std::io::BufRead>::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 17 | Summary: <_ as std::io::Read>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 18 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | +| 19 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 20 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 21 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 22 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 23 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 24 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 25 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 26 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 27 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 28 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 29 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 33 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | +| 34 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | edges | test.rs:11:9:11:22 | remote_string1 | test.rs:12:10:12:23 | remote_string1 | provenance | | | test.rs:11:26:11:47 | ...::get | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:6 | | test.rs:11:26:11:62 | ...::get(...) [Ok] | test.rs:11:26:11:63 | TryExpr | provenance | | -| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:33 | +| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:30 | | test.rs:11:26:11:70 | ... .text() [Ok] | test.rs:11:26:11:71 | TryExpr | provenance | | | test.rs:11:26:11:71 | TryExpr | test.rs:11:9:11:22 | remote_string1 | provenance | | | test.rs:14:9:14:22 | remote_string2 | test.rs:15:10:15:23 | remote_string2 | provenance | | | test.rs:14:26:14:47 | ...::get | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:26 | -| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:33 | -| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:26 | +| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:23 | +| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:30 | +| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:23 | | test.rs:14:26:14:87 | ... .unwrap() | test.rs:14:9:14:22 | remote_string2 | provenance | | | test.rs:17:9:17:22 | remote_string3 | test.rs:18:10:18:23 | remote_string3 | provenance | | | test.rs:17:26:17:47 | ...::get | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:26 | -| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:34 | -| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:26 | +| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:23 | +| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:31 | +| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:23 | | test.rs:17:26:17:107 | ... .unwrap() | test.rs:17:9:17:22 | remote_string3 | provenance | | | test.rs:20:9:20:22 | remote_string4 | test.rs:21:10:21:23 | remote_string4 | provenance | | | test.rs:20:26:20:47 | ...::get | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:26 | -| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:32 | -| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:26 | +| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:23 | +| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:29 | +| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:23 | | test.rs:20:26:20:88 | ... .unwrap() | test.rs:20:9:20:22 | remote_string4 | provenance | | | test.rs:23:9:23:22 | remote_string5 | test.rs:24:10:24:23 | remote_string5 | provenance | | | test.rs:23:26:23:37 | ...::get | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:7 | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | test.rs:23:26:23:58 | await ... [Ok] | provenance | | | test.rs:23:26:23:58 | await ... [Ok] | test.rs:23:26:23:59 | TryExpr | provenance | | -| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:31 | +| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:28 | | test.rs:23:26:23:66 | ... .text() [future, Ok] | test.rs:23:26:23:72 | await ... [Ok] | provenance | | | test.rs:23:26:23:72 | await ... [Ok] | test.rs:23:26:23:73 | TryExpr | provenance | | | test.rs:23:26:23:73 | TryExpr | test.rs:23:9:23:22 | remote_string5 | provenance | | @@ -74,21 +71,23 @@ edges | test.rs:26:26:26:37 | ...::get | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:7 | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | test.rs:26:26:26:58 | await ... [Ok] | provenance | | | test.rs:26:26:26:58 | await ... [Ok] | test.rs:26:26:26:59 | TryExpr | provenance | | -| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:29 | +| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:26 | | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | test.rs:26:26:26:73 | await ... [Ok] | provenance | | | test.rs:26:26:26:73 | await ... [Ok] | test.rs:26:26:26:74 | TryExpr | provenance | | | test.rs:26:26:26:74 | TryExpr | test.rs:26:9:26:22 | remote_string6 | provenance | | -| test.rs:29:9:29:20 | mut request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:30 | -| test.rs:29:9:29:20 | mut request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:30 | +| test.rs:29:9:29:20 | mut request1 | test.rs:30:10:30:17 | request1 | provenance | | +| test.rs:29:9:29:20 | mut request1 | test.rs:31:29:31:36 | request1 | provenance | | | test.rs:29:24:29:35 | ...::get | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:7 | | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | test.rs:29:24:29:56 | await ... [Ok] | provenance | | | test.rs:29:24:29:56 | await ... [Ok] | test.rs:29:24:29:57 | TryExpr | provenance | | | test.rs:29:24:29:57 | TryExpr | test.rs:29:9:29:20 | mut request1 | provenance | | +| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:27 | | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | test.rs:30:10:30:31 | await ... [Ok, Some] | provenance | | | test.rs:30:10:30:31 | await ... [Ok, Some] | test.rs:30:10:30:32 | TryExpr [Some] | provenance | | -| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:23 | +| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:20 | | test.rs:31:15:31:25 | Some(...) [Some] | test.rs:31:20:31:24 | chunk | provenance | | | test.rs:31:20:31:24 | chunk | test.rs:32:14:32:18 | chunk | provenance | | +| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:27 | | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | test.rs:31:29:31:50 | await ... [Ok, Some] | provenance | | | test.rs:31:29:31:50 | await ... [Ok, Some] | test.rs:31:29:31:51 | TryExpr [Some] | provenance | | | test.rs:31:29:31:51 | TryExpr [Some] | test.rs:31:15:31:25 | Some(...) [Some] | provenance | | @@ -105,44 +104,53 @@ edges | test.rs:67:24:67:58 | TryExpr | test.rs:67:9:67:20 | mut response | provenance | | | test.rs:67:31:67:42 | send_request | test.rs:67:24:67:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:68:11:68:18 | response | test.rs:68:10:68:18 | &response | provenance | | -| test.rs:155:13:155:22 | mut stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:20 | +| test.rs:155:13:155:22 | mut stream | test.rs:162:17:162:22 | stream | provenance | | | test.rs:155:26:155:53 | ...::connect | test.rs:155:26:155:62 | ...::connect(...) [Ok] | provenance | Src:MaD:3 | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | test.rs:155:26:155:63 | TryExpr | provenance | | | test.rs:155:26:155:63 | TryExpr | test.rs:155:13:155:22 | mut stream | provenance | | +| test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | test.rs:162:34:162:39 | [post] buffer | provenance | | | test.rs:162:34:162:39 | [post] buffer | test.rs:165:15:165:20 | buffer | provenance | | -| test.rs:162:34:162:39 | [post] buffer | test.rs:166:14:166:22 | buffer[0] | provenance | | +| test.rs:162:34:162:39 | [post] buffer | test.rs:166:14:166:19 | buffer | provenance | | | test.rs:165:15:165:20 | buffer | test.rs:165:14:165:20 | &buffer | provenance | | +| test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:8 | | test.rs:174:13:174:22 | mut stream | test.rs:182:58:182:63 | stream | provenance | | | test.rs:174:26:174:61 | ...::connect_timeout | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:4 | | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | test.rs:174:26:174:106 | TryExpr | provenance | | | test.rs:174:26:174:106 | TryExpr | test.rs:174:13:174:22 | mut stream | provenance | | -| test.rs:182:21:182:30 | mut reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:19 | -| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:21 | +| test.rs:182:21:182:30 | mut reader | test.rs:185:27:185:32 | reader | provenance | | +| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:18 | | test.rs:182:34:182:74 | ... .take(...) | test.rs:182:21:182:30 | mut reader | provenance | | -| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:35 | +| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:32 | +| test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:16 | | test.rs:185:44:185:52 | [post] &mut line [&ref] | test.rs:185:49:185:52 | [post] line | provenance | | | test.rs:185:49:185:52 | [post] line | test.rs:192:35:192:38 | line | provenance | | | test.rs:192:35:192:38 | line | test.rs:192:34:192:38 | &line | provenance | | -| test.rs:224:9:224:24 | mut tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:36 | -| test.rs:224:9:224:24 | mut tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:22 | -| test.rs:224:9:224:24 | mut tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:37 | -| test.rs:224:9:224:24 | mut tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:38 | +| test.rs:224:9:224:24 | mut tokio_stream | test.rs:232:17:232:28 | tokio_stream | provenance | | +| test.rs:224:9:224:24 | mut tokio_stream | test.rs:236:18:236:29 | tokio_stream | provenance | | +| test.rs:224:9:224:24 | mut tokio_stream | test.rs:252:19:252:30 | tokio_stream | provenance | | +| test.rs:224:9:224:24 | mut tokio_stream | test.rs:275:19:275:30 | tokio_stream | provenance | | | test.rs:224:28:224:57 | ...::connect | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:5 | | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | test.rs:224:28:224:72 | await ... [Ok] | provenance | | | test.rs:224:28:224:72 | await ... [Ok] | test.rs:224:28:224:73 | TryExpr | provenance | | | test.rs:224:28:224:73 | TryExpr | test.rs:224:9:224:24 | mut tokio_stream | provenance | | +| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:33 | | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | test.rs:232:40:232:46 | [post] buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:239:15:239:21 | buffer1 | provenance | | -| test.rs:232:40:232:46 | [post] buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | | +| test.rs:232:40:232:46 | [post] buffer1 | test.rs:240:14:240:20 | buffer1 | provenance | | +| test.rs:236:18:236:29 | tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:19 | | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | test.rs:236:41:236:47 | [post] buffer2 | provenance | | | test.rs:236:41:236:47 | [post] buffer2 | test.rs:243:15:243:21 | buffer2 | provenance | | -| test.rs:236:41:236:47 | [post] buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | | +| test.rs:236:41:236:47 | [post] buffer2 | test.rs:244:14:244:20 | buffer2 | provenance | | | test.rs:239:15:239:21 | buffer1 | test.rs:239:14:239:21 | &buffer1 | provenance | | +| test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:8 | | test.rs:243:15:243:21 | buffer2 | test.rs:243:14:243:21 | &buffer2 | provenance | | +| test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:8 | +| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | test.rs:252:46:252:51 | [post] buffer | provenance | | | test.rs:252:46:252:51 | [post] buffer | test.rs:259:27:259:32 | buffer | provenance | | | test.rs:259:27:259:32 | buffer | test.rs:259:26:259:32 | &buffer | provenance | | +| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | test.rs:275:50:275:55 | [post] buffer | provenance | | | test.rs:275:50:275:55 | [post] buffer | test.rs:282:27:282:32 | buffer | provenance | | | test.rs:282:27:282:32 | buffer | test.rs:282:26:282:32 | &buffer | provenance | | @@ -157,86 +165,80 @@ edges | test.rs:380:13:380:22 | mut reader | test.rs:386:44:386:49 | reader | provenance | | | test.rs:380:13:380:22 | mut reader | test.rs:399:68:399:73 | reader | provenance | | | test.rs:380:13:380:22 | mut reader | test.rs:403:31:403:36 | reader | provenance | | -| test.rs:380:13:380:22 | mut reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:15 | -| test.rs:380:13:380:22 | mut reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | | test.rs:380:13:380:22 | mut reader | test.rs:408:55:408:60 | reader | provenance | | | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | test.rs:380:26:380:66 | await ... [Ok] | provenance | | | test.rs:380:26:380:66 | await ... [Ok] | test.rs:380:26:380:67 | TryExpr | provenance | | | test.rs:380:26:380:67 | TryExpr | test.rs:380:13:380:22 | mut reader | provenance | | -| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:27 | +| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:24 | | test.rs:381:15:381:20 | reader | test.rs:381:14:381:20 | &reader | provenance | | | test.rs:386:17:386:26 | mut pinned | test.rs:387:19:387:24 | pinned | provenance | | -| test.rs:386:17:386:26 | mut pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:9 | -| test.rs:386:17:386:26 | mut pinned [&ref] | test.rs:387:19:387:24 | pinned [&ref] | provenance | | -| test.rs:386:17:386:26 | mut pinned [&ref] | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:9 | +| test.rs:386:17:386:26 | mut pinned | test.rs:389:30:389:35 | pinned | provenance | | +| test.rs:386:17:386:26 | mut pinned [Pin, &ref] | test.rs:387:19:387:24 | pinned [Pin, &ref] | provenance | | | test.rs:386:30:386:50 | ...::new(...) | test.rs:386:17:386:26 | mut pinned | provenance | | -| test.rs:386:30:386:50 | ...::new(...) [&ref] | test.rs:386:17:386:26 | mut pinned [&ref] | provenance | | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:24 | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [&ref] | provenance | MaD:25 | +| test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | provenance | | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:21 | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:22 | | test.rs:386:44:386:49 | reader | test.rs:386:39:386:49 | &mut reader [&ref] | provenance | | | test.rs:387:19:387:24 | pinned | test.rs:387:18:387:24 | &pinned | provenance | | -| test.rs:387:19:387:24 | pinned [&ref] | test.rs:387:18:387:24 | &pinned | provenance | | +| test.rs:387:19:387:24 | pinned [Pin, &ref] | test.rs:387:18:387:24 | &pinned | provenance | | +| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:10 | | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | test.rs:389:61:389:66 | [post] buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:391:23:391:28 | buffer | provenance | | +| test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:28 | buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:33 | buffer[...] | provenance | | | test.rs:391:23:391:28 | buffer | test.rs:391:22:391:28 | &buffer | provenance | | +| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:8 | | test.rs:392:23:392:33 | buffer[...] | test.rs:392:22:392:33 | &... | provenance | | -| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:15 | +| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:14 | | test.rs:399:68:399:73 | reader | test.rs:399:63:399:73 | &mut reader [&ref] | provenance | | | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | test.rs:399:81:399:87 | [post] buffer1 | provenance | | +| test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:25 | buffer1 | provenance | | | test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | | +| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:8 | | test.rs:400:19:400:40 | buffer1[...] | test.rs:400:18:400:40 | &... | provenance | | -| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:15 | +| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:14 | | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | test.rs:403:48:403:54 | [post] buffer2 | provenance | | +| test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:25 | buffer2 | provenance | | | test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | | +| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:8 | | test.rs:405:19:405:40 | buffer2[...] | test.rs:405:18:405:40 | &... | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:409:15:409:21 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:413:44:413:50 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:423:41:423:47 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:10 | +| test.rs:408:13:408:23 | mut reader2 | test.rs:437:26:437:32 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:444:44:444:50 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:457:68:457:74 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:461:31:461:37 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:15 | -| test.rs:408:13:408:23 | mut reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | | test.rs:408:13:408:23 | mut reader2 | test.rs:467:44:467:50 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:10 | +| test.rs:408:13:408:23 | mut reader2 | test.rs:479:26:479:32 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:486:31:486:37 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:13 | -| test.rs:408:13:408:23 | mut reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:14 | | test.rs:408:13:408:23 | mut reader2 | test.rs:493:31:493:37 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:11 | -| test.rs:408:13:408:23 | mut reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:12 | | test.rs:408:13:408:23 | mut reader2 | test.rs:500:31:500:37 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:17 | -| test.rs:408:13:408:23 | mut reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:408:27:408:61 | ...::new(...) | test.rs:408:13:408:23 | mut reader2 | provenance | | -| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:28 | +| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:25 | | test.rs:409:15:409:21 | reader2 | test.rs:409:14:409:21 | &reader2 | provenance | | | test.rs:413:17:413:26 | mut pinned | test.rs:414:19:414:24 | pinned | provenance | | -| test.rs:413:17:413:26 | mut pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:8 | -| test.rs:413:17:413:26 | mut pinned [&ref] | test.rs:414:19:414:24 | pinned [&ref] | provenance | | -| test.rs:413:17:413:26 | mut pinned [&ref] | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:8 | +| test.rs:413:17:413:26 | mut pinned | test.rs:416:26:416:31 | pinned | provenance | | +| test.rs:413:17:413:26 | mut pinned [Pin, &ref] | test.rs:414:19:414:24 | pinned [Pin, &ref] | provenance | | | test.rs:413:30:413:51 | ...::new(...) | test.rs:413:17:413:26 | mut pinned | provenance | | -| test.rs:413:30:413:51 | ...::new(...) [&ref] | test.rs:413:17:413:26 | mut pinned [&ref] | provenance | | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:24 | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [&ref] | provenance | MaD:25 | +| test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | provenance | | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:21 | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:22 | | test.rs:413:44:413:50 | reader2 | test.rs:413:39:413:50 | &mut reader2 [&ref] | provenance | | | test.rs:414:19:414:24 | pinned | test.rs:414:18:414:24 | &pinned | provenance | | -| test.rs:414:19:414:24 | pinned [&ref] | test.rs:414:18:414:24 | &pinned | provenance | | +| test.rs:414:19:414:24 | pinned [Pin, &ref] | test.rs:414:18:414:24 | &pinned | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:418:23:418:28 | buffer [Ready, Ok] | provenance | | +| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:9 | | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:416:17:416:22 | buffer [Ready, Ok] | provenance | | | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | test.rs:417:32:417:38 | Ok(...) [Ok] | provenance | | | test.rs:417:32:417:38 | Ok(...) [Ok] | test.rs:417:35:417:37 | buf | provenance | | | test.rs:417:35:417:37 | buf | test.rs:419:22:419:24 | buf | provenance | | | test.rs:418:23:418:28 | buffer [Ready, Ok] | test.rs:418:22:418:28 | &buffer | provenance | | | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:8 | -| test.rs:423:27:423:48 | ...::new(...) [&ref] | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:8 | +| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:9 | | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:24 | -| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) [&ref] | provenance | MaD:25 | +| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:21 | | test.rs:423:41:423:47 | reader2 | test.rs:423:36:423:47 | &mut reader2 [&ref] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:425:17:425:36 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | provenance | | @@ -245,53 +247,61 @@ edges | test.rs:425:32:425:34 | buf | test.rs:427:26:427:28 | buf | provenance | | | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | test.rs:426:26:426:33 | &buffer2 | provenance | | | test.rs:437:17:437:22 | buffer | test.rs:438:18:438:23 | buffer | provenance | | +| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:11 | | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | test.rs:437:26:437:49 | await ... [Ok] | provenance | | | test.rs:437:26:437:49 | await ... [Ok] | test.rs:437:26:437:50 | TryExpr | provenance | | | test.rs:437:26:437:50 | TryExpr | test.rs:437:17:437:22 | buffer | provenance | | | test.rs:444:17:444:26 | mut pinned | test.rs:445:19:445:24 | pinned | provenance | | -| test.rs:444:17:444:26 | mut pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:9 | -| test.rs:444:17:444:26 | mut pinned [&ref] | test.rs:445:19:445:24 | pinned [&ref] | provenance | | -| test.rs:444:17:444:26 | mut pinned [&ref] | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:9 | +| test.rs:444:17:444:26 | mut pinned | test.rs:447:30:447:35 | pinned | provenance | | +| test.rs:444:17:444:26 | mut pinned [Pin, &ref] | test.rs:445:19:445:24 | pinned [Pin, &ref] | provenance | | | test.rs:444:30:444:51 | ...::new(...) | test.rs:444:17:444:26 | mut pinned | provenance | | -| test.rs:444:30:444:51 | ...::new(...) [&ref] | test.rs:444:17:444:26 | mut pinned [&ref] | provenance | | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:24 | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [&ref] | provenance | MaD:25 | +| test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | provenance | | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:21 | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:22 | | test.rs:444:44:444:50 | reader2 | test.rs:444:39:444:50 | &mut reader2 [&ref] | provenance | | | test.rs:445:19:445:24 | pinned | test.rs:445:18:445:24 | &pinned | provenance | | -| test.rs:445:19:445:24 | pinned [&ref] | test.rs:445:18:445:24 | &pinned | provenance | | +| test.rs:445:19:445:24 | pinned [Pin, &ref] | test.rs:445:18:445:24 | &pinned | provenance | | +| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:10 | | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | test.rs:447:61:447:66 | [post] buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:448:19:448:24 | buffer | provenance | | +| test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:28 | buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:33 | buffer[...] | provenance | | | test.rs:448:19:448:24 | buffer | test.rs:448:18:448:24 | &buffer | provenance | | +| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:8 | | test.rs:450:23:450:33 | buffer[...] | test.rs:450:22:450:33 | &... | provenance | | -| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:15 | +| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:14 | | test.rs:457:68:457:74 | reader2 | test.rs:457:63:457:74 | &mut reader2 [&ref] | provenance | | | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | test.rs:457:82:457:88 | [post] buffer1 | provenance | | +| test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:25 | buffer1 | provenance | | | test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | | +| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:8 | | test.rs:458:19:458:40 | buffer1[...] | test.rs:458:18:458:40 | &... | provenance | | -| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:15 | +| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:14 | | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | test.rs:461:49:461:55 | [post] buffer2 | provenance | | +| test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:25 | buffer2 | provenance | | | test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | | +| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:8 | | test.rs:462:19:462:40 | buffer2[...] | test.rs:462:18:462:40 | &... | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:468:19:468:24 | pinned | provenance | | -| test.rs:467:17:467:26 | mut pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:8 | -| test.rs:467:17:467:26 | mut pinned [&ref] | test.rs:468:19:468:24 | pinned [&ref] | provenance | | -| test.rs:467:17:467:26 | mut pinned [&ref] | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:8 | +| test.rs:467:17:467:26 | mut pinned | test.rs:470:26:470:31 | pinned | provenance | | +| test.rs:467:17:467:26 | mut pinned [Pin, &ref] | test.rs:468:19:468:24 | pinned [Pin, &ref] | provenance | | | test.rs:467:30:467:51 | ...::new(...) | test.rs:467:17:467:26 | mut pinned | provenance | | -| test.rs:467:30:467:51 | ...::new(...) [&ref] | test.rs:467:17:467:26 | mut pinned [&ref] | provenance | | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:24 | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [&ref] | provenance | MaD:25 | +| test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | provenance | | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:21 | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | provenance | MaD:22 | | test.rs:467:44:467:50 | reader2 | test.rs:467:39:467:50 | &mut reader2 [&ref] | provenance | | | test.rs:468:19:468:24 | pinned | test.rs:468:18:468:24 | &pinned | provenance | | -| test.rs:468:19:468:24 | pinned [&ref] | test.rs:468:18:468:24 | &pinned | provenance | | +| test.rs:468:19:468:24 | pinned [Pin, &ref] | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:471:19:471:24 | buffer [Ready, Ok] | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | provenance | | +| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:9 | | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:470:17:470:22 | buffer [Ready, Ok] | provenance | | | test.rs:471:19:471:24 | buffer [Ready, Ok] | test.rs:471:18:471:24 | &buffer | provenance | | | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | test.rs:472:32:472:38 | Ok(...) [Ok] | provenance | | | test.rs:472:32:472:38 | Ok(...) [Ok] | test.rs:472:35:472:37 | buf | provenance | | | test.rs:472:35:472:37 | buf | test.rs:473:22:473:24 | buf | provenance | | | test.rs:479:17:479:22 | buffer | test.rs:480:18:480:23 | buffer | provenance | | +| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:11 | | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | test.rs:479:26:479:49 | await ... [Ok] | provenance | | | test.rs:479:26:479:49 | await ... [Ok] | test.rs:479:26:479:50 | TryExpr | provenance | | | test.rs:479:26:479:50 | TryExpr | test.rs:479:17:479:22 | buffer | provenance | | @@ -299,11 +309,11 @@ edges | test.rs:486:57:486:65 | [post] &mut line [&ref] | test.rs:486:62:486:65 | [post] line | provenance | | | test.rs:486:62:486:65 | [post] line | test.rs:487:19:487:22 | line | provenance | | | test.rs:487:19:487:22 | line | test.rs:487:18:487:22 | &line | provenance | | -| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:11 | +| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:12 | | test.rs:493:49:493:57 | [post] &mut line [&ref] | test.rs:493:54:493:57 | [post] line | provenance | | | test.rs:493:54:493:57 | [post] line | test.rs:494:19:494:22 | line | provenance | | | test.rs:494:19:494:22 | line | test.rs:494:18:494:22 | &line | provenance | | -| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:15 | | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | test.rs:500:56:500:61 | [post] buffer | provenance | | | test.rs:500:56:500:61 | [post] buffer | test.rs:501:19:501:24 | buffer | provenance | | | test.rs:501:19:501:24 | buffer | test.rs:501:18:501:24 | &buffer | provenance | | @@ -359,12 +369,14 @@ nodes | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | semmle.label | ...::get(...) [future, Ok] | | test.rs:29:24:29:56 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:29:24:29:57 | TryExpr | semmle.label | TryExpr | +| test.rs:30:10:30:17 | request1 | semmle.label | request1 | | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | semmle.label | request1.chunk() [future, Ok, Some] | | test.rs:30:10:30:31 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | | test.rs:30:10:30:32 | TryExpr [Some] | semmle.label | TryExpr [Some] | | test.rs:30:10:30:41 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:31:15:31:25 | Some(...) [Some] | semmle.label | Some(...) [Some] | | test.rs:31:20:31:24 | chunk | semmle.label | chunk | +| test.rs:31:29:31:36 | request1 | semmle.label | request1 | | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | semmle.label | request1.chunk() [future, Ok, Some] | | test.rs:31:29:31:50 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | | test.rs:31:29:31:51 | TryExpr [Some] | semmle.label | TryExpr [Some] | @@ -388,10 +400,12 @@ nodes | test.rs:155:26:155:53 | ...::connect | semmle.label | ...::connect | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | semmle.label | ...::connect(...) [Ok] | | test.rs:155:26:155:63 | TryExpr | semmle.label | TryExpr | +| test.rs:162:17:162:22 | stream | semmle.label | stream | | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:162:34:162:39 | [post] buffer | semmle.label | [post] buffer | | test.rs:165:14:165:20 | &buffer | semmle.label | &buffer | | test.rs:165:15:165:20 | buffer | semmle.label | buffer | +| test.rs:166:14:166:19 | buffer | semmle.label | buffer | | test.rs:166:14:166:22 | buffer[0] | semmle.label | buffer[0] | | test.rs:174:13:174:22 | mut stream | semmle.label | mut stream | | test.rs:174:26:174:61 | ...::connect_timeout | semmle.label | ...::connect_timeout | @@ -401,6 +415,7 @@ nodes | test.rs:182:34:182:64 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:182:34:182:74 | ... .take(...) | semmle.label | ... .take(...) | | test.rs:182:58:182:63 | stream | semmle.label | stream | +| test.rs:185:27:185:32 | reader | semmle.label | reader | | test.rs:185:44:185:52 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | | test.rs:185:49:185:52 | [post] line | semmle.label | [post] line | | test.rs:192:34:192:38 | &line | semmle.label | &line | @@ -410,20 +425,26 @@ nodes | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | | test.rs:224:28:224:72 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:224:28:224:73 | TryExpr | semmle.label | TryExpr | +| test.rs:232:17:232:28 | tokio_stream | semmle.label | tokio_stream | | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | | test.rs:232:40:232:46 | [post] buffer1 | semmle.label | [post] buffer1 | +| test.rs:236:18:236:29 | tokio_stream | semmle.label | tokio_stream | | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | | test.rs:236:41:236:47 | [post] buffer2 | semmle.label | [post] buffer2 | | test.rs:239:14:239:21 | &buffer1 | semmle.label | &buffer1 | | test.rs:239:15:239:21 | buffer1 | semmle.label | buffer1 | +| test.rs:240:14:240:20 | buffer1 | semmle.label | buffer1 | | test.rs:240:14:240:23 | buffer1[0] | semmle.label | buffer1[0] | | test.rs:243:14:243:21 | &buffer2 | semmle.label | &buffer2 | | test.rs:243:15:243:21 | buffer2 | semmle.label | buffer2 | +| test.rs:244:14:244:20 | buffer2 | semmle.label | buffer2 | | test.rs:244:14:244:23 | buffer2[0] | semmle.label | buffer2[0] | +| test.rs:252:19:252:30 | tokio_stream | semmle.label | tokio_stream | | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:252:46:252:51 | [post] buffer | semmle.label | [post] buffer | | test.rs:259:26:259:32 | &buffer | semmle.label | &buffer | | test.rs:259:27:259:32 | buffer | semmle.label | buffer | +| test.rs:275:19:275:30 | tokio_stream | semmle.label | tokio_stream | | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:275:50:275:55 | [post] buffer | semmle.label | [post] buffer | | test.rs:282:26:282:32 | &buffer | semmle.label | &buffer | @@ -443,30 +464,34 @@ nodes | test.rs:381:14:381:20 | &reader | semmle.label | &reader | | test.rs:381:15:381:20 | reader | semmle.label | reader | | test.rs:386:17:386:26 | mut pinned | semmle.label | mut pinned | -| test.rs:386:17:386:26 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test.rs:386:17:386:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | | test.rs:386:30:386:50 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:386:30:386:50 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | | test.rs:386:39:386:49 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | | test.rs:386:44:386:49 | reader | semmle.label | reader | | test.rs:387:18:387:24 | &pinned | semmle.label | &pinned | | test.rs:387:19:387:24 | pinned | semmle.label | pinned | -| test.rs:387:19:387:24 | pinned [&ref] | semmle.label | pinned [&ref] | +| test.rs:387:19:387:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test.rs:389:30:389:35 | pinned | semmle.label | pinned | | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:389:61:389:66 | [post] buffer | semmle.label | [post] buffer | | test.rs:391:22:391:28 | &buffer | semmle.label | &buffer | | test.rs:391:23:391:28 | buffer | semmle.label | buffer | | test.rs:392:22:392:33 | &... | semmle.label | &... | +| test.rs:392:23:392:28 | buffer | semmle.label | buffer | | test.rs:392:23:392:33 | buffer[...] | semmle.label | buffer[...] | | test.rs:399:63:399:73 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | | test.rs:399:68:399:73 | reader | semmle.label | reader | | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | | test.rs:399:81:399:87 | [post] buffer1 | semmle.label | [post] buffer1 | | test.rs:400:18:400:40 | &... | semmle.label | &... | +| test.rs:400:19:400:25 | buffer1 | semmle.label | buffer1 | | test.rs:400:19:400:40 | buffer1[...] | semmle.label | buffer1[...] | | test.rs:403:31:403:36 | reader | semmle.label | reader | | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | | test.rs:403:48:403:54 | [post] buffer2 | semmle.label | [post] buffer2 | | test.rs:405:18:405:40 | &... | semmle.label | &... | +| test.rs:405:19:405:25 | buffer2 | semmle.label | buffer2 | | test.rs:405:19:405:40 | buffer2[...] | semmle.label | buffer2[...] | | test.rs:408:13:408:23 | mut reader2 | semmle.label | mut reader2 | | test.rs:408:27:408:61 | ...::new(...) | semmle.label | ...::new(...) | @@ -474,15 +499,16 @@ nodes | test.rs:409:14:409:21 | &reader2 | semmle.label | &reader2 | | test.rs:409:15:409:21 | reader2 | semmle.label | reader2 | | test.rs:413:17:413:26 | mut pinned | semmle.label | mut pinned | -| test.rs:413:17:413:26 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test.rs:413:17:413:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | | test.rs:413:30:413:51 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:413:30:413:51 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | | test.rs:413:39:413:50 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | | test.rs:413:44:413:50 | reader2 | semmle.label | reader2 | | test.rs:414:18:414:24 | &pinned | semmle.label | &pinned | | test.rs:414:19:414:24 | pinned | semmle.label | pinned | -| test.rs:414:19:414:24 | pinned [&ref] | semmle.label | pinned [&ref] | +| test.rs:414:19:414:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | | test.rs:416:17:416:22 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test.rs:416:26:416:31 | pinned | semmle.label | pinned | | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | | test.rs:417:32:417:38 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | @@ -492,7 +518,6 @@ nodes | test.rs:419:22:419:24 | buf | semmle.label | buf | | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | | test.rs:423:27:423:48 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:423:27:423:48 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | semmle.label | ... .poll_fill_buf(...) [Ready, Ok] | | test.rs:423:36:423:47 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | | test.rs:423:41:423:47 | reader2 | semmle.label | reader2 | @@ -504,46 +529,52 @@ nodes | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | | test.rs:427:26:427:28 | buf | semmle.label | buf | | test.rs:437:17:437:22 | buffer | semmle.label | buffer | +| test.rs:437:26:437:32 | reader2 | semmle.label | reader2 | | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | | test.rs:437:26:437:49 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:437:26:437:50 | TryExpr | semmle.label | TryExpr | | test.rs:438:18:438:23 | buffer | semmle.label | buffer | | test.rs:444:17:444:26 | mut pinned | semmle.label | mut pinned | -| test.rs:444:17:444:26 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test.rs:444:17:444:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | | test.rs:444:30:444:51 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:444:30:444:51 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | | test.rs:444:39:444:50 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | | test.rs:444:44:444:50 | reader2 | semmle.label | reader2 | | test.rs:445:18:445:24 | &pinned | semmle.label | &pinned | | test.rs:445:19:445:24 | pinned | semmle.label | pinned | -| test.rs:445:19:445:24 | pinned [&ref] | semmle.label | pinned [&ref] | +| test.rs:445:19:445:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test.rs:447:30:447:35 | pinned | semmle.label | pinned | | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:447:61:447:66 | [post] buffer | semmle.label | [post] buffer | | test.rs:448:18:448:24 | &buffer | semmle.label | &buffer | | test.rs:448:19:448:24 | buffer | semmle.label | buffer | | test.rs:450:22:450:33 | &... | semmle.label | &... | +| test.rs:450:23:450:28 | buffer | semmle.label | buffer | | test.rs:450:23:450:33 | buffer[...] | semmle.label | buffer[...] | | test.rs:457:63:457:74 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | | test.rs:457:68:457:74 | reader2 | semmle.label | reader2 | | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | | test.rs:457:82:457:88 | [post] buffer1 | semmle.label | [post] buffer1 | | test.rs:458:18:458:40 | &... | semmle.label | &... | +| test.rs:458:19:458:25 | buffer1 | semmle.label | buffer1 | | test.rs:458:19:458:40 | buffer1[...] | semmle.label | buffer1[...] | | test.rs:461:31:461:37 | reader2 | semmle.label | reader2 | | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | | test.rs:461:49:461:55 | [post] buffer2 | semmle.label | [post] buffer2 | | test.rs:462:18:462:40 | &... | semmle.label | &... | +| test.rs:462:19:462:25 | buffer2 | semmle.label | buffer2 | | test.rs:462:19:462:40 | buffer2[...] | semmle.label | buffer2[...] | | test.rs:467:17:467:26 | mut pinned | semmle.label | mut pinned | -| test.rs:467:17:467:26 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test.rs:467:17:467:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | | test.rs:467:30:467:51 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:467:30:467:51 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | | test.rs:467:39:467:50 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | | test.rs:467:44:467:50 | reader2 | semmle.label | reader2 | | test.rs:468:18:468:24 | &pinned | semmle.label | &pinned | | test.rs:468:19:468:24 | pinned | semmle.label | pinned | -| test.rs:468:19:468:24 | pinned [&ref] | semmle.label | pinned [&ref] | +| test.rs:468:19:468:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | | test.rs:470:17:470:22 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test.rs:470:26:470:31 | pinned | semmle.label | pinned | | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | | test.rs:471:18:471:24 | &buffer | semmle.label | &buffer | | test.rs:471:19:471:24 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | @@ -552,6 +583,7 @@ nodes | test.rs:472:35:472:37 | buf | semmle.label | buf | | test.rs:473:22:473:24 | buf | semmle.label | buf | | test.rs:479:17:479:22 | buffer | semmle.label | buffer | +| test.rs:479:26:479:32 | reader2 | semmle.label | reader2 | | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | | test.rs:479:26:479:49 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:479:26:479:50 | TryExpr | semmle.label | TryExpr | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/test.rs b/rust/ql/test/library-tests/dataflow/sources/net/test.rs index 254a27349d9..178f539dc6e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/net/test.rs @@ -204,7 +204,7 @@ async fn test_std_tcpstream(case: i64) -> std::io::Result<()> { for line in reader.lines() { // $ MISSING: Alert[rust/summary/taint-sources] if let Ok(string) = line { println!("line = {}", string); - sink(string); // $ MISSING: hasTaintFlow + sink(string); // $ MISSING: hasTaintFlow=&sock_addr } } } diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 535b3f339b4..00000000000 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| test.rs:31:22:31:72 | ... .read_to_string(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected index 5e0e79e5e5d..01693b0041f 100644 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected @@ -1,48 +1,44 @@ models | 1 | Source: std::io::stdio::stdin; ReturnValue; stdin | | 2 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | -| 3 | Summary: <_ as core::iter::traits::iterator::Iterator>::next; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | -| 4 | Summary: <_ as std::io::BufRead>::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 3 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 4 | Summary: <_ as std::io::BufRead>::fill_buf; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | | 5 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | -| 6 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | -| 7 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | +| 6 | Summary: <_ as std::io::BufRead>::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 7 | Summary: <_ as std::io::BufRead>::read_until; Argument[self].Reference; Argument[1].Reference; taint | | 8 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | | 9 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | -| 10 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | -| 11 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 12 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 13 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 14 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 10 | Summary: <_ as std::io::Read>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 11 | Summary: <_ as std::io::Read>::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 12 | Summary: <_ as std::io::Read>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 13 | Summary: <_ as std::io::Read>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 14 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | | 15 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | -| 16 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | -| 17 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 16 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 17 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | | 18 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | -| 19 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 20 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | -| 21 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 22 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 23 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 24 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 25 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 26 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 27 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 19 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 20 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 21 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 22 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 23 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 24 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 25 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 26 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 27 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | | 28 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | | 29 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 30 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 31 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 32 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 33 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | -| 34 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 35 | Summary: ::lock; Argument[self]; ReturnValue; taint | -| 36 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 37 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 38 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 39 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 30 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | +| 31 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 32 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 33 | Summary: ::lock; Argument[self].Reference; ReturnValue; taint | +| 34 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 35 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 36 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 37 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | edges | test.rs:13:22:13:35 | ...::stdin | test.rs:13:22:13:37 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer | provenance | MaD:32 | | test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:10 | -| test.rs:13:44:13:54 | [post] &mut buffer | test.rs:14:15:14:20 | buffer | provenance | | | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | test.rs:13:49:13:54 | [post] buffer | provenance | | | test.rs:13:49:13:54 | [post] buffer | test.rs:14:15:14:20 | buffer | provenance | | | test.rs:14:15:14:20 | buffer | test.rs:14:14:14:20 | &buffer | provenance | | @@ -52,190 +48,213 @@ edges | test.rs:19:56:19:61 | [post] buffer | test.rs:20:15:20:20 | buffer | provenance | | | test.rs:20:15:20:20 | buffer | test.rs:20:14:20:20 | &buffer | provenance | | | test.rs:25:22:25:35 | ...::stdin | test.rs:25:22:25:37 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer | provenance | MaD:34 | | test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:13 | -| test.rs:25:54:25:64 | [post] &mut buffer | test.rs:26:15:26:20 | buffer | provenance | | | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | test.rs:25:59:25:64 | [post] buffer | provenance | | | test.rs:25:59:25:64 | [post] buffer | test.rs:26:15:26:20 | buffer | provenance | | | test.rs:26:15:26:20 | buffer | test.rs:26:14:26:20 | &buffer | provenance | | | test.rs:31:22:31:35 | ...::stdin | test.rs:31:22:31:37 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:35 | +| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:33 | | test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:13 | | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | test.rs:31:66:31:71 | [post] buffer | provenance | | | test.rs:31:66:31:71 | [post] buffer | test.rs:32:15:32:20 | buffer | provenance | | | test.rs:32:15:32:20 | buffer | test.rs:32:14:32:20 | &buffer | provenance | | | test.rs:37:9:37:22 | ...::stdin | test.rs:37:9:37:24 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer | provenance | MaD:33 | | test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:11 | -| test.rs:37:37:37:47 | [post] &mut buffer | test.rs:38:15:38:20 | buffer | provenance | | | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | test.rs:37:42:37:47 | [post] buffer | provenance | | | test.rs:37:42:37:47 | [post] buffer | test.rs:38:15:38:20 | buffer | provenance | | | test.rs:38:15:38:20 | buffer | test.rs:38:14:38:20 | &buffer | provenance | | | test.rs:41:17:41:30 | ...::stdin | test.rs:41:17:41:32 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:9 | | test.rs:41:17:41:40 | ... .bytes() | test.rs:42:14:42:17 | byte | provenance | | -| test.rs:48:13:48:22 | mut reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:4 | +| test.rs:48:13:48:22 | mut reader | test.rs:49:20:49:25 | reader | provenance | | | test.rs:48:26:48:66 | ...::new(...) | test.rs:48:13:48:22 | mut reader | provenance | | | test.rs:48:50:48:63 | ...::stdin | test.rs:48:50:48:65 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:31 | +| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:32 | | test.rs:49:13:49:16 | data | test.rs:50:15:50:18 | data | provenance | | +| test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:4 | | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | test.rs:49:20:49:37 | TryExpr | provenance | | | test.rs:49:20:49:37 | TryExpr | test.rs:49:13:49:16 | data | provenance | | | test.rs:50:15:50:18 | data | test.rs:50:14:50:18 | &data | provenance | | -| test.rs:54:13:54:18 | reader | test.rs:55:20:55:34 | reader.buffer() | provenance | MaD:30 | +| test.rs:54:13:54:18 | reader | test.rs:55:20:55:25 | reader | provenance | | | test.rs:54:22:54:62 | ...::new(...) | test.rs:54:13:54:18 | reader | provenance | | | test.rs:54:46:54:59 | ...::stdin | test.rs:54:46:54:61 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:31 | -| test.rs:55:13:55:16 | data | test.rs:56:15:56:18 | data | provenance | | -| test.rs:55:20:55:34 | reader.buffer() | test.rs:55:13:55:16 | data | provenance | | -| test.rs:56:15:56:18 | data | test.rs:56:14:56:18 | &data | provenance | | -| test.rs:61:13:61:22 | mut reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:6 | +| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:32 | +| test.rs:55:13:55:16 | data [&ref] | test.rs:56:15:56:18 | data [&ref] | provenance | | +| test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:31 | +| test.rs:55:20:55:34 | reader.buffer() [&ref] | test.rs:55:13:55:16 | data [&ref] | provenance | | +| test.rs:56:15:56:18 | data [&ref] | test.rs:56:14:56:18 | &data | provenance | | +| test.rs:61:13:61:22 | mut reader | test.rs:62:9:62:14 | reader | provenance | | | test.rs:61:26:61:66 | ...::new(...) | test.rs:61:13:61:22 | mut reader | provenance | | | test.rs:61:50:61:63 | ...::stdin | test.rs:61:50:61:65 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:31 | +| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:32 | +| test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:6 | | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | test.rs:62:31:62:36 | [post] buffer | provenance | | | test.rs:62:31:62:36 | [post] buffer | test.rs:63:15:63:20 | buffer | provenance | | | test.rs:63:15:63:20 | buffer | test.rs:63:14:63:20 | &buffer | provenance | | -| test.rs:68:13:68:22 | mut reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:7 | +| test.rs:68:13:68:22 | mut reader | test.rs:69:9:69:14 | reader | provenance | | | test.rs:68:26:68:66 | ...::new(...) | test.rs:68:13:68:22 | mut reader | provenance | | | test.rs:68:50:68:63 | ...::stdin | test.rs:68:50:68:65 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:31 | +| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:32 | +| test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:7 | | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | test.rs:69:38:69:43 | [post] buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:70:15:70:20 | buffer | provenance | | -| test.rs:69:38:69:43 | [post] buffer | test.rs:71:14:71:22 | buffer[0] | provenance | | +| test.rs:69:38:69:43 | [post] buffer | test.rs:71:14:71:19 | buffer | provenance | | | test.rs:70:15:70:20 | buffer | test.rs:70:14:70:20 | &buffer | provenance | | -| test.rs:75:13:75:28 | mut reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:3 | -| test.rs:75:13:75:28 | mut reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:3 | +| test.rs:71:14:71:19 | buffer | test.rs:71:14:71:22 | buffer[0] | provenance | MaD:3 | +| test.rs:75:13:75:28 | mut reader_split | test.rs:76:14:76:25 | reader_split | provenance | | +| test.rs:75:13:75:28 | mut reader_split | test.rs:77:33:77:44 | reader_split | provenance | | | test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:8 | | test.rs:75:32:75:84 | ... .split(...) | test.rs:75:13:75:28 | mut reader_split | provenance | | | test.rs:75:56:75:69 | ...::stdin | test.rs:75:56:75:71 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:31 | +| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:32 | +| test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:30 | | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:28 | | test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:29 | | test.rs:77:19:77:29 | Some(...) [Some, Ok] | test.rs:77:24:77:28 | chunk [Ok] | provenance | | -| test.rs:77:24:77:28 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:29 | +| test.rs:77:24:77:28 | chunk [Ok] | test.rs:78:18:78:22 | chunk [Ok] | provenance | | +| test.rs:77:33:77:44 | reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:30 | | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | test.rs:77:19:77:29 | Some(...) [Some, Ok] | provenance | | -| test.rs:83:13:83:18 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:5 | +| test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:29 | +| test.rs:83:13:83:18 | reader | test.rs:84:21:84:26 | reader | provenance | | | test.rs:83:22:83:62 | ...::new(...) | test.rs:83:13:83:18 | reader | provenance | | | test.rs:83:46:83:59 | ...::stdin | test.rs:83:46:83:61 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | -| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:31 | +| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:32 | +| test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:5 | | test.rs:84:21:84:34 | reader.lines() | test.rs:85:18:85:21 | line | provenance | | -| test.rs:109:13:109:21 | mut stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:19 | +| test.rs:109:13:109:21 | mut stdin | test.rs:111:22:111:26 | stdin | provenance | | | test.rs:109:25:109:40 | ...::stdin | test.rs:109:25:109:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:109:25:109:42 | ...::stdin(...) | test.rs:109:13:109:21 | mut stdin | provenance | | +| test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:19 | | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | test.rs:111:38:111:43 | [post] buffer | provenance | | | test.rs:111:38:111:43 | [post] buffer | test.rs:112:15:112:20 | buffer | provenance | | | test.rs:112:15:112:20 | buffer | test.rs:112:14:112:20 | &buffer | provenance | | -| test.rs:116:13:116:21 | mut stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:25 | +| test.rs:116:13:116:21 | mut stdin | test.rs:118:22:118:26 | stdin | provenance | | | test.rs:116:25:116:40 | ...::stdin | test.rs:116:25:116:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:116:25:116:42 | ...::stdin(...) | test.rs:116:13:116:21 | mut stdin | provenance | | +| test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | test.rs:118:45:118:50 | [post] buffer | provenance | | | test.rs:118:45:118:50 | [post] buffer | test.rs:119:15:119:20 | buffer | provenance | | | test.rs:119:15:119:20 | buffer | test.rs:119:14:119:20 | &buffer | provenance | | -| test.rs:123:13:123:21 | mut stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:26 | +| test.rs:123:13:123:21 | mut stdin | test.rs:125:22:125:26 | stdin | provenance | | | test.rs:123:25:123:40 | ...::stdin | test.rs:123:25:123:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:123:25:123:42 | ...::stdin(...) | test.rs:123:13:123:21 | mut stdin | provenance | | +| test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:26 | | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | test.rs:125:48:125:53 | [post] buffer | provenance | | | test.rs:125:48:125:53 | [post] buffer | test.rs:126:15:126:20 | buffer | provenance | | | test.rs:126:15:126:20 | buffer | test.rs:126:14:126:20 | &buffer | provenance | | -| test.rs:130:13:130:21 | mut stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:21 | +| test.rs:130:13:130:21 | mut stdin | test.rs:132:9:132:13 | stdin | provenance | | | test.rs:130:25:130:40 | ...::stdin | test.rs:130:25:130:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:130:25:130:42 | ...::stdin(...) | test.rs:130:13:130:21 | mut stdin | provenance | | +| test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:21 | | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | test.rs:132:31:132:36 | [post] buffer | provenance | | | test.rs:132:31:132:36 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | | test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | -| test.rs:137:13:137:21 | mut stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:27 | -| test.rs:137:13:137:21 | mut stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:23 | -| test.rs:137:13:137:21 | mut stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:22 | -| test.rs:137:13:137:21 | mut stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:24 | +| test.rs:137:13:137:21 | mut stdin | test.rs:138:18:138:22 | stdin | provenance | | +| test.rs:137:13:137:21 | mut stdin | test.rs:139:18:139:22 | stdin | provenance | | +| test.rs:137:13:137:21 | mut stdin | test.rs:140:18:140:22 | stdin | provenance | | +| test.rs:137:13:137:21 | mut stdin | test.rs:141:18:141:22 | stdin | provenance | | | test.rs:137:25:137:40 | ...::stdin | test.rs:137:25:137:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:137:13:137:21 | mut stdin | provenance | | | test.rs:138:13:138:14 | v1 | test.rs:142:14:142:15 | v1 | provenance | | +| test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:27 | | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | test.rs:138:18:138:38 | await ... [Ok] | provenance | | | test.rs:138:18:138:38 | await ... [Ok] | test.rs:138:18:138:39 | TryExpr | provenance | | | test.rs:138:18:138:39 | TryExpr | test.rs:138:13:138:14 | v1 | provenance | | | test.rs:139:13:139:14 | v2 | test.rs:143:14:143:15 | v2 | provenance | | +| test.rs:139:18:139:22 | stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:23 | | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | test.rs:139:18:139:39 | await ... [Ok] | provenance | | | test.rs:139:18:139:39 | await ... [Ok] | test.rs:139:18:139:40 | TryExpr | provenance | | | test.rs:139:18:139:40 | TryExpr | test.rs:139:13:139:14 | v2 | provenance | | | test.rs:140:13:140:14 | v3 | test.rs:144:14:144:15 | v3 | provenance | | +| test.rs:140:18:140:22 | stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:22 | | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | test.rs:140:18:140:39 | await ... [Ok] | provenance | | | test.rs:140:18:140:39 | await ... [Ok] | test.rs:140:18:140:40 | TryExpr | provenance | | | test.rs:140:18:140:40 | TryExpr | test.rs:140:13:140:14 | v3 | provenance | | | test.rs:141:13:141:14 | v4 | test.rs:145:14:145:15 | v4 | provenance | | +| test.rs:141:18:141:22 | stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:24 | | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | test.rs:141:18:141:42 | await ... [Ok] | provenance | | | test.rs:141:18:141:42 | await ... [Ok] | test.rs:141:18:141:43 | TryExpr | provenance | | | test.rs:141:18:141:43 | TryExpr | test.rs:141:13:141:14 | v4 | provenance | | -| test.rs:149:13:149:21 | mut stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:20 | +| test.rs:149:13:149:21 | mut stdin | test.rs:151:9:151:13 | stdin | provenance | | | test.rs:149:25:149:40 | ...::stdin | test.rs:149:25:149:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:149:25:149:42 | ...::stdin(...) | test.rs:149:13:149:21 | mut stdin | provenance | | +| test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:20 | | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | test.rs:151:29:151:34 | [post] buffer | provenance | | | test.rs:151:29:151:34 | [post] buffer | test.rs:152:15:152:20 | buffer | provenance | | | test.rs:152:15:152:20 | buffer | test.rs:152:14:152:20 | &buffer | provenance | | -| test.rs:158:13:158:22 | mut reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:14 | +| test.rs:158:13:158:22 | mut reader | test.rs:159:20:159:25 | reader | provenance | | | test.rs:158:26:158:70 | ...::new(...) | test.rs:158:13:158:22 | mut reader | provenance | | | test.rs:158:52:158:67 | ...::stdin | test.rs:158:52:158:69 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:37 | +| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:35 | | test.rs:159:13:159:16 | data | test.rs:160:15:160:18 | data | provenance | | +| test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:14 | | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | test.rs:159:20:159:42 | await ... [Ok] | provenance | | | test.rs:159:20:159:42 | await ... [Ok] | test.rs:159:20:159:43 | TryExpr | provenance | | | test.rs:159:20:159:43 | TryExpr | test.rs:159:13:159:16 | data | provenance | | | test.rs:160:15:160:18 | data | test.rs:160:14:160:18 | &data | provenance | | -| test.rs:164:13:164:18 | reader | test.rs:165:20:165:34 | reader.buffer() | provenance | MaD:36 | +| test.rs:164:13:164:18 | reader | test.rs:165:20:165:25 | reader | provenance | | | test.rs:164:22:164:66 | ...::new(...) | test.rs:164:13:164:18 | reader | provenance | | | test.rs:164:48:164:63 | ...::stdin | test.rs:164:48:164:65 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:37 | -| test.rs:165:13:165:16 | data | test.rs:166:15:166:18 | data | provenance | | -| test.rs:165:20:165:34 | reader.buffer() | test.rs:165:13:165:16 | data | provenance | | -| test.rs:166:15:166:18 | data | test.rs:166:14:166:18 | &data | provenance | | -| test.rs:171:13:171:22 | mut reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:16 | +| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:35 | +| test.rs:165:13:165:16 | data [&ref] | test.rs:166:15:166:18 | data [&ref] | provenance | | +| test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:34 | +| test.rs:165:20:165:34 | reader.buffer() [&ref] | test.rs:165:13:165:16 | data [&ref] | provenance | | +| test.rs:166:15:166:18 | data [&ref] | test.rs:166:14:166:18 | &data | provenance | | +| test.rs:171:13:171:22 | mut reader | test.rs:172:9:172:14 | reader | provenance | | | test.rs:171:26:171:70 | ...::new(...) | test.rs:171:13:171:22 | mut reader | provenance | | | test.rs:171:52:171:67 | ...::stdin | test.rs:171:52:171:69 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:37 | +| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:35 | +| test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:16 | | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | test.rs:172:31:172:36 | [post] buffer | provenance | | | test.rs:172:31:172:36 | [post] buffer | test.rs:173:15:173:20 | buffer | provenance | | | test.rs:173:15:173:20 | buffer | test.rs:173:14:173:20 | &buffer | provenance | | -| test.rs:178:13:178:22 | mut reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | | test.rs:178:26:178:70 | ...::new(...) | test.rs:178:13:178:22 | mut reader | provenance | | | test.rs:178:52:178:67 | ...::stdin | test.rs:178:52:178:69 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:37 | +| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:35 | +| test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | test.rs:179:38:179:43 | [post] buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | -| test.rs:179:38:179:43 | [post] buffer | test.rs:181:14:181:22 | buffer[0] | provenance | | +| test.rs:179:38:179:43 | [post] buffer | test.rs:181:14:181:19 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | -| test.rs:185:13:185:28 | mut reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:39 | -| test.rs:185:13:185:28 | mut reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:39 | +| test.rs:181:14:181:19 | buffer | test.rs:181:14:181:22 | buffer[0] | provenance | MaD:3 | +| test.rs:185:13:185:28 | mut reader_split | test.rs:186:14:186:25 | reader_split | provenance | | +| test.rs:185:13:185:28 | mut reader_split | test.rs:187:33:187:44 | reader_split | provenance | | | test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:18 | | test.rs:185:32:185:88 | ... .split(...) | test.rs:185:13:185:28 | mut reader_split | provenance | | | test.rs:185:58:185:73 | ...::stdin | test.rs:185:58:185:75 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:37 | +| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:35 | +| test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:37 | | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:186:14:186:46 | await ... [Ok, Some] | provenance | | | test.rs:186:14:186:46 | await ... [Ok, Some] | test.rs:186:14:186:47 | TryExpr [Some] | provenance | | | test.rs:186:14:186:47 | TryExpr [Some] | test.rs:186:14:186:56 | ... .unwrap() | provenance | MaD:28 | | test.rs:187:19:187:29 | Some(...) [Some] | test.rs:187:24:187:28 | chunk | provenance | | | test.rs:187:24:187:28 | chunk | test.rs:188:18:188:22 | chunk | provenance | | +| test.rs:187:33:187:44 | reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:37 | | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:187:33:187:65 | await ... [Ok, Some] | provenance | | | test.rs:187:33:187:65 | await ... [Ok, Some] | test.rs:187:33:187:66 | TryExpr [Some] | provenance | | | test.rs:187:33:187:66 | TryExpr [Some] | test.rs:187:19:187:29 | Some(...) [Some] | provenance | | -| test.rs:193:13:193:18 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:15 | +| test.rs:193:13:193:18 | reader | test.rs:194:25:194:30 | reader | provenance | | | test.rs:193:22:193:66 | ...::new(...) | test.rs:193:13:193:18 | reader | provenance | | | test.rs:193:48:193:63 | ...::stdin | test.rs:193:48:193:65 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:37 | -| test.rs:194:13:194:21 | mut lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:38 | -| test.rs:194:13:194:21 | mut lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:38 | +| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:35 | +| test.rs:194:13:194:21 | mut lines | test.rs:195:14:195:18 | lines | provenance | | +| test.rs:194:13:194:21 | mut lines | test.rs:196:32:196:36 | lines | provenance | | +| test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:15 | | test.rs:194:25:194:38 | reader.lines() | test.rs:194:13:194:21 | mut lines | provenance | | +| test.rs:195:14:195:18 | lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:36 | | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | test.rs:195:14:195:36 | await ... [Ok, Some] | provenance | | | test.rs:195:14:195:36 | await ... [Ok, Some] | test.rs:195:14:195:37 | TryExpr [Some] | provenance | | | test.rs:195:14:195:37 | TryExpr [Some] | test.rs:195:14:195:46 | ... .unwrap() | provenance | MaD:28 | | test.rs:196:19:196:28 | Some(...) [Some] | test.rs:196:24:196:27 | line | provenance | | | test.rs:196:24:196:27 | line | test.rs:197:18:197:21 | line | provenance | | +| test.rs:196:32:196:36 | lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:36 | | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | test.rs:196:32:196:54 | await ... [Ok, Some] | provenance | | | test.rs:196:32:196:54 | await ... [Ok, Some] | test.rs:196:32:196:55 | TryExpr [Some] | provenance | | | test.rs:196:32:196:55 | TryExpr [Some] | test.rs:196:19:196:28 | Some(...) [Some] | provenance | | nodes | test.rs:13:22:13:35 | ...::stdin | semmle.label | ...::stdin | | test.rs:13:22:13:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | -| test.rs:13:44:13:54 | [post] &mut buffer | semmle.label | [post] &mut buffer | | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:13:49:13:54 | [post] buffer | semmle.label | [post] buffer | | test.rs:14:14:14:20 | &buffer | semmle.label | &buffer | @@ -248,7 +267,6 @@ nodes | test.rs:20:15:20:20 | buffer | semmle.label | buffer | | test.rs:25:22:25:35 | ...::stdin | semmle.label | ...::stdin | | test.rs:25:22:25:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | -| test.rs:25:54:25:64 | [post] &mut buffer | semmle.label | [post] &mut buffer | | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:25:59:25:64 | [post] buffer | semmle.label | [post] buffer | | test.rs:26:14:26:20 | &buffer | semmle.label | &buffer | @@ -262,7 +280,6 @@ nodes | test.rs:32:15:32:20 | buffer | semmle.label | buffer | | test.rs:37:9:37:22 | ...::stdin | semmle.label | ...::stdin | | test.rs:37:9:37:24 | ...::stdin(...) | semmle.label | ...::stdin(...) | -| test.rs:37:37:37:47 | [post] &mut buffer | semmle.label | [post] &mut buffer | | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:37:42:37:47 | [post] buffer | semmle.label | [post] buffer | | test.rs:38:14:38:20 | &buffer | semmle.label | &buffer | @@ -276,6 +293,7 @@ nodes | test.rs:48:50:48:63 | ...::stdin | semmle.label | ...::stdin | | test.rs:48:50:48:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:49:13:49:16 | data | semmle.label | data | +| test.rs:49:20:49:25 | reader | semmle.label | reader | | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | semmle.label | reader.fill_buf() [Ok] | | test.rs:49:20:49:37 | TryExpr | semmle.label | TryExpr | | test.rs:50:14:50:18 | &data | semmle.label | &data | @@ -284,14 +302,16 @@ nodes | test.rs:54:22:54:62 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:54:46:54:59 | ...::stdin | semmle.label | ...::stdin | | test.rs:54:46:54:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | -| test.rs:55:13:55:16 | data | semmle.label | data | -| test.rs:55:20:55:34 | reader.buffer() | semmle.label | reader.buffer() | +| test.rs:55:13:55:16 | data [&ref] | semmle.label | data [&ref] | +| test.rs:55:20:55:25 | reader | semmle.label | reader | +| test.rs:55:20:55:34 | reader.buffer() [&ref] | semmle.label | reader.buffer() [&ref] | | test.rs:56:14:56:18 | &data | semmle.label | &data | -| test.rs:56:15:56:18 | data | semmle.label | data | +| test.rs:56:15:56:18 | data [&ref] | semmle.label | data [&ref] | | test.rs:61:13:61:22 | mut reader | semmle.label | mut reader | | test.rs:61:26:61:66 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:61:50:61:63 | ...::stdin | semmle.label | ...::stdin | | test.rs:61:50:61:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:62:9:62:14 | reader | semmle.label | reader | | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:62:31:62:36 | [post] buffer | semmle.label | [post] buffer | | test.rs:63:14:63:20 | &buffer | semmle.label | &buffer | @@ -300,32 +320,39 @@ nodes | test.rs:68:26:68:66 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:68:50:68:63 | ...::stdin | semmle.label | ...::stdin | | test.rs:68:50:68:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:69:9:69:14 | reader | semmle.label | reader | | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:69:38:69:43 | [post] buffer | semmle.label | [post] buffer | | test.rs:70:14:70:20 | &buffer | semmle.label | &buffer | | test.rs:70:15:70:20 | buffer | semmle.label | buffer | +| test.rs:71:14:71:19 | buffer | semmle.label | buffer | | test.rs:71:14:71:22 | buffer[0] | semmle.label | buffer[0] | | test.rs:75:13:75:28 | mut reader_split | semmle.label | mut reader_split | | test.rs:75:32:75:72 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:75:32:75:84 | ... .split(...) | semmle.label | ... .split(...) | | test.rs:75:56:75:69 | ...::stdin | semmle.label | ...::stdin | | test.rs:75:56:75:71 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:76:14:76:25 | reader_split | semmle.label | reader_split | | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | semmle.label | reader_split.next() [Some, Ok] | | test.rs:76:14:76:41 | ... .unwrap() [Ok] | semmle.label | ... .unwrap() [Ok] | | test.rs:76:14:76:50 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:77:19:77:29 | Some(...) [Some, Ok] | semmle.label | Some(...) [Some, Ok] | | test.rs:77:24:77:28 | chunk [Ok] | semmle.label | chunk [Ok] | +| test.rs:77:33:77:44 | reader_split | semmle.label | reader_split | | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | semmle.label | reader_split.next() [Some, Ok] | +| test.rs:78:18:78:22 | chunk [Ok] | semmle.label | chunk [Ok] | | test.rs:78:18:78:31 | chunk.unwrap() | semmle.label | chunk.unwrap() | | test.rs:83:13:83:18 | reader | semmle.label | reader | | test.rs:83:22:83:62 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:83:46:83:59 | ...::stdin | semmle.label | ...::stdin | | test.rs:83:46:83:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:84:21:84:26 | reader | semmle.label | reader | | test.rs:84:21:84:34 | reader.lines() | semmle.label | reader.lines() | | test.rs:85:18:85:21 | line | semmle.label | line | | test.rs:109:13:109:21 | mut stdin | semmle.label | mut stdin | | test.rs:109:25:109:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:109:25:109:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:111:22:111:26 | stdin | semmle.label | stdin | | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:111:38:111:43 | [post] buffer | semmle.label | [post] buffer | | test.rs:112:14:112:20 | &buffer | semmle.label | &buffer | @@ -333,6 +360,7 @@ nodes | test.rs:116:13:116:21 | mut stdin | semmle.label | mut stdin | | test.rs:116:25:116:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:116:25:116:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:118:22:118:26 | stdin | semmle.label | stdin | | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:118:45:118:50 | [post] buffer | semmle.label | [post] buffer | | test.rs:119:14:119:20 | &buffer | semmle.label | &buffer | @@ -340,6 +368,7 @@ nodes | test.rs:123:13:123:21 | mut stdin | semmle.label | mut stdin | | test.rs:123:25:123:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:123:25:123:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:125:22:125:26 | stdin | semmle.label | stdin | | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:125:48:125:53 | [post] buffer | semmle.label | [post] buffer | | test.rs:126:14:126:20 | &buffer | semmle.label | &buffer | @@ -347,6 +376,7 @@ nodes | test.rs:130:13:130:21 | mut stdin | semmle.label | mut stdin | | test.rs:130:25:130:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:130:25:130:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:132:9:132:13 | stdin | semmle.label | stdin | | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:132:31:132:36 | [post] buffer | semmle.label | [post] buffer | | test.rs:133:14:133:20 | &buffer | semmle.label | &buffer | @@ -355,18 +385,22 @@ nodes | test.rs:137:25:137:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:137:25:137:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:138:13:138:14 | v1 | semmle.label | v1 | +| test.rs:138:18:138:22 | stdin | semmle.label | stdin | | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | semmle.label | stdin.read_u8() [future, Ok] | | test.rs:138:18:138:38 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:138:18:138:39 | TryExpr | semmle.label | TryExpr | | test.rs:139:13:139:14 | v2 | semmle.label | v2 | +| test.rs:139:18:139:22 | stdin | semmle.label | stdin | | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | semmle.label | stdin.read_i16() [future, Ok] | | test.rs:139:18:139:39 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:139:18:139:40 | TryExpr | semmle.label | TryExpr | | test.rs:140:13:140:14 | v3 | semmle.label | v3 | +| test.rs:140:18:140:22 | stdin | semmle.label | stdin | | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | semmle.label | stdin.read_f32() [future, Ok] | | test.rs:140:18:140:39 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:140:18:140:40 | TryExpr | semmle.label | TryExpr | | test.rs:141:13:141:14 | v4 | semmle.label | v4 | +| test.rs:141:18:141:22 | stdin | semmle.label | stdin | | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | semmle.label | stdin.read_i64_le() [future, Ok] | | test.rs:141:18:141:42 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:141:18:141:43 | TryExpr | semmle.label | TryExpr | @@ -377,6 +411,7 @@ nodes | test.rs:149:13:149:21 | mut stdin | semmle.label | mut stdin | | test.rs:149:25:149:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:149:25:149:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:151:9:151:13 | stdin | semmle.label | stdin | | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:151:29:151:34 | [post] buffer | semmle.label | [post] buffer | | test.rs:152:14:152:20 | &buffer | semmle.label | &buffer | @@ -386,6 +421,7 @@ nodes | test.rs:158:52:158:67 | ...::stdin | semmle.label | ...::stdin | | test.rs:158:52:158:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:159:13:159:16 | data | semmle.label | data | +| test.rs:159:20:159:25 | reader | semmle.label | reader | | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | semmle.label | reader.fill_buf() [future, Ok] | | test.rs:159:20:159:42 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:159:20:159:43 | TryExpr | semmle.label | TryExpr | @@ -395,14 +431,16 @@ nodes | test.rs:164:22:164:66 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:164:48:164:63 | ...::stdin | semmle.label | ...::stdin | | test.rs:164:48:164:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | -| test.rs:165:13:165:16 | data | semmle.label | data | -| test.rs:165:20:165:34 | reader.buffer() | semmle.label | reader.buffer() | +| test.rs:165:13:165:16 | data [&ref] | semmle.label | data [&ref] | +| test.rs:165:20:165:25 | reader | semmle.label | reader | +| test.rs:165:20:165:34 | reader.buffer() [&ref] | semmle.label | reader.buffer() [&ref] | | test.rs:166:14:166:18 | &data | semmle.label | &data | -| test.rs:166:15:166:18 | data | semmle.label | data | +| test.rs:166:15:166:18 | data [&ref] | semmle.label | data [&ref] | | test.rs:171:13:171:22 | mut reader | semmle.label | mut reader | | test.rs:171:26:171:70 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:171:52:171:67 | ...::stdin | semmle.label | ...::stdin | | test.rs:171:52:171:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:172:9:172:14 | reader | semmle.label | reader | | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:172:31:172:36 | [post] buffer | semmle.label | [post] buffer | | test.rs:173:14:173:20 | &buffer | semmle.label | &buffer | @@ -411,22 +449,26 @@ nodes | test.rs:178:26:178:70 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:178:52:178:67 | ...::stdin | semmle.label | ...::stdin | | test.rs:178:52:178:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:179:9:179:14 | reader | semmle.label | reader | | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:179:38:179:43 | [post] buffer | semmle.label | [post] buffer | | test.rs:180:14:180:20 | &buffer | semmle.label | &buffer | | test.rs:180:15:180:20 | buffer | semmle.label | buffer | +| test.rs:181:14:181:19 | buffer | semmle.label | buffer | | test.rs:181:14:181:22 | buffer[0] | semmle.label | buffer[0] | | test.rs:185:13:185:28 | mut reader_split | semmle.label | mut reader_split | | test.rs:185:32:185:76 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:185:32:185:88 | ... .split(...) | semmle.label | ... .split(...) | | test.rs:185:58:185:73 | ...::stdin | semmle.label | ...::stdin | | test.rs:185:58:185:75 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:186:14:186:25 | reader_split | semmle.label | reader_split | | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | semmle.label | reader_split.next_segment() [future, Ok, Some] | | test.rs:186:14:186:46 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | | test.rs:186:14:186:47 | TryExpr [Some] | semmle.label | TryExpr [Some] | | test.rs:186:14:186:56 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:187:19:187:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | test.rs:187:24:187:28 | chunk | semmle.label | chunk | +| test.rs:187:33:187:44 | reader_split | semmle.label | reader_split | | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | semmle.label | reader_split.next_segment() [future, Ok, Some] | | test.rs:187:33:187:65 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | | test.rs:187:33:187:66 | TryExpr [Some] | semmle.label | TryExpr [Some] | @@ -436,13 +478,16 @@ nodes | test.rs:193:48:193:63 | ...::stdin | semmle.label | ...::stdin | | test.rs:193:48:193:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:194:13:194:21 | mut lines | semmle.label | mut lines | +| test.rs:194:25:194:30 | reader | semmle.label | reader | | test.rs:194:25:194:38 | reader.lines() | semmle.label | reader.lines() | +| test.rs:195:14:195:18 | lines | semmle.label | lines | | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | semmle.label | lines.next_line() [future, Ok, Some] | | test.rs:195:14:195:36 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | | test.rs:195:14:195:37 | TryExpr [Some] | semmle.label | TryExpr [Some] | | test.rs:195:14:195:46 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:196:19:196:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | | test.rs:196:24:196:27 | line | semmle.label | line | +| test.rs:196:32:196:36 | lines | semmle.label | lines | | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | semmle.label | lines.next_line() [future, Ok, Some] | | test.rs:196:32:196:54 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | | test.rs:196:32:196:55 | TryExpr [Some] | semmle.label | TryExpr [Some] | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected index 08edbe8c612..f1bdb2cddbd 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected @@ -1,4 +1,4 @@ nonUniqueCertainType -| test.rs:139:30:139:39 | ...::get(...) | | -| test.rs:140:34:140:43 | ...::get(...) | | -| test.rs:141:30:141:39 | ...::get(...) | | +| test.rs:131:30:131:39 | ...::get(...) | | +| test.rs:132:34:132:43 | ...::get(...) | | +| test.rs:133:30:133:39 | ...::get(...) | | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index 24a0cf78aec..4c85f166699 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -4,88 +4,75 @@ models | 3 | Source: <_ as warp::filter::Filter>::then; Argument[0].Parameter[0..7]; remote | | 4 | Source: ::to; Argument[0].Parameter[0..7]; remote | | 5 | Source: ::to; Argument[0].Parameter[0..7]; remote | -| 6 | Summary: ::into_inner; Argument[self]; ReturnValue.Field[0]; taint | -| 7 | Summary: ::into_inner; Argument[self]; ReturnValue.Field[1]; taint | -| 8 | Summary: ::into_inner; Argument[self]; ReturnValue.Field[2]; taint | -| 9 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | -| 10 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 11 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 6 | Source: ::get; Argument[0].Parameter[0..7]; remote | +| 7 | Source: ::on; Argument[1].Parameter[0..7]; remote | +| 8 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | +| 9 | Source: axum::routing::method_routing::post; Argument[0].Parameter[0..7]; remote | +| 10 | Source: axum::routing::method_routing::put; Argument[0].Parameter[0..7]; remote | +| 11 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | +| 12 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 13 | Summary: ::as_str; Argument[self]; ReturnValue; value | edges | test.rs:11:31:11:31 | a | test.rs:13:14:13:14 | a | provenance | | -| test.rs:11:31:11:31 | a | test.rs:13:14:13:23 | a.as_str() | provenance | MaD:11 | | test.rs:11:31:11:31 | a | test.rs:14:14:14:14 | a | provenance | | -| test.rs:11:31:11:31 | a | test.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:10 | | test.rs:11:31:11:31 | a | test.rs:15:14:15:14 | a | provenance | | -| test.rs:13:14:13:14 | a | test.rs:13:14:13:23 | a.as_str() | provenance | MaD:11 | -| test.rs:14:14:14:14 | a | test.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:10 | +| test.rs:13:14:13:14 | a | test.rs:13:14:13:23 | a.as_str() | provenance | MaD:13 | +| test.rs:14:14:14:14 | a | test.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:12 | +| test.rs:22:14:22:19 | TuplePat | test.rs:24:14:24:14 | a | provenance | | +| test.rs:22:14:22:19 | TuplePat | test.rs:25:14:25:14 | b | provenance | | +| test.rs:48:14:48:30 | MyStruct {...} | test.rs:50:14:50:14 | a | provenance | | +| test.rs:48:14:48:30 | MyStruct {...} | test.rs:51:14:51:14 | b | provenance | | +| test.rs:58:14:58:15 | ms | test.rs:60:14:60:17 | ms.a | provenance | | +| test.rs:58:14:58:15 | ms | test.rs:61:14:61:17 | ms.b | provenance | | | test.rs:68:15:68:15 | a | test.rs:70:14:70:14 | a | provenance | | -| test.rs:98:9:98:31 | ...: ...::Path::<...> | test.rs:100:17:100:33 | path.into_inner() | provenance | MaD:9 | -| test.rs:98:9:98:31 | ...: ...::Path::<...> | test.rs:100:17:100:33 | path.into_inner() [tuple.0] | provenance | MaD:6 | -| test.rs:98:9:98:31 | ...: ...::Path::<...> | test.rs:100:17:100:33 | path.into_inner() [tuple.1] | provenance | MaD:7 | -| test.rs:98:9:98:31 | ...: ...::Path::<...> | test.rs:100:17:100:33 | path.into_inner() [tuple.2] | provenance | MaD:8 | -| test.rs:100:13:100:13 | a | test.rs:101:14:101:14 | a | provenance | | -| test.rs:100:13:100:13 | a | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:100:13:100:13 | a | test.rs:102:14:102:14 | a | provenance | | -| test.rs:100:13:100:13 | a | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:100:13:100:13 | a | test.rs:103:14:103:14 | a | provenance | | -| test.rs:100:13:100:13 | a [tuple.0] | test.rs:101:14:101:14 | a [tuple.0] | provenance | | -| test.rs:100:13:100:13 | a [tuple.0] | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:100:13:100:13 | a [tuple.0] | test.rs:102:14:102:14 | a [tuple.0] | provenance | | -| test.rs:100:13:100:13 | a [tuple.0] | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:100:13:100:13 | a [tuple.0] | test.rs:103:14:103:14 | a | provenance | | -| test.rs:100:13:100:13 | a [tuple.1] | test.rs:101:14:101:14 | a [tuple.1] | provenance | | -| test.rs:100:13:100:13 | a [tuple.1] | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:100:13:100:13 | a [tuple.1] | test.rs:102:14:102:14 | a [tuple.1] | provenance | | -| test.rs:100:13:100:13 | a [tuple.1] | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:100:13:100:13 | a [tuple.1] | test.rs:103:14:103:14 | a | provenance | | -| test.rs:100:13:100:13 | a [tuple.2] | test.rs:101:14:101:14 | a [tuple.2] | provenance | | -| test.rs:100:13:100:13 | a [tuple.2] | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:100:13:100:13 | a [tuple.2] | test.rs:102:14:102:14 | a [tuple.2] | provenance | | -| test.rs:100:13:100:13 | a [tuple.2] | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:100:13:100:13 | a [tuple.2] | test.rs:103:14:103:14 | a | provenance | | -| test.rs:100:17:100:33 | path.into_inner() | test.rs:100:13:100:13 | a | provenance | | -| test.rs:100:17:100:33 | path.into_inner() [tuple.0] | test.rs:100:13:100:13 | a [tuple.0] | provenance | | -| test.rs:100:17:100:33 | path.into_inner() [tuple.1] | test.rs:100:13:100:13 | a [tuple.1] | provenance | | -| test.rs:100:17:100:33 | path.into_inner() [tuple.2] | test.rs:100:13:100:13 | a [tuple.2] | provenance | | -| test.rs:101:14:101:14 | a | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:101:14:101:14 | a [tuple.0] | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:101:14:101:14 | a [tuple.1] | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:101:14:101:14 | a [tuple.2] | test.rs:101:14:101:23 | a.as_str() | provenance | MaD:11 | -| test.rs:102:14:102:14 | a | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:102:14:102:14 | a [tuple.0] | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:102:14:102:14 | a [tuple.1] | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:102:14:102:14 | a [tuple.2] | test.rs:102:14:102:25 | a.as_bytes() | provenance | MaD:10 | -| test.rs:109:9:109:41 | ...: ...::Path::<...> | test.rs:111:22:111:38 | path.into_inner() [tuple.0] | provenance | MaD:6 | -| test.rs:109:9:109:41 | ...: ...::Path::<...> | test.rs:111:22:111:38 | path.into_inner() [tuple.1] | provenance | MaD:7 | -| test.rs:111:13:111:18 | TuplePat [tuple.0] | test.rs:111:14:111:14 | a | provenance | | -| test.rs:111:13:111:18 | TuplePat [tuple.1] | test.rs:111:17:111:17 | b | provenance | | -| test.rs:111:14:111:14 | a | test.rs:113:14:113:14 | a | provenance | | -| test.rs:111:17:111:17 | b | test.rs:114:14:114:14 | b | provenance | | -| test.rs:111:22:111:38 | path.into_inner() [tuple.0] | test.rs:111:13:111:18 | TuplePat [tuple.0] | provenance | | -| test.rs:111:22:111:38 | path.into_inner() [tuple.1] | test.rs:111:13:111:18 | TuplePat [tuple.1] | provenance | | -| test.rs:127:5:127:20 | to | test.rs:129:9:129:31 | ...: ...::Path::<...> | provenance | Src:MaD:4 | -| test.rs:129:9:129:31 | ...: ...::Path::<...> | test.rs:131:17:131:33 | path.into_inner() | provenance | MaD:9 | -| test.rs:129:9:129:31 | ...: ...::Path::<...> | test.rs:131:17:131:33 | path.into_inner() [tuple.0] | provenance | MaD:6 | -| test.rs:129:9:129:31 | ...: ...::Path::<...> | test.rs:131:17:131:33 | path.into_inner() [tuple.1] | provenance | MaD:7 | -| test.rs:129:9:129:31 | ...: ...::Path::<...> | test.rs:131:17:131:33 | path.into_inner() [tuple.2] | provenance | MaD:8 | -| test.rs:131:13:131:13 | a | test.rs:132:14:132:14 | a | provenance | | -| test.rs:131:13:131:13 | a [tuple.0] | test.rs:132:14:132:14 | a | provenance | | -| test.rs:131:13:131:13 | a [tuple.1] | test.rs:132:14:132:14 | a | provenance | | -| test.rs:131:13:131:13 | a [tuple.2] | test.rs:132:14:132:14 | a | provenance | | -| test.rs:131:17:131:33 | path.into_inner() | test.rs:131:13:131:13 | a | provenance | | -| test.rs:131:17:131:33 | path.into_inner() [tuple.0] | test.rs:131:13:131:13 | a [tuple.0] | provenance | | -| test.rs:131:17:131:33 | path.into_inner() [tuple.1] | test.rs:131:13:131:13 | a [tuple.1] | provenance | | -| test.rs:131:17:131:33 | path.into_inner() [tuple.2] | test.rs:131:13:131:13 | a [tuple.2] | provenance | | -| test.rs:139:41:139:42 | to | test.rs:98:9:98:31 | ...: ...::Path::<...> | provenance | Src:MaD:5 | -| test.rs:140:45:140:46 | to | test.rs:109:9:109:41 | ...: ...::Path::<...> | provenance | Src:MaD:5 | -| test.rs:242:33:242:35 | map | test.rs:242:38:242:46 | ...: String | provenance | Src:MaD:2 | -| test.rs:242:38:242:46 | ...: String | test.rs:244:18:244:18 | a | provenance | | -| test.rs:250:46:250:49 | then | test.rs:251:25:251:33 | ...: String | provenance | Src:MaD:3 | -| test.rs:251:25:251:33 | ...: String | test.rs:252:22:252:22 | a | provenance | | -| test.rs:259:50:259:57 | and_then | test.rs:260:26:260:32 | ...: u64 | provenance | Src:MaD:1 | -| test.rs:260:26:260:32 | ...: u64 | test.rs:263:22:263:23 | id | provenance | | -| test.rs:272:75:272:77 | map | test.rs:273:15:273:23 | ...: String | provenance | Src:MaD:2 | -| test.rs:273:15:273:23 | ...: String | test.rs:275:22:275:22 | a | provenance | | +| test.rs:97:33:97:55 | ...: ...::Path::<...> | test.rs:98:17:98:20 | path | provenance | | +| test.rs:98:13:98:13 | a | test.rs:99:14:99:14 | a | provenance | | +| test.rs:98:13:98:13 | a | test.rs:100:14:100:14 | a | provenance | | +| test.rs:98:13:98:13 | a | test.rs:101:14:101:14 | a | provenance | | +| test.rs:98:17:98:20 | path | test.rs:98:17:98:33 | path.into_inner() | provenance | MaD:11 | +| test.rs:98:17:98:33 | path.into_inner() | test.rs:98:13:98:13 | a | provenance | | +| test.rs:99:14:99:14 | a | test.rs:99:14:99:23 | a.as_str() | provenance | MaD:13 | +| test.rs:100:14:100:14 | a | test.rs:100:14:100:25 | a.as_bytes() | provenance | MaD:12 | +| test.rs:106:33:106:65 | ...: ...::Path::<...> | test.rs:107:22:107:25 | path | provenance | | +| test.rs:107:13:107:18 | TuplePat | test.rs:109:14:109:14 | a | provenance | | +| test.rs:107:13:107:18 | TuplePat | test.rs:110:14:110:14 | b | provenance | | +| test.rs:107:22:107:25 | path | test.rs:107:22:107:38 | path.into_inner() | provenance | MaD:11 | +| test.rs:107:22:107:38 | path.into_inner() | test.rs:107:13:107:18 | TuplePat | provenance | | +| test.rs:115:33:115:65 | ...: ...::Query::<...> | test.rs:116:14:116:14 | a | provenance | | +| test.rs:121:5:121:20 | to | test.rs:122:33:122:55 | ...: ...::Path::<...> | provenance | Src:MaD:4 | +| test.rs:122:33:122:55 | ...: ...::Path::<...> | test.rs:123:17:123:20 | path | provenance | | +| test.rs:123:13:123:13 | a | test.rs:124:14:124:14 | a | provenance | | +| test.rs:123:17:123:20 | path | test.rs:123:17:123:33 | path.into_inner() | provenance | MaD:11 | +| test.rs:123:17:123:33 | path.into_inner() | test.rs:123:13:123:13 | a | provenance | | +| test.rs:131:41:131:42 | to | test.rs:97:33:97:55 | ...: ...::Path::<...> | provenance | Src:MaD:5 | +| test.rs:132:45:132:46 | to | test.rs:106:33:106:65 | ...: ...::Path::<...> | provenance | Src:MaD:5 | +| test.rs:133:41:133:42 | to | test.rs:115:33:115:65 | ...: ...::Query::<...> | provenance | Src:MaD:5 | +| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:148:14:148:14 | a | provenance | | +| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:149:14:149:14 | a | provenance | | +| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:150:14:150:14 | a | provenance | | +| test.rs:148:14:148:14 | a | test.rs:148:14:148:23 | a.as_str() | provenance | MaD:13 | +| test.rs:149:14:149:14 | a | test.rs:149:14:149:25 | a.as_bytes() | provenance | MaD:12 | +| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:156:14:156:14 | a | provenance | | +| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:157:14:157:14 | b | provenance | | +| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:164:18:164:20 | key | provenance | | +| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:165:18:165:22 | value | provenance | | +| test.rs:179:32:179:69 | ...: Json::<...> | test.rs:181:14:181:20 | payload | provenance | | +| test.rs:186:32:186:43 | ...: String | test.rs:187:14:187:17 | body | provenance | | +| test.rs:192:32:192:43 | ...: String | test.rs:193:14:193:17 | body | provenance | | +| test.rs:200:30:200:32 | get | test.rs:147:32:147:52 | ...: Path::<...> | provenance | Src:MaD:8 | +| test.rs:201:34:201:37 | post | test.rs:155:32:155:67 | ...: Path::<...> | provenance | Src:MaD:9 | +| test.rs:202:29:202:31 | put | test.rs:162:32:162:76 | ...: Query::<...> | provenance | Src:MaD:10 | +| test.rs:205:40:205:41 | on | test.rs:179:32:179:69 | ...: Json::<...> | provenance | Src:MaD:7 | +| test.rs:207:29:207:31 | get | test.rs:186:32:186:43 | ...: String | provenance | Src:MaD:8 | +| test.rs:207:52:207:54 | get | test.rs:192:32:192:43 | ...: String | provenance | Src:MaD:6 | +| test.rs:222:33:222:35 | map | test.rs:222:38:222:46 | ...: String | provenance | Src:MaD:2 | +| test.rs:222:38:222:46 | ...: String | test.rs:224:18:224:18 | a | provenance | | +| test.rs:230:46:230:49 | then | test.rs:231:25:231:33 | ...: String | provenance | Src:MaD:3 | +| test.rs:231:25:231:33 | ...: String | test.rs:232:22:232:22 | a | provenance | | +| test.rs:239:50:239:57 | and_then | test.rs:240:26:240:32 | ...: u64 | provenance | Src:MaD:1 | +| test.rs:240:26:240:32 | ...: u64 | test.rs:243:22:243:23 | id | provenance | | +| test.rs:252:75:252:77 | map | test.rs:253:15:253:23 | ...: String | provenance | Src:MaD:2 | +| test.rs:253:15:253:23 | ...: String | test.rs:255:22:255:22 | a | provenance | | nodes | test.rs:11:31:11:31 | a | semmle.label | a | | test.rs:13:14:13:14 | a | semmle.label | a | @@ -93,76 +80,110 @@ nodes | test.rs:14:14:14:14 | a | semmle.label | a | | test.rs:14:14:14:25 | a.as_bytes() | semmle.label | a.as_bytes() | | test.rs:15:14:15:14 | a | semmle.label | a | +| test.rs:22:14:22:19 | TuplePat | semmle.label | TuplePat | +| test.rs:24:14:24:14 | a | semmle.label | a | +| test.rs:25:14:25:14 | b | semmle.label | b | +| test.rs:48:14:48:30 | MyStruct {...} | semmle.label | MyStruct {...} | +| test.rs:50:14:50:14 | a | semmle.label | a | +| test.rs:51:14:51:14 | b | semmle.label | b | +| test.rs:58:14:58:15 | ms | semmle.label | ms | +| test.rs:60:14:60:17 | ms.a | semmle.label | ms.a | +| test.rs:61:14:61:17 | ms.b | semmle.label | ms.b | | test.rs:68:15:68:15 | a | semmle.label | a | | test.rs:70:14:70:14 | a | semmle.label | a | -| test.rs:98:9:98:31 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | -| test.rs:100:13:100:13 | a | semmle.label | a | -| test.rs:100:13:100:13 | a [tuple.0] | semmle.label | a [tuple.0] | -| test.rs:100:13:100:13 | a [tuple.1] | semmle.label | a [tuple.1] | -| test.rs:100:13:100:13 | a [tuple.2] | semmle.label | a [tuple.2] | -| test.rs:100:17:100:33 | path.into_inner() | semmle.label | path.into_inner() | -| test.rs:100:17:100:33 | path.into_inner() [tuple.0] | semmle.label | path.into_inner() [tuple.0] | -| test.rs:100:17:100:33 | path.into_inner() [tuple.1] | semmle.label | path.into_inner() [tuple.1] | -| test.rs:100:17:100:33 | path.into_inner() [tuple.2] | semmle.label | path.into_inner() [tuple.2] | +| test.rs:97:33:97:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| test.rs:98:13:98:13 | a | semmle.label | a | +| test.rs:98:17:98:20 | path | semmle.label | path | +| test.rs:98:17:98:33 | path.into_inner() | semmle.label | path.into_inner() | +| test.rs:99:14:99:14 | a | semmle.label | a | +| test.rs:99:14:99:23 | a.as_str() | semmle.label | a.as_str() | +| test.rs:100:14:100:14 | a | semmle.label | a | +| test.rs:100:14:100:25 | a.as_bytes() | semmle.label | a.as_bytes() | | test.rs:101:14:101:14 | a | semmle.label | a | -| test.rs:101:14:101:14 | a [tuple.0] | semmle.label | a [tuple.0] | -| test.rs:101:14:101:14 | a [tuple.1] | semmle.label | a [tuple.1] | -| test.rs:101:14:101:14 | a [tuple.2] | semmle.label | a [tuple.2] | -| test.rs:101:14:101:23 | a.as_str() | semmle.label | a.as_str() | -| test.rs:102:14:102:14 | a | semmle.label | a | -| test.rs:102:14:102:14 | a [tuple.0] | semmle.label | a [tuple.0] | -| test.rs:102:14:102:14 | a [tuple.1] | semmle.label | a [tuple.1] | -| test.rs:102:14:102:14 | a [tuple.2] | semmle.label | a [tuple.2] | -| test.rs:102:14:102:25 | a.as_bytes() | semmle.label | a.as_bytes() | -| test.rs:103:14:103:14 | a | semmle.label | a | -| test.rs:109:9:109:41 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | -| test.rs:111:13:111:18 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | -| test.rs:111:13:111:18 | TuplePat [tuple.1] | semmle.label | TuplePat [tuple.1] | -| test.rs:111:14:111:14 | a | semmle.label | a | -| test.rs:111:17:111:17 | b | semmle.label | b | -| test.rs:111:22:111:38 | path.into_inner() [tuple.0] | semmle.label | path.into_inner() [tuple.0] | -| test.rs:111:22:111:38 | path.into_inner() [tuple.1] | semmle.label | path.into_inner() [tuple.1] | -| test.rs:113:14:113:14 | a | semmle.label | a | -| test.rs:114:14:114:14 | b | semmle.label | b | -| test.rs:127:5:127:20 | to | semmle.label | to | -| test.rs:129:9:129:31 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | -| test.rs:131:13:131:13 | a | semmle.label | a | -| test.rs:131:13:131:13 | a [tuple.0] | semmle.label | a [tuple.0] | -| test.rs:131:13:131:13 | a [tuple.1] | semmle.label | a [tuple.1] | -| test.rs:131:13:131:13 | a [tuple.2] | semmle.label | a [tuple.2] | -| test.rs:131:17:131:33 | path.into_inner() | semmle.label | path.into_inner() | -| test.rs:131:17:131:33 | path.into_inner() [tuple.0] | semmle.label | path.into_inner() [tuple.0] | -| test.rs:131:17:131:33 | path.into_inner() [tuple.1] | semmle.label | path.into_inner() [tuple.1] | -| test.rs:131:17:131:33 | path.into_inner() [tuple.2] | semmle.label | path.into_inner() [tuple.2] | -| test.rs:132:14:132:14 | a | semmle.label | a | -| test.rs:139:41:139:42 | to | semmle.label | to | -| test.rs:140:45:140:46 | to | semmle.label | to | -| test.rs:242:33:242:35 | map | semmle.label | map | -| test.rs:242:38:242:46 | ...: String | semmle.label | ...: String | -| test.rs:244:18:244:18 | a | semmle.label | a | -| test.rs:250:46:250:49 | then | semmle.label | then | -| test.rs:251:25:251:33 | ...: String | semmle.label | ...: String | -| test.rs:252:22:252:22 | a | semmle.label | a | -| test.rs:259:50:259:57 | and_then | semmle.label | and_then | -| test.rs:260:26:260:32 | ...: u64 | semmle.label | ...: u64 | -| test.rs:263:22:263:23 | id | semmle.label | id | -| test.rs:272:75:272:77 | map | semmle.label | map | -| test.rs:273:15:273:23 | ...: String | semmle.label | ...: String | -| test.rs:275:22:275:22 | a | semmle.label | a | +| test.rs:106:33:106:65 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| test.rs:107:13:107:18 | TuplePat | semmle.label | TuplePat | +| test.rs:107:22:107:25 | path | semmle.label | path | +| test.rs:107:22:107:38 | path.into_inner() | semmle.label | path.into_inner() | +| test.rs:109:14:109:14 | a | semmle.label | a | +| test.rs:110:14:110:14 | b | semmle.label | b | +| test.rs:115:33:115:65 | ...: ...::Query::<...> | semmle.label | ...: ...::Query::<...> | +| test.rs:116:14:116:14 | a | semmle.label | a | +| test.rs:121:5:121:20 | to | semmle.label | to | +| test.rs:122:33:122:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| test.rs:123:13:123:13 | a | semmle.label | a | +| test.rs:123:17:123:20 | path | semmle.label | path | +| test.rs:123:17:123:33 | path.into_inner() | semmle.label | path.into_inner() | +| test.rs:124:14:124:14 | a | semmle.label | a | +| test.rs:131:41:131:42 | to | semmle.label | to | +| test.rs:132:45:132:46 | to | semmle.label | to | +| test.rs:133:41:133:42 | to | semmle.label | to | +| test.rs:147:32:147:52 | ...: Path::<...> | semmle.label | ...: Path::<...> | +| test.rs:148:14:148:14 | a | semmle.label | a | +| test.rs:148:14:148:23 | a.as_str() | semmle.label | a.as_str() | +| test.rs:149:14:149:14 | a | semmle.label | a | +| test.rs:149:14:149:25 | a.as_bytes() | semmle.label | a.as_bytes() | +| test.rs:150:14:150:14 | a | semmle.label | a | +| test.rs:155:32:155:67 | ...: Path::<...> | semmle.label | ...: Path::<...> | +| test.rs:156:14:156:14 | a | semmle.label | a | +| test.rs:157:14:157:14 | b | semmle.label | b | +| test.rs:162:32:162:76 | ...: Query::<...> | semmle.label | ...: Query::<...> | +| test.rs:164:18:164:20 | key | semmle.label | key | +| test.rs:165:18:165:22 | value | semmle.label | value | +| test.rs:179:32:179:69 | ...: Json::<...> | semmle.label | ...: Json::<...> | +| test.rs:181:14:181:20 | payload | semmle.label | payload | +| test.rs:186:32:186:43 | ...: String | semmle.label | ...: String | +| test.rs:187:14:187:17 | body | semmle.label | body | +| test.rs:192:32:192:43 | ...: String | semmle.label | ...: String | +| test.rs:193:14:193:17 | body | semmle.label | body | +| test.rs:200:30:200:32 | get | semmle.label | get | +| test.rs:201:34:201:37 | post | semmle.label | post | +| test.rs:202:29:202:31 | put | semmle.label | put | +| test.rs:205:40:205:41 | on | semmle.label | on | +| test.rs:207:29:207:31 | get | semmle.label | get | +| test.rs:207:52:207:54 | get | semmle.label | get | +| test.rs:222:33:222:35 | map | semmle.label | map | +| test.rs:222:38:222:46 | ...: String | semmle.label | ...: String | +| test.rs:224:18:224:18 | a | semmle.label | a | +| test.rs:230:46:230:49 | then | semmle.label | then | +| test.rs:231:25:231:33 | ...: String | semmle.label | ...: String | +| test.rs:232:22:232:22 | a | semmle.label | a | +| test.rs:239:50:239:57 | and_then | semmle.label | and_then | +| test.rs:240:26:240:32 | ...: u64 | semmle.label | ...: u64 | +| test.rs:243:22:243:23 | id | semmle.label | id | +| test.rs:252:75:252:77 | map | semmle.label | map | +| test.rs:253:15:253:23 | ...: String | semmle.label | ...: String | +| test.rs:255:22:255:22 | a | semmle.label | a | subpaths testFailures #select | test.rs:13:14:13:23 | a.as_str() | test.rs:11:31:11:31 | a | test.rs:13:14:13:23 | a.as_str() | $@ | test.rs:11:31:11:31 | a | a | | test.rs:14:14:14:25 | a.as_bytes() | test.rs:11:31:11:31 | a | test.rs:14:14:14:25 | a.as_bytes() | $@ | test.rs:11:31:11:31 | a | a | | test.rs:15:14:15:14 | a | test.rs:11:31:11:31 | a | test.rs:15:14:15:14 | a | $@ | test.rs:11:31:11:31 | a | a | +| test.rs:24:14:24:14 | a | test.rs:22:14:22:19 | TuplePat | test.rs:24:14:24:14 | a | $@ | test.rs:22:14:22:19 | TuplePat | TuplePat | +| test.rs:25:14:25:14 | b | test.rs:22:14:22:19 | TuplePat | test.rs:25:14:25:14 | b | $@ | test.rs:22:14:22:19 | TuplePat | TuplePat | +| test.rs:50:14:50:14 | a | test.rs:48:14:48:30 | MyStruct {...} | test.rs:50:14:50:14 | a | $@ | test.rs:48:14:48:30 | MyStruct {...} | MyStruct {...} | +| test.rs:51:14:51:14 | b | test.rs:48:14:48:30 | MyStruct {...} | test.rs:51:14:51:14 | b | $@ | test.rs:48:14:48:30 | MyStruct {...} | MyStruct {...} | +| test.rs:60:14:60:17 | ms.a | test.rs:58:14:58:15 | ms | test.rs:60:14:60:17 | ms.a | $@ | test.rs:58:14:58:15 | ms | ms | +| test.rs:61:14:61:17 | ms.b | test.rs:58:14:58:15 | ms | test.rs:61:14:61:17 | ms.b | $@ | test.rs:58:14:58:15 | ms | ms | | test.rs:70:14:70:14 | a | test.rs:68:15:68:15 | a | test.rs:70:14:70:14 | a | $@ | test.rs:68:15:68:15 | a | a | -| test.rs:101:14:101:23 | a.as_str() | test.rs:139:41:139:42 | to | test.rs:101:14:101:23 | a.as_str() | $@ | test.rs:139:41:139:42 | to | to | -| test.rs:102:14:102:25 | a.as_bytes() | test.rs:139:41:139:42 | to | test.rs:102:14:102:25 | a.as_bytes() | $@ | test.rs:139:41:139:42 | to | to | -| test.rs:103:14:103:14 | a | test.rs:139:41:139:42 | to | test.rs:103:14:103:14 | a | $@ | test.rs:139:41:139:42 | to | to | -| test.rs:113:14:113:14 | a | test.rs:140:45:140:46 | to | test.rs:113:14:113:14 | a | $@ | test.rs:140:45:140:46 | to | to | -| test.rs:114:14:114:14 | b | test.rs:140:45:140:46 | to | test.rs:114:14:114:14 | b | $@ | test.rs:140:45:140:46 | to | to | -| test.rs:132:14:132:14 | a | test.rs:127:5:127:20 | to | test.rs:132:14:132:14 | a | $@ | test.rs:127:5:127:20 | to | to | -| test.rs:244:18:244:18 | a | test.rs:242:33:242:35 | map | test.rs:244:18:244:18 | a | $@ | test.rs:242:33:242:35 | map | map | -| test.rs:252:22:252:22 | a | test.rs:250:46:250:49 | then | test.rs:252:22:252:22 | a | $@ | test.rs:250:46:250:49 | then | then | -| test.rs:263:22:263:23 | id | test.rs:259:50:259:57 | and_then | test.rs:263:22:263:23 | id | $@ | test.rs:259:50:259:57 | and_then | and_then | -| test.rs:275:22:275:22 | a | test.rs:272:75:272:77 | map | test.rs:275:22:275:22 | a | $@ | test.rs:272:75:272:77 | map | map | +| test.rs:99:14:99:23 | a.as_str() | test.rs:131:41:131:42 | to | test.rs:99:14:99:23 | a.as_str() | $@ | test.rs:131:41:131:42 | to | to | +| test.rs:100:14:100:25 | a.as_bytes() | test.rs:131:41:131:42 | to | test.rs:100:14:100:25 | a.as_bytes() | $@ | test.rs:131:41:131:42 | to | to | +| test.rs:101:14:101:14 | a | test.rs:131:41:131:42 | to | test.rs:101:14:101:14 | a | $@ | test.rs:131:41:131:42 | to | to | +| test.rs:109:14:109:14 | a | test.rs:132:45:132:46 | to | test.rs:109:14:109:14 | a | $@ | test.rs:132:45:132:46 | to | to | +| test.rs:110:14:110:14 | b | test.rs:132:45:132:46 | to | test.rs:110:14:110:14 | b | $@ | test.rs:132:45:132:46 | to | to | +| test.rs:116:14:116:14 | a | test.rs:133:41:133:42 | to | test.rs:116:14:116:14 | a | $@ | test.rs:133:41:133:42 | to | to | +| test.rs:124:14:124:14 | a | test.rs:121:5:121:20 | to | test.rs:124:14:124:14 | a | $@ | test.rs:121:5:121:20 | to | to | +| test.rs:148:14:148:23 | a.as_str() | test.rs:200:30:200:32 | get | test.rs:148:14:148:23 | a.as_str() | $@ | test.rs:200:30:200:32 | get | get | +| test.rs:149:14:149:25 | a.as_bytes() | test.rs:200:30:200:32 | get | test.rs:149:14:149:25 | a.as_bytes() | $@ | test.rs:200:30:200:32 | get | get | +| test.rs:150:14:150:14 | a | test.rs:200:30:200:32 | get | test.rs:150:14:150:14 | a | $@ | test.rs:200:30:200:32 | get | get | +| test.rs:156:14:156:14 | a | test.rs:201:34:201:37 | post | test.rs:156:14:156:14 | a | $@ | test.rs:201:34:201:37 | post | post | +| test.rs:157:14:157:14 | b | test.rs:201:34:201:37 | post | test.rs:157:14:157:14 | b | $@ | test.rs:201:34:201:37 | post | post | +| test.rs:164:18:164:20 | key | test.rs:202:29:202:31 | put | test.rs:164:18:164:20 | key | $@ | test.rs:202:29:202:31 | put | put | +| test.rs:165:18:165:22 | value | test.rs:202:29:202:31 | put | test.rs:165:18:165:22 | value | $@ | test.rs:202:29:202:31 | put | put | +| test.rs:181:14:181:20 | payload | test.rs:205:40:205:41 | on | test.rs:181:14:181:20 | payload | $@ | test.rs:205:40:205:41 | on | on | +| test.rs:187:14:187:17 | body | test.rs:207:29:207:31 | get | test.rs:187:14:187:17 | body | $@ | test.rs:207:29:207:31 | get | get | +| test.rs:193:14:193:17 | body | test.rs:207:52:207:54 | get | test.rs:193:14:193:17 | body | $@ | test.rs:207:52:207:54 | get | get | +| test.rs:224:18:224:18 | a | test.rs:222:33:222:35 | map | test.rs:224:18:224:18 | a | $@ | test.rs:222:33:222:35 | map | map | +| test.rs:232:22:232:22 | a | test.rs:230:46:230:49 | then | test.rs:232:22:232:22 | a | $@ | test.rs:230:46:230:49 | then | then | +| test.rs:243:22:243:23 | id | test.rs:239:50:239:57 | and_then | test.rs:243:22:243:23 | id | $@ | test.rs:239:50:239:57 | and_then | and_then | +| test.rs:255:22:255:22 | a | test.rs:252:75:252:77 | map | test.rs:255:22:255:22 | a | $@ | test.rs:252:75:252:77 | map | map | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected index 20a20ce3f9b..146406e7192 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected @@ -3,67 +3,123 @@ | test.rs:48:14:48:30 | MyStruct {...} | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:58:14:58:15 | ms | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:68:15:68:15 | a | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:127:5:127:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:139:41:139:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:140:45:140:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:141:41:141:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:242:33:242:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:250:46:250:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:259:50:259:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:272:75:272:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs index 3bcea0dee4e..c6c487fed28 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs @@ -21,8 +21,8 @@ mod poem_test { fn my_poem_handler_2( Path((a, b)): Path<(String, String)>, // $ Alert[rust/summary/taint-sources] ) -> String { - sink(a); // $ MISSING: hasTaintFlow - sink(b); // $ MISSING: hasTaintFlow + sink(a); // $ hasTaintFlow + sink(b); // $ hasTaintFlow "".to_string() } @@ -47,8 +47,8 @@ mod poem_test { fn my_poem_handler_4( Path(MyStruct { a, b }): Path, // $ Alert[rust/summary/taint-sources] ) -> String { - sink(a); // $ MISSING: hasTaintFlow - sink(b); // $ MISSING: hasTaintFlow + sink(a); // $ hasTaintFlow + sink(b); // $ hasTaintFlow "".to_string() } @@ -57,8 +57,8 @@ mod poem_test { fn my_poem_handler_5( Path(ms): Path, // $ Alert[rust/summary/taint-sources] ) -> String { - sink(ms.a); // $ MISSING: hasTaintFlow - sink(ms.b); // $ MISSING: hasTaintFlow + sink(ms.a); // $ hasTaintFlow + sink(ms.b); // $ hasTaintFlow "".to_string() } @@ -94,9 +94,7 @@ mod actix_test { use super::sink; use actix_web::{get, web, App}; - async fn my_actix_handler_1( - path: web::Path, - ) -> String { + async fn my_actix_handler_1(path: web::Path) -> String { let a = path.into_inner(); sink(a.as_str()); // $ hasTaintFlow=my_actix_handler_1 sink(a.as_bytes()); // $ hasTaintFlow=my_actix_handler_1 @@ -105,9 +103,7 @@ mod actix_test { "".to_string() } - async fn my_actix_handler_2( - path: web::Path<(String, String)>, - ) -> String { + async fn my_actix_handler_2(path: web::Path<(String, String)>) -> String { let (a, b) = path.into_inner(); sink(a); // $ hasTaintFlow=my_actix_handler_2 @@ -116,18 +112,14 @@ mod actix_test { "".to_string() } - async fn my_actix_handler_3( - web::Query(a): web::Query, - ) -> String { - sink(a); // $ MISSING: hasTaintFlow + async fn my_actix_handler_3(web::Query(a): web::Query) -> String { + sink(a); // $ hasTaintFlow=my_actix_handler_3 "".to_string() } #[get("/4/{a}")] // $ Alert[rust/summary/taint-sources] - async fn my_actix_handler_4( - path: web::Path, - ) -> String { + async fn my_actix_handler_4(path: web::Path) -> String { let a = path.into_inner(); sink(a); // $ hasTaintFlow=my_actix_handler_4 @@ -148,43 +140,35 @@ mod actix_test { mod axum_test { use super::sink; use axum::extract::{Json, Path, Query, Request}; - use axum::routing::get; + use axum::routing::{get, post, put, MethodFilter}; use axum::Router; use std::collections::HashMap; - async fn my_axum_handler_1( - Path(a): Path, // $ MISSING: Alert[rust/summary/taint-sources] - ) -> &'static str { - sink(a.as_str()); // $ MISSING: hasTaintFlow - sink(a.as_bytes()); // $ MISSING: hasTaintFlow - sink(a); // $ MISSING: hasTaintFlow + async fn my_axum_handler_1(Path(a): Path) -> &'static str { + sink(a.as_str()); // $ hasTaintFlow=my_axum_handler_1 + sink(a.as_bytes()); // $ hasTaintFlow=my_axum_handler_1 + sink(a); // $ hasTaintFlow=my_axum_handler_1 "" } - async fn my_axum_handler_2( - Path((a, b)): Path<(String, String)>, // $ MISSING: Alert[rust/summary/taint-sources] - ) -> &'static str { - sink(a); // $ MISSING: hasTaintFlow - sink(b); // $ MISSING: hasTaintFlow + async fn my_axum_handler_2(Path((a, b)): Path<(String, String)>) -> &'static str { + sink(a); // $ hasTaintFlow=my_axum_handler_2 + sink(b); // $ hasTaintFlow=my_axum_handler_2 "" } - async fn my_axum_handler_3( - Query(params): Query>, // $ MISSING: Alert[rust/summary/taint-sources] - ) -> &'static str { + async fn my_axum_handler_3(Query(params): Query>) -> &'static str { for (key, value) in params { - sink(key); // $ MISSING: hasTaintFlow - sink(value); // $ MISSING: hasTaintFlow + sink(key); // $ hasTaintFlow=my_axum_handler_3 + sink(value); // $ hasTaintFlow=my_axum_handler_3 } "" } - async fn my_axum_handler_4( - request: Request, // $ MISSING: Alert[rust/summary/taint-sources] - ) -> &'static str { + async fn my_axum_handler_4(request: Request) -> &'static str { sink(request.body()); // $ MISSING: hasTaintFlow request.headers().get("header").unwrap(); // $ MISSING: hasTaintFlow sink(request.into_body()); // $ MISSING: hasTaintFlow @@ -192,39 +176,35 @@ mod axum_test { "" } - async fn my_axum_handler_5( - Json(payload): Json, // $ MISSING: Alert[rust/summary/taint-sources] - ) -> &'static str { + async fn my_axum_handler_5(Json(payload): Json) -> &'static str { sink(payload.as_str()); // $ MISSING: hasTaintFlow - sink(payload); // $ MISSING: hasTaintFlow + sink(payload); // $ hasTaintFlow=...::DELETE "" } - async fn my_axum_handler_6( - body: String, // $ MISSING: Alert[rust/summary/taint-sources] - ) -> &'static str { - sink(body); // $ MISSING: hasTaintFlow + async fn my_axum_handler_6(body: String) -> &'static str { + sink(body); // $ hasTaintFlow=my_axum_handler_6 "" } - async fn my_axum_handler_7( - body: String, // $ MISSING: Alert[rust/summary/taint-sources] - ) -> &'static str { - sink(body); // $ MISSING: hasTaintFlow + async fn my_axum_handler_7(body: String) -> &'static str { + sink(body); // $ hasTaintFlow=my_axum_handler_7 "" } async fn test_axum() { let app = Router::<()>::new() - .route("/1/{a}", get(my_axum_handler_1)) - .route("/2/{a}/{b}", get(my_axum_handler_2)) - .route("/3/:a", get(my_axum_handler_3)) - .route("/4/:a", get(my_axum_handler_4)) - .route("/5/:a", get(my_axum_handler_5)) - .route("/67/:a", get(my_axum_handler_6).get(my_axum_handler_7)); + .route("/1/{a}", get(my_axum_handler_1)) // $ Alert[rust/summary/taint-sources]) + .route("/2/{a}/{b}", post(my_axum_handler_2)) // $ Alert[rust/summary/taint-sources]) + .route("/3/:a", put(my_axum_handler_3)) // $ Alert[rust/summary/taint-sources]) + .route( + "/4/:a", + get(my_axum_handler_4).on(MethodFilter::DELETE, my_axum_handler_5), // $ Alert[rust/summary/taint-sources]) + ) + .route("/5/:a", get(my_axum_handler_6).get(my_axum_handler_7)); // $ Alert[rust/summary/taint-sources]) // ... } diff --git a/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index ccda75006f9..00000000000 --- a/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| main.rs:52:14:52:29 | ...::from(...) | diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index 6cb680fa6ca..ddc016e3d37 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -1,25 +1,27 @@ models -| 1 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self]; ReturnValue; taint | +| 1 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self].Reference; ReturnValue; taint | | 2 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | | 3 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | | 4 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint | -| 5 | Summary: ::from; Argument[0].Reference; ReturnValue; value | -| 6 | Summary: ::add; Argument[self]; ReturnValue; value | -| 7 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 8 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 9 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 5 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 6 | Summary: ::from; Argument[0].Reference; ReturnValue; value | +| 7 | Summary: ::add; Argument[self]; ReturnValue; value | +| 8 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 9 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 10 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges +| main.rs:26:9:26:9 | s | main.rs:27:19:27:19 | s | provenance | | | main.rs:26:9:26:9 | s | main.rs:27:19:27:25 | s[...] | provenance | | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | s | provenance | | | main.rs:27:9:27:14 | sliced [&ref] | main.rs:28:16:28:21 | sliced | provenance | | | main.rs:27:18:27:25 | &... [&ref] | main.rs:27:9:27:14 | sliced [&ref] | provenance | | +| main.rs:27:19:27:19 | s | main.rs:27:19:27:25 | s[...] | provenance | MaD:5 | | main.rs:27:19:27:25 | s[...] | main.rs:27:18:27:25 | &... [&ref] | provenance | | -| main.rs:32:9:32:10 | s1 | main.rs:35:9:35:10 | s4 | provenance | | | main.rs:32:9:32:10 | s1 | main.rs:35:14:35:15 | s1 | provenance | | | main.rs:32:14:32:23 | source(...) | main.rs:32:9:32:10 | s1 | provenance | | | main.rs:35:9:35:10 | s4 | main.rs:38:10:38:11 | s4 | provenance | | | main.rs:35:14:35:15 | s1 | main.rs:35:14:35:20 | ... + ... | provenance | MaD:4 | -| main.rs:35:14:35:15 | s1 | main.rs:35:14:35:20 | ... + ... | provenance | MaD:6 | +| main.rs:35:14:35:15 | s1 | main.rs:35:14:35:20 | ... + ... | provenance | MaD:7 | | main.rs:35:14:35:20 | ... + ... | main.rs:35:9:35:10 | s4 | provenance | | | main.rs:43:9:43:10 | s1 | main.rs:46:34:46:35 | s1 | provenance | | | main.rs:43:14:43:23 | source(...) | main.rs:43:9:43:10 | s1 | provenance | | @@ -30,45 +32,46 @@ edges | main.rs:52:9:52:10 | s2 | main.rs:53:10:53:11 | s2 | provenance | | | main.rs:52:14:52:29 | ...::from(...) | main.rs:52:9:52:10 | s2 | provenance | | | main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:2 | -| main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:5 | -| main.rs:57:9:57:10 | s1 | main.rs:58:14:58:27 | s1.to_string() | provenance | MaD:1 | +| main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:6 | +| main.rs:57:9:57:10 | s1 | main.rs:58:14:58:15 | s1 | provenance | | | main.rs:57:14:57:29 | source_slice(...) | main.rs:57:9:57:10 | s1 | provenance | | | main.rs:58:9:58:10 | s2 | main.rs:59:10:59:11 | s2 | provenance | | +| main.rs:58:14:58:15 | s1 | main.rs:58:14:58:27 | s1.to_string() | provenance | MaD:1 | | main.rs:58:14:58:27 | s1.to_string() | main.rs:58:9:58:10 | s2 | provenance | | | main.rs:63:9:63:9 | s | main.rs:64:16:64:16 | s | provenance | | -| main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:7 | | main.rs:63:13:63:22 | source(...) | main.rs:63:9:63:9 | s | provenance | | -| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:7 | +| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:8 | | main.rs:68:9:68:9 | s | main.rs:70:34:70:61 | MacroExpr | provenance | | | main.rs:68:9:68:9 | s | main.rs:73:34:73:59 | MacroExpr | provenance | | | main.rs:68:13:68:22 | source(...) | main.rs:68:9:68:9 | s | provenance | | | main.rs:70:9:70:18 | formatted1 | main.rs:71:10:71:19 | formatted1 | provenance | | | main.rs:70:22:70:62 | ...::format(...) | main.rs:70:9:70:18 | formatted1 | provenance | | -| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:8 | +| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:9 | | main.rs:73:9:73:18 | formatted2 | main.rs:74:10:74:19 | formatted2 | provenance | | | main.rs:73:22:73:60 | ...::format(...) | main.rs:73:9:73:18 | formatted2 | provenance | | -| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:8 | +| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:9 | | main.rs:76:9:76:13 | width | main.rs:77:34:77:74 | MacroExpr | provenance | | | main.rs:76:17:76:32 | source_usize(...) | main.rs:76:9:76:13 | width | provenance | | | main.rs:77:9:77:18 | formatted3 | main.rs:78:10:78:19 | formatted3 | provenance | | | main.rs:77:22:77:75 | ...::format(...) | main.rs:77:9:77:18 | formatted3 | provenance | | -| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:8 | +| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:9 | | main.rs:82:9:82:10 | s1 | main.rs:86:18:86:25 | MacroExpr | provenance | | | main.rs:82:9:82:10 | s1 | main.rs:87:18:87:32 | MacroExpr | provenance | | | main.rs:82:14:82:23 | source(...) | main.rs:82:9:82:10 | s1 | provenance | | | main.rs:86:18:86:25 | ...::format(...) | main.rs:86:18:86:25 | { ... } | provenance | | | main.rs:86:18:86:25 | ...::must_use(...) | main.rs:86:10:86:26 | MacroExpr | provenance | | -| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:8 | -| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:9 | +| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:9 | +| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:10 | | main.rs:87:18:87:32 | ...::format(...) | main.rs:87:18:87:32 | { ... } | provenance | | | main.rs:87:18:87:32 | ...::must_use(...) | main.rs:87:10:87:33 | MacroExpr | provenance | | -| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:8 | -| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:9 | +| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:9 | +| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:10 | nodes | main.rs:26:9:26:9 | s | semmle.label | s | | main.rs:26:13:26:22 | source(...) | semmle.label | source(...) | | main.rs:27:9:27:14 | sliced [&ref] | semmle.label | sliced [&ref] | | main.rs:27:18:27:25 | &... [&ref] | semmle.label | &... [&ref] | +| main.rs:27:19:27:19 | s | semmle.label | s | | main.rs:27:19:27:25 | s[...] | semmle.label | s[...] | | main.rs:28:16:28:21 | sliced | semmle.label | sliced | | main.rs:32:9:32:10 | s1 | semmle.label | s1 | @@ -91,6 +94,7 @@ nodes | main.rs:57:9:57:10 | s1 | semmle.label | s1 | | main.rs:57:14:57:29 | source_slice(...) | semmle.label | source_slice(...) | | main.rs:58:9:58:10 | s2 | semmle.label | s2 | +| main.rs:58:14:58:15 | s1 | semmle.label | s1 | | main.rs:58:14:58:27 | s1.to_string() | semmle.label | s1.to_string() | | main.rs:59:10:59:11 | s2 | semmle.label | s2 | | main.rs:63:9:63:9 | s | semmle.label | s | diff --git a/rust/ql/test/library-tests/dataflow/strings/main.rs b/rust/ql/test/library-tests/dataflow/strings/main.rs index 633d9f42f46..93054834a2a 100644 --- a/rust/ql/test/library-tests/dataflow/strings/main.rs +++ b/rust/ql/test/library-tests/dataflow/strings/main.rs @@ -61,7 +61,7 @@ fn string_to_string() { fn as_str() { let s = source(67); - sink_slice(s.as_str()); // $ hasValueFlow=67 + sink_slice(s.as_str()); // $ hasTaintFlow=67 -- `s.as_str()` has type `&str`, so an implicit deref is needed at the sink } fn format_args_built_in() { diff --git a/rust/ql/test/library-tests/dataflow/taint/TaintFlowStep.expected b/rust/ql/test/library-tests/dataflow/taint/TaintFlowStep.expected index fa32f2201b2..9799d66b124 100644 --- a/rust/ql/test/library-tests/dataflow/taint/TaintFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/taint/TaintFlowStep.expected @@ -1,17 +1,19 @@ -| main.rs:4:5:4:8 | 1000 | main.rs:4:5:4:12 | ... + ... | -| main.rs:4:12:4:12 | i | main.rs:4:5:4:12 | ... + ... | | main.rs:8:20:8:20 | s | main.rs:8:14:8:20 | FormatArgsExpr | -| main.rs:13:10:13:10 | a | main.rs:13:10:13:14 | ... + ... | -| main.rs:13:14:13:14 | 1 | main.rs:13:10:13:14 | ... + ... | -| main.rs:18:11:18:11 | a | main.rs:18:10:18:11 | - ... | -| main.rs:23:13:23:13 | a | main.rs:23:13:23:19 | a as u8 | -| main.rs:24:10:24:10 | b | main.rs:24:10:24:17 | b as i64 | -| main.rs:24:10:24:17 | [post] b as i64 | main.rs:24:10:24:10 | [post] b | -| main.rs:29:23:29:23 | i | main.rs:29:17:29:23 | FormatArgsExpr | -| main.rs:33:24:33:24 | s | main.rs:33:18:33:24 | FormatArgsExpr | -| main.rs:38:23:38:23 | s | main.rs:38:23:38:29 | s[...] | -| main.rs:49:24:49:24 | i | main.rs:49:18:49:24 | FormatArgsExpr | -| main.rs:54:14:54:16 | arr | main.rs:54:14:54:19 | arr[1] | -| main.rs:64:24:64:24 | s | main.rs:64:24:64:27 | s[1] | -| main.rs:64:24:64:27 | s[1] | main.rs:64:18:64:27 | FormatArgsExpr | -| main.rs:69:9:69:12 | arr2 | main.rs:69:9:69:15 | arr2[1] | +| main.rs:16:5:16:5 | [post] b [borrowed] | main.rs:16:5:16:5 | [SSA] b | +| main.rs:20:5:20:5 | [post] c [borrowed] | main.rs:20:5:20:5 | [SSA] c | +| main.rs:31:13:31:13 | a | main.rs:31:13:31:19 | a as u8 | +| main.rs:32:10:32:10 | b | main.rs:32:10:32:17 | b as i64 | +| main.rs:32:10:32:17 | [post] b as i64 | main.rs:32:10:32:10 | [post] b | +| main.rs:37:23:37:23 | i | main.rs:37:17:37:23 | FormatArgsExpr | +| main.rs:41:24:41:24 | s | main.rs:41:18:41:24 | FormatArgsExpr | +| main.rs:46:23:46:23 | [post] s [borrowed] | main.rs:46:23:46:23 | [post] s | +| main.rs:46:23:46:23 | s | main.rs:46:23:46:29 | s[...] | +| main.rs:46:23:46:29 | s[...] [pre-dereferenced] | main.rs:46:23:46:29 | s[...] | +| main.rs:57:24:57:24 | i | main.rs:57:18:57:24 | FormatArgsExpr | +| main.rs:62:14:62:16 | [post] arr [borrowed] | main.rs:62:14:62:16 | [post] arr | +| main.rs:62:14:62:19 | arr[1] [pre-dereferenced] | main.rs:62:14:62:19 | arr[1] | +| main.rs:72:24:72:24 | [post] s [borrowed] | main.rs:72:24:72:24 | [post] s | +| main.rs:72:24:72:27 | s[1] | main.rs:72:18:72:27 | FormatArgsExpr | +| main.rs:72:24:72:27 | s[1] [pre-dereferenced] | main.rs:72:24:72:27 | s[1] | +| main.rs:77:9:77:12 | [post] arr2 [borrowed] | main.rs:77:9:77:12 | [post] arr2 | +| main.rs:77:9:77:15 | arr2[1] [pre-dereferenced] | main.rs:77:9:77:15 | arr2[1] | diff --git a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected index a8f0b6321f5..c4393834112 100644 --- a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected @@ -1,54 +1,80 @@ models -| 1 | Summary: ::neg; Argument[self]; ReturnValue; taint | +| 1 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint | +| 2 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[0].Reference; Argument[self].Reference; taint | +| 3 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[0]; Argument[self].Reference; taint | +| 4 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 5 | Summary: <_ as core::ops::arith::Neg>::neg; Argument[self]; ReturnValue; taint | +| 6 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 7 | Summary: ::neg; Argument[self]; ReturnValue; taint | edges -| main.rs:12:9:12:9 | a | main.rs:13:10:13:14 | ... + ... | provenance | | +| main.rs:12:9:12:9 | a | main.rs:13:10:13:10 | a | provenance | | | main.rs:12:13:12:22 | source(...) | main.rs:12:9:12:9 | a | provenance | | -| main.rs:17:9:17:9 | a | main.rs:18:10:18:11 | - ... | provenance | | -| main.rs:17:9:17:9 | a | main.rs:18:11:18:11 | a | provenance | | -| main.rs:17:13:17:22 | source(...) | main.rs:17:9:17:9 | a | provenance | | -| main.rs:18:11:18:11 | a | main.rs:18:10:18:11 | - ... | provenance | MaD:1 | -| main.rs:22:9:22:9 | a | main.rs:23:9:23:9 | b | provenance | | -| main.rs:22:13:22:22 | source(...) | main.rs:22:9:22:9 | a | provenance | | -| main.rs:23:9:23:9 | b | main.rs:24:10:24:17 | b as i64 | provenance | | -| main.rs:37:13:37:13 | s | main.rs:38:23:38:29 | s[...] | provenance | | -| main.rs:37:17:37:26 | source(...) | main.rs:37:13:37:13 | s | provenance | | -| main.rs:38:13:38:18 | sliced [&ref] | main.rs:39:14:39:19 | sliced | provenance | | -| main.rs:38:22:38:29 | &... [&ref] | main.rs:38:13:38:18 | sliced [&ref] | provenance | | -| main.rs:38:23:38:29 | s[...] | main.rs:38:22:38:29 | &... [&ref] | provenance | | -| main.rs:53:13:53:15 | arr | main.rs:54:14:54:19 | arr[1] | provenance | | -| main.rs:53:19:53:28 | source(...) | main.rs:53:13:53:15 | arr | provenance | | -| main.rs:69:9:69:12 | [post] arr2 [element] | main.rs:70:14:70:17 | arr2 | provenance | | -| main.rs:69:19:69:28 | source(...) | main.rs:69:9:69:12 | [post] arr2 [element] | provenance | | +| main.rs:13:10:13:10 | a | main.rs:13:10:13:14 | ... + ... | provenance | MaD:1 | +| main.rs:15:9:15:13 | mut b | main.rs:16:5:16:5 | b | provenance | | +| main.rs:15:17:15:26 | source(...) | main.rs:15:9:15:13 | mut b | provenance | | +| main.rs:16:5:16:5 | b | main.rs:17:10:17:10 | b | provenance | MaD:4 | +| main.rs:20:10:20:19 | source(...) | main.rs:21:10:21:10 | c | provenance | MaD:2 | +| main.rs:20:10:20:19 | source(...) | main.rs:21:10:21:10 | c | provenance | MaD:3 | +| main.rs:25:9:25:9 | a | main.rs:26:11:26:11 | a | provenance | | +| main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | a | provenance | | +| main.rs:26:11:26:11 | a | main.rs:26:10:26:11 | - ... | provenance | MaD:5 | +| main.rs:26:11:26:11 | a | main.rs:26:10:26:11 | - ... | provenance | MaD:7 | +| main.rs:30:9:30:9 | a | main.rs:31:9:31:9 | b | provenance | | +| main.rs:30:13:30:22 | source(...) | main.rs:30:9:30:9 | a | provenance | | +| main.rs:31:9:31:9 | b | main.rs:32:10:32:17 | b as i64 | provenance | | +| main.rs:45:13:45:13 | s | main.rs:46:23:46:23 | s | provenance | | +| main.rs:45:13:45:13 | s | main.rs:46:23:46:29 | s[...] | provenance | | +| main.rs:45:17:45:26 | source(...) | main.rs:45:13:45:13 | s | provenance | | +| main.rs:46:13:46:18 | sliced [&ref] | main.rs:47:14:47:19 | sliced | provenance | | +| main.rs:46:22:46:29 | &... [&ref] | main.rs:46:13:46:18 | sliced [&ref] | provenance | | +| main.rs:46:23:46:23 | s | main.rs:46:23:46:29 | s[...] | provenance | MaD:6 | +| main.rs:46:23:46:29 | s[...] | main.rs:46:22:46:29 | &... [&ref] | provenance | | +| main.rs:61:13:61:15 | arr | main.rs:62:14:62:16 | arr | provenance | | +| main.rs:61:19:61:28 | source(...) | main.rs:61:13:61:15 | arr | provenance | | +| main.rs:62:14:62:16 | arr | main.rs:62:14:62:19 | arr[1] | provenance | MaD:6 | +| main.rs:77:9:77:12 | [post] arr2 [element] | main.rs:78:14:78:17 | arr2 | provenance | | +| main.rs:77:19:77:28 | source(...) | main.rs:77:9:77:12 | [post] arr2 [element] | provenance | | nodes | main.rs:12:9:12:9 | a | semmle.label | a | | main.rs:12:13:12:22 | source(...) | semmle.label | source(...) | +| main.rs:13:10:13:10 | a | semmle.label | a | | main.rs:13:10:13:14 | ... + ... | semmle.label | ... + ... | -| main.rs:17:9:17:9 | a | semmle.label | a | -| main.rs:17:13:17:22 | source(...) | semmle.label | source(...) | -| main.rs:18:10:18:11 | - ... | semmle.label | - ... | -| main.rs:18:11:18:11 | a | semmle.label | a | -| main.rs:22:9:22:9 | a | semmle.label | a | -| main.rs:22:13:22:22 | source(...) | semmle.label | source(...) | -| main.rs:23:9:23:9 | b | semmle.label | b | -| main.rs:24:10:24:17 | b as i64 | semmle.label | b as i64 | -| main.rs:37:13:37:13 | s | semmle.label | s | -| main.rs:37:17:37:26 | source(...) | semmle.label | source(...) | -| main.rs:38:13:38:18 | sliced [&ref] | semmle.label | sliced [&ref] | -| main.rs:38:22:38:29 | &... [&ref] | semmle.label | &... [&ref] | -| main.rs:38:23:38:29 | s[...] | semmle.label | s[...] | -| main.rs:39:14:39:19 | sliced | semmle.label | sliced | -| main.rs:53:13:53:15 | arr | semmle.label | arr | -| main.rs:53:19:53:28 | source(...) | semmle.label | source(...) | -| main.rs:54:14:54:19 | arr[1] | semmle.label | arr[1] | -| main.rs:69:9:69:12 | [post] arr2 [element] | semmle.label | [post] arr2 [element] | -| main.rs:69:19:69:28 | source(...) | semmle.label | source(...) | -| main.rs:70:14:70:17 | arr2 | semmle.label | arr2 | +| main.rs:15:9:15:13 | mut b | semmle.label | mut b | +| main.rs:15:17:15:26 | source(...) | semmle.label | source(...) | +| main.rs:16:5:16:5 | b | semmle.label | b | +| main.rs:17:10:17:10 | b | semmle.label | b | +| main.rs:20:10:20:19 | source(...) | semmle.label | source(...) | +| main.rs:21:10:21:10 | c | semmle.label | c | +| main.rs:25:9:25:9 | a | semmle.label | a | +| main.rs:25:13:25:22 | source(...) | semmle.label | source(...) | +| main.rs:26:10:26:11 | - ... | semmle.label | - ... | +| main.rs:26:11:26:11 | a | semmle.label | a | +| main.rs:30:9:30:9 | a | semmle.label | a | +| main.rs:30:13:30:22 | source(...) | semmle.label | source(...) | +| main.rs:31:9:31:9 | b | semmle.label | b | +| main.rs:32:10:32:17 | b as i64 | semmle.label | b as i64 | +| main.rs:45:13:45:13 | s | semmle.label | s | +| main.rs:45:17:45:26 | source(...) | semmle.label | source(...) | +| main.rs:46:13:46:18 | sliced [&ref] | semmle.label | sliced [&ref] | +| main.rs:46:22:46:29 | &... [&ref] | semmle.label | &... [&ref] | +| main.rs:46:23:46:23 | s | semmle.label | s | +| main.rs:46:23:46:29 | s[...] | semmle.label | s[...] | +| main.rs:47:14:47:19 | sliced | semmle.label | sliced | +| main.rs:61:13:61:15 | arr | semmle.label | arr | +| main.rs:61:19:61:28 | source(...) | semmle.label | source(...) | +| main.rs:62:14:62:16 | arr | semmle.label | arr | +| main.rs:62:14:62:19 | arr[1] | semmle.label | arr[1] | +| main.rs:77:9:77:12 | [post] arr2 [element] | semmle.label | [post] arr2 [element] | +| main.rs:77:19:77:28 | source(...) | semmle.label | source(...) | +| main.rs:78:14:78:17 | arr2 | semmle.label | arr2 | subpaths testFailures #select | main.rs:13:10:13:14 | ... + ... | main.rs:12:13:12:22 | source(...) | main.rs:13:10:13:14 | ... + ... | $@ | main.rs:12:13:12:22 | source(...) | source(...) | -| main.rs:18:10:18:11 | - ... | main.rs:17:13:17:22 | source(...) | main.rs:18:10:18:11 | - ... | $@ | main.rs:17:13:17:22 | source(...) | source(...) | -| main.rs:24:10:24:17 | b as i64 | main.rs:22:13:22:22 | source(...) | main.rs:24:10:24:17 | b as i64 | $@ | main.rs:22:13:22:22 | source(...) | source(...) | -| main.rs:39:14:39:19 | sliced | main.rs:37:17:37:26 | source(...) | main.rs:39:14:39:19 | sliced | $@ | main.rs:37:17:37:26 | source(...) | source(...) | -| main.rs:54:14:54:19 | arr[1] | main.rs:53:19:53:28 | source(...) | main.rs:54:14:54:19 | arr[1] | $@ | main.rs:53:19:53:28 | source(...) | source(...) | -| main.rs:70:14:70:17 | arr2 | main.rs:69:19:69:28 | source(...) | main.rs:70:14:70:17 | arr2 | $@ | main.rs:69:19:69:28 | source(...) | source(...) | +| main.rs:17:10:17:10 | b | main.rs:15:17:15:26 | source(...) | main.rs:17:10:17:10 | b | $@ | main.rs:15:17:15:26 | source(...) | source(...) | +| main.rs:21:10:21:10 | c | main.rs:20:10:20:19 | source(...) | main.rs:21:10:21:10 | c | $@ | main.rs:20:10:20:19 | source(...) | source(...) | +| main.rs:26:10:26:11 | - ... | main.rs:25:13:25:22 | source(...) | main.rs:26:10:26:11 | - ... | $@ | main.rs:25:13:25:22 | source(...) | source(...) | +| main.rs:32:10:32:17 | b as i64 | main.rs:30:13:30:22 | source(...) | main.rs:32:10:32:17 | b as i64 | $@ | main.rs:30:13:30:22 | source(...) | source(...) | +| main.rs:47:14:47:19 | sliced | main.rs:45:17:45:26 | source(...) | main.rs:47:14:47:19 | sliced | $@ | main.rs:45:17:45:26 | source(...) | source(...) | +| main.rs:62:14:62:19 | arr[1] | main.rs:61:19:61:28 | source(...) | main.rs:62:14:62:19 | arr[1] | $@ | main.rs:61:19:61:28 | source(...) | source(...) | +| main.rs:78:14:78:17 | arr2 | main.rs:77:19:77:28 | source(...) | main.rs:78:14:78:17 | arr2 | $@ | main.rs:77:19:77:28 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/taint/main.rs b/rust/ql/test/library-tests/dataflow/taint/main.rs index 90af2ec8a06..5e4f8c43501 100644 --- a/rust/ql/test/library-tests/dataflow/taint/main.rs +++ b/rust/ql/test/library-tests/dataflow/taint/main.rs @@ -11,6 +11,14 @@ fn sink(s: i64) { fn addition() { let a = source(42); sink(a + 1); // $ hasTaintFlow=42 + + let mut b = source(58); + b += 2; + sink(b); // $ hasTaintFlow=58 + + let mut c = 0; + c += source(99); + sink(c); // $ hasTaintFlow=99 } fn negation() { diff --git a/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.expected b/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.expected index 2b0aecda049..4a67027027b 100644 --- a/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.expected +++ b/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.expected @@ -1,3 +1,22 @@ +| struct Array | | +| struct PtrConst | | +| struct PtrMut | | +| struct Ref | | +| struct RefMut | | +| struct Slice | | +| struct Tuple0 | | +| struct Tuple1 | | +| struct Tuple2 | | +| struct Tuple3 | | +| struct Tuple4 | | +| struct Tuple5 | | +| struct Tuple6 | | +| struct Tuple7 | | +| struct Tuple8 | | +| struct Tuple9 | | +| struct Tuple10 | | +| struct Tuple11 | | +| struct Tuple12 | | | struct bool | | | struct char | | | struct f32 | FloatingPointType, NumericType | diff --git a/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.ql b/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.ql index 4da1117a3fb..8dfd49bc137 100644 --- a/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.ql +++ b/rust/ql/test/library-tests/elements/builtintypes/BuiltinTypes.ql @@ -1,6 +1,5 @@ import rust import codeql.rust.frameworks.stdlib.Builtins -import codeql.rust.internal.Type string describe(BuiltinType t) { t instanceof NumericType and result = "NumericType" diff --git a/rust/ql/test/library-tests/elements/enum/Cargo.lock b/rust/ql/test/library-tests/elements/enum/Cargo.lock new file mode 100644 index 00000000000..b9856cfaf77 --- /dev/null +++ b/rust/ql/test/library-tests/elements/enum/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "test" +version = "0.0.1" diff --git a/rust/ql/test/library-tests/elements/enum/Enum.expected b/rust/ql/test/library-tests/elements/enum/Enum.expected new file mode 100644 index 00000000000..f910b240ca7 --- /dev/null +++ b/rust/ql/test/library-tests/elements/enum/Enum.expected @@ -0,0 +1,7 @@ +fieldless +| enums.rs:1:1:5:1 | enum Foo | +| enums.rs:7:1:11:1 | enum Fieldless | +| enums.rs:13:1:18:1 | enum Direction | +unitOnly +| enums.rs:1:1:5:1 | enum Foo | +| enums.rs:13:1:18:1 | enum Direction | diff --git a/rust/ql/test/library-tests/elements/enum/Enum.ql b/rust/ql/test/library-tests/elements/enum/Enum.ql new file mode 100644 index 00000000000..82baa8dffe6 --- /dev/null +++ b/rust/ql/test/library-tests/elements/enum/Enum.ql @@ -0,0 +1,6 @@ +import rust +import TestUtils + +query predicate fieldless(Enum e) { toBeTested(e) and e.isFieldless() } + +query predicate unitOnly(Enum e) { toBeTested(e) and e.isUnitOnly() } diff --git a/rust/ql/test/library-tests/elements/enum/enums.rs b/rust/ql/test/library-tests/elements/enum/enums.rs new file mode 100644 index 00000000000..0f5a964c284 --- /dev/null +++ b/rust/ql/test/library-tests/elements/enum/enums.rs @@ -0,0 +1,24 @@ +enum Foo { + Bar, + Baz, + Qux, +} + +enum Fieldless { + Tuple(), + Struct{}, + Unit, +} + +enum Direction { + North = 0, + East = 90, + South = 180, + West = 270, +} + +enum Color { + Red(u8), + Green(u8), + Blue(u8), +} diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 0b5d376b4d2..23ac5e722d5 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -1,6 +1,9 @@ -multipleCallTargets -| main.rs:125:9:125:11 | f(...) | -| main.rs:365:9:367:16 | ...::f(...) | -| main.rs:368:9:370:16 | ...::f(...) | -| main.rs:447:9:451:16 | ...::f(...) | -| main.rs:452:9:456:16 | ...::f(...) | +multipleResolvedTargets +| main.rs:126:9:126:11 | f(...) | +| main.rs:366:9:368:16 | ...::f(...) | +| main.rs:369:9:371:16 | ...::f(...) | +| main.rs:450:9:454:16 | ...::f(...) | +| main.rs:455:9:459:16 | ...::f(...) | +| main.rs:565:9:566:15 | ...::Assoc(...) | +| main.rs:568:9:569:12 | ...::f1(...) | +| main.rs:571:9:572:12 | ...::f1(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 037527c71be..761e97fced1 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -1,6 +1,7 @@ mod my; // I1 -use my::*; // $ item=I1 +#[rustfmt::skip] +use {{{my::{{self as my_alias, *}}}}}; // $ item=I1 use my::nested::nested1::nested2::*; // $ item=I3 @@ -380,8 +381,9 @@ mod m16 { > { fn f(&self) -> T; // $ item=I84 - fn g(&self) -> T // $ item=I84 - ; // I85 + fn g(&self) -> T {// $ item=I84 + self.f() // $ item=f + } // I85 fn h(&self) -> T { // $ item=I84 Self::g(&self); // $ item=I85 @@ -435,8 +437,9 @@ mod m16 { > // $ item=I89 for S { // $ item=I90 fn f(&self) -> S { // $ item=I90 + Self::g(&self); // $ item=I92 println!("m16::>::f"); // $ item=println - Self::c // $ MISSING: item=I95 + Self::c // $ item=I95 } // I93 } @@ -465,6 +468,109 @@ mod m16 { > // $ item=I86 >::c; // $ MISSING: item=I95 } // I83 + + trait Trait3 { + type AssocType; + + fn f(&self); + } + + trait Trait4 { + type AssocType; + + fn g(&self); + } + + struct S2; + + #[rustfmt::skip] + impl Trait3 for S2 { // $ item=Trait3 item=S2 + type AssocType = i32 // $ item=i32 + ; // S2Trait3AssocType + + fn f(&self) { + let x: Self::AssocType = 42; // $ item=S2Trait3AssocType + } // S2asTrait3::f + } + + #[rustfmt::skip] + impl Trait4 for S2 { // $ item=Trait4 item=S2 + type AssocType = bool // $ item=bool + ; // S2Trait4AssocType + + fn g(&self) { + Self::f(&self); // $ item=S2asTrait3::f + S2::f(&self); // $ item=S2asTrait3::f + let x: Self::AssocType = true; // $ item=S2Trait4AssocType + } + } + + trait Trait5 { + type Assoc; // Trait5Assoc + + fn Assoc() -> Self::Assoc; // $ item=Trait5Assoc + } + + #[rustfmt::skip] + impl Trait5 for S { // $ item=Trait5 item=I90 + type Assoc = i32 // $ item=i32 + ; // AssocType + + fn Assoc() + -> Self::Assoc { // $ item=AssocType + Self::Assoc() + 1 // $ item=AssocFunc + } // AssocFunc + } + + struct S3(T3); // $ item=T3 + + #[rustfmt::skip] + impl Trait5 for S3 { // $ item=Trait5 item=S3 item=i32 + type Assoc = i32 // $ item=i32 + ; // S3i32AssocType + + fn Assoc() + -> Self::Assoc { // $ item=S3i32AssocType + Self::Assoc() + 1 // $ item=S3i32AssocFunc + } // S3i32AssocFunc + } + + #[rustfmt::skip] + impl Trait5 for S3 { // $ item=Trait5 item=S3 item=bool + type Assoc = bool // $ item=bool + ; // S3boolAssocType + + fn Assoc() + -> Self::Assoc { // $ item=S3boolAssocType + !Self::Assoc() // $ item=S3boolAssocFunc + } // S3boolAssocFunc + } + + #[rustfmt::skip] + impl S3 { // $ item=S3 item=i32 + fn f1() -> i32 { // $ item=i32 + 0 + } // S3i32f1 + } + + #[rustfmt::skip] + impl S3 { // $ item=S3 item=bool + fn f1() -> bool { // $ item=bool + true + } // S3boolf1 + } + + #[rustfmt::skip] + fn foo() { + S3:::: // $ item=i32 + Assoc(); // $ item=S3i32AssocFunc $ SPURIOUS: item=S3boolAssocFunc + + S3:::: // $ item=bool + f1(); // $ item=S3boolf1 $ SPURIOUS: item=S3i32f1 + + S3:::: // $ item=i32 + f1(); // $ item=S3i32f1 $ SPURIOUS: item=S3boolf1 + } } mod trait_visibility { @@ -789,6 +895,49 @@ mod impl_with_attribute_macro { } // impl_with_attribute_macro::test } +mod patterns { + #[rustfmt::skip] + pub fn test() -> Option { // $ item=Option $ item=i32 + let x = Some(42); // $ item=Some + let y : Option = match x { // $ item=Option $ item=i32 + Some(y) => { // $ item=Some + None // $ item=None + } + None => // $ item=None + None // $ item=None + }; + match y { + N0ne => // local variable + N0ne + } + } // patterns::test + + #[rustfmt::skip] + fn test2() -> Option { // $ item=Option $ item=i32 + let test_alias = test; // $ item=patterns::test + let test = test_alias(); + test + } + + #[rustfmt::skip] + const z: i32 // $ item=i32 + = 0; // constz + + #[rustfmt::skip] + fn test3() { + let x = Some(0); // $ item=Some + match x { + Some(x) // $ item=Some + => x, + _ => 0 + }; + match x { + Some(z) => z, // $ item=Some item=constz + _ => 0 + }; + } +} + fn main() { my::nested::nested1::nested2::f(); // $ item=I4 my::f(); // $ item=I38 @@ -816,6 +965,7 @@ fn main() { nested8::f(); // $ item=I119 my3::f(); // $ item=I200 nested_f(); // $ item=I201 + my_alias::nested_f(); // $ item=I201 m18::m19::m20::g(); // $ item=I103 m23::f(); // $ item=I108 m24::f(); // $ item=I121 @@ -824,4 +974,5 @@ fn main() { AStruct::z_on_type(); // $ item=I124 AStruct {}.z_on_instance(); // $ item=I123 item=I125 impl_with_attribute_macro::test(); // $ item=impl_with_attribute_macro::test + patterns::test(); // $ item=patterns::test } diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index bb9a456a42c..c6bac60b412 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -1,37 +1,38 @@ mod | lib.rs:1:1:1:11 | mod my | | main.rs:1:1:1:7 | mod my | -| main.rs:7:1:7:8 | mod my2 | -| main.rs:19:1:43:1 | mod m1 | -| main.rs:24:5:42:5 | mod m2 | -| main.rs:35:9:41:9 | mod m3 | -| main.rs:45:1:52:1 | mod m4 | -| main.rs:109:1:113:1 | mod m5 | -| main.rs:115:1:127:1 | mod m6 | -| main.rs:129:1:148:1 | mod m7 | -| main.rs:150:1:204:1 | mod m8 | -| main.rs:206:1:214:1 | mod m9 | -| main.rs:216:1:235:1 | mod m10 | -| main.rs:237:1:274:1 | mod m11 | -| main.rs:247:5:247:12 | mod f | -| main.rs:276:1:288:1 | mod m12 | -| main.rs:290:1:303:1 | mod m13 | -| main.rs:294:5:302:5 | mod m14 | -| main.rs:305:1:374:1 | mod m15 | -| main.rs:376:1:468:1 | mod m16 | -| main.rs:470:1:520:1 | mod trait_visibility | -| main.rs:471:5:493:5 | mod m | -| main.rs:522:1:552:1 | mod m17 | -| main.rs:554:1:572:1 | mod m18 | -| main.rs:559:5:571:5 | mod m19 | -| main.rs:564:9:570:9 | mod m20 | -| main.rs:574:1:599:1 | mod m21 | -| main.rs:575:5:581:5 | mod m22 | -| main.rs:583:5:598:5 | mod m33 | -| main.rs:601:1:626:1 | mod m23 | -| main.rs:628:1:696:1 | mod m24 | -| main.rs:713:1:765:1 | mod associated_types | -| main.rs:771:1:790:1 | mod impl_with_attribute_macro | +| main.rs:8:1:8:8 | mod my2 | +| main.rs:20:1:44:1 | mod m1 | +| main.rs:25:5:43:5 | mod m2 | +| main.rs:36:9:42:9 | mod m3 | +| main.rs:46:1:53:1 | mod m4 | +| main.rs:110:1:114:1 | mod m5 | +| main.rs:116:1:128:1 | mod m6 | +| main.rs:130:1:149:1 | mod m7 | +| main.rs:151:1:205:1 | mod m8 | +| main.rs:207:1:215:1 | mod m9 | +| main.rs:217:1:236:1 | mod m10 | +| main.rs:238:1:275:1 | mod m11 | +| main.rs:248:5:248:12 | mod f | +| main.rs:277:1:289:1 | mod m12 | +| main.rs:291:1:304:1 | mod m13 | +| main.rs:295:5:303:5 | mod m14 | +| main.rs:306:1:375:1 | mod m15 | +| main.rs:377:1:574:1 | mod m16 | +| main.rs:576:1:626:1 | mod trait_visibility | +| main.rs:577:5:599:5 | mod m | +| main.rs:628:1:658:1 | mod m17 | +| main.rs:660:1:678:1 | mod m18 | +| main.rs:665:5:677:5 | mod m19 | +| main.rs:670:9:676:9 | mod m20 | +| main.rs:680:1:705:1 | mod m21 | +| main.rs:681:5:687:5 | mod m22 | +| main.rs:689:5:704:5 | mod m33 | +| main.rs:707:1:732:1 | mod m23 | +| main.rs:734:1:802:1 | mod m24 | +| main.rs:819:1:871:1 | mod associated_types | +| main.rs:877:1:896:1 | mod impl_with_attribute_macro | +| main.rs:898:1:939:1 | mod patterns | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:20:1:20:12 | mod my3 | | my2/mod.rs:22:1:23:10 | mod mymod | @@ -47,424 +48,508 @@ mod | my/nested.rs:1:1:17:1 | mod nested1 | | my/nested.rs:2:5:11:5 | mod nested2 | resolvePath -| main.rs:3:5:3:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:5:5:5:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:5:5:5:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:5:5:5:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:5:5:5:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:9:5:9:7 | my2 | main.rs:7:1:7:8 | mod my2 | -| main.rs:12:5:12:7 | my2 | main.rs:7:1:7:8 | mod my2 | -| main.rs:12:5:12:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:12:5:12:25 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:12:5:12:34 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:13:5:13:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:14:5:14:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:17:5:17:7 | my2 | main.rs:7:1:7:8 | mod my2 | -| main.rs:17:5:17:18 | ...::nested8_f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:21:9:21:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:26:13:26:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:30:13:30:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:31:13:31:13 | f | main.rs:25:9:27:9 | fn f | -| main.rs:32:13:32:17 | super | main.rs:19:1:43:1 | mod m1 | -| main.rs:32:13:32:20 | ...::f | main.rs:20:5:22:5 | fn f | -| main.rs:36:17:36:21 | super | main.rs:24:5:42:5 | mod m2 | -| main.rs:36:17:36:24 | ...::f | main.rs:25:9:27:9 | fn f | -| main.rs:38:17:38:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:39:17:39:17 | f | main.rs:25:9:27:9 | fn f | -| main.rs:46:9:46:13 | super | main.rs:1:1:827:2 | SourceFile | -| main.rs:46:9:46:17 | ...::m1 | main.rs:19:1:43:1 | mod m1 | -| main.rs:46:9:46:21 | ...::m2 | main.rs:24:5:42:5 | mod m2 | -| main.rs:46:9:46:24 | ...::g | main.rs:29:9:33:9 | fn g | -| main.rs:49:9:49:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:50:9:50:9 | g | main.rs:29:9:33:9 | fn g | -| main.rs:57:5:57:11 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:62:13:62:14 | m1 | main.rs:19:1:43:1 | mod m1 | -| main.rs:62:13:62:18 | ...::m2 | main.rs:24:5:42:5 | mod m2 | -| main.rs:62:13:62:21 | ...::g | main.rs:29:9:33:9 | fn g | -| main.rs:63:9:63:9 | g | main.rs:29:9:33:9 | fn g | -| main.rs:66:9:66:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:67:17:67:19 | Foo | main.rs:65:9:65:21 | struct Foo | -| main.rs:70:13:70:15 | Foo | main.rs:59:5:59:17 | struct Foo | -| main.rs:72:5:72:5 | f | main.rs:61:5:68:5 | fn f | -| main.rs:74:5:74:8 | self | main.rs:1:1:827:2 | SourceFile | -| main.rs:74:5:74:11 | ...::i | main.rs:77:1:89:1 | fn i | -| main.rs:78:5:78:11 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:80:13:80:15 | Foo | main.rs:54:1:54:13 | struct Foo | -| main.rs:84:16:84:18 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:87:17:87:19 | Foo | main.rs:83:9:85:9 | struct Foo | -| main.rs:91:5:91:7 | my2 | main.rs:7:1:7:8 | mod my2 | -| main.rs:91:5:91:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:93:5:93:21 | my2_nested2_alias | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:93:5:93:30 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:93:34:93:40 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:93:34:93:43 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:93:57:93:63 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:93:57:93:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:93:80:93:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:104:5:104:11 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:105:5:105:15 | fn_in_macro | main.rs:95:1:101:1 | MacroRules | -| main.rs:105:18:105:24 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:106:5:106:22 | f_defined_in_macro | main.rs:105:18:105:42 | fn f_defined_in_macro | -| main.rs:111:9:111:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:117:9:117:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:121:9:121:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:124:13:124:17 | super | main.rs:1:1:827:2 | SourceFile | -| main.rs:124:13:124:21 | ...::m5 | main.rs:109:1:113:1 | mod m5 | -| main.rs:125:9:125:9 | f | main.rs:110:5:112:5 | fn f | -| main.rs:125:9:125:9 | f | main.rs:116:5:118:5 | fn f | -| main.rs:132:13:132:15 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:135:16:135:18 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:141:19:141:24 | MyEnum | main.rs:130:5:138:5 | enum MyEnum | -| main.rs:143:9:143:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:144:17:144:22 | MyEnum | main.rs:130:5:138:5 | enum MyEnum | -| main.rs:144:17:144:25 | ...::A | main.rs:131:9:133:9 | A | -| main.rs:145:17:145:22 | MyEnum | main.rs:130:5:138:5 | enum MyEnum | -| main.rs:145:17:145:25 | ...::B | main.rs:133:12:136:9 | B | -| main.rs:146:9:146:14 | MyEnum | main.rs:130:5:138:5 | enum MyEnum | -| main.rs:146:9:146:17 | ...::C | main.rs:136:12:137:9 | C | -| main.rs:155:13:155:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:156:13:156:13 | f | main.rs:163:5:165:5 | fn f | -| main.rs:157:13:157:16 | Self | main.rs:151:5:159:5 | trait MyTrait | -| main.rs:157:13:157:19 | ...::f | main.rs:152:9:152:20 | fn f | -| main.rs:164:9:164:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:168:10:168:16 | MyTrait | main.rs:151:5:159:5 | trait MyTrait | -| main.rs:168:22:168:29 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:170:13:170:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:171:13:171:13 | f | main.rs:163:5:165:5 | fn f | -| main.rs:172:13:172:16 | Self | main.rs:167:5:178:5 | impl MyTrait for MyStruct { ... } | -| main.rs:172:13:172:19 | ...::g | main.rs:175:9:177:9 | fn g | -| main.rs:176:13:176:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:181:10:181:17 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:183:13:183:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:184:13:184:13 | f | main.rs:163:5:165:5 | fn f | -| main.rs:190:17:190:24 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:191:9:191:15 | MyTrait | main.rs:151:5:159:5 | trait MyTrait | -| main.rs:191:9:191:18 | ...::f | main.rs:152:9:152:20 | fn f | -| main.rs:192:9:192:16 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:192:9:192:19 | ...::f | main.rs:168:33:173:9 | fn f | -| main.rs:193:10:193:17 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:194:10:194:16 | MyTrait | main.rs:151:5:159:5 | trait MyTrait | -| main.rs:197:17:197:24 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:199:17:199:24 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:201:9:201:16 | MyStruct | main.rs:161:5:161:22 | struct MyStruct | -| main.rs:201:9:201:19 | ...::h | main.rs:181:21:185:9 | fn h | -| main.rs:210:19:210:22 | self | main.rs:206:1:214:1 | mod m9 | -| main.rs:210:19:210:32 | ...::MyStruct | main.rs:207:5:207:26 | struct MyStruct | -| main.rs:211:9:211:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:212:9:212:12 | self | main.rs:206:1:214:1 | mod m9 | -| main.rs:212:9:212:22 | ...::MyStruct | main.rs:207:5:207:26 | struct MyStruct | -| main.rs:222:12:222:12 | T | main.rs:219:7:219:7 | T | -| main.rs:227:12:227:12 | T | main.rs:226:14:226:14 | T | -| main.rs:229:7:231:7 | MyStruct::<...> | main.rs:217:5:223:5 | struct MyStruct | -| main.rs:230:9:230:9 | T | main.rs:226:14:226:14 | T | -| main.rs:233:9:233:16 | MyStruct | main.rs:217:5:223:5 | struct MyStruct | -| main.rs:243:17:243:19 | Foo | main.rs:238:5:238:21 | struct Foo | -| main.rs:244:9:244:11 | Foo | main.rs:240:5:240:15 | fn Foo | -| main.rs:253:9:253:11 | Bar | main.rs:249:5:251:5 | enum Bar | -| main.rs:253:9:253:19 | ...::FooBar | main.rs:250:9:250:17 | FooBar | -| main.rs:258:13:258:15 | Foo | main.rs:238:5:238:21 | struct Foo | -| main.rs:259:17:259:22 | FooBar | main.rs:250:9:250:17 | FooBar | -| main.rs:260:17:260:22 | FooBar | main.rs:255:5:255:18 | fn FooBar | -| main.rs:268:9:268:9 | E | main.rs:263:15:266:5 | enum E | -| main.rs:268:9:268:12 | ...::C | main.rs:265:9:265:9 | C | -| main.rs:271:17:271:17 | S | main.rs:263:5:263:13 | struct S | -| main.rs:272:17:272:17 | C | main.rs:265:9:265:9 | C | -| main.rs:285:16:285:16 | T | main.rs:279:7:279:7 | T | -| main.rs:286:14:286:17 | Self | main.rs:277:5:287:5 | trait MyParamTrait | -| main.rs:286:14:286:33 | ...::AssociatedType | main.rs:281:9:281:28 | type AssociatedType | -| main.rs:295:13:295:16 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:295:13:295:21 | ...::m13 | main.rs:290:1:303:1 | mod m13 | -| main.rs:295:13:295:24 | ...::f | main.rs:291:5:291:17 | fn f | -| main.rs:295:13:295:24 | ...::f | main.rs:291:19:292:19 | struct f | -| main.rs:298:17:298:17 | f | main.rs:291:19:292:19 | struct f | -| main.rs:299:21:299:21 | f | main.rs:291:19:292:19 | struct f | -| main.rs:300:13:300:13 | f | main.rs:291:5:291:17 | fn f | -| main.rs:314:9:314:14 | Trait1 | main.rs:306:5:310:5 | trait Trait1 | -| main.rs:316:13:316:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:317:13:317:16 | Self | main.rs:312:5:320:5 | trait Trait2 | -| main.rs:317:13:317:19 | ...::g | main.rs:309:9:309:20 | fn g | -| main.rs:327:9:327:12 | Self | main.rs:322:5:335:5 | trait Trait3 | -| main.rs:327:15:327:20 | Trait1 | main.rs:306:5:310:5 | trait Trait1 | -| main.rs:328:9:328:10 | TT | main.rs:324:9:324:10 | TT | -| main.rs:328:13:328:18 | Trait1 | main.rs:306:5:310:5 | trait Trait1 | -| main.rs:330:25:330:26 | TT | main.rs:324:9:324:10 | TT | -| main.rs:331:13:331:16 | Self | main.rs:322:5:335:5 | trait Trait3 | -| main.rs:331:13:331:19 | ...::g | main.rs:309:9:309:20 | fn g | -| main.rs:332:13:332:14 | TT | main.rs:324:9:324:10 | TT | -| main.rs:332:13:332:17 | ...::g | main.rs:309:9:309:20 | fn g | -| main.rs:340:10:340:15 | Trait1 | main.rs:306:5:310:5 | trait Trait1 | -| main.rs:341:11:341:11 | S | main.rs:337:5:337:13 | struct S | -| main.rs:343:13:343:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:344:13:344:16 | Self | main.rs:339:5:351:5 | impl Trait1 for S { ... } | -| main.rs:344:13:344:19 | ...::g | main.rs:348:9:350:9 | fn g | -| main.rs:349:13:349:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:354:10:354:15 | Trait2 | main.rs:312:5:320:5 | trait Trait2 | -| main.rs:355:11:355:11 | S | main.rs:337:5:337:13 | struct S | -| main.rs:357:13:357:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:363:9:363:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:364:17:364:17 | S | main.rs:337:5:337:13 | struct S | -| main.rs:365:10:365:10 | S | main.rs:337:5:337:13 | struct S | -| main.rs:366:14:366:19 | Trait1 | main.rs:306:5:310:5 | trait Trait1 | -| main.rs:368:10:368:10 | S | main.rs:337:5:337:13 | struct S | -| main.rs:369:14:369:19 | Trait2 | main.rs:312:5:320:5 | trait Trait2 | -| main.rs:371:9:371:9 | S | main.rs:337:5:337:13 | struct S | -| main.rs:371:9:371:12 | ...::g | main.rs:348:9:350:9 | fn g | -| main.rs:381:24:381:24 | T | main.rs:379:7:379:7 | T | -| main.rs:383:24:383:24 | T | main.rs:379:7:379:7 | T | -| main.rs:386:24:386:24 | T | main.rs:379:7:379:7 | T | -| main.rs:387:13:387:16 | Self | main.rs:377:5:393:5 | trait Trait1 | -| main.rs:387:13:387:19 | ...::g | main.rs:383:9:384:9 | fn g | -| main.rs:391:18:391:18 | T | main.rs:379:7:379:7 | T | -| main.rs:399:9:401:9 | Trait1::<...> | main.rs:377:5:393:5 | trait Trait1 | -| main.rs:400:11:400:11 | T | main.rs:397:7:397:7 | T | -| main.rs:402:24:402:24 | T | main.rs:397:7:397:7 | T | -| main.rs:403:13:403:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:404:13:404:16 | Self | main.rs:395:5:408:5 | trait Trait2 | -| main.rs:404:13:404:19 | ...::g | main.rs:383:9:384:9 | fn g | -| main.rs:406:13:406:16 | Self | main.rs:395:5:408:5 | trait Trait2 | -| main.rs:406:13:406:19 | ...::c | main.rs:391:9:392:9 | Const | -| main.rs:413:10:415:5 | Trait1::<...> | main.rs:377:5:393:5 | trait Trait1 | -| main.rs:414:7:414:7 | S | main.rs:410:5:410:13 | struct S | -| main.rs:416:11:416:11 | S | main.rs:410:5:410:13 | struct S | -| main.rs:417:24:417:24 | S | main.rs:410:5:410:13 | struct S | -| main.rs:418:13:418:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:419:13:419:16 | Self | main.rs:412:5:430:5 | impl Trait1::<...> for S { ... } | -| main.rs:419:13:419:19 | ...::g | main.rs:423:9:426:9 | fn g | -| main.rs:423:24:423:24 | S | main.rs:410:5:410:13 | struct S | -| main.rs:424:13:424:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:425:13:425:16 | Self | main.rs:412:5:430:5 | impl Trait1::<...> for S { ... } | -| main.rs:425:13:425:19 | ...::c | main.rs:428:9:429:9 | Const | -| main.rs:428:18:428:18 | S | main.rs:410:5:410:13 | struct S | -| main.rs:428:22:428:22 | S | main.rs:410:5:410:13 | struct S | -| main.rs:433:10:435:5 | Trait2::<...> | main.rs:395:5:408:5 | trait Trait2 | -| main.rs:434:7:434:7 | S | main.rs:410:5:410:13 | struct S | -| main.rs:436:11:436:11 | S | main.rs:410:5:410:13 | struct S | -| main.rs:437:24:437:24 | S | main.rs:410:5:410:13 | struct S | -| main.rs:438:13:438:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:439:13:439:16 | Self | main.rs:432:5:441:5 | impl Trait2::<...> for S { ... } | -| main.rs:445:9:445:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:446:17:446:17 | S | main.rs:410:5:410:13 | struct S | -| main.rs:447:10:447:10 | S | main.rs:410:5:410:13 | struct S | -| main.rs:448:14:450:11 | Trait1::<...> | main.rs:377:5:393:5 | trait Trait1 | -| main.rs:449:13:449:13 | S | main.rs:410:5:410:13 | struct S | -| main.rs:452:10:452:10 | S | main.rs:410:5:410:13 | struct S | -| main.rs:453:14:455:11 | Trait2::<...> | main.rs:395:5:408:5 | trait Trait2 | -| main.rs:454:13:454:13 | S | main.rs:410:5:410:13 | struct S | -| main.rs:457:9:457:9 | S | main.rs:410:5:410:13 | struct S | -| main.rs:457:9:457:12 | ...::g | main.rs:423:9:426:9 | fn g | -| main.rs:459:9:459:9 | S | main.rs:410:5:410:13 | struct S | -| main.rs:459:9:459:12 | ...::h | main.rs:386:9:389:9 | fn h | -| main.rs:461:9:461:9 | S | main.rs:410:5:410:13 | struct S | -| main.rs:461:9:461:12 | ...::c | main.rs:428:9:429:9 | Const | -| main.rs:462:10:462:10 | S | main.rs:410:5:410:13 | struct S | -| main.rs:463:14:465:11 | Trait1::<...> | main.rs:377:5:393:5 | trait Trait1 | -| main.rs:464:13:464:13 | S | main.rs:410:5:410:13 | struct S | -| main.rs:482:14:482:16 | Foo | main.rs:472:9:474:9 | trait Foo | -| main.rs:482:22:482:22 | X | main.rs:480:9:480:21 | struct X | -| main.rs:484:17:484:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:488:14:488:16 | Bar | main.rs:476:9:478:9 | trait Bar | -| main.rs:488:22:488:22 | X | main.rs:480:9:480:21 | struct X | -| main.rs:490:17:490:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:495:9:495:9 | m | main.rs:471:5:493:5 | mod m | -| main.rs:495:9:495:12 | ...::X | main.rs:480:9:480:21 | struct X | -| main.rs:498:17:498:17 | X | main.rs:480:9:480:21 | struct X | -| main.rs:501:17:501:17 | m | main.rs:471:5:493:5 | mod m | -| main.rs:501:17:501:22 | ...::Foo | main.rs:472:9:474:9 | trait Foo | -| main.rs:502:13:502:13 | X | main.rs:480:9:480:21 | struct X | -| main.rs:502:13:502:23 | ...::a_method | main.rs:482:26:485:13 | fn a_method | -| main.rs:506:17:506:17 | m | main.rs:471:5:493:5 | mod m | -| main.rs:506:17:506:22 | ...::Bar | main.rs:476:9:478:9 | trait Bar | -| main.rs:507:13:507:13 | X | main.rs:480:9:480:21 | struct X | -| main.rs:507:13:507:23 | ...::a_method | main.rs:488:26:491:13 | fn a_method | -| main.rs:511:17:511:17 | m | main.rs:471:5:493:5 | mod m | -| main.rs:511:17:511:22 | ...::Bar | main.rs:476:9:478:9 | trait Bar | -| main.rs:512:13:512:13 | X | main.rs:480:9:480:21 | struct X | -| main.rs:512:13:512:23 | ...::a_method | main.rs:488:26:491:13 | fn a_method | -| main.rs:517:13:517:13 | m | main.rs:471:5:493:5 | mod m | -| main.rs:517:13:517:18 | ...::Bar | main.rs:476:9:478:9 | trait Bar | -| main.rs:517:13:517:28 | ...::a_method | main.rs:477:13:477:31 | fn a_method | -| main.rs:530:10:530:16 | MyTrait | main.rs:523:5:525:5 | trait MyTrait | -| main.rs:531:9:531:9 | S | main.rs:527:5:527:13 | struct S | -| main.rs:533:13:533:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:539:7:539:13 | MyTrait | main.rs:523:5:525:5 | trait MyTrait | -| main.rs:540:10:540:10 | T | main.rs:538:10:538:10 | T | -| main.rs:542:9:542:9 | T | main.rs:538:10:538:10 | T | -| main.rs:542:9:542:12 | ...::f | main.rs:524:9:524:20 | fn f | -| main.rs:543:9:543:15 | MyTrait | main.rs:523:5:525:5 | trait MyTrait | -| main.rs:543:9:543:18 | ...::f | main.rs:524:9:524:20 | fn f | -| main.rs:548:9:548:9 | g | main.rs:537:5:544:5 | fn g | -| main.rs:549:11:549:11 | S | main.rs:527:5:527:13 | struct S | -| main.rs:556:9:556:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:561:13:561:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:566:17:566:23 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:567:17:567:21 | super | main.rs:559:5:571:5 | mod m19 | -| main.rs:567:17:567:24 | ...::f | main.rs:560:9:562:9 | fn f | -| main.rs:568:17:568:21 | super | main.rs:559:5:571:5 | mod m19 | -| main.rs:568:17:568:28 | ...::super | main.rs:554:1:572:1 | mod m18 | -| main.rs:568:17:568:31 | ...::f | main.rs:555:5:557:5 | fn f | -| main.rs:585:13:585:17 | super | main.rs:574:1:599:1 | mod m21 | -| main.rs:585:13:585:22 | ...::m22 | main.rs:575:5:581:5 | mod m22 | -| main.rs:585:13:585:30 | ...::MyEnum | main.rs:576:9:578:9 | enum MyEnum | -| main.rs:586:13:586:16 | self | main.rs:576:9:578:9 | enum MyEnum | -| main.rs:590:13:590:17 | super | main.rs:574:1:599:1 | mod m21 | -| main.rs:590:13:590:22 | ...::m22 | main.rs:575:5:581:5 | mod m22 | -| main.rs:590:13:590:32 | ...::MyStruct | main.rs:580:9:580:28 | struct MyStruct | -| main.rs:591:13:591:16 | self | main.rs:580:9:580:28 | struct MyStruct | -| main.rs:595:21:595:26 | MyEnum | main.rs:576:9:578:9 | enum MyEnum | -| main.rs:595:21:595:29 | ...::A | main.rs:577:13:577:13 | A | -| main.rs:596:21:596:28 | MyStruct | main.rs:580:9:580:28 | struct MyStruct | -| main.rs:612:10:614:5 | Trait1::<...> | main.rs:602:5:607:5 | trait Trait1 | -| main.rs:613:7:613:10 | Self | main.rs:609:5:609:13 | struct S | -| main.rs:615:11:615:11 | S | main.rs:609:5:609:13 | struct S | -| main.rs:617:13:617:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:623:17:623:17 | S | main.rs:609:5:609:13 | struct S | -| main.rs:639:15:639:15 | T | main.rs:638:26:638:26 | T | -| main.rs:644:9:644:24 | GenericStruct::<...> | main.rs:637:5:640:5 | struct GenericStruct | -| main.rs:644:23:644:23 | T | main.rs:643:10:643:10 | T | -| main.rs:646:9:646:9 | T | main.rs:643:10:643:10 | T | -| main.rs:646:12:646:17 | TraitA | main.rs:629:5:631:5 | trait TraitA | -| main.rs:655:9:655:24 | GenericStruct::<...> | main.rs:637:5:640:5 | struct GenericStruct | -| main.rs:655:23:655:23 | T | main.rs:654:10:654:10 | T | -| main.rs:657:9:657:9 | T | main.rs:654:10:654:10 | T | -| main.rs:657:12:657:17 | TraitB | main.rs:633:5:635:5 | trait TraitB | -| main.rs:658:9:658:9 | T | main.rs:654:10:654:10 | T | -| main.rs:658:12:658:17 | TraitA | main.rs:629:5:631:5 | trait TraitA | -| main.rs:669:10:669:15 | TraitA | main.rs:629:5:631:5 | trait TraitA | -| main.rs:669:21:669:31 | Implementor | main.rs:666:5:666:23 | struct Implementor | -| main.rs:671:13:671:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:676:10:676:15 | TraitB | main.rs:633:5:635:5 | trait TraitB | -| main.rs:676:21:676:31 | Implementor | main.rs:666:5:666:23 | struct Implementor | -| main.rs:678:13:678:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:684:24:684:34 | Implementor | main.rs:666:5:666:23 | struct Implementor | -| main.rs:685:23:685:35 | GenericStruct | main.rs:637:5:640:5 | struct GenericStruct | -| main.rs:691:9:691:36 | GenericStruct::<...> | main.rs:637:5:640:5 | struct GenericStruct | -| main.rs:691:9:691:50 | ...::call_trait_a | main.rs:648:9:650:9 | fn call_trait_a | -| main.rs:691:25:691:35 | Implementor | main.rs:666:5:666:23 | struct Implementor | -| main.rs:694:9:694:36 | GenericStruct::<...> | main.rs:637:5:640:5 | struct GenericStruct | -| main.rs:694:9:694:47 | ...::call_both | main.rs:660:9:663:9 | fn call_both | -| main.rs:694:25:694:35 | Implementor | main.rs:666:5:666:23 | struct Implementor | -| main.rs:700:3:700:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:700:3:700:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:704:6:704:12 | AStruct | main.rs:703:1:703:17 | struct AStruct | -| main.rs:706:7:706:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:706:7:706:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:709:7:709:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:709:7:709:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:714:9:714:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:714:9:714:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | -| main.rs:714:9:714:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:715:9:715:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:715:9:715:19 | ...::result | {EXTERNAL LOCATION} | mod result | -| main.rs:715:9:715:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | -| main.rs:723:19:723:22 | Self | main.rs:717:5:725:5 | trait Reduce | -| main.rs:723:19:723:29 | ...::Input | main.rs:718:9:718:19 | type Input | -| main.rs:724:14:724:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:724:21:724:24 | Self | main.rs:717:5:725:5 | trait Reduce | -| main.rs:724:21:724:32 | ...::Output | main.rs:719:21:720:20 | type Output | -| main.rs:724:35:724:38 | Self | main.rs:717:5:725:5 | trait Reduce | -| main.rs:724:35:724:45 | ...::Error | main.rs:718:21:719:19 | type Error | -| main.rs:728:17:728:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:728:29:728:33 | Input | main.rs:727:19:727:23 | Input | -| main.rs:729:17:729:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:729:29:729:33 | Error | main.rs:727:26:727:30 | Error | -| main.rs:736:11:736:16 | Reduce | main.rs:717:5:725:5 | trait Reduce | -| main.rs:737:13:740:9 | MyImpl::<...> | main.rs:727:5:730:5 | struct MyImpl | -| main.rs:738:13:738:17 | Input | main.rs:734:13:734:17 | Input | -| main.rs:739:13:739:17 | Error | main.rs:735:13:735:17 | Error | -| main.rs:742:22:745:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:743:13:743:17 | Input | main.rs:734:13:734:17 | Input | -| main.rs:744:13:744:16 | Self | main.rs:732:5:764:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:744:13:744:23 | ...::Error | main.rs:746:11:750:9 | type Error | -| main.rs:747:22:749:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:748:11:748:15 | Error | main.rs:735:13:735:17 | Error | -| main.rs:752:13:752:17 | Input | main.rs:734:13:734:17 | Input | -| main.rs:757:19:757:22 | Self | main.rs:732:5:764:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:757:19:757:29 | ...::Input | main.rs:742:9:746:9 | type Input | -| main.rs:758:14:761:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:759:13:759:16 | Self | main.rs:732:5:764:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:759:13:759:24 | ...::Output | main.rs:750:11:753:9 | type Output | -| main.rs:760:13:760:16 | Self | main.rs:732:5:764:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:760:13:760:23 | ...::Error | main.rs:746:11:750:9 | type Error | -| main.rs:767:5:767:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:767:11:767:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:769:15:769:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:769:15:769:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:769:15:769:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:779:7:779:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:779:7:779:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | -| main.rs:780:10:780:15 | ATrait | main.rs:775:5:777:5 | trait ATrait | -| main.rs:780:21:780:23 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:782:11:782:13 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:788:17:788:19 | Foo | main.rs:773:5:773:15 | struct Foo | -| main.rs:793:5:793:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:793:5:793:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:793:5:793:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:793:5:793:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:793:5:793:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:794:5:794:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:794:5:794:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:795:5:795:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:795:5:795:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:795:5:795:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:795:5:795:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:796:5:796:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:797:5:797:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:798:5:798:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:798:5:798:12 | ...::h | main.rs:56:1:75:1 | fn h | -| main.rs:799:5:799:6 | m1 | main.rs:19:1:43:1 | mod m1 | -| main.rs:799:5:799:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | -| main.rs:799:5:799:13 | ...::g | main.rs:29:9:33:9 | fn g | -| main.rs:800:5:800:6 | m1 | main.rs:19:1:43:1 | mod m1 | -| main.rs:800:5:800:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | -| main.rs:800:5:800:14 | ...::m3 | main.rs:35:9:41:9 | mod m3 | -| main.rs:800:5:800:17 | ...::h | main.rs:36:27:40:13 | fn h | -| main.rs:801:5:801:6 | m4 | main.rs:45:1:52:1 | mod m4 | -| main.rs:801:5:801:9 | ...::i | main.rs:48:5:51:5 | fn i | -| main.rs:802:5:802:5 | h | main.rs:56:1:75:1 | fn h | -| main.rs:803:5:803:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:804:5:804:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:805:5:805:5 | j | main.rs:103:1:107:1 | fn j | -| main.rs:806:5:806:6 | m6 | main.rs:115:1:127:1 | mod m6 | -| main.rs:806:5:806:9 | ...::g | main.rs:120:5:126:5 | fn g | -| main.rs:807:5:807:6 | m7 | main.rs:129:1:148:1 | mod m7 | -| main.rs:807:5:807:9 | ...::f | main.rs:140:5:147:5 | fn f | -| main.rs:808:5:808:6 | m8 | main.rs:150:1:204:1 | mod m8 | -| main.rs:808:5:808:9 | ...::g | main.rs:188:5:203:5 | fn g | -| main.rs:809:5:809:6 | m9 | main.rs:206:1:214:1 | mod m9 | -| main.rs:809:5:809:9 | ...::f | main.rs:209:5:213:5 | fn f | -| main.rs:810:5:810:7 | m11 | main.rs:237:1:274:1 | mod m11 | -| main.rs:810:5:810:10 | ...::f | main.rs:242:5:245:5 | fn f | -| main.rs:811:5:811:7 | m15 | main.rs:305:1:374:1 | mod m15 | -| main.rs:811:5:811:10 | ...::f | main.rs:361:5:373:5 | fn f | -| main.rs:812:5:812:7 | m16 | main.rs:376:1:468:1 | mod m16 | -| main.rs:812:5:812:10 | ...::f | main.rs:443:5:467:5 | fn f | -| main.rs:813:5:813:20 | trait_visibility | main.rs:470:1:520:1 | mod trait_visibility | -| main.rs:813:5:813:23 | ...::f | main.rs:497:5:519:5 | fn f | -| main.rs:814:5:814:7 | m17 | main.rs:522:1:552:1 | mod m17 | -| main.rs:814:5:814:10 | ...::f | main.rs:546:5:551:5 | fn f | -| main.rs:815:5:815:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:815:5:815:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:816:5:816:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:816:5:816:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:817:5:817:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | -| main.rs:817:5:817:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:818:5:818:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:819:5:819:7 | m18 | main.rs:554:1:572:1 | mod m18 | -| main.rs:819:5:819:12 | ...::m19 | main.rs:559:5:571:5 | mod m19 | -| main.rs:819:5:819:17 | ...::m20 | main.rs:564:9:570:9 | mod m20 | -| main.rs:819:5:819:20 | ...::g | main.rs:565:13:569:13 | fn g | -| main.rs:820:5:820:7 | m23 | main.rs:601:1:626:1 | mod m23 | -| main.rs:820:5:820:10 | ...::f | main.rs:621:5:625:5 | fn f | -| main.rs:821:5:821:7 | m24 | main.rs:628:1:696:1 | mod m24 | -| main.rs:821:5:821:10 | ...::f | main.rs:682:5:695:5 | fn f | -| main.rs:822:5:822:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:822:5:822:11 | ...::h | main.rs:56:1:75:1 | fn h | -| main.rs:823:5:823:13 | z_changed | main.rs:701:1:701:9 | fn z_changed | -| main.rs:824:5:824:11 | AStruct | main.rs:703:1:703:17 | struct AStruct | -| main.rs:824:5:824:22 | ...::z_on_type | main.rs:707:5:707:17 | fn z_on_type | -| main.rs:825:5:825:11 | AStruct | main.rs:703:1:703:17 | struct AStruct | -| main.rs:826:5:826:29 | impl_with_attribute_macro | main.rs:771:1:790:1 | mod impl_with_attribute_macro | -| main.rs:826:5:826:35 | ...::test | main.rs:786:5:789:5 | fn test | +| main.rs:4:8:4:9 | my | main.rs:1:1:1:7 | mod my | +| main.rs:4:14:4:17 | self | main.rs:1:1:1:7 | mod my | +| main.rs:6:5:6:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:6:5:6:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:6:5:6:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:6:5:6:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:10:5:10:7 | my2 | main.rs:8:1:8:8 | mod my2 | +| main.rs:13:5:13:7 | my2 | main.rs:8:1:8:8 | mod my2 | +| main.rs:13:5:13:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:13:5:13:25 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:13:5:13:34 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:14:5:14:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:15:5:15:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:18:5:18:7 | my2 | main.rs:8:1:8:8 | mod my2 | +| main.rs:18:5:18:18 | ...::nested8_f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:22:9:22:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:27:13:27:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:31:13:31:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:32:13:32:13 | f | main.rs:26:9:28:9 | fn f | +| main.rs:33:13:33:17 | super | main.rs:20:1:44:1 | mod m1 | +| main.rs:33:13:33:20 | ...::f | main.rs:21:5:23:5 | fn f | +| main.rs:37:17:37:21 | super | main.rs:25:5:43:5 | mod m2 | +| main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f | +| main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f | +| main.rs:47:9:47:13 | super | main.rs:1:1:978:2 | SourceFile | +| main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:50:9:50:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:51:9:51:9 | g | main.rs:30:9:34:9 | fn g | +| main.rs:58:5:58:11 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:63:13:63:14 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:63:13:63:18 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:63:13:63:21 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:64:9:64:9 | g | main.rs:30:9:34:9 | fn g | +| main.rs:67:9:67:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo | +| main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo | +| main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f | +| main.rs:75:5:75:8 | self | main.rs:1:1:978:2 | SourceFile | +| main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i | +| main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo | +| main.rs:85:16:85:18 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:88:17:88:19 | Foo | main.rs:84:9:86:9 | struct Foo | +| main.rs:92:5:92:7 | my2 | main.rs:8:1:8:8 | mod my2 | +| main.rs:92:5:92:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:94:5:94:21 | my2_nested2_alias | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:94:5:94:30 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:94:34:94:40 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:94:34:94:43 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:94:57:94:63 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:94:57:94:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:94:80:94:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:105:5:105:11 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:106:5:106:15 | fn_in_macro | main.rs:96:1:102:1 | MacroRules | +| main.rs:106:18:106:24 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:107:5:107:22 | f_defined_in_macro | main.rs:106:18:106:42 | fn f_defined_in_macro | +| main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:125:13:125:17 | super | main.rs:1:1:978:2 | SourceFile | +| main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 | +| main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f | +| main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f | +| main.rs:133:13:133:15 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:136:16:136:18 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:142:19:142:24 | MyEnum | main.rs:131:5:139:5 | enum MyEnum | +| main.rs:144:9:144:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:145:17:145:22 | MyEnum | main.rs:131:5:139:5 | enum MyEnum | +| main.rs:145:17:145:25 | ...::A | main.rs:132:9:134:9 | A | +| main.rs:146:17:146:22 | MyEnum | main.rs:131:5:139:5 | enum MyEnum | +| main.rs:146:17:146:25 | ...::B | main.rs:134:12:137:9 | B | +| main.rs:147:9:147:14 | MyEnum | main.rs:131:5:139:5 | enum MyEnum | +| main.rs:147:9:147:17 | ...::C | main.rs:137:12:138:9 | C | +| main.rs:156:13:156:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:157:13:157:13 | f | main.rs:164:5:166:5 | fn f | +| main.rs:158:13:158:16 | Self | main.rs:152:5:160:5 | trait MyTrait | +| main.rs:158:13:158:19 | ...::f | main.rs:153:9:153:20 | fn f | +| main.rs:165:9:165:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:169:10:169:16 | MyTrait | main.rs:152:5:160:5 | trait MyTrait | +| main.rs:169:22:169:29 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:171:13:171:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:172:13:172:13 | f | main.rs:164:5:166:5 | fn f | +| main.rs:173:13:173:16 | Self | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:173:13:173:19 | ...::g | main.rs:176:9:178:9 | fn g | +| main.rs:177:13:177:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:182:10:182:17 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:184:13:184:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:185:13:185:13 | f | main.rs:164:5:166:5 | fn f | +| main.rs:191:17:191:24 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:192:9:192:15 | MyTrait | main.rs:152:5:160:5 | trait MyTrait | +| main.rs:192:9:192:18 | ...::f | main.rs:153:9:153:20 | fn f | +| main.rs:193:9:193:16 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:193:9:193:19 | ...::f | main.rs:169:33:174:9 | fn f | +| main.rs:194:10:194:17 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:195:10:195:16 | MyTrait | main.rs:152:5:160:5 | trait MyTrait | +| main.rs:198:17:198:24 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:200:17:200:24 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:202:9:202:16 | MyStruct | main.rs:162:5:162:22 | struct MyStruct | +| main.rs:202:9:202:19 | ...::h | main.rs:182:21:186:9 | fn h | +| main.rs:211:19:211:22 | self | main.rs:207:1:215:1 | mod m9 | +| main.rs:211:19:211:32 | ...::MyStruct | main.rs:208:5:208:26 | struct MyStruct | +| main.rs:212:9:212:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:213:9:213:12 | self | main.rs:207:1:215:1 | mod m9 | +| main.rs:213:9:213:22 | ...::MyStruct | main.rs:208:5:208:26 | struct MyStruct | +| main.rs:223:12:223:12 | T | main.rs:220:7:220:7 | T | +| main.rs:228:12:228:12 | T | main.rs:227:14:227:14 | T | +| main.rs:230:7:232:7 | MyStruct::<...> | main.rs:218:5:224:5 | struct MyStruct | +| main.rs:231:9:231:9 | T | main.rs:227:14:227:14 | T | +| main.rs:234:9:234:16 | MyStruct | main.rs:218:5:224:5 | struct MyStruct | +| main.rs:244:17:244:19 | Foo | main.rs:239:5:239:21 | struct Foo | +| main.rs:245:9:245:11 | Foo | main.rs:241:5:241:15 | fn Foo | +| main.rs:254:9:254:11 | Bar | main.rs:250:5:252:5 | enum Bar | +| main.rs:254:9:254:19 | ...::FooBar | main.rs:251:9:251:17 | FooBar | +| main.rs:259:13:259:15 | Foo | main.rs:239:5:239:21 | struct Foo | +| main.rs:260:17:260:22 | FooBar | main.rs:251:9:251:17 | FooBar | +| main.rs:261:17:261:22 | FooBar | main.rs:256:5:256:18 | fn FooBar | +| main.rs:269:9:269:9 | E | main.rs:264:15:267:5 | enum E | +| main.rs:269:9:269:12 | ...::C | main.rs:266:9:266:9 | C | +| main.rs:272:17:272:17 | S | main.rs:264:5:264:13 | struct S | +| main.rs:273:17:273:17 | C | main.rs:266:9:266:9 | C | +| main.rs:286:16:286:16 | T | main.rs:280:7:280:7 | T | +| main.rs:287:14:287:17 | Self | main.rs:278:5:288:5 | trait MyParamTrait | +| main.rs:287:14:287:33 | ...::AssociatedType | main.rs:282:9:282:28 | type AssociatedType | +| main.rs:296:13:296:16 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:296:13:296:21 | ...::m13 | main.rs:291:1:304:1 | mod m13 | +| main.rs:296:13:296:24 | ...::f | main.rs:292:5:292:17 | fn f | +| main.rs:296:13:296:24 | ...::f | main.rs:292:19:293:19 | struct f | +| main.rs:299:17:299:17 | f | main.rs:292:19:293:19 | struct f | +| main.rs:300:21:300:21 | f | main.rs:292:19:293:19 | struct f | +| main.rs:301:13:301:13 | f | main.rs:292:5:292:17 | fn f | +| main.rs:315:9:315:14 | Trait1 | main.rs:307:5:311:5 | trait Trait1 | +| main.rs:317:13:317:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:318:13:318:16 | Self | main.rs:313:5:321:5 | trait Trait2 | +| main.rs:318:13:318:19 | ...::g | main.rs:310:9:310:20 | fn g | +| main.rs:328:9:328:12 | Self | main.rs:323:5:336:5 | trait Trait3 | +| main.rs:328:15:328:20 | Trait1 | main.rs:307:5:311:5 | trait Trait1 | +| main.rs:329:9:329:10 | TT | main.rs:325:9:325:10 | TT | +| main.rs:329:13:329:18 | Trait1 | main.rs:307:5:311:5 | trait Trait1 | +| main.rs:331:25:331:26 | TT | main.rs:325:9:325:10 | TT | +| main.rs:332:13:332:16 | Self | main.rs:323:5:336:5 | trait Trait3 | +| main.rs:332:13:332:19 | ...::g | main.rs:310:9:310:20 | fn g | +| main.rs:333:13:333:14 | TT | main.rs:325:9:325:10 | TT | +| main.rs:333:13:333:17 | ...::g | main.rs:310:9:310:20 | fn g | +| main.rs:341:10:341:15 | Trait1 | main.rs:307:5:311:5 | trait Trait1 | +| main.rs:342:11:342:11 | S | main.rs:338:5:338:13 | struct S | +| main.rs:344:13:344:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:345:13:345:16 | Self | main.rs:338:5:338:13 | struct S | +| main.rs:345:13:345:19 | ...::g | main.rs:349:9:351:9 | fn g | +| main.rs:350:13:350:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:355:10:355:15 | Trait2 | main.rs:313:5:321:5 | trait Trait2 | +| main.rs:356:11:356:11 | S | main.rs:338:5:338:13 | struct S | +| main.rs:358:13:358:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:364:9:364:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:365:17:365:17 | S | main.rs:338:5:338:13 | struct S | +| main.rs:366:10:366:10 | S | main.rs:338:5:338:13 | struct S | +| main.rs:367:14:367:19 | Trait1 | main.rs:307:5:311:5 | trait Trait1 | +| main.rs:369:10:369:10 | S | main.rs:338:5:338:13 | struct S | +| main.rs:370:14:370:19 | Trait2 | main.rs:313:5:321:5 | trait Trait2 | +| main.rs:372:9:372:9 | S | main.rs:338:5:338:13 | struct S | +| main.rs:372:9:372:12 | ...::g | main.rs:349:9:351:9 | fn g | +| main.rs:382:24:382:24 | T | main.rs:380:7:380:7 | T | +| main.rs:384:24:384:24 | T | main.rs:380:7:380:7 | T | +| main.rs:388:24:388:24 | T | main.rs:380:7:380:7 | T | +| main.rs:389:13:389:16 | Self | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:389:13:389:19 | ...::g | main.rs:384:9:386:9 | fn g | +| main.rs:393:18:393:18 | T | main.rs:380:7:380:7 | T | +| main.rs:401:9:403:9 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:402:11:402:11 | T | main.rs:399:7:399:7 | T | +| main.rs:404:24:404:24 | T | main.rs:399:7:399:7 | T | +| main.rs:405:13:405:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:406:13:406:16 | Self | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:406:13:406:19 | ...::g | main.rs:384:9:386:9 | fn g | +| main.rs:408:13:408:16 | Self | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:408:13:408:19 | ...::c | main.rs:393:9:394:9 | Const | +| main.rs:415:10:417:5 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:416:7:416:7 | S | main.rs:412:5:412:13 | struct S | +| main.rs:418:11:418:11 | S | main.rs:412:5:412:13 | struct S | +| main.rs:419:24:419:24 | S | main.rs:412:5:412:13 | struct S | +| main.rs:420:13:420:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:421:13:421:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:421:13:421:19 | ...::g | main.rs:425:9:428:9 | fn g | +| main.rs:425:24:425:24 | S | main.rs:412:5:412:13 | struct S | +| main.rs:426:13:426:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:427:13:427:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:427:13:427:19 | ...::c | main.rs:430:9:431:9 | Const | +| main.rs:430:18:430:18 | S | main.rs:412:5:412:13 | struct S | +| main.rs:430:22:430:22 | S | main.rs:412:5:412:13 | struct S | +| main.rs:435:10:437:5 | Trait2::<...> | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:436:7:436:7 | S | main.rs:412:5:412:13 | struct S | +| main.rs:438:11:438:11 | S | main.rs:412:5:412:13 | struct S | +| main.rs:439:24:439:24 | S | main.rs:412:5:412:13 | struct S | +| main.rs:440:13:440:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:440:13:440:19 | ...::g | main.rs:425:9:428:9 | fn g | +| main.rs:441:13:441:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:442:13:442:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:442:13:442:19 | ...::c | main.rs:430:9:431:9 | Const | +| main.rs:448:9:448:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:449:17:449:17 | S | main.rs:412:5:412:13 | struct S | +| main.rs:450:10:450:10 | S | main.rs:412:5:412:13 | struct S | +| main.rs:451:14:453:11 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:452:13:452:13 | S | main.rs:412:5:412:13 | struct S | +| main.rs:455:10:455:10 | S | main.rs:412:5:412:13 | struct S | +| main.rs:456:14:458:11 | Trait2::<...> | main.rs:397:5:410:5 | trait Trait2 | +| main.rs:457:13:457:13 | S | main.rs:412:5:412:13 | struct S | +| main.rs:460:9:460:9 | S | main.rs:412:5:412:13 | struct S | +| main.rs:460:9:460:12 | ...::g | main.rs:425:9:428:9 | fn g | +| main.rs:462:9:462:9 | S | main.rs:412:5:412:13 | struct S | +| main.rs:462:9:462:12 | ...::h | main.rs:388:9:391:9 | fn h | +| main.rs:464:9:464:9 | S | main.rs:412:5:412:13 | struct S | +| main.rs:464:9:464:12 | ...::c | main.rs:430:9:431:9 | Const | +| main.rs:465:10:465:10 | S | main.rs:412:5:412:13 | struct S | +| main.rs:466:14:468:11 | Trait1::<...> | main.rs:378:5:395:5 | trait Trait1 | +| main.rs:467:13:467:13 | S | main.rs:412:5:412:13 | struct S | +| main.rs:487:10:487:15 | Trait3 | main.rs:472:5:476:5 | trait Trait3 | +| main.rs:487:21:487:22 | S2 | main.rs:484:5:484:14 | struct S2 | +| main.rs:488:26:488:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:492:20:492:23 | Self | main.rs:484:5:484:14 | struct S2 | +| main.rs:492:20:492:34 | ...::AssocType | main.rs:487:26:489:9 | type AssocType | +| main.rs:497:10:497:15 | Trait4 | main.rs:478:5:482:5 | trait Trait4 | +| main.rs:497:21:497:22 | S2 | main.rs:484:5:484:14 | struct S2 | +| main.rs:498:26:498:29 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:502:13:502:16 | Self | main.rs:484:5:484:14 | struct S2 | +| main.rs:502:13:502:19 | ...::f | main.rs:489:11:493:9 | fn f | +| main.rs:503:13:503:14 | S2 | main.rs:484:5:484:14 | struct S2 | +| main.rs:503:13:503:17 | ...::f | main.rs:489:11:493:9 | fn f | +| main.rs:504:20:504:23 | Self | main.rs:484:5:484:14 | struct S2 | +| main.rs:504:20:504:34 | ...::AssocType | main.rs:497:26:499:9 | type AssocType | +| main.rs:511:23:511:26 | Self | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:511:23:511:33 | ...::Assoc | main.rs:509:9:509:19 | type Assoc | +| main.rs:515:10:515:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:515:21:515:21 | S | main.rs:412:5:412:13 | struct S | +| main.rs:516:22:516:24 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:520:16:520:19 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:520:16:520:26 | ...::Assoc | main.rs:515:25:517:9 | type Assoc | +| main.rs:521:13:521:16 | Self | main.rs:412:5:412:13 | struct S | +| main.rs:521:13:521:23 | ...::Assoc | main.rs:519:9:522:9 | fn Assoc | +| main.rs:525:19:525:20 | T3 | main.rs:525:15:525:16 | T3 | +| main.rs:528:10:528:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:528:21:528:27 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:528:24:528:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:529:22:529:24 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:533:16:533:19 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:533:16:533:26 | ...::Assoc | main.rs:528:31:530:9 | type Assoc | +| main.rs:534:13:534:16 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:534:13:534:23 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc | +| main.rs:539:10:539:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 | +| main.rs:539:21:539:28 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:539:24:539:27 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:540:22:540:25 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:544:16:544:19 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:544:16:544:26 | ...::Assoc | main.rs:539:32:541:9 | type Assoc | +| main.rs:545:14:545:17 | Self | main.rs:525:5:525:22 | struct S3 | +| main.rs:545:14:545:24 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | +| main.rs:550:10:550:16 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:550:13:550:15 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:551:20:551:22 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:557:10:557:17 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:557:13:557:16 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:558:20:558:23 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:565:9:565:17 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:565:9:566:13 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc | +| main.rs:565:9:566:13 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc | +| main.rs:565:14:565:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:568:9:568:18 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:568:9:569:10 | ...::f1 | main.rs:550:20:553:9 | fn f1 | +| main.rs:568:9:569:10 | ...::f1 | main.rs:557:21:560:9 | fn f1 | +| main.rs:568:14:568:17 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:571:9:571:17 | S3::<...> | main.rs:525:5:525:22 | struct S3 | +| main.rs:571:9:572:10 | ...::f1 | main.rs:550:20:553:9 | fn f1 | +| main.rs:571:9:572:10 | ...::f1 | main.rs:557:21:560:9 | fn f1 | +| main.rs:571:14:571:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:588:14:588:16 | Foo | main.rs:578:9:580:9 | trait Foo | +| main.rs:588:22:588:22 | X | main.rs:586:9:586:21 | struct X | +| main.rs:590:17:590:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:594:14:594:16 | Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:594:22:594:22 | X | main.rs:586:9:586:21 | struct X | +| main.rs:596:17:596:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:601:9:601:9 | m | main.rs:577:5:599:5 | mod m | +| main.rs:601:9:601:12 | ...::X | main.rs:586:9:586:21 | struct X | +| main.rs:604:17:604:17 | X | main.rs:586:9:586:21 | struct X | +| main.rs:607:17:607:17 | m | main.rs:577:5:599:5 | mod m | +| main.rs:607:17:607:22 | ...::Foo | main.rs:578:9:580:9 | trait Foo | +| main.rs:608:13:608:13 | X | main.rs:586:9:586:21 | struct X | +| main.rs:608:13:608:23 | ...::a_method | main.rs:588:26:591:13 | fn a_method | +| main.rs:612:17:612:17 | m | main.rs:577:5:599:5 | mod m | +| main.rs:612:17:612:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:613:13:613:13 | X | main.rs:586:9:586:21 | struct X | +| main.rs:613:13:613:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method | +| main.rs:617:17:617:17 | m | main.rs:577:5:599:5 | mod m | +| main.rs:617:17:617:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:618:13:618:13 | X | main.rs:586:9:586:21 | struct X | +| main.rs:618:13:618:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method | +| main.rs:623:13:623:13 | m | main.rs:577:5:599:5 | mod m | +| main.rs:623:13:623:18 | ...::Bar | main.rs:582:9:584:9 | trait Bar | +| main.rs:623:13:623:28 | ...::a_method | main.rs:583:13:583:31 | fn a_method | +| main.rs:636:10:636:16 | MyTrait | main.rs:629:5:631:5 | trait MyTrait | +| main.rs:637:9:637:9 | S | main.rs:633:5:633:13 | struct S | +| main.rs:639:13:639:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:645:7:645:13 | MyTrait | main.rs:629:5:631:5 | trait MyTrait | +| main.rs:646:10:646:10 | T | main.rs:644:10:644:10 | T | +| main.rs:648:9:648:9 | T | main.rs:644:10:644:10 | T | +| main.rs:648:9:648:12 | ...::f | main.rs:630:9:630:20 | fn f | +| main.rs:649:9:649:15 | MyTrait | main.rs:629:5:631:5 | trait MyTrait | +| main.rs:649:9:649:18 | ...::f | main.rs:630:9:630:20 | fn f | +| main.rs:654:9:654:9 | g | main.rs:643:5:650:5 | fn g | +| main.rs:655:11:655:11 | S | main.rs:633:5:633:13 | struct S | +| main.rs:662:9:662:15 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:667:13:667:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:672:17:672:23 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:673:17:673:21 | super | main.rs:665:5:677:5 | mod m19 | +| main.rs:673:17:673:24 | ...::f | main.rs:666:9:668:9 | fn f | +| main.rs:674:17:674:21 | super | main.rs:665:5:677:5 | mod m19 | +| main.rs:674:17:674:28 | ...::super | main.rs:660:1:678:1 | mod m18 | +| main.rs:674:17:674:31 | ...::f | main.rs:661:5:663:5 | fn f | +| main.rs:691:13:691:17 | super | main.rs:680:1:705:1 | mod m21 | +| main.rs:691:13:691:22 | ...::m22 | main.rs:681:5:687:5 | mod m22 | +| main.rs:691:13:691:30 | ...::MyEnum | main.rs:682:9:684:9 | enum MyEnum | +| main.rs:692:13:692:16 | self | main.rs:682:9:684:9 | enum MyEnum | +| main.rs:696:13:696:17 | super | main.rs:680:1:705:1 | mod m21 | +| main.rs:696:13:696:22 | ...::m22 | main.rs:681:5:687:5 | mod m22 | +| main.rs:696:13:696:32 | ...::MyStruct | main.rs:686:9:686:28 | struct MyStruct | +| main.rs:697:13:697:16 | self | main.rs:686:9:686:28 | struct MyStruct | +| main.rs:701:21:701:26 | MyEnum | main.rs:682:9:684:9 | enum MyEnum | +| main.rs:701:21:701:29 | ...::A | main.rs:683:13:683:13 | A | +| main.rs:702:21:702:28 | MyStruct | main.rs:686:9:686:28 | struct MyStruct | +| main.rs:718:10:720:5 | Trait1::<...> | main.rs:708:5:713:5 | trait Trait1 | +| main.rs:719:7:719:10 | Self | main.rs:715:5:715:13 | struct S | +| main.rs:721:11:721:11 | S | main.rs:715:5:715:13 | struct S | +| main.rs:723:13:723:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:729:17:729:17 | S | main.rs:715:5:715:13 | struct S | +| main.rs:745:15:745:15 | T | main.rs:744:26:744:26 | T | +| main.rs:750:9:750:24 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:750:23:750:23 | T | main.rs:749:10:749:10 | T | +| main.rs:752:9:752:9 | T | main.rs:749:10:749:10 | T | +| main.rs:752:12:752:17 | TraitA | main.rs:735:5:737:5 | trait TraitA | +| main.rs:761:9:761:24 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:761:23:761:23 | T | main.rs:760:10:760:10 | T | +| main.rs:763:9:763:9 | T | main.rs:760:10:760:10 | T | +| main.rs:763:12:763:17 | TraitB | main.rs:739:5:741:5 | trait TraitB | +| main.rs:764:9:764:9 | T | main.rs:760:10:760:10 | T | +| main.rs:764:12:764:17 | TraitA | main.rs:735:5:737:5 | trait TraitA | +| main.rs:775:10:775:15 | TraitA | main.rs:735:5:737:5 | trait TraitA | +| main.rs:775:21:775:31 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:777:13:777:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:782:10:782:15 | TraitB | main.rs:739:5:741:5 | trait TraitB | +| main.rs:782:21:782:31 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:784:13:784:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:790:24:790:34 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:791:23:791:35 | GenericStruct | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:797:9:797:36 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:797:9:797:50 | ...::call_trait_a | main.rs:754:9:756:9 | fn call_trait_a | +| main.rs:797:25:797:35 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:800:9:800:36 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct | +| main.rs:800:9:800:47 | ...::call_both | main.rs:766:9:769:9 | fn call_both | +| main.rs:800:25:800:35 | Implementor | main.rs:772:5:772:23 | struct Implementor | +| main.rs:806:3:806:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:806:3:806:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:810:6:810:12 | AStruct | main.rs:809:1:809:17 | struct AStruct | +| main.rs:812:7:812:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:812:7:812:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:815:7:815:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:815:7:815:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:820:9:820:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:820:9:820:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:820:9:820:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:821:9:821:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:821:9:821:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:821:9:821:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:829:19:829:22 | Self | main.rs:823:5:831:5 | trait Reduce | +| main.rs:829:19:829:29 | ...::Input | main.rs:824:9:824:19 | type Input | +| main.rs:830:14:830:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:830:21:830:24 | Self | main.rs:823:5:831:5 | trait Reduce | +| main.rs:830:21:830:32 | ...::Output | main.rs:825:21:826:20 | type Output | +| main.rs:830:35:830:38 | Self | main.rs:823:5:831:5 | trait Reduce | +| main.rs:830:35:830:45 | ...::Error | main.rs:824:21:825:19 | type Error | +| main.rs:834:17:834:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:834:29:834:33 | Input | main.rs:833:19:833:23 | Input | +| main.rs:835:17:835:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:835:29:835:33 | Error | main.rs:833:26:833:30 | Error | +| main.rs:842:11:842:16 | Reduce | main.rs:823:5:831:5 | trait Reduce | +| main.rs:843:13:846:9 | MyImpl::<...> | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:844:13:844:17 | Input | main.rs:840:13:840:17 | Input | +| main.rs:845:13:845:17 | Error | main.rs:841:13:841:17 | Error | +| main.rs:848:22:851:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:849:13:849:17 | Input | main.rs:840:13:840:17 | Input | +| main.rs:850:13:850:16 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:850:13:850:23 | ...::Error | main.rs:852:11:856:9 | type Error | +| main.rs:853:22:855:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:854:11:854:15 | Error | main.rs:841:13:841:17 | Error | +| main.rs:858:13:858:17 | Input | main.rs:840:13:840:17 | Input | +| main.rs:863:19:863:22 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:863:19:863:29 | ...::Input | main.rs:848:9:852:9 | type Input | +| main.rs:864:14:867:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:865:13:865:16 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:865:13:865:24 | ...::Output | main.rs:856:11:859:9 | type Output | +| main.rs:866:13:866:16 | Self | main.rs:833:5:836:5 | struct MyImpl | +| main.rs:866:13:866:23 | ...::Error | main.rs:852:11:856:9 | type Error | +| main.rs:873:5:873:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:873:11:873:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:875:15:875:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:875:15:875:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:875:15:875:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:885:7:885:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:885:7:885:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | +| main.rs:886:10:886:15 | ATrait | main.rs:881:5:883:5 | trait ATrait | +| main.rs:886:21:886:23 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:888:11:888:13 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:894:17:894:19 | Foo | main.rs:879:5:879:15 | struct Foo | +| main.rs:900:22:900:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:900:29:900:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:901:17:901:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:902:17:902:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:902:24:902:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:903:13:903:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:904:17:904:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:906:13:906:16 | None | {EXTERNAL LOCATION} | None | +| main.rs:907:17:907:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:916:19:916:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:916:26:916:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:917:26:917:29 | test | main.rs:899:5:913:5 | fn test | +| main.rs:923:14:923:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:928:17:928:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:930:13:930:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:935:13:935:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:935:18:935:18 | z | main.rs:922:5:924:12 | Const | +| main.rs:935:24:935:24 | z | main.rs:922:5:924:12 | Const | +| main.rs:942:5:942:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:942:5:942:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:942:5:942:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:942:5:942:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:942:5:942:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:943:5:943:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:943:5:943:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:944:5:944:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:944:5:944:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:944:5:944:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:944:5:944:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:945:5:945:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:946:5:946:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:947:5:947:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:947:5:947:12 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:948:5:948:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:948:5:948:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:948:5:948:13 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:949:5:949:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:949:5:949:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:949:5:949:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | +| main.rs:949:5:949:17 | ...::h | main.rs:37:27:41:13 | fn h | +| main.rs:950:5:950:6 | m4 | main.rs:46:1:53:1 | mod m4 | +| main.rs:950:5:950:9 | ...::i | main.rs:49:5:52:5 | fn i | +| main.rs:951:5:951:5 | h | main.rs:57:1:76:1 | fn h | +| main.rs:952:5:952:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:953:5:953:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:954:5:954:5 | j | main.rs:104:1:108:1 | fn j | +| main.rs:955:5:955:6 | m6 | main.rs:116:1:128:1 | mod m6 | +| main.rs:955:5:955:9 | ...::g | main.rs:121:5:127:5 | fn g | +| main.rs:956:5:956:6 | m7 | main.rs:130:1:149:1 | mod m7 | +| main.rs:956:5:956:9 | ...::f | main.rs:141:5:148:5 | fn f | +| main.rs:957:5:957:6 | m8 | main.rs:151:1:205:1 | mod m8 | +| main.rs:957:5:957:9 | ...::g | main.rs:189:5:204:5 | fn g | +| main.rs:958:5:958:6 | m9 | main.rs:207:1:215:1 | mod m9 | +| main.rs:958:5:958:9 | ...::f | main.rs:210:5:214:5 | fn f | +| main.rs:959:5:959:7 | m11 | main.rs:238:1:275:1 | mod m11 | +| main.rs:959:5:959:10 | ...::f | main.rs:243:5:246:5 | fn f | +| main.rs:960:5:960:7 | m15 | main.rs:306:1:375:1 | mod m15 | +| main.rs:960:5:960:10 | ...::f | main.rs:362:5:374:5 | fn f | +| main.rs:961:5:961:7 | m16 | main.rs:377:1:574:1 | mod m16 | +| main.rs:961:5:961:10 | ...::f | main.rs:446:5:470:5 | fn f | +| main.rs:962:5:962:20 | trait_visibility | main.rs:576:1:626:1 | mod trait_visibility | +| main.rs:962:5:962:23 | ...::f | main.rs:603:5:625:5 | fn f | +| main.rs:963:5:963:7 | m17 | main.rs:628:1:658:1 | mod m17 | +| main.rs:963:5:963:10 | ...::f | main.rs:652:5:657:5 | fn f | +| main.rs:964:5:964:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:964:5:964:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:965:5:965:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:965:5:965:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:966:5:966:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | +| main.rs:966:5:966:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:967:5:967:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:968:5:968:12 | my_alias | main.rs:1:1:1:7 | mod my | +| main.rs:968:5:968:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:969:5:969:7 | m18 | main.rs:660:1:678:1 | mod m18 | +| main.rs:969:5:969:12 | ...::m19 | main.rs:665:5:677:5 | mod m19 | +| main.rs:969:5:969:17 | ...::m20 | main.rs:670:9:676:9 | mod m20 | +| main.rs:969:5:969:20 | ...::g | main.rs:671:13:675:13 | fn g | +| main.rs:970:5:970:7 | m23 | main.rs:707:1:732:1 | mod m23 | +| main.rs:970:5:970:10 | ...::f | main.rs:727:5:731:5 | fn f | +| main.rs:971:5:971:7 | m24 | main.rs:734:1:802:1 | mod m24 | +| main.rs:971:5:971:10 | ...::f | main.rs:788:5:801:5 | fn f | +| main.rs:972:5:972:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:972:5:972:11 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:973:5:973:13 | z_changed | main.rs:807:1:807:9 | fn z_changed | +| main.rs:974:5:974:11 | AStruct | main.rs:809:1:809:17 | struct AStruct | +| main.rs:974:5:974:22 | ...::z_on_type | main.rs:813:5:813:17 | fn z_on_type | +| main.rs:975:5:975:11 | AStruct | main.rs:809:1:809:17 | struct AStruct | +| main.rs:976:5:976:29 | impl_with_attribute_macro | main.rs:877:1:896:1 | mod impl_with_attribute_macro | +| main.rs:976:5:976:35 | ...::test | main.rs:892:5:895:5 | fn test | +| main.rs:977:5:977:12 | patterns | main.rs:898:1:939:1 | mod patterns | +| main.rs:977:5:977:18 | ...::test | main.rs:899:5:913:5 | fn test | | my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules | | my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | @@ -488,10 +573,10 @@ resolvePath | my2/mod.rs:25:9:25:16 | ...::f | my2/renamed.rs:1:1:1:13 | fn f | | my2/my3/mod.rs:2:5:2:11 | println | {EXTERNAL LOCATION} | MacroRules | | my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g | -| my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h | +| my2/my3/mod.rs:4:5:4:5 | h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:827:2 | SourceFile | -| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:978:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | | my2/my3/mod.rs:10:5:10:9 | super | my2/mod.rs:1:1:25:34 | SourceFile | diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.ql b/rust/ql/test/library-tests/path-resolution/path-resolution.ql index 0fe49a8e386..f7955929b83 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.ql +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.ql @@ -5,7 +5,7 @@ import TestUtils query predicate mod(Module m) { toBeTested(m) } -query predicate resolvePath(Path p, ItemNode i) { +query predicate resolvePath(PathExt p, ItemNode i) { toBeTested(p) and not p.isFromMacroExpansion() and i = resolvePath(p) diff --git a/rust/ql/test/library-tests/sensitivedata/SensitiveData.ql b/rust/ql/test/library-tests/sensitivedata/SensitiveData.ql index 0d5e748f80e..6372e81555d 100644 --- a/rust/ql/test/library-tests/sensitivedata/SensitiveData.ql +++ b/rust/ql/test/library-tests/sensitivedata/SensitiveData.ql @@ -13,7 +13,7 @@ module SensitiveDataConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { any(CallExpr call | call.getFunction().(PathExpr).getPath().getSegment().getIdentifier().getText() = "sink" - ).getArgList().getAnArg() = sink.asExpr().getExpr() + ).getArgList().getAnArg() = sink.asExpr() } } diff --git a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected index e1585e2e0d3..28242d86a7b 100644 --- a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected @@ -1,17 +1,2 @@ -multipleCallTargets -| dereference.rs:69:15:69:24 | e1.deref() | -| dereference.rs:182:17:182:26 | ... .foo() | -| dereference.rs:183:17:183:23 | S.foo() | -| dereference.rs:184:17:184:30 | ... .foo() | -| dereference.rs:186:17:186:25 | S.bar(...) | -| dereference.rs:187:17:187:29 | S.bar(...) | -| main.rs:589:9:589:14 | S4.m() | -| main.rs:590:9:590:18 | ...::m(...) | -| main.rs:591:9:591:20 | ... .m() | -| main.rs:592:9:592:24 | ...::m(...) | -| main.rs:2524:13:2524:31 | ...::from(...) | -| main.rs:2525:13:2525:31 | ...::from(...) | -| main.rs:2526:13:2526:31 | ...::from(...) | -| main.rs:2532:13:2532:31 | ...::from(...) | -| main.rs:2533:13:2533:31 | ...::from(...) | -| main.rs:2534:13:2534:31 | ...::from(...) | +multipleResolvedTargets +| main.rs:3087:13:3087:17 | x.f() | diff --git a/rust/ql/test/library-tests/type-inference/blanket_impl.rs b/rust/ql/test/library-tests/type-inference/blanket_impl.rs index 49fcd8af0a6..c139af01c42 100644 --- a/rust/ql/test/library-tests/type-inference/blanket_impl.rs +++ b/rust/ql/test/library-tests/type-inference/blanket_impl.rs @@ -236,7 +236,7 @@ mod blanket_like_impl { impl MyTrait2 for &&S1 { // MyTrait2RefRefS1::m2 fn m2(self) { - self.m1() // $ MISSING: target=S1::m1 + self.m1() // $ target=S1::m1 } } diff --git a/rust/ql/test/library-tests/type-inference/dereference.rs b/rust/ql/test/library-tests/type-inference/dereference.rs index bdc42180a63..6b8d659eb3e 100644 --- a/rust/ql/test/library-tests/type-inference/dereference.rs +++ b/rust/ql/test/library-tests/type-inference/dereference.rs @@ -38,7 +38,7 @@ impl S { fn explicit_monomorphic_dereference() { // Dereference with method call let a1 = MyIntPointer { value: 34i64 }; - let _b1 = a1.deref(); // $ target=MyIntPointer::deref type=_b1:&T.i64 + let _b1 = a1.deref(); // $ target=MyIntPointer::deref type=_b1:TRef.i64 // Dereference with overloaded dereference operator let a2 = MyIntPointer { value: 34i64 }; @@ -52,7 +52,7 @@ fn explicit_monomorphic_dereference() { fn explicit_polymorphic_dereference() { // Explicit dereference with type parameter let c1 = MySmartPointer { value: 'a' }; - let _d1 = c1.deref(); // $ target=MySmartPointer::deref type=_d1:&T.char + let _d1 = c1.deref(); // $ target=MySmartPointer::deref type=_d1:TRef.char // Explicit dereference with type parameter let c2 = MySmartPointer { value: 'a' }; @@ -66,7 +66,7 @@ fn explicit_polymorphic_dereference() { fn explicit_ref_dereference() { // Explicit dereference with type parameter let e1 = &'a'; - let _f1 = e1.deref(); // $ target=deref type=_f1:&T.char + let _f1 = e1.deref(); // $ target=deref type=_f1:TRef.char // Explicit dereference with type parameter let e2 = &'a'; @@ -80,7 +80,7 @@ fn explicit_ref_dereference() { fn explicit_box_dereference() { // Explicit dereference with type parameter let g1: Box = Box::new('a'); // $ target=new - let _h1 = g1.deref(); // $ target=deref type=_h1:&T.char + let _h1 = g1.deref(); // $ target=deref type=_h1:TRef.char // Explicit dereference with type parameter let g2: Box = Box::new('a'); // $ target=new @@ -101,7 +101,7 @@ fn implicit_dereference() { let _y = x.is_positive(); // $ MISSING: target=is_positive type=_y:bool let z = MySmartPointer { value: S(0i64) }; - let z_ = z.foo(); // $ MISSING: target=foo type=z_:&T.i64 + let z_ = z.foo(); // $ MISSING: target=foo type=z_:TRef.i64 } mod implicit_deref_coercion_cycle { @@ -179,12 +179,12 @@ mod ref_vs_mut_ref { } pub fn test() { - let x = (&S).foo(); // $ target=MyTrait1::foo1 type=x:S $ SPURIOUS: target=MyTrait1::foo2 - let y = S.foo(); // $ target=MyTrait1::foo1 type=y:S $ SPURIOUS: target=MyTrait1::foo2 - let z = (&mut S).foo(); // $ target=MyTrait1::foo2 type=z:i64 $ SPURIOUS: target=MyTrait1::foo1 + let x = (&S).foo(); // $ target=MyTrait1::foo1 type=x:S + let y = S.foo(); // $ target=MyTrait1::foo1 type=y:S + let z = (&mut S).foo(); // $ target=MyTrait1::foo2 type=z:i64 - let x = S.bar(&S); // $ target=MyTrait2::bar1 type=x:S $ SPURIOUS: target=MyTrait2::bar2 - let y = S.bar(&mut S); // $ target=MyTrait2::bar2 type=y:i64 $ SPURIOUS: target=MyTrait2::bar1 + let x = S.bar(&S); // $ target=MyTrait2::bar1 type=x:S + let y = S.bar(&mut S); // $ target=MyTrait2::bar2 type=y:i64 } } @@ -212,7 +212,7 @@ mod rust_reference_example { pub fn main() { let mut f = Foo {}; - f.bar(); // $ SPURIOUS: target=bar1 $ MISSING: target=bar2 + f.bar(); // $ target=bar2 } } diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index d99d178ba8d..d367525c7b8 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -586,10 +586,10 @@ mod impl_overlap { println!("{:?}", w.m(x)); // $ target=S3::m println!("{:?}", S3::m(&w, x)); // $ target=S3::m - S4.m(); // $ target=::m $ SPURIOUS: target=MyTrait1::m - S4::m(&S4); // $ target=::m $ SPURIOUS: target=MyTrait1::m - S5(0i32).m(); // $ target=_as_MyTrait1>::m $ SPURIOUS: target=MyTrait1::m - S5::m(&S5(0i32)); // $ target=_as_MyTrait1>::m $ SPURIOUS: target=MyTrait1::m + S4.m(); // $ target=::m + S4::m(&S4); // $ target=::m + S5(0i32).m(); // $ target=_as_MyTrait1>::m + S5::m(&S5(0i32)); // $ target=_as_MyTrait1>::m S5(true).m(); // $ target=MyTrait1::m S5::m(&S5(true)); // $ target=MyTrait1::m } @@ -758,6 +758,26 @@ mod function_trait_bounds { fn assoc(x: Self) -> A; } + impl MyTrait for S2 { + fn m1(self) -> T { + Default::default() // $ target=default + } + + fn assoc(x: Self) -> T { + Default::default() // $ target=default + } + } + + impl MyTrait for S1 { + fn m1(self) -> i32 { + 0 + } + + fn assoc(x: Self) -> i32 { + 0 + } + } + // Type parameter with bound occurs in the root of a parameter type. fn call_trait_m1 + Copy>(x: T2) -> T1 { @@ -807,6 +827,21 @@ mod function_trait_bounds { } } + trait MyTrait2 { + // MyTrait2::m2 + fn m2(self); + } + + trait MyTrait3 { + // MyTrait3::m2 + fn m2(&self); + } + + fn bound_overlap(x: T, y: &T) { + x.m2(); // $ target=MyTrait2::m2 + y.m2(); // $ target=MyTrait3::m2 + } + pub fn f() { let x = MyThing { a: S1 }; let y = MyThing { a: S2 }; @@ -863,6 +898,8 @@ mod function_trait_bounds { println!("{:?}", b); let b = call_trait_thing_m1_3(y3); // $ type=b:S2 target=call_trait_thing_m1_3 println!("{:?}", b); + let x = S1::m2(S1); // $ target=m2 $ type=x:i32 + let y: i32 = S2::m2(S2); // $ target=m2 } } @@ -1402,7 +1439,6 @@ mod option_methods { x2.set(S); // $ target=MyOption::set println!("{:?}", x2); - // missing type `S` from `MyOption` (but can resolve `MyTrait`) let mut x3 = MyOption::new(); // $ target=new x3.call_set(S); // $ target=call_set println!("{:?}", x3); @@ -1520,7 +1556,7 @@ mod method_call_type_conversion { let x7 = S(&S2); // Non-implicit dereference with nested borrow in order to test that the // implicit dereference handling doesn't affect nested borrows. - let t = x7.m1(); // $ target=m1 type=t:& type=t:&T.S2 + let t = x7.m1(); // $ target=m1 type=t:& type=t:TRef.S2 println!("{:?}", x7); let x9: String = "Hello".to_string(); // $ certainType=x9:String target=to_string @@ -1576,11 +1612,18 @@ mod implicit_self_borrow { fn foo(&self) -> &Self { self } + + fn bar(&self, x: &Self) -> &Self { + self + } } pub fn f() { let x = MyStruct(S); x.foo(); // $ target=foo + let x = MyStruct(S); + // `&&x` below is Deref coerced to `&x` (see https://doc.rust-lang.org/std/ops/trait.Deref.html#deref-coercion) + x.bar(&&x); // $ target=bar } } @@ -1703,10 +1746,91 @@ mod builtins { let z = x + y; // $ type=z:i32 target=add let z = x.abs(); // $ target=abs $ type=z:i32 let c = 'c'; // $ certainType=c:char - let hello = "Hello"; // $ certainType=hello:&T.str + let hello = "Hello"; // $ certainType=hello:TRef.str let f = 123.0f64; // $ certainType=f:f64 let t = true; // $ certainType=t:bool let f = false; // $ certainType=f:bool + + trait MyTrait { + fn my_method(&self) -> &T; + + fn my_func() -> T; + } + + impl MyTrait for [T; N] { + fn my_method(&self) -> &T { + self.get(0).unwrap() // $ MISSING: target=get target=unwrap + } + + fn my_func() -> T { + T::default() // $ target=default + } + } + + let x = [1, 2, 3].my_method(); // $ target=my_method type=x:TRef.i32 + let x = <[_; 3]>::my_method(&[1, 2, 3]); // $ target=my_method type=x:TRef.i32 + let x = <[i32; 3]>::my_func(); // $ target=my_func type=x:i32 + + impl MyTrait for [T] { + fn my_method(&self) -> &T { + self.get(0).unwrap() // $ target=get target=unwrap + } + + fn my_func() -> T { + T::default() // $ target=default + } + } + + let s: &[i32] = &[1, 2, 3]; + let x = s.my_method(); // $ target=my_method type=x:TRef.i32 + let x = <[_]>::my_method(s); // $ target=my_method type=x:TRef.i32 + let x = <[i32]>::my_func(); // $ target=my_func type=x:i32 + + impl MyTrait for (T, i32) { + fn my_method(&self) -> &T { + &self.0 // $ fieldof=Tuple2 + } + + fn my_func() -> T { + T::default() // $ target=default + } + } + + let p = (42, 7); + let x = p.my_method(); // $ target=my_method type=x:TRef.i32 + let x = <(_, _)>::my_method(&p); // $ target=my_method type=x:TRef.i32 + let x = <(i32, i32)>::my_func(); // $ target=my_func type=x:i32 + + impl MyTrait for &T { + fn my_method(&self) -> &T { + *self // $ target=deref + } + + fn my_func() -> T { + T::default() // $ target=default + } + } + + let r = &42; + let x = r.my_method(); // $ target=my_method type=x:TRef.i32 + let x = <&_>::my_method(&r); // $ target=my_method type=x:TRef.i32 + let x = <&i32>::my_func(); // $ target=my_func type=x:i32 + + impl MyTrait for *mut T { + fn my_method(&self) -> &T { + unsafe { &**self } // $ target=deref target=deref + } + + fn my_func() -> T { + T::default() // $ target=default + } + } + + let mut v = 42; + let p: *mut i32 = &mut v; + let x = unsafe { p.my_method() }; // $ target=my_method type=x:TRef.i32 + let x = unsafe { <*mut _>::my_method(&p) }; // $ target=my_method type=x:TRef.i32 + let x = <*mut i32>::my_func(); // $ target=my_func type=x:i32 } } @@ -2234,7 +2358,7 @@ mod impl_trait { // For this function the `impl` type does not appear in the root of the return type let f = get_a_my_trait3(S1).unwrap().get_a(); // $ target=get_a_my_trait3 target=unwrap target=MyTrait::get_a type=f:S1 - let g = get_a_my_trait4(S1).0.get_a(); // $ target=get_a_my_trait4 target=MyTrait::get_a type=g:S1 + let g = get_a_my_trait4(S1).0.get_a(); // $ target=get_a_my_trait4 target=MyTrait::get_a type=g:S1 fieldof=Tuple2 } } @@ -2502,24 +2626,24 @@ mod loops { for i in [1, 2, 3].map(|x| x + 1) {} // $ target=map MISSING: type=i:i32 for i in [1, 2, 3].into_iter() {} // $ target=into_iter type=i:i32 - let vals1 = [1u8, 2, 3]; // $ type=vals1:[T;...].u8 + let vals1 = [1u8, 2, 3]; // $ type=vals1:TArray.u8 for u in vals1 {} // $ type=u:u8 - let vals2 = [1u16; 3]; // $ type=vals2:[T;...].u16 + let vals2 = [1u16; 3]; // $ type=vals2:TArray.u16 for u in vals2 {} // $ type=u:u16 - let vals3: [u32; 3] = [1, 2, 3]; // $ certainType=vals3:[T;...].u32 + let vals3: [u32; 3] = [1, 2, 3]; // $ certainType=vals3:TArray.u32 for u in vals3 {} // $ type=u:u32 - let vals4: [u64; 3] = [1; 3]; // $ certainType=vals4:[T;...].u64 + let vals4: [u64; 3] = [1; 3]; // $ certainType=vals4:TArray.u64 for u in vals4 {} // $ type=u:u64 - let mut strings1 = ["foo", "bar", "baz"]; // $ type=strings1:[T;...].&T.str - for s in &strings1 {} // $ type=s:&T.&T.str - for s in &mut strings1 {} // $ type=s:&T.&T.str - for s in strings1 {} // $ type=s:&T.str + let mut strings1 = ["foo", "bar", "baz"]; // $ type=strings1:TArray.TRef.str + for s in &strings1 {} // $ type=s:TRef.TRef.str + for s in &mut strings1 {} // $ type=s:TRefMut.TRef.str + for s in strings1 {} // $ type=s:TRef.str - let strings2 = // $ type=strings2:[T;...].String + let strings2 = // $ type=strings2:TArray.String [ String::from("foo"), // $ target=from String::from("bar"), // $ target=from @@ -2527,15 +2651,15 @@ mod loops { ]; for s in strings2 {} // $ type=s:String - let strings3 = // $ type=strings3:&T.[T;...].String + let strings3 = // $ type=strings3:TRef.TArray.String &[ String::from("foo"), // $ target=from String::from("bar"), // $ target=from String::from("baz"), // $ target=from ]; - for s in strings3 {} // $ type=s:&T.String + for s in strings3 {} // $ type=s:TRef.String - let callables = [MyCallable::new(), MyCallable::new(), MyCallable::new()]; // $ target=new $ type=callables:[T;...].MyCallable + let callables = [MyCallable::new(), MyCallable::new(), MyCallable::new()]; // $ target=new $ type=callables:TArray.MyCallable for c // $ type=c:MyCallable in callables { @@ -2549,7 +2673,7 @@ mod loops { let range = 0..10; // $ certainType=range:Range type=range:Idx.i32 for i in range {} // $ type=i:i32 let range_full = ..; // $ certainType=range_full:RangeFull - for i in &[1i64, 2i64, 3i64][range_full] {} // $ target=index MISSING: type=i:&T.i64 + for i in &[1i64, 2i64, 3i64][range_full] {} // $ target=index MISSING: type=i:TRef.i64 let range1 = // $ certainType=range1:Range type=range1:Idx.u16 std::ops::Range { @@ -2560,7 +2684,7 @@ mod loops { // for loops with containers - let vals3 = vec![1, 2, 3]; // $ MISSING: type=vals3:Vec type=vals3:T.i32 + let vals3 = vec![1, 2, 3]; // $ type=vals3:Vec $ MISSING: type=vals3:T.i32 for i in vals3 {} // $ MISSING: type=i:i32 let vals4a: Vec = [1u16, 2, 3].to_vec(); // $ certainType=vals4a:Vec certainType=vals4a:T.u16 @@ -2572,27 +2696,27 @@ mod loops { let vals5 = Vec::from([1u32, 2, 3]); // $ certainType=vals5:Vec target=from type=vals5:T.u32 for u in vals5 {} // $ type=u:u32 - let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ certainType=vals6:Vec certainType=vals6:T.&T.u64 - for u in vals6 {} // $ type=u:&T.u64 + let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ certainType=vals6:Vec certainType=vals6:T.TRef.u64 + for u in vals6 {} // $ type=u:TRef.u64 let mut vals7 = Vec::new(); // $ target=new certainType=vals7:Vec type=vals7:T.u8 vals7.push(1u8); // $ target=push for u in vals7 {} // $ type=u:u8 - let matrix1 = vec![vec![1, 2], vec![3, 4]]; // $ MISSING: type=matrix1:Vec type=matrix1:T.Vec type=matrix1:T.T.i32 + let matrix1 = vec![vec![1, 2], vec![3, 4]]; // $ type=matrix1:Vec $ MISSING: type=matrix1:T.Vec type=matrix1:T.T.i32 #[rustfmt::skip] let _ = for row in matrix1 { // $ MISSING: type=row:Vec type=row:T.i32 for cell in row { // $ MISSING: type=cell:i32 } }; - let mut map1 = std::collections::HashMap::new(); // $ target=new type=map1:K.i32 type=map1:V.Box $ MISSING: type=map1:Hashmap type1=map1:V.T.&T.str + let mut map1 = std::collections::HashMap::new(); // $ target=new type=map1:K.i32 type=map1:V.Box $ MISSING: type=map1:Hashmap type1=map1:V.T.TRef.str map1.insert(1, Box::new("one")); // $ target=insert target=new map1.insert(2, Box::new("two")); // $ target=insert target=new - for key in map1.keys() {} // $ target=keys type=key:&T.i32 - for value in map1.values() {} // $ target=values type=value:&T.Box type=value:&T.T.&T.str - for (key, value) in map1.iter() {} // $ target=iter type=key:&T.i32 type=value:&T.Box type=value:&T.T.&T.str - for (key, value) in &map1 {} // $ type=key:&T.i32 type=value:&T.Box type=value:&T.T.&T.str + for key in map1.keys() {} // $ target=keys type=key:TRef.i32 + for value in map1.values() {} // $ target=values type=value:TRef.Box type=value:TRef.T.TRef.str + for (key, value) in map1.iter() {} // $ target=iter type=key:TRef.i32 type=value:TRef.Box type=value:TRef.T.TRef.str + for (key, value) in &map1 {} // $ type=key:TRef.i32 type=value:TRef.Box type=value:TRef.T.TRef.str // while loops @@ -2680,8 +2804,8 @@ mod tuples { let (mut e, f) = S1::get_pair(); // $ target=get_pair type=e:S1 type=f:S1 let (mut g, mut h) = S1::get_pair(); // $ target=get_pair type=g:S1 type=h:S1 - a.0.foo(); // $ target=foo - b.1.foo(); // $ target=foo + a.0.foo(); // $ target=foo fieldof=Tuple2 + b.1.foo(); // $ target=foo fieldof=Tuple2 c.foo(); // $ target=foo d.foo(); // $ target=foo e.foo(); // $ target=foo @@ -2694,19 +2818,19 @@ mod tuples { // `a` and `b` to be inferred. let a = Default::default(); // $ target=default type=a:i64 let b = Default::default(); // $ target=default type=b:bool - let pair = (a, b); // $ type=pair:0(2).i64 type=pair:1(2).bool - let i: i64 = pair.0; - let j: bool = pair.1; + let pair = (a, b); // $ type=pair:T0.i64 type=pair:T1.bool + let i: i64 = pair.0; // $ fieldof=Tuple2 + let j: bool = pair.1; // $ fieldof=Tuple2 - let pair = [1, 1].into(); // $ type=pair:(T_2) type=pair:0(2).i32 type=pair:1(2).i32 MISSING: target=into + let pair = [1, 1].into(); // $ type=pair:(T_2) type=pair:T0.i32 type=pair:T1.i32 MISSING: target=into match pair { (0, 0) => print!("unexpected"), _ => print!("expected"), } - let x = pair.0; // $ type=x:i32 + let x = pair.0; // $ type=x:i32 fieldof=Tuple2 let y = &S1::get_pair(); // $ target=get_pair - y.0.foo(); // $ target=foo + y.0.foo(); // $ target=foo fieldof=Tuple2 } } @@ -2875,6 +2999,106 @@ mod block_types { } } +mod context_typed { + pub fn f() { + let x = None; // $ type=x:T.i32 + let x: Option = x; + let x = Option::::None; // $ type=x:T.i32 + let x = Option::None::; // $ type=x:T.i32 + + fn pin_option(opt: Option, x: T) {} + + let x = None; // $ type=x:T.i32 + pin_option(x, 0); // $ target=pin_option + + enum MyEither { + A { left: T1 }, + B { right: T2 }, + } + + let x = MyEither::A { left: 0 }; // $ type=x:T1.i32 type=x:T2.String + let x: MyEither = x; + let x = MyEither::<_, String>::A { left: 0 }; // $ type=x:T1.i32 certainType=x:T2.String + #[rustfmt::skip] + let x = MyEither::B:: { // $ certainType=x:T1.i32 type=x:T2.String + right: String::new(), // $ target=new + }; + + fn pin_my_either(e: MyEither, x: T) {} + + #[rustfmt::skip] + let x = MyEither::B { // $ type=x:T1.i32 type=x:T2.String + right: String::new(), // $ target=new + }; + pin_my_either(x, 0); // $ target=pin_my_either + + let x = Result::Ok(0); // $ type=x:E.String + let x: Result = x; + let x = Result::::Ok(0); // $ type=x:E.String + let x = Result::Ok::(0); // $ type=x:E.String + + fn pin_result(res: Result, x: E) {} + + let x = Result::Ok(0); // $ type=x:T.i32 type=x:E.bool + pin_result(x, false); // $ target=pin_result + + let mut x = Vec::new(); // $ type=x:T.i32 target=new + x.push(0); // $ target=push + + let y = Default::default(); // $ type=y:i32 target=default + x.push(y); // $ target=push + } +} + +mod literal_overlap { + trait MyTrait { + // MyTrait::f + fn f(self) -> Self; + + // MyTrait::g + fn g(&self, other: &Self) -> &Self { + self.f() // $ target=Reff + } + } + + impl MyTrait for i32 { + // i32f + fn f(self) -> Self { + self + } + } + + impl MyTrait for usize { + // usizef + fn f(self) -> Self { + self + } + } + + impl MyTrait for &T { + // Reff + fn f(self) -> Self { + self + } + } + + pub fn f() -> usize { + let mut x = 0; + x = x.f(); // $ target=usizef $ SPURIOUS: target=i32f + x + } + + fn g() { + let x: usize = 0; + let y = &1; + let z = x.g(y); // $ target=MyTrait::g + + let x = 0; // $ SPURIOUS: type=x:i32 $ MISSING: type=x:usize + let y: usize = 1; + let z = x.max(y); // $ target=max + } +} + mod blanket_impl; mod closure; mod dereference; diff --git a/rust/ql/test/library-tests/type-inference/pattern_matching.rs b/rust/ql/test/library-tests/type-inference/pattern_matching.rs index 569b06ab9a7..33e6b9f09f3 100755 --- a/rust/ql/test/library-tests/type-inference/pattern_matching.rs +++ b/rust/ql/test/library-tests/type-inference/pattern_matching.rs @@ -37,18 +37,18 @@ pub fn f() -> Option<()> { let value3 = 42; if let ref mesg = value3 { - let mesg = mesg; // $ type=mesg:&T.i32 + let mesg = mesg; // $ type=mesg:TRef.i32 println!("{mesg}"); } let value4 = Some(42); if let Some(ref mesg) = value4 { - let mesg = mesg; // $ type=mesg:&T.i32 + let mesg = mesg; // $ type=mesg:TRef.i32 println!("{mesg}"); } let ref value5 = 42; - let x = value5; // $ type=x:&T.i32 + let x = value5; // $ type=x:TRef.i32 let my_record_struct = MyRecordStruct { value1: 42, @@ -102,7 +102,7 @@ pub fn f() -> Option<()> { ) => { let a = value1; // $ type=a:bool let b = x; // $ type=b:i32 - let c = y; // $ type=c:&T.str + let c = y; // $ type=c:TRef.str (); } _ => (), @@ -197,7 +197,7 @@ pub fn literal_patterns() { let string_val = "hello"; match string_val { "hello" => { - let hello_match = string_val; // $ certainType=hello_match:&T.str + let hello_match = string_val; // $ certainType=hello_match:TRef.str println!("String literal: {}", hello_match); } _ => {} @@ -230,7 +230,7 @@ pub fn identifier_patterns() { // IdentPat with ref match &value { ref x => { - let ref_bound = x; // $ type=ref_bound:&T.&T.i32 + let ref_bound = x; // $ type=ref_bound:TRef.TRef.i32 println!("Reference identifier: {:?}", ref_bound); } } @@ -269,7 +269,7 @@ pub fn identifier_patterns() { let mut ref_mut_val = 5i32; match &mut ref_mut_val { ref mut x => { - let ref_mut_bound = x; // $ type=ref_mut_bound:&T.&T.i32 + let ref_mut_bound = x; // $ type=ref_mut_bound:TRefMut.TRefMut.i32 **ref_mut_bound += 1; // $ target=deref target=add_assign println!("Ref mut pattern"); } @@ -341,14 +341,14 @@ pub fn reference_patterns() { match &mut mutable_value { &mut ref x => { - let mut_ref_bound = x; // $ type=mut_ref_bound:&T.i32 + let mut_ref_bound = x; // $ type=mut_ref_bound:TRef.i32 println!("Mutable ref pattern: {}", mut_ref_bound); } } match &value { ref x => { - let ref_pattern = x; // $ type=ref_pattern:&T.&T.i32 + let ref_pattern = x; // $ type=ref_pattern:TRef.TRef.i32 println!("Reference pattern: {}", ref_pattern); } } @@ -525,7 +525,7 @@ pub fn slice_patterns() { // SlicePat - Slice patterns match slice { [] => { - let empty_slice = slice; // $ certainType=empty_slice:&T.[T].i32 + let empty_slice = slice; // $ certainType=empty_slice:TRef.TSlice.i32 println!("Empty slice: {:?}", empty_slice); } [x] => { @@ -540,7 +540,7 @@ pub fn slice_patterns() { [first, middle @ .., last] => { let slice_start = *first; // $ MISSING: type=slice_start:i32 let slice_end = *last; // $ MISSING: type=slice_end:i32 - let slice_middle = middle; // $ MISSING: type=slice_middle:&T.[T].i32 + let slice_middle = middle; // $ MISSING: type=slice_middle:TRef.TSlice.i32 println!( "First: {}, last: {}, middle len: {}", slice_start, @@ -717,7 +717,7 @@ pub fn complex_nested_patterns() { } // Catch-all with identifier pattern other => { - let other_complex = other; // $ type=other_complex:0(2).Point type=other_complex:1(2).MyOption + let other_complex = other; // $ type=other_complex:T0.Point type=other_complex:T1.MyOption println!("Other complex data: {:?}", other_complex); } } @@ -750,7 +750,7 @@ pub fn patterns_in_let_statements() { // Let with reference pattern let value = 42i32; let ref ref_val = value; - let let_ref = ref_val; // $ certainType=let_ref:&T.i32 + let let_ref = ref_val; // $ certainType=let_ref:TRef.i32 // Let with mutable pattern let mut mut_val = 10i32; @@ -779,13 +779,13 @@ pub fn patterns_in_function_parameters() { // Call the functions to use them let point = Point { x: 5, y: 10 }; - let extracted = extract_point(point); // $ target=extract_point certainType=extracted:0(2).i32 certainType=extracted:1(2).i32 + let extracted = extract_point(point); // $ target=extract_point certainType=extracted:T0.i32 certainType=extracted:T1.i32 let color = Color(200, 100, 50); let red = extract_color(color); // $ target=extract_color certainType=red:u8 let tuple = (42i32, 3.14f64, true); - let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple certainType=tuple_extracted:0(2).i32 certainType=tuple_extracted:1(2).bool + let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple certainType=tuple_extracted:T0.i32 certainType=tuple_extracted:T1.bool } #[rustfmt::skip] diff --git a/rust/ql/test/library-tests/type-inference/raw_pointer.rs b/rust/ql/test/library-tests/type-inference/raw_pointer.rs new file mode 100644 index 00000000000..bf4537f30ce --- /dev/null +++ b/rust/ql/test/library-tests/type-inference/raw_pointer.rs @@ -0,0 +1,60 @@ +use std::ptr::null_mut; + +fn raw_pointer_const_deref(x: *const i32) -> i32 { + let _y = unsafe { *x }; // $ type=_y:i32 + 0 +} + +fn raw_pointer_mut_deref(x: *mut bool) -> i32 { + let _y = unsafe { *x }; // $ type=_y:bool + 0 +} + +fn raw_const_borrow() { + let a: i64 = 10; + let x = &raw const a; // $ type=x:TPtrConst.i64 + unsafe { + let _y = *x; // $ type=_y:i64 + } +} + +fn raw_mut_borrow() { + let mut a = 10i32; + let x = &raw mut a; // $ type=x:TPtrMut.i32 + unsafe { + let _y = *x; // $ type=_y:i32 + } +} + +fn raw_mut_write(cond: bool) { + let a = 10i32; + // The type of `ptr_written` must be inferred from the write below. + let ptr_written = null_mut(); // $ target=null_mut type=ptr_written:TPtrMut.i32 + if cond { + unsafe { + // NOTE: This write is undefined behavior because `ptr_written` is a null pointer. + *ptr_written = a; + let _y = *ptr_written; // $ type=_y:i32 + } + } +} + +fn raw_type_from_deref(cond: bool) { + // The type of `ptr_read` must be inferred from the read below. + let ptr_read = null_mut(); // $ target=null_mut type=ptr_read:TPtrMut.i64 + if cond { + unsafe { + // NOTE: This read is undefined behavior because `ptr_read` is a null pointer. + let _y: i64 = *ptr_read; + } + } +} + +pub fn test() { + raw_pointer_const_deref(&10); // $ target=raw_pointer_const_deref + raw_pointer_mut_deref(&mut true); // $ target=raw_pointer_mut_deref + raw_const_borrow(); // $ target=raw_const_borrow + raw_mut_borrow(); // $ target=raw_mut_borrow + raw_mut_write(false); // $ target=raw_mut_write + raw_type_from_deref(false); // $ target=raw_type_from_deref +} diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index d9b5e5782ab..d5b9e30f05e 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -1,106 +1,4609 @@ +inferCertainType +| blanket_impl.rs:15:18:15:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:15:18:15:22 | SelfParam | TRef | blanket_impl.rs:9:5:10:14 | S2 | +| blanket_impl.rs:15:42:17:9 | { ... } | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:15:42:17:9 | { ... } | TRef | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:16:13:16:15 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:21:19:21:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:21:19:21:23 | SelfParam | TRef | blanket_impl.rs:20:5:22:5 | Self [trait Clone1] | +| blanket_impl.rs:25:22:25:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:25:22:25:26 | SelfParam | TRef | blanket_impl.rs:24:5:28:5 | Self [trait Duplicatable] | +| blanket_impl.rs:32:19:32:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:32:19:32:23 | SelfParam | TRef | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:32:34:34:9 | { ... } | | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:33:14:33:17 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:33:14:33:17 | self | TRef | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:40:22:40:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:40:22:40:26 | SelfParam | TRef | blanket_impl.rs:38:10:38:18 | T | +| blanket_impl.rs:40:37:42:9 | { ... } | | blanket_impl.rs:38:10:38:18 | T | +| blanket_impl.rs:41:13:41:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:41:13:41:16 | self | TRef | blanket_impl.rs:38:10:38:18 | T | +| blanket_impl.rs:45:33:60:5 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:47:18:47:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:48:18:48:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:48:19:48:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:49:18:49:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:49:18:49:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:51:18:51:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:51:18:51:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:52:18:52:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:52:19:52:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:53:18:53:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:53:18:53:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:54:32:54:34 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:55:18:55:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:55:18:55:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:57:18:57:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:57:18:57:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:58:18:58:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:58:19:58:21 | &S2 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:59:18:59:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:59:18:59:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:68:24:68:24 | x | | {EXTERNAL LOCATION} | i64 | +| blanket_impl.rs:68:32:68:32 | y | | blanket_impl.rs:67:5:69:5 | Self [trait Trait1] | +| blanket_impl.rs:72:24:72:24 | x | | {EXTERNAL LOCATION} | i64 | +| blanket_impl.rs:72:32:72:32 | y | | blanket_impl.rs:71:5:73:5 | Self [trait Trait2] | +| blanket_impl.rs:77:24:77:24 | x | | {EXTERNAL LOCATION} | i64 | +| blanket_impl.rs:77:32:77:32 | y | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:77:49:79:9 | { ... } | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:78:13:78:13 | y | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:84:24:84:24 | x | | {EXTERNAL LOCATION} | i64 | +| blanket_impl.rs:84:32:84:32 | y | | blanket_impl.rs:82:10:82:18 | T | +| blanket_impl.rs:84:49:86:9 | { ... } | | blanket_impl.rs:82:10:82:18 | T | +| blanket_impl.rs:85:28:85:28 | x | | {EXTERNAL LOCATION} | i64 | +| blanket_impl.rs:85:31:85:31 | y | | blanket_impl.rs:82:10:82:18 | T | +| blanket_impl.rs:89:33:98:5 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:90:13:90:14 | x1 | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:90:18:90:39 | ...::assoc_func1(...) | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:91:18:91:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:91:18:91:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:91:20:91:21 | x1 | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:93:18:93:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:93:18:93:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:95:18:95:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:95:18:95:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:97:18:97:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:97:18:97:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:108:22:108:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:108:22:108:26 | SelfParam | TRef | blanket_impl.rs:107:5:109:5 | Self [trait Flag] | +| blanket_impl.rs:112:26:112:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:112:26:112:30 | SelfParam | TRef | blanket_impl.rs:111:5:113:5 | Self [trait TryFlag] | +| blanket_impl.rs:119:26:119:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:119:26:119:30 | SelfParam | TRef | blanket_impl.rs:115:10:115:11 | Fl | +| blanket_impl.rs:119:49:121:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:119:49:121:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:120:18:120:21 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:120:18:120:21 | self | TRef | blanket_impl.rs:115:10:115:11 | Fl | +| blanket_impl.rs:126:32:126:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:126:32:126:36 | SelfParam | TRef | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | +| blanket_impl.rs:126:55:128:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:126:55:128:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:127:13:127:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:127:13:127:16 | self | TRef | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | +| blanket_impl.rs:135:32:135:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:135:32:135:36 | SelfParam | TRef | blanket_impl.rs:133:5:136:5 | Self [trait AnotherTryFlag] | +| blanket_impl.rs:144:26:144:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:144:26:144:30 | SelfParam | TRef | blanket_impl.rs:138:5:140:5 | MyTryFlag | +| blanket_impl.rs:144:49:146:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:144:49:146:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:145:18:145:21 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:145:18:145:21 | self | TRef | blanket_impl.rs:138:5:140:5 | MyTryFlag | +| blanket_impl.rs:155:22:155:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:155:22:155:26 | SelfParam | TRef | blanket_impl.rs:149:5:151:5 | MyFlag | +| blanket_impl.rs:155:37:157:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:156:13:156:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:156:13:156:16 | self | TRef | blanket_impl.rs:149:5:151:5 | MyFlag | +| blanket_impl.rs:166:32:166:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:166:32:166:36 | SelfParam | TRef | blanket_impl.rs:160:5:162:5 | MyOtherFlag | +| blanket_impl.rs:166:55:168:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:166:55:168:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:167:18:167:21 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:167:18:167:21 | self | TRef | blanket_impl.rs:160:5:162:5 | MyOtherFlag | +| blanket_impl.rs:171:15:184:5 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:172:13:172:23 | my_try_flag | | blanket_impl.rs:138:5:140:5 | MyTryFlag | +| blanket_impl.rs:172:27:172:50 | MyTryFlag {...} | | blanket_impl.rs:138:5:140:5 | MyTryFlag | +| blanket_impl.rs:172:45:172:48 | true | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:173:22:173:32 | my_try_flag | | blanket_impl.rs:138:5:140:5 | MyTryFlag | +| blanket_impl.rs:175:13:175:19 | my_flag | | blanket_impl.rs:149:5:151:5 | MyFlag | +| blanket_impl.rs:175:23:175:43 | MyFlag {...} | | blanket_impl.rs:149:5:151:5 | MyFlag | +| blanket_impl.rs:175:38:175:41 | true | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:178:22:178:28 | my_flag | | blanket_impl.rs:149:5:151:5 | MyFlag | +| blanket_impl.rs:180:13:180:25 | my_other_flag | | blanket_impl.rs:160:5:162:5 | MyOtherFlag | +| blanket_impl.rs:180:29:180:54 | MyOtherFlag {...} | | blanket_impl.rs:160:5:162:5 | MyOtherFlag | +| blanket_impl.rs:180:49:180:52 | true | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:183:22:183:34 | my_other_flag | | blanket_impl.rs:160:5:162:5 | MyOtherFlag | +| blanket_impl.rs:196:15:196:18 | SelfParam | | blanket_impl.rs:194:5:197:5 | Self [trait MyTrait1] | +| blanket_impl.rs:201:15:201:18 | SelfParam | | blanket_impl.rs:199:5:202:5 | Self [trait MyTrait2] | +| blanket_impl.rs:206:15:206:18 | SelfParam | | blanket_impl.rs:204:5:207:5 | Self [trait MyTrait3] | +| blanket_impl.rs:211:15:211:18 | SelfParam | | blanket_impl.rs:209:5:212:5 | Self [trait MyTrait4a] | +| blanket_impl.rs:216:15:216:18 | SelfParam | | blanket_impl.rs:214:5:217:5 | Self [trait MyTrait4b] | +| blanket_impl.rs:221:15:221:18 | SelfParam | | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:221:21:221:22 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:226:15:226:18 | SelfParam | | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:226:21:226:22 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:231:15:231:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:231:15:231:18 | SelfParam | TRef | blanket_impl.rs:229:10:229:27 | T | +| blanket_impl.rs:231:21:233:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:232:13:232:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:232:13:232:16 | self | TRef | blanket_impl.rs:229:10:229:27 | T | +| blanket_impl.rs:238:15:238:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:238:15:238:18 | SelfParam | TRef | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:238:15:238:18 | SelfParam | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:238:21:240:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:239:13:239:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:239:13:239:16 | self | TRef | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:239:13:239:16 | self | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:245:15:245:18 | SelfParam | | blanket_impl.rs:243:10:243:20 | T | +| blanket_impl.rs:245:21:247:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:246:13:246:16 | self | | blanket_impl.rs:243:10:243:20 | T | +| blanket_impl.rs:252:15:252:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:252:15:252:18 | SelfParam | TRef | blanket_impl.rs:250:10:250:10 | T | +| blanket_impl.rs:252:21:252:22 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:255:33:263:5 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:257:18:257:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:257:19:257:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:18:258:23 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:19:258:22 | &... | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:20:258:22 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:260:18:260:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:260:19:260:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:262:18:262:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:262:19:262:21 | &S2 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:272:21:272:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:272:21:272:25 | SelfParam | TRef | blanket_impl.rs:271:5:274:5 | Self [trait Executor] | +| blanket_impl.rs:273:24:273:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:273:24:273:28 | SelfParam | TRef | blanket_impl.rs:271:5:274:5 | Self [trait Executor] | +| blanket_impl.rs:273:31:273:35 | query | | blanket_impl.rs:273:21:273:21 | E | +| blanket_impl.rs:277:21:277:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:277:21:277:25 | SelfParam | TRef | blanket_impl.rs:276:10:276:22 | T | +| blanket_impl.rs:277:28:279:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:278:22:278:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:278:22:278:41 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:281:24:281:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:281:24:281:28 | SelfParam | TRef | blanket_impl.rs:276:10:276:22 | T | +| blanket_impl.rs:281:31:281:36 | _query | | blanket_impl.rs:281:21:281:21 | E | +| blanket_impl.rs:281:42:283:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:282:22:282:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:282:22:282:41 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:290:16:300:5 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:291:13:291:13 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:291:17:291:34 | MySqlConnection {...} | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:293:9:293:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:294:35:294:36 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:294:36:294:36 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:296:9:296:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:296:20:296:40 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:296:20:296:40 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:297:9:297:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:298:35:298:36 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:298:36:298:36 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:299:43:299:44 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:299:44:299:44 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | +| closure.rs:4:19:31:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:6:27:6:27 | a | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:30:6:30 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:33:6:33 | a | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:33:6:38 | ... && ... | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:38:6:38 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:8:13:8:13 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:8:22:8:25 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:31:9:34 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:10:26:10:26 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:25:14:25 | n | | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:33:14:33 | n | | {EXTERNAL LOCATION} | i64 | +| closure.rs:25:21:25:24 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:30:13:30:15 | _b2 | | {EXTERNAL LOCATION} | bool | +| closure.rs:35:44:35:44 | f | | closure.rs:35:20:35:41 | F | +| closure.rs:35:50:37:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | +| closure.rs:36:25:36:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:39:46:39:46 | f | | closure.rs:39:22:39:43 | F | +| closure.rs:39:52:42:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:41:9:41:9 | f | | closure.rs:39:22:39:43 | F | +| closure.rs:44:39:44:39 | f | | closure.rs:44:20:44:36 | F | +| closure.rs:44:45:44:45 | a | | closure.rs:44:14:44:14 | A | +| closure.rs:44:56:46:5 | { ... } | | closure.rs:44:17:44:17 | B | +| closure.rs:45:9:45:9 | f | | closure.rs:44:20:44:36 | F | +| closure.rs:45:11:45:11 | a | | closure.rs:44:14:44:14 | A | +| closure.rs:48:18:48:18 | f | | closure.rs:48:21:48:43 | impl ... | +| closure.rs:48:53:50:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:49:9:49:9 | f | | closure.rs:48:21:48:43 | impl ... | +| closure.rs:52:15:64:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:53:18:53:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:54:16:54:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:60:27:60:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:63:13:63:15 | _r2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:63:19:63:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:68:54:68:54 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:68:54:68:54 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:68:54:68:54 | f | T | closure.rs:68:26:68:51 | F | +| closure.rs:68:65:68:67 | arg | | closure.rs:68:20:68:20 | A | +| closure.rs:68:78:70:5 | { ... } | | closure.rs:68:23:68:23 | B | +| closure.rs:69:9:69:9 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:69:9:69:9 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:69:9:69:9 | f | T | closure.rs:68:26:68:51 | F | +| closure.rs:69:11:69:13 | arg | | closure.rs:68:20:68:20 | A | +| closure.rs:72:30:72:30 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:72:30:72:30 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:72:30:72:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:72:30:72:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:72:30:72:30 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | +| closure.rs:72:30:72:30 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | +| closure.rs:72:58:72:60 | arg | | closure.rs:72:24:72:24 | A | +| closure.rs:72:66:75:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:73:31:73:31 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:73:31:73:31 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:73:31:73:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:73:31:73:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:73:31:73:31 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | +| closure.rs:73:31:73:31 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | +| closure.rs:73:34:73:36 | arg | | closure.rs:72:24:72:24 | A | +| closure.rs:74:31:74:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| closure.rs:74:31:74:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| closure.rs:74:41:74:41 | _ | | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:49:74:52 | true | | {EXTERNAL LOCATION} | bool | +| dereference.rs:12:14:12:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:12:14:12:18 | SelfParam | TRef | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:12:29:14:5 | { ... } | | {EXTERNAL LOCATION} | & | +| dereference.rs:12:29:14:5 | { ... } | TRef | {EXTERNAL LOCATION} | i64 | +| dereference.rs:13:9:13:19 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:13:10:13:13 | self | | {EXTERNAL LOCATION} | & | +| dereference.rs:13:10:13:13 | self | TRef | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:25:14:25:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:25:14:25:18 | SelfParam | TRef | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:25:14:25:18 | SelfParam | TRef.T | dereference.rs:21:6:21:6 | T | +| dereference.rs:25:27:27:5 | { ... } | | {EXTERNAL LOCATION} | & | +| dereference.rs:25:27:27:5 | { ... } | TRef | dereference.rs:21:6:21:6 | T | +| dereference.rs:26:9:26:19 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:26:10:26:13 | self | | {EXTERNAL LOCATION} | & | +| dereference.rs:26:10:26:13 | self | TRef | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:26:10:26:13 | self | TRef.T | dereference.rs:21:6:21:6 | T | +| dereference.rs:33:12:33:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:33:12:33:16 | SelfParam | TRef | dereference.rs:30:1:30:15 | S | +| dereference.rs:33:12:33:16 | SelfParam | TRef.T | dereference.rs:32:6:32:6 | T | +| dereference.rs:33:25:35:5 | { ... } | | {EXTERNAL LOCATION} | & | +| dereference.rs:33:25:35:5 | { ... } | TRef | dereference.rs:32:6:32:6 | T | +| dereference.rs:34:9:34:15 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:34:10:34:13 | self | | {EXTERNAL LOCATION} | & | +| dereference.rs:34:10:34:13 | self | TRef | dereference.rs:30:1:30:15 | S | +| dereference.rs:34:10:34:13 | self | TRef.T | dereference.rs:32:6:32:6 | T | +| dereference.rs:38:39:50:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:40:9:40:10 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:40:14:40:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:40:36:40:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:41:15:41:16 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:44:9:44:10 | a2 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:44:14:44:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:44:36:44:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:45:16:45:17 | a2 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:48:9:48:10 | a3 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:48:14:48:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:48:36:48:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:49:17:49:18 | a3 | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:52:39:64:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:54:9:54:10 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:54:14:54:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:54:38:54:40 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:55:15:55:16 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:58:9:58:10 | c2 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:58:14:58:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:58:38:58:40 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:59:16:59:17 | c2 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:62:9:62:10 | c3 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:62:14:62:44 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:62:38:62:42 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:63:17:63:18 | c3 | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:66:31:78:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:68:9:68:10 | e1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:68:14:68:17 | &'a' | | {EXTERNAL LOCATION} | & | +| dereference.rs:68:15:68:17 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:69:15:69:16 | e1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:72:9:72:10 | e2 | | {EXTERNAL LOCATION} | & | +| dereference.rs:72:14:72:17 | &'a' | | {EXTERNAL LOCATION} | & | +| dereference.rs:72:15:72:17 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:73:16:73:17 | e2 | | {EXTERNAL LOCATION} | & | +| dereference.rs:76:9:76:10 | e3 | | {EXTERNAL LOCATION} | & | +| dereference.rs:76:14:76:19 | &34i64 | | {EXTERNAL LOCATION} | & | +| dereference.rs:76:15:76:19 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:77:17:77:18 | e3 | | {EXTERNAL LOCATION} | & | +| dereference.rs:80:31:92:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:82:9:82:10 | g1 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:82:9:82:10 | g1 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:82:9:82:10 | g1 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:82:25:82:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dereference.rs:82:25:82:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:82:34:82:36 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:83:15:83:16 | g1 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:83:15:83:16 | g1 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:83:15:83:16 | g1 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:86:9:86:10 | g2 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:86:9:86:10 | g2 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:86:9:86:10 | g2 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:86:25:86:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dereference.rs:86:25:86:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:86:34:86:36 | 'a' | | {EXTERNAL LOCATION} | char | +| dereference.rs:87:16:87:17 | g2 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:87:16:87:17 | g2 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:87:16:87:17 | g2 | T | {EXTERNAL LOCATION} | char | +| dereference.rs:90:9:90:10 | g3 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:90:9:90:10 | g3 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:90:9:90:10 | g3 | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:90:24:90:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dereference.rs:90:24:90:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:90:33:90:37 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:91:17:91:18 | g3 | | {EXTERNAL LOCATION} | Box | +| dereference.rs:91:17:91:18 | g3 | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:91:17:91:18 | g3 | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:94:27:105:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:96:9:96:9 | x | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:96:13:96:41 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:96:35:96:39 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:97:14:97:14 | x | | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:100:9:100:9 | x | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:100:13:100:43 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:100:37:100:41 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:101:14:101:14 | x | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:103:9:103:9 | z | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:103:13:103:45 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:103:39:103:42 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:104:14:104:14 | z | | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:131:19:139:5 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:132:17:132:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:132:17:132:26 | key_to_key | K | {EXTERNAL LOCATION} | & | +| dereference.rs:132:17:132:26 | key_to_key | K.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:17:132:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:132:17:132:26 | key_to_key | V | {EXTERNAL LOCATION} | & | +| dereference.rs:132:17:132:26 | key_to_key | V.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:30:132:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:132:30:132:57 | ...::new(...) | K | {EXTERNAL LOCATION} | & | +| dereference.rs:132:30:132:57 | ...::new(...) | K.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:30:132:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:132:30:132:57 | ...::new(...) | V | {EXTERNAL LOCATION} | & | +| dereference.rs:132:30:132:57 | ...::new(...) | V.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:17:133:19 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:133:23:133:29 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:133:24:133:29 | Key {...} | | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:9:137:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| dereference.rs:134:32:134:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:134:32:134:41 | key_to_key | K | {EXTERNAL LOCATION} | & | +| dereference.rs:134:32:134:41 | key_to_key | K.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:134:32:134:41 | key_to_key | V | {EXTERNAL LOCATION} | & | +| dereference.rs:134:32:134:41 | key_to_key | V.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:47:134:49 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:134:52:137:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:136:13:136:15 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:138:9:138:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:138:9:138:18 | key_to_key | K | {EXTERNAL LOCATION} | & | +| dereference.rs:138:9:138:18 | key_to_key | K.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:138:9:138:18 | key_to_key | V | {EXTERNAL LOCATION} | & | +| dereference.rs:138:9:138:18 | key_to_key | V.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:27:138:29 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:138:32:138:34 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:144:16:144:19 | SelfParam | | dereference.rs:143:5:145:5 | Self [trait MyTrait1] | +| dereference.rs:151:16:151:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:151:16:151:19 | SelfParam | TRef | dereference.rs:147:5:147:13 | S | +| dereference.rs:151:27:153:9 | { ... } | | dereference.rs:147:5:147:13 | S | +| dereference.rs:158:16:158:19 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:158:16:158:19 | SelfParam | TRefMut | dereference.rs:147:5:147:13 | S | +| dereference.rs:158:29:160:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:164:16:164:19 | SelfParam | | dereference.rs:163:5:165:5 | Self [trait MyTrait2] | +| dereference.rs:164:22:164:24 | arg | | dereference.rs:163:20:163:21 | T1 | +| dereference.rs:169:16:169:19 | SelfParam | | dereference.rs:147:5:147:13 | S | +| dereference.rs:169:22:169:24 | arg | | {EXTERNAL LOCATION} | & | +| dereference.rs:169:22:169:24 | arg | TRef | dereference.rs:147:5:147:13 | S | +| dereference.rs:169:36:171:9 | { ... } | | dereference.rs:147:5:147:13 | S | +| dereference.rs:176:16:176:19 | SelfParam | | dereference.rs:147:5:147:13 | S | +| dereference.rs:176:22:176:24 | arg | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:176:22:176:24 | arg | TRefMut | dereference.rs:147:5:147:13 | S | +| dereference.rs:176:42:178:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:181:19:188:5 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:182:17:182:20 | (...) | | {EXTERNAL LOCATION} | & | +| dereference.rs:182:18:182:19 | &S | | {EXTERNAL LOCATION} | & | +| dereference.rs:184:17:184:24 | (...) | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:184:18:184:23 | &mut S | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:186:23:186:24 | &S | | {EXTERNAL LOCATION} | & | +| dereference.rs:187:23:187:28 | &mut S | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:196:16:196:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:196:16:196:20 | SelfParam | TRef | dereference.rs:195:5:197:5 | Self [trait Bar] | +| dereference.rs:201:16:201:24 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:201:16:201:24 | SelfParam | TRefMut | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:201:27:203:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:202:22:202:38 | "In struct impl!\\n" | | {EXTERNAL LOCATION} | & | +| dereference.rs:202:22:202:38 | "In struct impl!\\n" | TRef | {EXTERNAL LOCATION} | str | +| dereference.rs:202:22:202:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:202:22:202:38 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:208:16:208:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:208:16:208:20 | SelfParam | TRef | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:208:23:210:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:209:22:209:37 | "In trait impl!\\n" | | {EXTERNAL LOCATION} | & | +| dereference.rs:209:22:209:37 | "In trait impl!\\n" | TRef | {EXTERNAL LOCATION} | str | +| dereference.rs:209:22:209:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:209:22:209:37 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:213:19:216:5 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:214:17:214:17 | f | | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:214:21:214:26 | Foo {...} | | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:215:9:215:9 | f | | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:219:15:228:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:220:5:220:38 | explicit_monomorphic_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:221:5:221:38 | explicit_polymorphic_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:222:5:222:30 | explicit_ref_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:223:5:223:30 | explicit_box_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:224:5:224:26 | implicit_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:225:5:225:41 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:226:5:226:26 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:227:5:227:34 | ...::main(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:7:10:7:14 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:7:10:7:14 | SelfParam | TRef | dyn_type.rs:5:1:8:1 | Self [trait MyTrait1] | +| dyn_type.rs:12:12:12:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:12:12:12:16 | SelfParam | TRef | dyn_type.rs:10:1:13:1 | Self [trait GenericGet] | +| dyn_type.rs:18:12:18:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:18:12:18:16 | SelfParam | TRef | dyn_type.rs:15:1:19:1 | Self [trait AssocTrait] | +| dyn_type.rs:28:10:28:14 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:28:10:28:14 | SelfParam | TRef | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:28:27:30:5 | { ... } | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | TRef | {EXTERNAL LOCATION} | str | +| dyn_type.rs:29:17:29:42 | ...::format(...) | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:33:29:36 | self | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:29:33:29:36 | self | TRef | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:40:12:40:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:40:12:40:16 | SelfParam | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:40:12:40:16 | SelfParam | TRef.A | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:40:24:42:5 | { ... } | | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:41:9:41:12 | self | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:41:9:41:12 | self | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:41:9:41:12 | self | TRef.A | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:51:12:51:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:51:12:51:16 | SelfParam | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:51:12:51:16 | SelfParam | TRef.A | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:51:34:53:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:51:34:53:5 | { ... } | T0 | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:51:34:53:5 | { ... } | T1 | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:52:9:52:34 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:52:10:52:13 | self | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:52:10:52:13 | self | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:52:10:52:13 | self | TRef.A | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:52:30:52:33 | true | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:56:40:56:40 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:56:40:56:40 | a | TRef | dyn_type.rs:56:13:56:37 | G | +| dyn_type.rs:56:52:58:1 | { ... } | | dyn_type.rs:56:10:56:10 | A | +| dyn_type.rs:57:5:57:5 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:57:5:57:5 | a | TRef | dyn_type.rs:56:13:56:37 | G | +| dyn_type.rs:60:46:60:46 | a | | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:60:78:62:1 | { ... } | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:60:78:62:1 | { ... } | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:60:78:62:1 | { ... } | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:60:78:62:1 | { ... } | T.dyn(A) | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:61:5:61:36 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:61:5:61:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:61:33:61:33 | a | | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:64:25:64:27 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:64:25:64:27 | obj | TRef | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:64:45:66:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:65:21:65:23 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:65:21:65:23 | obj | TRef | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:68:27:68:29 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:68:27:68:29 | obj | TRef | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:68:27:68:29 | obj | TRef.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:68:57:71:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:69:22:69:24 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:69:22:69:24 | obj | TRef | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:69:22:69:24 | obj | TRef.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:70:26:70:28 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:70:26:70:28 | obj | TRef | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:70:26:70:28 | obj | TRef.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:73:26:76:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:74:9:74:11 | obj | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:74:9:74:11 | obj | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:74:9:74:11 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:74:15:74:33 | get_box_trait(...) | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:74:15:74:33 | get_box_trait(...) | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:74:15:74:33 | get_box_trait(...) | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:74:29:74:32 | true | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:75:21:75:23 | obj | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:75:21:75:23 | obj | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:75:21:75:23 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:78:24:78:24 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:78:24:78:24 | a | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:78:24:78:24 | a | TRef.dyn(AP) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:78:24:78:24 | a | TRef.dyn(GP) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:78:65:80:1 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:78:65:80:1 | { ... } | T0 | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:78:65:80:1 | { ... } | T1 | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:79:5:79:5 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:79:5:79:5 | a | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:79:5:79:5 | a | TRef.dyn(AP) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:79:5:79:5 | a | TRef.dyn(GP) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:82:55:82:55 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:82:55:82:55 | a | TRef | dyn_type.rs:82:20:82:52 | T | +| dyn_type.rs:82:72:84:1 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:82:72:84:1 | { ... } | T0 | dyn_type.rs:82:14:82:14 | A | +| dyn_type.rs:82:72:84:1 | { ... } | T1 | dyn_type.rs:82:17:82:17 | B | +| dyn_type.rs:83:5:83:5 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:83:5:83:5 | a | TRef | dyn_type.rs:82:20:82:52 | T | +| dyn_type.rs:86:20:86:22 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:86:20:86:22 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:86:20:86:22 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:86:20:86:22 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:86:58:99:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:87:9:90:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:90:11:90:13 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:90:11:90:13 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:90:11:90:13 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:11:90:13 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:91:9:94:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:94:23:94:25 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:94:23:94:25 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:94:23:94:25 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:94:23:94:25 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:95:9:98:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:98:9:98:22 | assoc_get(...) | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:98:19:98:21 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:98:19:98:21 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:98:19:98:21 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:98:19:98:21 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:101:15:108:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:102:5:102:49 | test_basic_dyn_trait(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:102:26:102:48 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:102:27:102:48 | MyStruct {...} | | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:103:5:105:6 | test_generic_dyn_trait(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:103:28:105:5 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:103:29:105:5 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:104:16:104:17 | "" | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:104:16:104:17 | "" | TRef | {EXTERNAL LOCATION} | str | +| dyn_type.rs:106:5:106:25 | test_poly_dyn_trait(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:107:5:107:46 | test_assoc_type(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:107:21:107:45 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:107:22:107:45 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | +| invalid/main.rs:8:16:8:19 | SelfParam | | invalid/main.rs:7:5:9:5 | Self [trait T1] | +| invalid/main.rs:8:22:8:23 | { ... } | | {EXTERNAL LOCATION} | () | +| invalid/main.rs:12:16:12:19 | SelfParam | | invalid/main.rs:11:5:15:5 | Self [trait T2] | +| invalid/main.rs:12:22:14:9 | { ... } | | {EXTERNAL LOCATION} | () | +| invalid/main.rs:13:13:13:16 | self | | invalid/main.rs:11:5:15:5 | Self [trait T2] | +| invalid/main.rs:25:22:25:25 | SelfParam | | invalid/main.rs:24:5:26:5 | Self [trait AddAlias] | +| invalid/main.rs:25:28:25:32 | other | | invalid/main.rs:24:5:26:5 | Self [trait AddAlias] | +| invalid/main.rs:29:22:29:25 | SelfParam | | invalid/main.rs:21:5:22:20 | Num | +| invalid/main.rs:29:28:29:32 | other | | invalid/main.rs:21:5:22:20 | Num | +| invalid/main.rs:29:49:31:9 | { ... } | | invalid/main.rs:21:5:22:20 | Num | +| invalid/main.rs:30:17:30:20 | self | | invalid/main.rs:21:5:22:20 | Num | +| invalid/main.rs:30:26:30:30 | other | | invalid/main.rs:21:5:22:20 | Num | +| invalid/main.rs:39:16:39:19 | SelfParam | | invalid/main.rs:35:10:35:20 | T | +| invalid/main.rs:39:22:39:26 | other | | invalid/main.rs:35:10:35:20 | T | +| invalid/main.rs:39:43:41:9 | { ... } | | invalid/main.rs:35:10:35:20 | T | +| invalid/main.rs:40:13:40:16 | self | | invalid/main.rs:35:10:35:20 | T | +| invalid/main.rs:40:28:40:32 | other | | invalid/main.rs:35:10:35:20 | T | +| invalid/main.rs:44:30:49:5 | { ... } | | {EXTERNAL LOCATION} | () | +| invalid/main.rs:57:19:57:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:57:19:57:23 | SelfParam | TRef | invalid/main.rs:56:5:58:5 | Self [trait Clone1] | +| invalid/main.rs:61:22:61:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:61:22:61:26 | SelfParam | TRef | invalid/main.rs:60:5:64:5 | Self [trait Duplicatable] | +| invalid/main.rs:68:19:68:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:68:19:68:23 | SelfParam | TRef | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:68:34:70:9 | { ... } | | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:69:14:69:17 | self | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:69:14:69:17 | self | TRef | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:75:22:75:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:75:22:75:26 | SelfParam | TRef | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:75:37:77:9 | { ... } | | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:76:14:76:17 | self | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:76:14:76:17 | self | TRef | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:83:22:83:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:83:22:83:26 | SelfParam | TRef | invalid/main.rs:81:10:81:18 | T | +| invalid/main.rs:83:37:85:9 | { ... } | | invalid/main.rs:81:10:81:18 | T | +| invalid/main.rs:84:13:84:16 | self | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:84:13:84:16 | self | TRef | invalid/main.rs:81:10:81:18 | T | +| invalid/main.rs:88:33:92:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:25:30:28:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:26:13:26:13 | x | | main.rs:5:5:8:5 | MyThing | +| main.rs:26:17:26:32 | MyThing {...} | | main.rs:5:5:8:5 | MyThing | +| main.rs:27:18:27:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:27:18:27:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:27:18:27:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:27:18:27:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:27:26:27:26 | x | | main.rs:5:5:8:5 | MyThing | +| main.rs:30:29:30:29 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:30:29:30:29 | x | A | {EXTERNAL LOCATION} | bool | +| main.rs:30:46:33:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:31:17:31:17 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:31:17:31:17 | x | A | {EXTERNAL LOCATION} | bool | +| main.rs:32:18:32:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:32:18:32:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:32:18:32:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:32:18:32:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:35:31:63:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:37:13:37:13 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:37:13:37:13 | x | A | main.rs:3:5:4:13 | S | +| main.rs:37:17:37:42 | GenericThing::<...> {...} | | main.rs:16:5:19:5 | GenericThing | +| main.rs:37:17:37:42 | GenericThing::<...> {...} | A | main.rs:3:5:4:13 | S | +| main.rs:38:18:38:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:38:18:38:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:38:18:38:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:38:18:38:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:38:26:38:26 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:38:26:38:26 | x | A | main.rs:3:5:4:13 | S | +| main.rs:41:13:41:13 | y | | main.rs:16:5:19:5 | GenericThing | +| main.rs:41:17:41:37 | GenericThing {...} | | main.rs:16:5:19:5 | GenericThing | +| main.rs:42:18:42:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:42:18:42:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:42:18:42:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:42:18:42:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:42:26:42:26 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:42:26:42:26 | x | A | main.rs:3:5:4:13 | S | +| main.rs:46:13:46:13 | x | | main.rs:21:5:23:5 | OptionS | +| main.rs:46:17:48:9 | OptionS {...} | | main.rs:21:5:23:5 | OptionS | +| main.rs:49:18:49:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:49:18:49:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:49:18:49:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:49:18:49:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:49:26:49:26 | x | | main.rs:21:5:23:5 | OptionS | +| main.rs:52:13:52:13 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:52:13:52:13 | x | A | main.rs:10:5:14:5 | MyOption | +| main.rs:52:13:52:13 | x | A.T | main.rs:3:5:4:13 | S | +| main.rs:52:17:54:9 | GenericThing::<...> {...} | | main.rs:16:5:19:5 | GenericThing | +| main.rs:52:17:54:9 | GenericThing::<...> {...} | A | main.rs:10:5:14:5 | MyOption | +| main.rs:52:17:54:9 | GenericThing::<...> {...} | A.T | main.rs:3:5:4:13 | S | +| main.rs:55:18:55:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:55:18:55:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:55:18:55:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:55:18:55:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:55:26:55:26 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:55:26:55:26 | x | A | main.rs:10:5:14:5 | MyOption | +| main.rs:55:26:55:26 | x | A.T | main.rs:3:5:4:13 | S | +| main.rs:57:17:57:17 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:57:21:59:9 | GenericThing {...} | | main.rs:16:5:19:5 | GenericThing | +| main.rs:61:13:61:13 | a | | main.rs:10:5:14:5 | MyOption | +| main.rs:61:13:61:13 | a | T | main.rs:3:5:4:13 | S | +| main.rs:61:30:61:30 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:62:18:62:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:62:18:62:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:62:18:62:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:62:18:62:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:62:26:62:26 | a | | main.rs:10:5:14:5 | MyOption | +| main.rs:62:26:62:26 | a | T | main.rs:3:5:4:13 | S | +| main.rs:65:16:68:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:66:9:66:29 | simple_field_access(...) | | {EXTERNAL LOCATION} | () | +| main.rs:67:9:67:30 | generic_field_access(...) | | {EXTERNAL LOCATION} | () | +| main.rs:75:19:75:22 | SelfParam | | main.rs:72:5:72:21 | Foo | +| main.rs:75:33:77:9 | { ... } | | main.rs:72:5:72:21 | Foo | +| main.rs:76:13:76:16 | self | | main.rs:72:5:72:21 | Foo | +| main.rs:79:19:79:22 | SelfParam | | main.rs:72:5:72:21 | Foo | +| main.rs:79:32:81:9 | { ... } | | main.rs:72:5:72:21 | Foo | +| main.rs:80:13:80:16 | self | | main.rs:72:5:72:21 | Foo | +| main.rs:84:23:89:5 | { ... } | | main.rs:72:5:72:21 | Foo | +| main.rs:85:18:85:33 | "main.rs::m1::f\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:85:18:85:33 | "main.rs::m1::f\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:85:18:85:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:85:18:85:33 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:86:13:86:13 | x | | main.rs:72:5:72:21 | Foo | +| main.rs:86:17:86:22 | Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:87:20:87:25 | Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:88:9:88:9 | x | | main.rs:72:5:72:21 | Foo | +| main.rs:91:14:91:14 | x | | main.rs:72:5:72:21 | Foo | +| main.rs:91:22:91:22 | y | | main.rs:72:5:72:21 | Foo | +| main.rs:91:37:95:5 | { ... } | | main.rs:72:5:72:21 | Foo | +| main.rs:92:18:92:33 | "main.rs::m1::g\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:92:18:92:33 | "main.rs::m1::g\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:92:18:92:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:92:18:92:33 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:93:9:93:9 | x | | main.rs:72:5:72:21 | Foo | +| main.rs:94:9:94:9 | y | | main.rs:72:5:72:21 | Foo | +| main.rs:105:25:105:28 | SelfParam | | main.rs:104:5:106:5 | Self [trait MyTrait] | +| main.rs:110:25:110:28 | SelfParam | | main.rs:99:5:102:5 | MyThing | +| main.rs:110:39:112:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:111:13:111:16 | self | | main.rs:99:5:102:5 | MyThing | +| main.rs:115:16:121:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:116:13:116:13 | x | | main.rs:99:5:102:5 | MyThing | +| main.rs:116:17:116:39 | MyThing {...} | | main.rs:99:5:102:5 | MyThing | +| main.rs:116:34:116:37 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:117:17:117:17 | x | | main.rs:99:5:102:5 | MyThing | +| main.rs:119:13:119:13 | y | | main.rs:99:5:102:5 | MyThing | +| main.rs:119:17:119:40 | MyThing {...} | | main.rs:99:5:102:5 | MyThing | +| main.rs:119:34:119:38 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:120:39:120:39 | y | | main.rs:99:5:102:5 | MyThing | +| main.rs:130:25:130:29 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:130:25:130:29 | SelfParam | TRef | main.rs:128:9:133:9 | Self [trait Foo] | +| main.rs:130:32:132:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:131:26:131:31 | "foo!\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:131:26:131:31 | "foo!\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:131:26:131:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:131:26:131:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:137:25:137:29 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:137:25:137:29 | SelfParam | TRef | main.rs:135:9:140:9 | Self [trait Bar] | +| main.rs:137:32:139:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:138:26:138:31 | "bar!\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:138:26:138:31 | "bar!\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:138:26:138:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:138:26:138:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:149:15:170:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:151:9:154:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:155:9:158:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:159:9:162:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:163:9:169:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:167:13:167:29 | ...::a_method(...) | | {EXTERNAL LOCATION} | () | +| main.rs:167:27:167:28 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:168:13:168:29 | ...::a_method(...) | | {EXTERNAL LOCATION} | () | +| main.rs:168:27:168:28 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:186:15:186:18 | SelfParam | | main.rs:174:5:177:5 | MyThing | +| main.rs:186:15:186:18 | SelfParam | A | main.rs:179:5:180:14 | S1 | +| main.rs:186:27:188:9 | { ... } | | main.rs:179:5:180:14 | S1 | +| main.rs:187:13:187:16 | self | | main.rs:174:5:177:5 | MyThing | +| main.rs:187:13:187:16 | self | A | main.rs:179:5:180:14 | S1 | +| main.rs:193:15:193:18 | SelfParam | | main.rs:174:5:177:5 | MyThing | +| main.rs:193:15:193:18 | SelfParam | A | main.rs:181:5:182:14 | S2 | +| main.rs:193:29:195:9 | { ... } | | main.rs:174:5:177:5 | MyThing | +| main.rs:193:29:195:9 | { ... } | A | main.rs:181:5:182:14 | S2 | +| main.rs:194:13:194:30 | Self {...} | | main.rs:174:5:177:5 | MyThing | +| main.rs:194:13:194:30 | Self {...} | A | main.rs:181:5:182:14 | S2 | +| main.rs:194:23:194:26 | self | | main.rs:174:5:177:5 | MyThing | +| main.rs:194:23:194:26 | self | A | main.rs:181:5:182:14 | S2 | +| main.rs:199:15:199:18 | SelfParam | | main.rs:174:5:177:5 | MyThing | +| main.rs:199:15:199:18 | SelfParam | A | main.rs:198:10:198:10 | T | +| main.rs:199:26:201:9 | { ... } | | main.rs:198:10:198:10 | T | +| main.rs:200:13:200:16 | self | | main.rs:174:5:177:5 | MyThing | +| main.rs:200:13:200:16 | self | A | main.rs:198:10:198:10 | T | +| main.rs:204:16:220:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:205:13:205:13 | x | | main.rs:174:5:177:5 | MyThing | +| main.rs:205:17:205:33 | MyThing {...} | | main.rs:174:5:177:5 | MyThing | +| main.rs:206:13:206:13 | y | | main.rs:174:5:177:5 | MyThing | +| main.rs:206:17:206:33 | MyThing {...} | | main.rs:174:5:177:5 | MyThing | +| main.rs:209:18:209:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:209:18:209:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:209:18:209:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:209:18:209:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:209:26:209:26 | x | | main.rs:174:5:177:5 | MyThing | +| main.rs:210:18:210:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:210:18:210:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:210:18:210:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:210:18:210:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:210:26:210:26 | y | | main.rs:174:5:177:5 | MyThing | +| main.rs:212:18:212:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:212:18:212:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:212:18:212:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:212:18:212:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:212:26:212:26 | x | | main.rs:174:5:177:5 | MyThing | +| main.rs:213:18:213:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:213:18:213:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:213:18:213:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:213:18:213:33 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:213:26:213:26 | y | | main.rs:174:5:177:5 | MyThing | +| main.rs:215:13:215:13 | x | | main.rs:174:5:177:5 | MyThing | +| main.rs:215:17:215:33 | MyThing {...} | | main.rs:174:5:177:5 | MyThing | +| main.rs:216:13:216:13 | y | | main.rs:174:5:177:5 | MyThing | +| main.rs:216:17:216:33 | MyThing {...} | | main.rs:174:5:177:5 | MyThing | +| main.rs:218:18:218:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:218:18:218:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:218:18:218:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:218:18:218:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:218:26:218:26 | x | | main.rs:174:5:177:5 | MyThing | +| main.rs:219:18:219:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:219:18:219:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:219:18:219:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:219:18:219:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:219:26:219:26 | y | | main.rs:174:5:177:5 | MyThing | +| main.rs:243:15:243:18 | SelfParam | | main.rs:242:5:251:5 | Self [trait MyTrait] | +| main.rs:245:15:245:18 | SelfParam | | main.rs:242:5:251:5 | Self [trait MyTrait] | +| main.rs:248:9:250:9 | { ... } | | main.rs:242:5:251:5 | Self [trait MyTrait] | +| main.rs:249:13:249:16 | self | | main.rs:242:5:251:5 | Self [trait MyTrait] | +| main.rs:255:16:255:19 | SelfParam | | main.rs:253:5:258:5 | Self [trait MyProduct] | +| main.rs:257:16:257:19 | SelfParam | | main.rs:253:5:258:5 | Self [trait MyProduct] | +| main.rs:260:43:260:43 | x | | main.rs:260:26:260:40 | T2 | +| main.rs:260:56:262:5 | { ... } | | main.rs:260:22:260:23 | T1 | +| main.rs:261:9:261:9 | x | | main.rs:260:26:260:40 | T2 | +| main.rs:266:15:266:18 | SelfParam | | main.rs:224:5:227:5 | MyThing | +| main.rs:266:15:266:18 | SelfParam | A | main.rs:235:5:236:14 | S1 | +| main.rs:266:27:268:9 | { ... } | | main.rs:235:5:236:14 | S1 | +| main.rs:267:13:267:16 | self | | main.rs:224:5:227:5 | MyThing | +| main.rs:267:13:267:16 | self | A | main.rs:235:5:236:14 | S1 | +| main.rs:273:15:273:18 | SelfParam | | main.rs:224:5:227:5 | MyThing | +| main.rs:273:15:273:18 | SelfParam | A | main.rs:237:5:238:14 | S2 | +| main.rs:273:29:275:9 | { ... } | | main.rs:224:5:227:5 | MyThing | +| main.rs:273:29:275:9 | { ... } | A | main.rs:237:5:238:14 | S2 | +| main.rs:274:13:274:30 | Self {...} | | main.rs:224:5:227:5 | MyThing | +| main.rs:274:13:274:30 | Self {...} | A | main.rs:237:5:238:14 | S2 | +| main.rs:274:23:274:26 | self | | main.rs:224:5:227:5 | MyThing | +| main.rs:274:23:274:26 | self | A | main.rs:237:5:238:14 | S2 | +| main.rs:285:15:285:18 | SelfParam | | main.rs:224:5:227:5 | MyThing | +| main.rs:285:15:285:18 | SelfParam | A | main.rs:239:5:240:14 | S3 | +| main.rs:285:27:287:9 | { ... } | | main.rs:280:10:280:11 | TD | +| main.rs:292:15:292:18 | SelfParam | | main.rs:229:5:233:5 | MyPair | +| main.rs:292:15:292:18 | SelfParam | P1 | main.rs:290:10:290:10 | I | +| main.rs:292:15:292:18 | SelfParam | P2 | main.rs:235:5:236:14 | S1 | +| main.rs:292:26:294:9 | { ... } | | main.rs:290:10:290:10 | I | +| main.rs:293:13:293:16 | self | | main.rs:229:5:233:5 | MyPair | +| main.rs:293:13:293:16 | self | P1 | main.rs:290:10:290:10 | I | +| main.rs:293:13:293:16 | self | P2 | main.rs:235:5:236:14 | S1 | +| main.rs:299:15:299:18 | SelfParam | | main.rs:229:5:233:5 | MyPair | +| main.rs:299:15:299:18 | SelfParam | P1 | main.rs:235:5:236:14 | S1 | +| main.rs:299:15:299:18 | SelfParam | P2 | main.rs:237:5:238:14 | S2 | +| main.rs:299:27:301:9 | { ... } | | main.rs:239:5:240:14 | S3 | +| main.rs:306:15:306:18 | SelfParam | | main.rs:229:5:233:5 | MyPair | +| main.rs:306:15:306:18 | SelfParam | P1 | main.rs:224:5:227:5 | MyThing | +| main.rs:306:15:306:18 | SelfParam | P1.A | main.rs:304:10:304:11 | TT | +| main.rs:306:15:306:18 | SelfParam | P2 | main.rs:239:5:240:14 | S3 | +| main.rs:306:27:309:9 | { ... } | | main.rs:304:10:304:11 | TT | +| main.rs:307:25:307:28 | self | | main.rs:229:5:233:5 | MyPair | +| main.rs:307:25:307:28 | self | P1 | main.rs:224:5:227:5 | MyThing | +| main.rs:307:25:307:28 | self | P1.A | main.rs:304:10:304:11 | TT | +| main.rs:307:25:307:28 | self | P2 | main.rs:239:5:240:14 | S3 | +| main.rs:315:16:315:19 | SelfParam | | main.rs:229:5:233:5 | MyPair | +| main.rs:315:16:315:19 | SelfParam | P1 | main.rs:313:10:313:10 | A | +| main.rs:315:16:315:19 | SelfParam | P2 | main.rs:313:10:313:10 | A | +| main.rs:315:27:317:9 | { ... } | | main.rs:313:10:313:10 | A | +| main.rs:316:13:316:16 | self | | main.rs:229:5:233:5 | MyPair | +| main.rs:316:13:316:16 | self | P1 | main.rs:313:10:313:10 | A | +| main.rs:316:13:316:16 | self | P2 | main.rs:313:10:313:10 | A | +| main.rs:320:16:320:19 | SelfParam | | main.rs:229:5:233:5 | MyPair | +| main.rs:320:16:320:19 | SelfParam | P1 | main.rs:313:10:313:10 | A | +| main.rs:320:16:320:19 | SelfParam | P2 | main.rs:313:10:313:10 | A | +| main.rs:320:27:322:9 | { ... } | | main.rs:313:10:313:10 | A | +| main.rs:321:13:321:16 | self | | main.rs:229:5:233:5 | MyPair | +| main.rs:321:13:321:16 | self | P1 | main.rs:313:10:313:10 | A | +| main.rs:321:13:321:16 | self | P2 | main.rs:313:10:313:10 | A | +| main.rs:328:16:328:19 | SelfParam | | main.rs:229:5:233:5 | MyPair | +| main.rs:328:16:328:19 | SelfParam | P1 | main.rs:237:5:238:14 | S2 | +| main.rs:328:16:328:19 | SelfParam | P2 | main.rs:235:5:236:14 | S1 | +| main.rs:328:28:330:9 | { ... } | | main.rs:235:5:236:14 | S1 | +| main.rs:329:13:329:16 | self | | main.rs:229:5:233:5 | MyPair | +| main.rs:329:13:329:16 | self | P1 | main.rs:237:5:238:14 | S2 | +| main.rs:329:13:329:16 | self | P2 | main.rs:235:5:236:14 | S1 | +| main.rs:333:16:333:19 | SelfParam | | main.rs:229:5:233:5 | MyPair | +| main.rs:333:16:333:19 | SelfParam | P1 | main.rs:237:5:238:14 | S2 | +| main.rs:333:16:333:19 | SelfParam | P2 | main.rs:235:5:236:14 | S1 | +| main.rs:333:28:335:9 | { ... } | | main.rs:237:5:238:14 | S2 | +| main.rs:334:13:334:16 | self | | main.rs:229:5:233:5 | MyPair | +| main.rs:334:13:334:16 | self | P1 | main.rs:237:5:238:14 | S2 | +| main.rs:334:13:334:16 | self | P2 | main.rs:235:5:236:14 | S1 | +| main.rs:338:46:338:46 | p | | main.rs:338:24:338:43 | P | +| main.rs:338:58:340:5 | { ... } | | main.rs:338:16:338:17 | V1 | +| main.rs:339:9:339:9 | p | | main.rs:338:24:338:43 | P | +| main.rs:342:46:342:46 | p | | main.rs:342:24:342:43 | P | +| main.rs:342:58:344:5 | { ... } | | main.rs:342:20:342:21 | V2 | +| main.rs:343:9:343:9 | p | | main.rs:342:24:342:43 | P | +| main.rs:346:54:346:54 | p | | main.rs:229:5:233:5 | MyPair | +| main.rs:346:54:346:54 | p | P1 | main.rs:346:20:346:21 | V0 | +| main.rs:346:54:346:54 | p | P2 | main.rs:346:32:346:51 | P | +| main.rs:346:78:348:5 | { ... } | | main.rs:346:24:346:25 | V1 | +| main.rs:347:9:347:9 | p | | main.rs:229:5:233:5 | MyPair | +| main.rs:347:9:347:9 | p | P1 | main.rs:346:20:346:21 | V0 | +| main.rs:347:9:347:9 | p | P2 | main.rs:346:32:346:51 | P | +| main.rs:352:23:352:26 | SelfParam | | main.rs:350:5:353:5 | Self [trait ConvertTo] | +| main.rs:357:23:357:26 | SelfParam | | main.rs:355:10:355:23 | T | +| main.rs:357:35:359:9 | { ... } | | main.rs:235:5:236:14 | S1 | +| main.rs:358:13:358:16 | self | | main.rs:355:10:355:23 | T | +| main.rs:362:41:362:45 | thing | | main.rs:362:23:362:38 | T | +| main.rs:362:57:364:5 | { ... } | | main.rs:362:19:362:20 | TS | +| main.rs:363:9:363:13 | thing | | main.rs:362:23:362:38 | T | +| main.rs:366:56:366:60 | thing | | main.rs:366:39:366:53 | TP | +| main.rs:366:73:369:5 | { ... } | | main.rs:235:5:236:14 | S1 | +| main.rs:368:9:368:13 | thing | | main.rs:366:39:366:53 | TP | +| main.rs:371:16:442:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:372:13:372:20 | thing_s1 | | main.rs:224:5:227:5 | MyThing | +| main.rs:372:24:372:40 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | +| main.rs:373:13:373:20 | thing_s2 | | main.rs:224:5:227:5 | MyThing | +| main.rs:373:24:373:40 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | +| main.rs:374:13:374:20 | thing_s3 | | main.rs:224:5:227:5 | MyThing | +| main.rs:374:24:374:40 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | +| main.rs:378:18:378:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:378:18:378:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:378:18:378:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:378:18:378:38 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:378:26:378:33 | thing_s1 | | main.rs:224:5:227:5 | MyThing | +| main.rs:379:18:379:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:379:18:379:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:379:18:379:40 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:379:18:379:40 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:379:26:379:33 | thing_s2 | | main.rs:224:5:227:5 | MyThing | +| main.rs:380:13:380:14 | s3 | | main.rs:239:5:240:14 | S3 | +| main.rs:380:22:380:29 | thing_s3 | | main.rs:224:5:227:5 | MyThing | +| main.rs:381:18:381:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:381:18:381:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:381:18:381:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:381:18:381:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:381:26:381:27 | s3 | | main.rs:239:5:240:14 | S3 | +| main.rs:383:13:383:14 | p1 | | main.rs:229:5:233:5 | MyPair | +| main.rs:383:18:383:42 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:384:18:384:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:384:18:384:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:384:18:384:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:384:18:384:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:384:26:384:27 | p1 | | main.rs:229:5:233:5 | MyPair | +| main.rs:386:13:386:14 | p2 | | main.rs:229:5:233:5 | MyPair | +| main.rs:386:18:386:42 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:387:18:387:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:387:18:387:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:387:18:387:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:387:18:387:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:387:26:387:27 | p2 | | main.rs:229:5:233:5 | MyPair | +| main.rs:389:13:389:14 | p3 | | main.rs:229:5:233:5 | MyPair | +| main.rs:389:18:392:9 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:390:17:390:33 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | +| main.rs:393:18:393:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:393:18:393:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:393:18:393:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:393:18:393:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:393:26:393:27 | p3 | | main.rs:229:5:233:5 | MyPair | +| main.rs:396:13:396:13 | a | | main.rs:229:5:233:5 | MyPair | +| main.rs:396:17:396:41 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:397:17:397:17 | a | | main.rs:229:5:233:5 | MyPair | +| main.rs:398:18:398:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:398:18:398:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:398:18:398:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:398:18:398:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:399:17:399:17 | a | | main.rs:229:5:233:5 | MyPair | +| main.rs:400:18:400:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:400:18:400:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:400:18:400:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:400:18:400:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:406:13:406:13 | b | | main.rs:229:5:233:5 | MyPair | +| main.rs:406:17:406:41 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:407:17:407:17 | b | | main.rs:229:5:233:5 | MyPair | +| main.rs:408:18:408:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:408:18:408:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:408:18:408:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:408:18:408:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:409:17:409:17 | b | | main.rs:229:5:233:5 | MyPair | +| main.rs:410:18:410:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:410:18:410:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:410:18:410:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:410:18:410:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:414:31:414:38 | thing_s1 | | main.rs:224:5:227:5 | MyThing | +| main.rs:415:18:415:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:415:18:415:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:415:18:415:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:415:18:415:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:416:31:416:38 | thing_s2 | | main.rs:224:5:227:5 | MyThing | +| main.rs:417:18:417:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:417:18:417:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:417:18:417:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:417:18:417:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:420:13:420:13 | a | | main.rs:229:5:233:5 | MyPair | +| main.rs:420:17:420:41 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:421:25:421:25 | a | | main.rs:229:5:233:5 | MyPair | +| main.rs:422:18:422:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:422:18:422:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:422:18:422:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:422:18:422:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:423:25:423:25 | a | | main.rs:229:5:233:5 | MyPair | +| main.rs:424:18:424:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:424:18:424:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:424:18:424:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:424:18:424:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:427:13:427:13 | b | | main.rs:229:5:233:5 | MyPair | +| main.rs:427:17:427:41 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:428:25:428:25 | b | | main.rs:229:5:233:5 | MyPair | +| main.rs:429:18:429:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:429:18:429:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:429:18:429:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:429:18:429:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:430:25:430:25 | b | | main.rs:229:5:233:5 | MyPair | +| main.rs:431:18:431:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:431:18:431:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:431:18:431:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:431:18:431:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:433:13:433:13 | c | | main.rs:229:5:233:5 | MyPair | +| main.rs:433:17:436:9 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:435:17:435:41 | MyPair {...} | | main.rs:229:5:233:5 | MyPair | +| main.rs:437:29:437:29 | c | | main.rs:229:5:233:5 | MyPair | +| main.rs:439:13:439:17 | thing | | main.rs:224:5:227:5 | MyThing | +| main.rs:439:21:439:37 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | +| main.rs:440:17:440:21 | thing | | main.rs:224:5:227:5 | MyThing | +| main.rs:441:28:441:32 | thing | | main.rs:224:5:227:5 | MyThing | +| main.rs:450:26:450:29 | SelfParam | | main.rs:449:5:453:5 | Self [trait OverlappingTrait] | +| main.rs:452:28:452:31 | SelfParam | | main.rs:449:5:453:5 | Self [trait OverlappingTrait] | +| main.rs:452:34:452:35 | s1 | | main.rs:446:5:447:14 | S1 | +| main.rs:457:26:457:29 | SelfParam | | main.rs:446:5:447:14 | S1 | +| main.rs:457:38:459:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:462:28:462:31 | SelfParam | | main.rs:446:5:447:14 | S1 | +| main.rs:462:34:462:35 | s1 | | main.rs:446:5:447:14 | S1 | +| main.rs:462:48:464:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:469:26:469:29 | SelfParam | | main.rs:446:5:447:14 | S1 | +| main.rs:469:38:471:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:470:13:470:16 | self | | main.rs:446:5:447:14 | S1 | +| main.rs:474:28:474:31 | SelfParam | | main.rs:446:5:447:14 | S1 | +| main.rs:474:40:476:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:475:13:475:16 | self | | main.rs:446:5:447:14 | S1 | +| main.rs:483:26:483:29 | SelfParam | | main.rs:479:5:479:22 | S2 | +| main.rs:483:26:483:29 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | +| main.rs:483:38:485:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:488:28:488:31 | SelfParam | | main.rs:479:5:479:22 | S2 | +| main.rs:488:28:488:31 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | +| main.rs:488:40:490:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:495:26:495:29 | SelfParam | | main.rs:479:5:479:22 | S2 | +| main.rs:495:26:495:29 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | +| main.rs:495:38:497:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:500:28:500:31 | SelfParam | | main.rs:479:5:479:22 | S2 | +| main.rs:500:28:500:31 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | +| main.rs:500:34:500:35 | s1 | | main.rs:446:5:447:14 | S1 | +| main.rs:500:48:502:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:507:26:507:29 | SelfParam | | main.rs:479:5:479:22 | S2 | +| main.rs:507:26:507:29 | SelfParam | T2 | main.rs:446:5:447:14 | S1 | +| main.rs:507:38:509:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:512:28:512:31 | SelfParam | | main.rs:479:5:479:22 | S2 | +| main.rs:512:28:512:31 | SelfParam | T2 | main.rs:446:5:447:14 | S1 | +| main.rs:512:34:512:35 | s1 | | main.rs:446:5:447:14 | S1 | +| main.rs:512:48:514:9 | { ... } | | main.rs:446:5:447:14 | S1 | +| main.rs:521:14:521:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:521:14:521:18 | SelfParam | TRef | main.rs:520:5:522:5 | Self [trait OverlappingTrait2] | +| main.rs:521:21:521:21 | x | | {EXTERNAL LOCATION} | & | +| main.rs:521:21:521:21 | x | TRef | main.rs:520:29:520:29 | T | +| main.rs:526:14:526:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:526:14:526:18 | SelfParam | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:526:14:526:18 | SelfParam | TRef.T3 | main.rs:524:10:524:10 | T | +| main.rs:526:21:526:21 | x | | {EXTERNAL LOCATION} | & | +| main.rs:526:21:526:21 | x | TRef | main.rs:524:10:524:10 | T | +| main.rs:526:37:528:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:526:37:528:9 | { ... } | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:526:37:528:9 | { ... } | TRef.T3 | main.rs:524:10:524:10 | T | +| main.rs:527:13:527:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:527:13:527:16 | self | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:527:13:527:16 | self | TRef.T3 | main.rs:524:10:524:10 | T | +| main.rs:533:14:533:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:533:14:533:18 | SelfParam | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:533:14:533:18 | SelfParam | TRef.T3 | main.rs:531:10:531:10 | T | +| main.rs:533:21:533:21 | x | | main.rs:531:10:531:10 | T | +| main.rs:533:36:535:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:533:36:535:9 | { ... } | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:533:36:535:9 | { ... } | TRef.T3 | main.rs:531:10:531:10 | T | +| main.rs:534:13:534:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:534:13:534:16 | self | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:534:13:534:16 | self | TRef.T3 | main.rs:531:10:531:10 | T | +| main.rs:540:14:540:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:540:14:540:18 | SelfParam | TRef | main.rs:538:5:541:5 | Self [trait MyTrait1] | +| main.rs:540:21:540:22 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:550:14:550:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:550:14:550:18 | SelfParam | TRef | main.rs:545:5:546:14 | S4 | +| main.rs:550:21:550:22 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:560:14:560:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:560:14:560:18 | SelfParam | TRef | main.rs:555:5:556:22 | S5 | +| main.rs:560:14:560:18 | SelfParam | TRef.T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:560:21:560:22 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:569:16:595:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:571:18:571:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:571:18:571:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:571:18:571:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:571:18:571:42 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:572:18:572:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:572:18:572:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:572:18:572:45 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:572:18:572:45 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:572:26:572:45 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | +| main.rs:573:18:573:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:573:18:573:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:573:18:573:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:573:18:573:44 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:574:18:574:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:574:18:574:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:574:18:574:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:574:18:574:47 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:574:26:574:47 | ...::common_method_2(...) | | main.rs:446:5:447:14 | S1 | +| main.rs:577:18:577:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:577:18:577:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:577:18:577:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:577:18:577:42 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:578:18:578:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:578:18:578:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:578:18:578:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:578:18:578:56 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:578:26:578:56 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | +| main.rs:581:18:581:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:581:18:581:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:581:18:581:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:581:18:581:42 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:582:18:582:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:582:18:582:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:582:18:582:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:582:18:582:49 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:582:26:582:49 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | +| main.rs:583:18:583:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:583:18:583:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:583:18:583:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:583:18:583:56 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:583:26:583:56 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | +| main.rs:586:18:586:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:586:18:586:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:586:18:586:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:586:18:586:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:587:18:587:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:587:18:587:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:587:18:587:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:587:18:587:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:587:26:587:37 | ...::m(...) | | {EXTERNAL LOCATION} | & | +| main.rs:587:26:587:37 | ...::m(...) | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:587:32:587:33 | &w | | {EXTERNAL LOCATION} | & | +| main.rs:590:9:590:18 | ...::m(...) | | {EXTERNAL LOCATION} | () | +| main.rs:590:15:590:17 | &S4 | | {EXTERNAL LOCATION} | & | +| main.rs:591:12:591:15 | 0i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:592:9:592:24 | ...::m(...) | | {EXTERNAL LOCATION} | () | +| main.rs:592:15:592:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:592:19:592:22 | 0i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:593:12:593:15 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:594:9:594:24 | ...::m(...) | | {EXTERNAL LOCATION} | () | +| main.rs:594:15:594:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:594:19:594:22 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:611:19:611:22 | SelfParam | | main.rs:609:5:612:5 | Self [trait FirstTrait] | +| main.rs:616:19:616:22 | SelfParam | | main.rs:614:5:617:5 | Self [trait SecondTrait] | +| main.rs:619:64:619:64 | x | | main.rs:619:45:619:61 | T | +| main.rs:619:70:623:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:621:18:621:18 | x | | main.rs:619:45:619:61 | T | +| main.rs:622:18:622:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:622:18:622:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:622:18:622:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:622:18:622:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:625:65:625:65 | x | | main.rs:625:46:625:62 | T | +| main.rs:625:71:629:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:627:18:627:18 | x | | main.rs:625:46:625:62 | T | +| main.rs:628:18:628:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:628:18:628:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:628:18:628:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:628:18:628:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:631:49:631:49 | x | | main.rs:631:30:631:46 | T | +| main.rs:631:55:634:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:632:17:632:17 | x | | main.rs:631:30:631:46 | T | +| main.rs:633:18:633:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:633:18:633:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:633:18:633:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:633:18:633:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:636:53:636:53 | x | | main.rs:636:34:636:50 | T | +| main.rs:636:59:639:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:637:17:637:17 | x | | main.rs:636:34:636:50 | T | +| main.rs:638:18:638:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:638:18:638:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:638:18:638:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:638:18:638:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:641:43:641:43 | x | | main.rs:641:40:641:40 | T | +| main.rs:644:5:647:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:645:17:645:17 | x | | main.rs:641:40:641:40 | T | +| main.rs:646:18:646:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:646:18:646:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:646:18:646:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:646:18:646:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:650:16:650:19 | SelfParam | | main.rs:649:5:653:5 | Self [trait Pair] | +| main.rs:652:16:652:19 | SelfParam | | main.rs:649:5:653:5 | Self [trait Pair] | +| main.rs:655:53:655:53 | x | | main.rs:655:50:655:50 | T | +| main.rs:655:59:655:59 | y | | main.rs:655:50:655:50 | T | +| main.rs:659:5:662:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:660:17:660:17 | x | | main.rs:655:50:655:50 | T | +| main.rs:661:17:661:17 | y | | main.rs:655:50:655:50 | T | +| main.rs:664:58:664:58 | x | | main.rs:664:41:664:55 | T | +| main.rs:664:64:664:64 | y | | main.rs:664:41:664:55 | T | +| main.rs:664:70:669:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:666:18:666:18 | x | | main.rs:664:41:664:55 | T | +| main.rs:667:18:667:18 | y | | main.rs:664:41:664:55 | T | +| main.rs:668:18:668:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:668:18:668:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:668:18:668:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:668:18:668:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:671:69:671:69 | x | | main.rs:671:52:671:66 | T | +| main.rs:671:75:671:75 | y | | main.rs:671:52:671:66 | T | +| main.rs:671:81:676:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:673:18:673:18 | x | | main.rs:671:52:671:66 | T | +| main.rs:674:18:674:18 | y | | main.rs:671:52:671:66 | T | +| main.rs:675:18:675:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:675:18:675:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:675:18:675:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:675:18:675:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:678:50:678:50 | x | | main.rs:678:41:678:47 | T | +| main.rs:678:56:678:56 | y | | main.rs:678:41:678:47 | T | +| main.rs:678:62:683:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:680:18:680:18 | x | | main.rs:678:41:678:47 | T | +| main.rs:681:18:681:18 | y | | main.rs:678:41:678:47 | T | +| main.rs:682:18:682:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:682:18:682:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:682:18:682:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:682:18:682:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:685:54:685:54 | x | | main.rs:685:41:685:51 | T | +| main.rs:685:60:685:60 | y | | main.rs:685:41:685:51 | T | +| main.rs:685:66:690:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:687:18:687:18 | x | | main.rs:685:41:685:51 | T | +| main.rs:688:18:688:18 | y | | main.rs:685:41:685:51 | T | +| main.rs:689:18:689:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:689:18:689:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:689:18:689:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:689:18:689:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:697:18:697:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:697:18:697:22 | SelfParam | TRef | main.rs:694:5:698:5 | Self [trait TraitWithSelfTp] | +| main.rs:700:40:700:44 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:700:40:700:44 | thing | TRef | main.rs:700:17:700:37 | T | +| main.rs:700:56:702:5 | { ... } | | main.rs:700:14:700:14 | A | +| main.rs:701:9:701:13 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:701:9:701:13 | thing | TRef | main.rs:700:17:700:37 | T | +| main.rs:705:44:705:48 | thing | | main.rs:705:24:705:41 | S | +| main.rs:705:61:708:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:706:19:706:23 | thing | | main.rs:705:24:705:41 | S | +| main.rs:713:55:713:59 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:713:55:713:59 | thing | TRef | main.rs:713:25:713:52 | S | +| main.rs:713:66:716:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:715:25:715:29 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:715:25:715:29 | thing | TRef | main.rs:713:25:713:52 | S | +| main.rs:724:18:724:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:724:18:724:22 | SelfParam | TRef | main.rs:718:5:720:5 | MyStruct | +| main.rs:724:41:726:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:724:41:726:9 | { ... } | T | main.rs:718:5:720:5 | MyStruct | +| main.rs:725:18:725:47 | MyStruct {...} | | main.rs:718:5:720:5 | MyStruct | +| main.rs:725:36:725:39 | self | | {EXTERNAL LOCATION} | & | +| main.rs:725:36:725:39 | self | TRef | main.rs:718:5:720:5 | MyStruct | +| main.rs:731:19:734:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:732:13:732:13 | s | | main.rs:718:5:720:5 | MyStruct | +| main.rs:732:17:732:37 | MyStruct {...} | | main.rs:718:5:720:5 | MyStruct | +| main.rs:733:25:733:26 | &s | | {EXTERNAL LOCATION} | & | +| main.rs:733:26:733:26 | s | | main.rs:718:5:720:5 | MyStruct | +| main.rs:749:15:749:18 | SelfParam | | main.rs:748:5:759:5 | Self [trait MyTrait] | +| main.rs:751:15:751:18 | SelfParam | | main.rs:748:5:759:5 | Self [trait MyTrait] | +| main.rs:754:9:756:9 | { ... } | | main.rs:748:19:748:19 | A | +| main.rs:755:13:755:16 | self | | main.rs:748:5:759:5 | Self [trait MyTrait] | +| main.rs:758:18:758:18 | x | | main.rs:748:5:759:5 | Self [trait MyTrait] | +| main.rs:762:15:762:18 | SelfParam | | main.rs:745:5:746:14 | S2 | +| main.rs:762:26:764:9 | { ... } | | main.rs:761:10:761:19 | T | +| main.rs:766:18:766:18 | x | | main.rs:745:5:746:14 | S2 | +| main.rs:766:32:768:9 | { ... } | | main.rs:761:10:761:19 | T | +| main.rs:772:15:772:18 | SelfParam | | main.rs:743:5:744:14 | S1 | +| main.rs:772:28:774:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:776:18:776:18 | x | | main.rs:743:5:744:14 | S1 | +| main.rs:776:34:778:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:783:50:783:50 | x | | main.rs:783:26:783:47 | T2 | +| main.rs:783:63:786:5 | { ... } | | main.rs:783:22:783:23 | T1 | +| main.rs:784:9:784:9 | x | | main.rs:783:26:783:47 | T2 | +| main.rs:785:9:785:9 | x | | main.rs:783:26:783:47 | T2 | +| main.rs:787:52:787:52 | x | | main.rs:787:28:787:49 | T2 | +| main.rs:787:65:791:5 | { ... } | | main.rs:787:24:787:25 | T1 | +| main.rs:788:24:788:24 | x | | main.rs:787:28:787:49 | T2 | +| main.rs:790:16:790:16 | x | | main.rs:787:28:787:49 | T2 | +| main.rs:792:52:792:52 | x | | main.rs:792:28:792:49 | T2 | +| main.rs:792:65:796:5 | { ... } | | main.rs:792:24:792:25 | T1 | +| main.rs:793:29:793:29 | x | | main.rs:792:28:792:49 | T2 | +| main.rs:795:21:795:21 | x | | main.rs:792:28:792:49 | T2 | +| main.rs:797:55:797:55 | x | | main.rs:797:31:797:52 | T2 | +| main.rs:797:68:801:5 | { ... } | | main.rs:797:27:797:28 | T1 | +| main.rs:798:27:798:27 | x | | main.rs:797:31:797:52 | T2 | +| main.rs:800:19:800:19 | x | | main.rs:797:31:797:52 | T2 | +| main.rs:802:55:802:55 | x | | main.rs:802:31:802:52 | T2 | +| main.rs:802:68:806:5 | { ... } | | main.rs:802:27:802:28 | T1 | +| main.rs:803:32:803:32 | x | | main.rs:802:31:802:52 | T2 | +| main.rs:805:24:805:24 | x | | main.rs:802:31:802:52 | T2 | +| main.rs:810:49:810:49 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:810:49:810:49 | x | T | main.rs:810:32:810:46 | T2 | +| main.rs:810:71:812:5 | { ... } | | main.rs:810:28:810:29 | T1 | +| main.rs:811:9:811:9 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:811:9:811:9 | x | T | main.rs:810:32:810:46 | T2 | +| main.rs:813:51:813:51 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:813:51:813:51 | x | T | main.rs:813:34:813:48 | T2 | +| main.rs:813:73:815:5 | { ... } | | main.rs:813:30:813:31 | T1 | +| main.rs:814:16:814:16 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:814:16:814:16 | x | T | main.rs:813:34:813:48 | T2 | +| main.rs:816:51:816:51 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:816:51:816:51 | x | T | main.rs:816:34:816:48 | T2 | +| main.rs:816:73:818:5 | { ... } | | main.rs:816:30:816:31 | T1 | +| main.rs:817:21:817:21 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:817:21:817:21 | x | T | main.rs:816:34:816:48 | T2 | +| main.rs:821:15:821:18 | SelfParam | | main.rs:738:5:741:5 | MyThing | +| main.rs:821:15:821:18 | SelfParam | T | main.rs:820:10:820:10 | T | +| main.rs:821:26:823:9 | { ... } | | main.rs:820:10:820:10 | T | +| main.rs:822:13:822:16 | self | | main.rs:738:5:741:5 | MyThing | +| main.rs:822:13:822:16 | self | T | main.rs:820:10:820:10 | T | +| main.rs:825:18:825:18 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:825:18:825:18 | x | T | main.rs:820:10:820:10 | T | +| main.rs:825:32:827:9 | { ... } | | main.rs:820:10:820:10 | T | +| main.rs:826:13:826:13 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:826:13:826:13 | x | T | main.rs:820:10:820:10 | T | +| main.rs:832:15:832:18 | SelfParam | | main.rs:830:5:833:5 | Self [trait MyTrait2] | +| main.rs:837:15:837:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:837:15:837:19 | SelfParam | TRef | main.rs:835:5:838:5 | Self [trait MyTrait3] | +| main.rs:840:46:840:46 | x | | main.rs:840:22:840:43 | T | +| main.rs:840:52:840:52 | y | | {EXTERNAL LOCATION} | & | +| main.rs:840:52:840:52 | y | TRef | main.rs:840:22:840:43 | T | +| main.rs:840:59:843:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:841:9:841:9 | x | | main.rs:840:22:840:43 | T | +| main.rs:842:9:842:9 | y | | {EXTERNAL LOCATION} | & | +| main.rs:842:9:842:9 | y | TRef | main.rs:840:22:840:43 | T | +| main.rs:845:16:903:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:846:13:846:13 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:846:17:846:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:847:13:847:13 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:847:17:847:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:849:18:849:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:849:18:849:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:849:18:849:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:849:18:849:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:849:26:849:26 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:850:18:850:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:850:18:850:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:850:18:850:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:850:18:850:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:850:26:850:26 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:852:13:852:13 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:852:17:852:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:853:13:853:13 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:853:17:853:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:855:18:855:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:855:18:855:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:855:18:855:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:855:18:855:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:855:26:855:26 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:856:18:856:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:856:18:856:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:856:18:856:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:856:18:856:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:856:26:856:26 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:858:13:858:14 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:858:18:858:34 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:859:13:859:14 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:859:18:859:34 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:861:31:861:32 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:862:18:862:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:862:18:862:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:862:18:862:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:862:18:862:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:863:33:863:34 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:864:18:864:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:864:18:864:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:864:18:864:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:864:18:864:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:865:33:865:34 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:866:18:866:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:866:18:866:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:866:18:866:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:866:18:866:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:867:31:867:32 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:868:18:868:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:868:18:868:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:868:18:868:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:868:18:868:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:869:33:869:34 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:870:18:870:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:870:18:870:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:870:18:870:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:870:18:870:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:871:33:871:34 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:872:18:872:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:872:18:872:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:872:18:872:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:872:18:872:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:873:36:873:37 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:874:18:874:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:874:18:874:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:874:18:874:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:874:18:874:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:875:36:875:37 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:876:18:876:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:876:18:876:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:876:18:876:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:876:18:876:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:877:36:877:37 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:878:18:878:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:878:18:878:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:878:18:878:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:878:18:878:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:879:36:879:37 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:880:18:880:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:880:18:880:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:880:18:880:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:880:18:880:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:882:13:882:14 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:882:18:884:9 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:883:16:883:32 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:885:13:885:14 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:885:18:887:9 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:886:16:886:32 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:889:37:889:38 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:890:18:890:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:890:18:890:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:890:18:890:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:890:18:890:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:891:39:891:40 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:892:18:892:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:892:18:892:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:892:18:892:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:892:18:892:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:893:39:893:40 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:894:18:894:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:894:18:894:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:894:18:894:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:894:18:894:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:895:37:895:38 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:896:18:896:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:896:18:896:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:896:18:896:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:896:18:896:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:897:39:897:40 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:898:18:898:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:898:18:898:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:898:18:898:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:898:18:898:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:899:39:899:40 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:900:18:900:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:900:18:900:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:900:18:900:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:900:18:900:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:902:13:902:13 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:913:19:913:22 | SelfParam | | main.rs:907:5:910:5 | Wrapper | +| main.rs:913:19:913:22 | SelfParam | A | main.rs:912:10:912:10 | A | +| main.rs:913:30:915:9 | { ... } | | main.rs:912:10:912:10 | A | +| main.rs:914:13:914:16 | self | | main.rs:907:5:910:5 | Wrapper | +| main.rs:914:13:914:16 | self | A | main.rs:912:10:912:10 | A | +| main.rs:922:15:922:18 | SelfParam | | main.rs:918:5:932:5 | Self [trait MyTrait] | +| main.rs:924:15:924:18 | SelfParam | | main.rs:918:5:932:5 | Self [trait MyTrait] | +| main.rs:928:9:931:9 | { ... } | | main.rs:919:9:919:28 | AssociatedType | +| main.rs:929:13:929:16 | self | | main.rs:918:5:932:5 | Self [trait MyTrait] | +| main.rs:938:19:938:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:938:19:938:23 | SelfParam | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:938:26:938:26 | a | | main.rs:938:16:938:16 | A | +| main.rs:940:22:940:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:940:22:940:26 | SelfParam | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:940:29:940:29 | a | | main.rs:940:19:940:19 | A | +| main.rs:940:35:940:35 | b | | main.rs:940:19:940:19 | A | +| main.rs:940:75:943:9 | { ... } | | main.rs:935:9:935:52 | GenericAssociatedType | +| main.rs:941:13:941:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:941:13:941:16 | self | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:941:22:941:22 | a | | main.rs:940:19:940:19 | A | +| main.rs:942:13:942:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:942:13:942:16 | self | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:942:22:942:22 | b | | main.rs:940:19:940:19 | A | +| main.rs:951:21:951:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:951:21:951:25 | SelfParam | TRef | main.rs:946:5:956:5 | Self [trait TraitMultipleAssoc] | +| main.rs:953:20:953:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:953:20:953:24 | SelfParam | TRef | main.rs:946:5:956:5 | Self [trait TraitMultipleAssoc] | +| main.rs:955:20:955:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:955:20:955:24 | SelfParam | TRef | main.rs:946:5:956:5 | Self [trait TraitMultipleAssoc] | +| main.rs:971:15:971:18 | SelfParam | | main.rs:958:5:959:13 | S | +| main.rs:971:45:973:9 | { ... } | | main.rs:964:5:965:14 | AT | +| main.rs:981:19:981:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:981:19:981:23 | SelfParam | TRef | main.rs:958:5:959:13 | S | +| main.rs:981:26:981:26 | a | | main.rs:981:16:981:16 | A | +| main.rs:981:46:983:9 | { ... } | | main.rs:907:5:910:5 | Wrapper | +| main.rs:981:46:983:9 | { ... } | A | main.rs:981:16:981:16 | A | +| main.rs:982:13:982:32 | Wrapper {...} | | main.rs:907:5:910:5 | Wrapper | +| main.rs:982:30:982:30 | a | | main.rs:981:16:981:16 | A | +| main.rs:990:15:990:18 | SelfParam | | main.rs:961:5:962:14 | S2 | +| main.rs:990:45:992:9 | { ... } | | main.rs:907:5:910:5 | Wrapper | +| main.rs:990:45:992:9 | { ... } | A | main.rs:961:5:962:14 | S2 | +| main.rs:991:13:991:35 | Wrapper {...} | | main.rs:907:5:910:5 | Wrapper | +| main.rs:991:30:991:33 | self | | main.rs:961:5:962:14 | S2 | +| main.rs:997:30:999:9 | { ... } | | main.rs:907:5:910:5 | Wrapper | +| main.rs:997:30:999:9 | { ... } | A | main.rs:961:5:962:14 | S2 | +| main.rs:998:13:998:33 | Wrapper {...} | | main.rs:907:5:910:5 | Wrapper | +| main.rs:1004:22:1004:26 | thing | | main.rs:1004:10:1004:19 | T | +| main.rs:1005:9:1005:13 | thing | | main.rs:1004:10:1004:19 | T | +| main.rs:1012:21:1012:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1012:21:1012:25 | SelfParam | TRef | main.rs:964:5:965:14 | AT | +| main.rs:1012:34:1014:9 | { ... } | | main.rs:964:5:965:14 | AT | +| main.rs:1016:20:1016:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1016:20:1016:24 | SelfParam | TRef | main.rs:964:5:965:14 | AT | +| main.rs:1016:43:1018:9 | { ... } | | main.rs:958:5:959:13 | S | +| main.rs:1020:20:1020:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1020:20:1020:24 | SelfParam | TRef | main.rs:964:5:965:14 | AT | +| main.rs:1020:43:1022:9 | { ... } | | main.rs:961:5:962:14 | S2 | +| main.rs:1025:16:1053:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1028:18:1028:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1028:18:1028:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1028:18:1028:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1028:18:1028:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1033:18:1033:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1033:18:1033:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1033:18:1033:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1033:18:1033:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1037:18:1037:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1037:18:1037:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1037:18:1037:43 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1037:18:1037:43 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1040:18:1040:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1040:18:1040:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1040:18:1040:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1040:18:1040:49 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1043:18:1043:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1043:18:1043:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1043:18:1043:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1043:18:1043:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1046:18:1046:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1046:18:1046:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1046:18:1046:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1046:18:1046:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1048:18:1048:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1048:18:1048:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1048:18:1048:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1048:18:1048:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1060:19:1060:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1060:19:1060:23 | SelfParam | TRef | main.rs:1057:5:1061:5 | Self [trait Supertrait] | +| main.rs:1060:26:1060:32 | content | | main.rs:1058:9:1058:21 | Content | +| main.rs:1065:24:1065:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1065:24:1065:28 | SelfParam | TRef | main.rs:1063:5:1066:5 | Self [trait Subtrait] | +| main.rs:1074:23:1074:27 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1074:23:1074:27 | SelfParam | TRef | main.rs:1068:5:1078:5 | Self [trait Subtrait2] | +| main.rs:1074:68:1077:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1075:13:1075:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1075:13:1075:16 | self | TRef | main.rs:1068:5:1078:5 | Self [trait Subtrait2] | +| main.rs:1076:13:1076:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1076:13:1076:16 | self | TRef | main.rs:1068:5:1078:5 | Self [trait Subtrait2] | +| main.rs:1084:19:1084:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1084:19:1084:23 | SelfParam | TRef | main.rs:1080:5:1080:24 | MyType | +| main.rs:1084:19:1084:23 | SelfParam | TRef.T | main.rs:1082:10:1082:10 | T | +| main.rs:1084:26:1084:33 | _content | | main.rs:1082:10:1082:10 | T | +| main.rs:1084:51:1086:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1085:22:1085:42 | "Inserting content: \\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1085:22:1085:42 | "Inserting content: \\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1085:22:1085:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1085:22:1085:42 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1091:24:1091:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1091:24:1091:28 | SelfParam | TRef | main.rs:1080:5:1080:24 | MyType | +| main.rs:1091:24:1091:28 | SelfParam | TRef.T | main.rs:1089:10:1089:17 | T | +| main.rs:1092:15:1092:18 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1092:15:1092:18 | self | TRef | main.rs:1080:5:1080:24 | MyType | +| main.rs:1092:15:1092:18 | self | TRef.T | main.rs:1089:10:1089:17 | T | +| main.rs:1096:33:1096:36 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1096:33:1096:36 | item | TRef | main.rs:1096:20:1096:30 | T | +| main.rs:1097:9:1097:12 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1097:9:1097:12 | item | TRef | main.rs:1096:20:1096:30 | T | +| main.rs:1100:35:1100:38 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1100:35:1100:38 | item | TRef | main.rs:1100:21:1100:32 | T | +| main.rs:1100:93:1103:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1101:9:1101:12 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1101:9:1101:12 | item | TRef | main.rs:1100:21:1100:32 | T | +| main.rs:1102:9:1102:12 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1102:9:1102:12 | item | TRef | main.rs:1100:21:1100:32 | T | +| main.rs:1105:15:1111:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1106:28:1106:32 | 42i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1109:28:1109:31 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1110:37:1110:42 | &item2 | | {EXTERNAL LOCATION} | & | +| main.rs:1127:15:1127:18 | SelfParam | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1127:15:1127:18 | SelfParam | A | main.rs:1126:10:1126:10 | T | +| main.rs:1127:26:1132:9 | { ... } | | main.rs:1126:10:1126:10 | T | +| main.rs:1128:19:1128:22 | self | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1128:19:1128:22 | self | A | main.rs:1126:10:1126:10 | T | +| main.rs:1130:17:1130:32 | ...::C2 {...} | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1135:16:1141:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1137:13:1137:13 | y | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1137:17:1137:36 | ...::C2 {...} | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1139:18:1139:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1139:18:1139:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1139:18:1139:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1139:18:1139:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1140:18:1140:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1140:18:1140:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1140:18:1140:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1140:18:1140:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1140:26:1140:26 | y | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1162:15:1162:18 | SelfParam | | main.rs:1160:5:1163:5 | Self [trait MyTrait1] | +| main.rs:1167:15:1167:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1167:15:1167:19 | SelfParam | TRef | main.rs:1165:5:1177:5 | Self [trait MyTrait2] | +| main.rs:1170:9:1176:9 | { ... } | | main.rs:1165:20:1165:22 | Tr2 | +| main.rs:1172:17:1172:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1172:17:1172:20 | self | TRef | main.rs:1165:5:1177:5 | Self [trait MyTrait2] | +| main.rs:1174:27:1174:30 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1174:27:1174:30 | self | TRef | main.rs:1165:5:1177:5 | Self [trait MyTrait2] | +| main.rs:1181:15:1181:18 | SelfParam | | main.rs:1179:5:1191:5 | Self [trait MyTrait3] | +| main.rs:1184:9:1190:9 | { ... } | | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1186:17:1186:20 | self | | main.rs:1179:5:1191:5 | Self [trait MyTrait3] | +| main.rs:1188:26:1188:30 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:1188:27:1188:30 | self | | main.rs:1179:5:1191:5 | Self [trait MyTrait3] | +| main.rs:1195:15:1195:18 | SelfParam | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1195:15:1195:18 | SelfParam | A | main.rs:1193:10:1193:10 | T | +| main.rs:1195:26:1197:9 | { ... } | | main.rs:1193:10:1193:10 | T | +| main.rs:1196:13:1196:16 | self | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1196:13:1196:16 | self | A | main.rs:1193:10:1193:10 | T | +| main.rs:1204:15:1204:18 | SelfParam | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1204:15:1204:18 | SelfParam | A | main.rs:1202:10:1202:10 | T | +| main.rs:1204:35:1206:9 | { ... } | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1204:35:1206:9 | { ... } | A | main.rs:1202:10:1202:10 | T | +| main.rs:1205:13:1205:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1205:26:1205:29 | self | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1205:26:1205:29 | self | A | main.rs:1202:10:1202:10 | T | +| main.rs:1213:44:1213:44 | x | | main.rs:1213:26:1213:41 | T2 | +| main.rs:1213:57:1215:5 | { ... } | | main.rs:1213:22:1213:23 | T1 | +| main.rs:1214:9:1214:9 | x | | main.rs:1213:26:1213:41 | T2 | +| main.rs:1217:56:1217:56 | x | | main.rs:1217:39:1217:53 | T | +| main.rs:1217:62:1221:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1219:17:1219:17 | x | | main.rs:1217:39:1217:53 | T | +| main.rs:1220:18:1220:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1220:18:1220:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1220:18:1220:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1220:18:1220:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1223:16:1247:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1224:13:1224:13 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1224:17:1224:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1225:13:1225:13 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1225:17:1225:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1227:18:1227:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1227:18:1227:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1227:18:1227:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1227:18:1227:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1227:26:1227:26 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1228:18:1228:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1228:18:1228:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1228:18:1228:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1228:18:1228:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1228:26:1228:26 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1230:13:1230:13 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1230:17:1230:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1231:13:1231:13 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1231:17:1231:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1233:18:1233:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1233:18:1233:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1233:18:1233:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1233:18:1233:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1233:26:1233:26 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1234:18:1234:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1234:18:1234:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1234:18:1234:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1234:18:1234:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1234:26:1234:26 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1236:13:1236:13 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1236:17:1236:34 | MyThing2 {...} | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1237:13:1237:13 | y | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1237:17:1237:34 | MyThing2 {...} | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1239:18:1239:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1239:18:1239:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1239:18:1239:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1239:18:1239:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1239:26:1239:26 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1240:18:1240:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1240:18:1240:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1240:18:1240:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1240:18:1240:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1240:26:1240:26 | y | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1242:13:1242:13 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1242:17:1242:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1243:31:1243:31 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1245:13:1245:13 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1245:17:1245:34 | MyThing2 {...} | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1246:31:1246:31 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1263:22:1263:22 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1263:22:1263:22 | x | TRef | main.rs:1263:11:1263:19 | T | +| main.rs:1263:35:1265:5 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1263:35:1265:5 | { ... } | TRef | main.rs:1263:11:1263:19 | T | +| main.rs:1264:9:1264:9 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1264:9:1264:9 | x | TRef | main.rs:1263:11:1263:19 | T | +| main.rs:1268:17:1268:20 | SelfParam | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1268:29:1270:9 | { ... } | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1273:21:1273:21 | x | | main.rs:1273:13:1273:14 | T1 | +| main.rs:1276:5:1278:5 | { ... } | | main.rs:1273:17:1273:18 | T2 | +| main.rs:1277:9:1277:9 | x | | main.rs:1273:13:1273:14 | T1 | +| main.rs:1280:16:1296:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1282:18:1282:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1282:18:1282:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1282:18:1282:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1282:18:1282:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1282:26:1282:31 | id(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1282:29:1282:30 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1285:18:1285:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1285:18:1285:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1285:18:1285:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1285:18:1285:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1285:26:1285:37 | id::<...>(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1285:26:1285:37 | id::<...>(...) | TRef | main.rs:1253:5:1254:14 | S1 | +| main.rs:1285:35:1285:36 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1289:18:1289:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1289:18:1289:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1289:18:1289:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1289:18:1289:44 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1289:26:1289:44 | id::<...>(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1289:26:1289:44 | id::<...>(...) | TRef | main.rs:1259:5:1259:25 | dyn Trait | +| main.rs:1289:42:1289:43 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1292:9:1292:25 | into::<...>(...) | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1295:13:1295:13 | y | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1309:22:1309:25 | SelfParam | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1309:22:1309:25 | SelfParam | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1309:22:1309:25 | SelfParam | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1309:35:1316:9 | { ... } | | main.rs:1308:15:1308:17 | Snd | +| main.rs:1310:19:1310:22 | self | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1310:19:1310:22 | self | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1310:19:1310:22 | self | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1311:43:1311:82 | MacroExpr | | file://:0:0:0:0 | ! | +| main.rs:1311:50:1311:81 | "PairNone has no second elemen... | | {EXTERNAL LOCATION} | & | +| main.rs:1311:50:1311:81 | "PairNone has no second elemen... | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1311:50:1311:81 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | +| main.rs:1311:50:1311:81 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1312:43:1312:81 | MacroExpr | | file://:0:0:0:0 | ! | +| main.rs:1312:50:1312:80 | "PairFst has no second element... | | {EXTERNAL LOCATION} | & | +| main.rs:1312:50:1312:80 | "PairFst has no second element... | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1312:50:1312:80 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | +| main.rs:1312:50:1312:80 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1340:10:1340:10 | t | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1340:10:1340:10 | t | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1340:10:1340:10 | t | Snd | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1340:10:1340:10 | t | Snd.Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1340:10:1340:10 | t | Snd.Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1340:30:1343:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1341:17:1341:17 | t | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1341:17:1341:17 | t | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1341:17:1341:17 | t | Snd | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1341:17:1341:17 | t | Snd.Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1341:17:1341:17 | t | Snd.Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1342:18:1342:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1342:18:1342:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1342:18:1342:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1342:18:1342:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1357:22:1357:25 | SelfParam | | main.rs:1355:5:1358:5 | Self [trait TraitWithAssocType] | +| main.rs:1365:22:1365:25 | SelfParam | | main.rs:1353:5:1353:28 | GenS | +| main.rs:1365:22:1365:25 | SelfParam | GenT | main.rs:1360:10:1360:15 | Output | +| main.rs:1365:44:1367:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1365:44:1367:9 | { ... } | E | main.rs:1360:10:1360:15 | Output | +| main.rs:1365:44:1367:9 | { ... } | T | main.rs:1360:10:1360:15 | Output | +| main.rs:1366:16:1366:19 | self | | main.rs:1353:5:1353:28 | GenS | +| main.rs:1366:16:1366:19 | self | GenT | main.rs:1360:10:1360:15 | Output | +| main.rs:1370:16:1392:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1372:13:1372:14 | p1 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1372:13:1372:14 | p1 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1372:13:1372:14 | p1 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1373:18:1373:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1373:18:1373:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1373:18:1373:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1373:18:1373:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1373:26:1373:27 | p1 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1373:26:1373:27 | p1 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1373:26:1373:27 | p1 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1376:13:1376:14 | p2 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1376:13:1376:14 | p2 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1376:13:1376:14 | p2 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1377:18:1377:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1377:18:1377:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1377:18:1377:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1377:18:1377:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1377:26:1377:27 | p2 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1377:26:1377:27 | p2 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1377:26:1377:27 | p2 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1380:13:1380:14 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1380:13:1380:14 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1381:18:1381:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1381:18:1381:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1381:18:1381:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1381:18:1381:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1381:26:1381:27 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1381:26:1381:27 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1384:13:1384:14 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1384:13:1384:14 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1384:13:1384:14 | p3 | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1385:18:1385:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1385:18:1385:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1385:18:1385:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1385:18:1385:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1385:26:1385:27 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1385:26:1385:27 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1385:26:1385:27 | p3 | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1387:9:1387:55 | g(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1389:13:1389:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1389:13:1389:13 | x | E | main.rs:1319:5:1320:14 | S1 | +| main.rs:1389:13:1389:13 | x | T | main.rs:1345:5:1345:34 | S4 | +| main.rs:1389:13:1389:13 | x | T.T41 | main.rs:1322:5:1323:14 | S2 | +| main.rs:1389:13:1389:13 | x | T.T42 | main.rs:1347:5:1347:22 | S5 | +| main.rs:1389:13:1389:13 | x | T.T42.T5 | main.rs:1322:5:1323:14 | S2 | +| main.rs:1391:22:1391:25 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1404:16:1404:24 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1404:16:1404:24 | SelfParam | TRefMut | main.rs:1402:5:1409:5 | Self [trait MyTrait] | +| main.rs:1404:27:1404:31 | value | | main.rs:1402:19:1402:19 | S | +| main.rs:1406:21:1406:29 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1406:21:1406:29 | SelfParam | TRefMut | main.rs:1402:5:1409:5 | Self [trait MyTrait] | +| main.rs:1406:32:1406:36 | value | | main.rs:1402:19:1402:19 | S | +| main.rs:1406:42:1408:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1407:13:1407:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1407:13:1407:16 | self | TRefMut | main.rs:1402:5:1409:5 | Self [trait MyTrait] | +| main.rs:1407:22:1407:26 | value | | main.rs:1402:19:1402:19 | S | +| main.rs:1413:16:1413:24 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1413:16:1413:24 | SelfParam | TRefMut | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1413:16:1413:24 | SelfParam | TRefMut.T | main.rs:1411:10:1411:10 | T | +| main.rs:1413:27:1413:31 | value | | main.rs:1411:10:1411:10 | T | +| main.rs:1413:37:1413:38 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1417:26:1419:9 | { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1417:26:1419:9 | { ... } | T | main.rs:1416:10:1416:10 | T | +| main.rs:1423:20:1423:23 | SelfParam | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1423:20:1423:23 | SelfParam | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1423:20:1423:23 | SelfParam | T.T | main.rs:1422:10:1422:10 | T | +| main.rs:1423:41:1428:9 | { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1423:41:1428:9 | { ... } | T | main.rs:1422:10:1422:10 | T | +| main.rs:1424:19:1424:22 | self | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1424:19:1424:22 | self | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1424:19:1424:22 | self | T.T | main.rs:1422:10:1422:10 | T | +| main.rs:1434:16:1479:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1435:13:1435:14 | x1 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1435:13:1435:14 | x1 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1435:18:1435:37 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1435:18:1435:37 | ...::new(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1436:18:1436:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1436:18:1436:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1436:18:1436:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1436:18:1436:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1436:26:1436:27 | x1 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1436:26:1436:27 | x1 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1438:17:1438:18 | x2 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1438:22:1438:36 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1439:9:1439:10 | x2 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1440:18:1440:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1440:18:1440:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1440:18:1440:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1440:18:1440:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1440:26:1440:27 | x2 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1442:17:1442:18 | x3 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1442:22:1442:36 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1443:9:1443:10 | x3 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1444:18:1444:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1444:18:1444:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1444:18:1444:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1444:18:1444:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1444:26:1444:27 | x3 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1446:17:1446:18 | x4 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1446:22:1446:36 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1447:9:1447:33 | ...::set(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1447:23:1447:29 | &mut x4 | | {EXTERNAL LOCATION} | &mut | +| main.rs:1447:28:1447:29 | x4 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1448:18:1448:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1448:18:1448:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1448:18:1448:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1448:18:1448:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1448:26:1448:27 | x4 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1451:18:1451:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1451:18:1451:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1451:18:1451:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1451:18:1451:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1454:18:1454:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1454:18:1454:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1454:18:1454:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1454:18:1454:61 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1454:26:1454:61 | ...::flatten(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1454:26:1454:61 | ...::flatten(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1462:18:1462:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1462:18:1462:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1462:18:1462:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1462:18:1462:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1466:13:1466:16 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1467:13:1467:17 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1469:18:1469:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1469:18:1469:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1469:18:1469:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1469:18:1469:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1472:30:1477:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1473:13:1475:13 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1473:22:1475:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1478:18:1478:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1478:18:1478:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1478:18:1478:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1478:18:1478:34 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1496:15:1496:18 | SelfParam | | main.rs:1484:5:1485:19 | S | +| main.rs:1496:15:1496:18 | SelfParam | T | main.rs:1495:10:1495:10 | T | +| main.rs:1496:26:1498:9 | { ... } | | main.rs:1495:10:1495:10 | T | +| main.rs:1497:13:1497:16 | self | | main.rs:1484:5:1485:19 | S | +| main.rs:1497:13:1497:16 | self | T | main.rs:1495:10:1495:10 | T | +| main.rs:1500:15:1500:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1500:15:1500:19 | SelfParam | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1500:15:1500:19 | SelfParam | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1500:28:1502:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1500:28:1502:9 | { ... } | TRef | main.rs:1495:10:1495:10 | T | +| main.rs:1501:13:1501:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1501:14:1501:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1501:14:1501:17 | self | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1501:14:1501:17 | self | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1504:15:1504:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1504:15:1504:25 | SelfParam | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1504:15:1504:25 | SelfParam | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1504:34:1506:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1504:34:1506:9 | { ... } | TRef | main.rs:1495:10:1495:10 | T | +| main.rs:1505:13:1505:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1505:14:1505:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1505:14:1505:17 | self | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1505:14:1505:17 | self | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1510:29:1510:33 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1510:29:1510:33 | SelfParam | TRef | main.rs:1509:5:1512:5 | Self [trait ATrait] | +| main.rs:1511:33:1511:36 | SelfParam | | main.rs:1509:5:1512:5 | Self [trait ATrait] | +| main.rs:1517:29:1517:33 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1517:29:1517:33 | SelfParam | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1517:29:1517:33 | SelfParam | TRef.TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1517:43:1519:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:1518:17:1518:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1518:17:1518:20 | self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1518:17:1518:20 | self | TRef.TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1522:33:1522:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1522:33:1522:36 | SelfParam | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1522:46:1524:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:1523:15:1523:18 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1523:15:1523:18 | self | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1527:16:1577:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1529:18:1529:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1529:18:1529:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1529:18:1529:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1529:18:1529:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1533:18:1533:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1533:18:1533:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1533:18:1533:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1533:18:1533:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1534:18:1534:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1534:18:1534:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1534:18:1534:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1534:18:1534:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1538:18:1538:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1538:18:1538:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1538:18:1538:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1538:18:1538:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1538:26:1538:41 | ...::m2(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1538:26:1538:41 | ...::m2(...) | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1538:38:1538:40 | &x3 | | {EXTERNAL LOCATION} | & | +| main.rs:1539:18:1539:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1539:18:1539:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1539:18:1539:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1539:18:1539:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1539:26:1539:41 | ...::m3(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1539:26:1539:41 | ...::m3(...) | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1539:38:1539:40 | &x3 | | {EXTERNAL LOCATION} | & | +| main.rs:1541:13:1541:14 | x4 | | {EXTERNAL LOCATION} | & | +| main.rs:1541:18:1541:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1543:18:1543:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1543:18:1543:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1543:18:1543:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1543:18:1543:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1543:26:1543:27 | x4 | | {EXTERNAL LOCATION} | & | +| main.rs:1544:18:1544:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1544:18:1544:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1544:18:1544:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1544:18:1544:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1544:26:1544:27 | x4 | | {EXTERNAL LOCATION} | & | +| main.rs:1546:13:1546:14 | x5 | | {EXTERNAL LOCATION} | & | +| main.rs:1546:18:1546:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1548:18:1548:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1548:18:1548:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1548:18:1548:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1548:18:1548:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1548:26:1548:27 | x5 | | {EXTERNAL LOCATION} | & | +| main.rs:1549:18:1549:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1549:18:1549:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1549:18:1549:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1549:18:1549:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1549:26:1549:27 | x5 | | {EXTERNAL LOCATION} | & | +| main.rs:1551:13:1551:14 | x6 | | {EXTERNAL LOCATION} | & | +| main.rs:1551:18:1551:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1554:18:1554:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1554:18:1554:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1554:18:1554:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1554:18:1554:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1554:28:1554:29 | x6 | | {EXTERNAL LOCATION} | & | +| main.rs:1556:20:1556:22 | &S2 | | {EXTERNAL LOCATION} | & | +| main.rs:1560:18:1560:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1560:18:1560:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1560:18:1560:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1560:18:1560:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1562:13:1562:14 | x9 | | {EXTERNAL LOCATION} | String | +| main.rs:1562:26:1562:32 | "Hello" | | {EXTERNAL LOCATION} | & | +| main.rs:1562:26:1562:32 | "Hello" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1566:17:1566:18 | x9 | | {EXTERNAL LOCATION} | String | +| main.rs:1568:13:1568:20 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1568:24:1568:39 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1568:25:1568:39 | MyInt {...} | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1570:17:1570:24 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1571:18:1571:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1571:18:1571:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1571:18:1571:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1571:18:1571:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1574:13:1574:20 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1574:24:1574:39 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1574:25:1574:39 | MyInt {...} | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1575:17:1575:24 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1576:18:1576:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1576:18:1576:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1576:18:1576:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1576:18:1576:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1583:16:1583:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1583:16:1583:20 | SelfParam | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1586:16:1586:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1586:16:1586:20 | SelfParam | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1586:32:1588:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1586:32:1588:9 | { ... } | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1587:13:1587:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1587:13:1587:16 | self | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1595:16:1595:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1595:16:1595:20 | SelfParam | TRef | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1595:36:1597:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1595:36:1597:9 | { ... } | TRef | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1596:13:1596:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1596:13:1596:16 | self | TRef | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1600:16:1603:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1612:16:1612:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1612:16:1612:20 | SelfParam | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1612:16:1612:20 | SelfParam | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1612:32:1614:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1612:32:1614:9 | { ... } | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1612:32:1614:9 | { ... } | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1613:13:1613:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1613:13:1613:16 | self | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1613:13:1613:16 | self | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1616:16:1616:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1616:16:1616:20 | SelfParam | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1616:16:1616:20 | SelfParam | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1616:23:1616:23 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1616:23:1616:23 | x | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1616:23:1616:23 | x | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1616:42:1618:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1616:42:1618:9 | { ... } | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1616:42:1618:9 | { ... } | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1617:13:1617:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1617:13:1617:16 | self | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1617:13:1617:16 | self | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1621:16:1627:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1626:15:1626:17 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1626:16:1626:17 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1637:17:1637:25 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1637:17:1637:25 | SelfParam | TRefMut | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1637:28:1639:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1638:13:1638:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1638:13:1638:16 | self | TRefMut | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1638:26:1638:29 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1638:26:1638:29 | self | TRefMut | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1645:15:1645:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1645:15:1645:19 | SelfParam | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1645:31:1647:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1645:31:1647:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1646:13:1646:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1646:14:1646:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1646:15:1646:19 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:1646:16:1646:19 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1646:16:1646:19 | self | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1649:15:1649:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1649:15:1649:25 | SelfParam | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1649:37:1651:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1649:37:1651:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1650:13:1650:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1650:14:1650:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1650:15:1650:19 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:1650:16:1650:19 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1650:16:1650:19 | self | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1653:15:1653:15 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1653:15:1653:15 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1653:34:1655:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1653:34:1655:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1654:13:1654:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1654:13:1654:13 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1657:15:1657:15 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1657:15:1657:15 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1657:34:1659:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1657:34:1659:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1658:13:1658:16 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1658:14:1658:16 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1658:15:1658:16 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1658:16:1658:16 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1658:16:1658:16 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1662:16:1675:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1663:13:1663:13 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1663:17:1663:20 | S {...} | | main.rs:1642:5:1642:13 | S | +| main.rs:1664:9:1664:9 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1665:9:1665:9 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1666:9:1666:17 | ...::f3(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1666:9:1666:17 | ...::f3(...) | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1666:15:1666:16 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1666:16:1666:16 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1668:19:1668:24 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1668:20:1668:24 | &true | | {EXTERNAL LOCATION} | & | +| main.rs:1668:21:1668:24 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1673:9:1673:31 | ...::flip(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1673:22:1673:30 | &mut flag | | {EXTERNAL LOCATION} | &mut | +| main.rs:1674:18:1674:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1674:18:1674:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1674:18:1674:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1674:18:1674:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1689:43:1692:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1689:43:1692:5 | { ... } | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1689:43:1692:5 | { ... } | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1696:46:1700:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1696:46:1700:5 | { ... } | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1696:46:1700:5 | { ... } | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1704:40:1709:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1704:40:1709:5 | { ... } | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1704:40:1709:5 | { ... } | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1713:30:1713:34 | input | | {EXTERNAL LOCATION} | Result | +| main.rs:1713:30:1713:34 | input | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1713:30:1713:34 | input | T | main.rs:1713:20:1713:27 | T | +| main.rs:1713:69:1720:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1713:69:1720:5 | { ... } | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1713:69:1720:5 | { ... } | T | main.rs:1713:20:1713:27 | T | +| main.rs:1714:21:1714:25 | input | | {EXTERNAL LOCATION} | Result | +| main.rs:1714:21:1714:25 | input | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1714:21:1714:25 | input | T | main.rs:1713:20:1713:27 | T | +| main.rs:1716:22:1716:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1716:22:1716:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1716:22:1716:30 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1716:22:1716:30 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1723:16:1739:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1724:9:1726:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1724:37:1724:52 | try_same_error(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1724:37:1724:52 | try_same_error(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1724:37:1724:52 | try_same_error(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1724:54:1726:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1725:22:1725:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1725:22:1725:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1725:22:1725:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1725:22:1725:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1728:9:1730:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1728:37:1728:55 | try_convert_error(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1728:37:1728:55 | try_convert_error(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1728:37:1728:55 | try_convert_error(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1728:57:1730:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1729:22:1729:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1729:22:1729:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1729:22:1729:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1729:22:1729:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1732:9:1734:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1732:37:1732:49 | try_chained(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1732:37:1732:49 | try_chained(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1732:37:1732:49 | try_chained(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1732:51:1734:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1733:22:1733:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1733:22:1733:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1733:22:1733:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1733:22:1733:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1736:9:1738:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1736:37:1736:63 | try_complex(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1736:37:1736:63 | try_complex(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:65:1738:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1737:22:1737:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1737:22:1737:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1737:22:1737:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1737:22:1737:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1743:16:1834:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1744:13:1744:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1746:17:1746:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1747:17:1747:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1748:13:1748:13 | c | | {EXTERNAL LOCATION} | char | +| main.rs:1748:17:1748:19 | 'c' | | {EXTERNAL LOCATION} | char | +| main.rs:1749:13:1749:17 | hello | | {EXTERNAL LOCATION} | & | +| main.rs:1749:13:1749:17 | hello | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1749:21:1749:27 | "Hello" | | {EXTERNAL LOCATION} | & | +| main.rs:1749:21:1749:27 | "Hello" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1750:13:1750:13 | f | | {EXTERNAL LOCATION} | f64 | +| main.rs:1750:17:1750:24 | 123.0f64 | | {EXTERNAL LOCATION} | f64 | +| main.rs:1751:13:1751:13 | t | | {EXTERNAL LOCATION} | bool | +| main.rs:1751:17:1751:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1752:13:1752:13 | f | | {EXTERNAL LOCATION} | bool | +| main.rs:1752:17:1752:21 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1755:26:1755:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1755:26:1755:30 | SelfParam | TRef | main.rs:1754:9:1758:9 | Self [trait MyTrait] | +| main.rs:1761:26:1761:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1761:26:1761:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:1761:26:1761:30 | SelfParam | TRef.TArray | main.rs:1760:14:1760:23 | T | +| main.rs:1761:39:1763:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1761:39:1763:13 | { ... } | TRef | main.rs:1760:14:1760:23 | T | +| main.rs:1762:17:1762:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1762:17:1762:20 | self | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:1762:17:1762:20 | self | TRef.TArray | main.rs:1760:14:1760:23 | T | +| main.rs:1765:31:1767:13 | { ... } | | main.rs:1760:14:1760:23 | T | +| main.rs:1770:17:1770:25 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:1771:13:1771:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1771:17:1771:47 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1771:37:1771:46 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1771:38:1771:46 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:1772:13:1772:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1772:17:1772:37 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1775:26:1775:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1775:26:1775:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1775:26:1775:30 | SelfParam | TRef.TSlice | main.rs:1774:14:1774:23 | T | +| main.rs:1775:39:1777:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1775:39:1777:13 | { ... } | TRef | main.rs:1774:14:1774:23 | T | +| main.rs:1776:17:1776:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1776:17:1776:20 | self | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1776:17:1776:20 | self | TRef.TSlice | main.rs:1774:14:1774:23 | T | +| main.rs:1779:31:1781:13 | { ... } | | main.rs:1774:14:1774:23 | T | +| main.rs:1784:13:1784:13 | s | | {EXTERNAL LOCATION} | & | +| main.rs:1784:13:1784:13 | s | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1784:13:1784:13 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| main.rs:1784:25:1784:34 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1784:26:1784:34 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:1785:17:1785:17 | s | | {EXTERNAL LOCATION} | & | +| main.rs:1785:17:1785:17 | s | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1785:17:1785:17 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| main.rs:1786:13:1786:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1786:17:1786:35 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1786:34:1786:34 | s | | {EXTERNAL LOCATION} | & | +| main.rs:1786:34:1786:34 | s | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1786:34:1786:34 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| main.rs:1787:13:1787:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1787:17:1787:34 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1790:26:1790:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1790:26:1790:30 | SelfParam | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1790:26:1790:30 | SelfParam | TRef.T0 | main.rs:1789:14:1789:23 | T | +| main.rs:1790:26:1790:30 | SelfParam | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1790:39:1792:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1790:39:1792:13 | { ... } | TRef | main.rs:1789:14:1789:23 | T | +| main.rs:1791:17:1791:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1791:18:1791:21 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1791:18:1791:21 | self | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1791:18:1791:21 | self | TRef.T0 | main.rs:1789:14:1789:23 | T | +| main.rs:1791:18:1791:21 | self | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1794:31:1796:13 | { ... } | | main.rs:1789:14:1789:23 | T | +| main.rs:1799:13:1799:13 | p | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1799:17:1799:23 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1800:17:1800:17 | p | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1801:13:1801:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1801:17:1801:39 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1801:37:1801:38 | &p | | {EXTERNAL LOCATION} | & | +| main.rs:1801:38:1801:38 | p | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1802:13:1802:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1802:17:1802:39 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1805:26:1805:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1805:26:1805:30 | SelfParam | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1805:26:1805:30 | SelfParam | TRef.TRef | main.rs:1804:14:1804:23 | T | +| main.rs:1805:39:1807:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1805:39:1807:13 | { ... } | TRef | main.rs:1804:14:1804:23 | T | +| main.rs:1806:18:1806:21 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1806:18:1806:21 | self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1806:18:1806:21 | self | TRef.TRef | main.rs:1804:14:1804:23 | T | +| main.rs:1809:31:1811:13 | { ... } | | main.rs:1804:14:1804:23 | T | +| main.rs:1814:13:1814:13 | r | | {EXTERNAL LOCATION} | & | +| main.rs:1814:17:1814:19 | &42 | | {EXTERNAL LOCATION} | & | +| main.rs:1815:17:1815:17 | r | | {EXTERNAL LOCATION} | & | +| main.rs:1816:13:1816:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1816:17:1816:35 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1816:33:1816:34 | &r | | {EXTERNAL LOCATION} | & | +| main.rs:1816:34:1816:34 | r | | {EXTERNAL LOCATION} | & | +| main.rs:1817:13:1817:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1817:17:1817:33 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1820:26:1820:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1820:26:1820:30 | SelfParam | TRef | {EXTERNAL LOCATION} | *mut | +| main.rs:1820:26:1820:30 | SelfParam | TRef.TPtrMut | main.rs:1819:14:1819:23 | T | +| main.rs:1820:39:1822:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1820:39:1822:13 | { ... } | TRef | main.rs:1819:14:1819:23 | T | +| main.rs:1821:26:1821:32 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1821:29:1821:32 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1821:29:1821:32 | self | TRef | {EXTERNAL LOCATION} | *mut | +| main.rs:1821:29:1821:32 | self | TRef.TPtrMut | main.rs:1819:14:1819:23 | T | +| main.rs:1824:31:1826:13 | { ... } | | main.rs:1819:14:1819:23 | T | +| main.rs:1830:13:1830:13 | p | | {EXTERNAL LOCATION} | *mut | +| main.rs:1830:13:1830:13 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1830:27:1830:32 | &mut v | | {EXTERNAL LOCATION} | &mut | +| main.rs:1831:26:1831:26 | p | | {EXTERNAL LOCATION} | *mut | +| main.rs:1831:26:1831:26 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1832:26:1832:48 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1832:46:1832:47 | &p | | {EXTERNAL LOCATION} | & | +| main.rs:1832:47:1832:47 | p | | {EXTERNAL LOCATION} | *mut | +| main.rs:1832:47:1832:47 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1833:13:1833:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1833:17:1833:37 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1839:16:1851:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1840:13:1840:13 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:17:1840:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:17:1840:29 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:25:1840:29 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:13:1841:13 | y | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:17:1841:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:17:1841:29 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:25:1841:29 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1845:17:1847:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1847:16:1849:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1864:30:1866:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1865:13:1865:31 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1872:16:1872:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1872:22:1872:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1872:41:1877:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1873:13:1876:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1874:20:1874:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1874:29:1874:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1875:20:1875:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1875:29:1875:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1882:23:1882:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1882:23:1882:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1882:34:1882:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1882:45:1885:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1883:13:1883:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1883:13:1883:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1883:23:1883:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1884:13:1884:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1884:13:1884:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1884:23:1884:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1890:16:1890:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1890:22:1890:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1890:41:1895:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1891:13:1894:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1892:20:1892:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1892:29:1892:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1893:20:1893:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1893:29:1893:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1900:23:1900:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1900:23:1900:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1900:34:1900:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1900:45:1903:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1901:13:1901:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1901:13:1901:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1901:23:1901:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1902:13:1902:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1902:13:1902:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1902:23:1902:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1908:16:1908:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1908:22:1908:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1908:41:1913:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1909:13:1912:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1910:20:1910:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1910:29:1910:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1911:20:1911:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1911:29:1911:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1917:23:1917:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1917:23:1917:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1917:34:1917:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1917:45:1920:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1918:13:1918:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1918:13:1918:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1918:23:1918:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1919:13:1919:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1919:13:1919:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1919:23:1919:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1925:16:1925:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1925:22:1925:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1925:41:1930:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1926:13:1929:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1927:20:1927:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1927:29:1927:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1928:20:1928:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1928:29:1928:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1934:23:1934:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1934:23:1934:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1934:34:1934:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1934:45:1937:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1935:13:1935:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1935:13:1935:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1935:23:1935:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1936:13:1936:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1936:13:1936:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1936:23:1936:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1942:16:1942:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1942:22:1942:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1942:41:1947:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1943:13:1946:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1944:20:1944:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1944:29:1944:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1945:20:1945:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1945:29:1945:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1951:23:1951:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1951:23:1951:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1951:34:1951:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1951:45:1954:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1952:13:1952:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1952:13:1952:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1952:23:1952:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1953:13:1953:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1953:13:1953:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1953:23:1953:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1959:19:1959:22 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1959:25:1959:27 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1959:44:1964:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1960:13:1963:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1961:20:1961:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1961:29:1961:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1962:20:1962:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1962:29:1962:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1968:26:1968:34 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1968:26:1968:34 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1968:37:1968:39 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1968:48:1971:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1969:13:1969:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1969:13:1969:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1969:23:1969:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1970:13:1970:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1970:13:1970:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1970:23:1970:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1976:18:1976:21 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1976:24:1976:26 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1976:43:1981:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1977:13:1980:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1978:20:1978:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1978:29:1978:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1979:20:1979:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1979:29:1979:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1985:25:1985:33 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1985:25:1985:33 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1985:36:1985:38 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1985:47:1988:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1986:13:1986:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1986:13:1986:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1986:23:1986:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1987:13:1987:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1987:13:1987:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1987:23:1987:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1993:19:1993:22 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1993:25:1993:27 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1993:44:1998:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1994:13:1997:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1995:20:1995:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1995:29:1995:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1996:20:1996:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1996:29:1996:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2002:26:2002:34 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2002:26:2002:34 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2002:37:2002:39 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2002:48:2005:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2003:13:2003:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2003:13:2003:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2003:23:2003:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2004:13:2004:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2004:13:2004:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2004:23:2004:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2010:16:2010:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2010:22:2010:24 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2010:40:2015:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2011:13:2014:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2012:20:2012:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2012:30:2012:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2013:20:2013:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2013:30:2013:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2019:23:2019:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2019:23:2019:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2019:34:2019:36 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2019:44:2022:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2020:13:2020:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2020:13:2020:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2020:24:2020:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2021:13:2021:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2021:13:2021:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2021:24:2021:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2027:16:2027:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2027:22:2027:24 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2027:40:2032:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2028:13:2031:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2029:20:2029:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2029:30:2029:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2030:20:2030:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2030:30:2030:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2036:23:2036:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2036:23:2036:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2036:34:2036:36 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2036:44:2039:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2037:13:2037:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2037:13:2037:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2037:24:2037:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2038:13:2038:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2038:13:2038:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2038:24:2038:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2044:16:2044:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2044:30:2049:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2045:13:2048:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2046:21:2046:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2047:21:2047:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2054:16:2054:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2054:30:2059:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2055:13:2058:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2056:21:2056:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2057:21:2057:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2063:15:2063:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2063:15:2063:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2063:22:2063:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2063:22:2063:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2063:44:2065:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:13:2064:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2064:13:2064:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2064:13:2064:29 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:13:2064:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:23:2064:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2064:23:2064:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2064:34:2064:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2064:34:2064:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2064:34:2064:50 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:44:2064:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2064:44:2064:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2067:15:2067:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2067:15:2067:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2067:22:2067:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2067:22:2067:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2067:44:2069:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:13:2068:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2068:13:2068:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2068:13:2068:29 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:13:2068:50 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:23:2068:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2068:23:2068:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2068:34:2068:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2068:34:2068:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2068:34:2068:50 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:44:2068:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2068:44:2068:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2073:24:2073:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2073:24:2073:28 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2073:31:2073:35 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2073:31:2073:35 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2073:75:2075:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2073:75:2075:9 | { ... } | T | {EXTERNAL LOCATION} | Ordering | +| main.rs:2074:14:2074:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2074:14:2074:17 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2074:23:2074:26 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2074:23:2074:26 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2074:43:2074:62 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2074:45:2074:49 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2074:45:2074:49 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2074:55:2074:59 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2074:55:2074:59 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2077:15:2077:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2077:15:2077:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2077:22:2077:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2077:22:2077:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2077:44:2079:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:13:2078:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2078:13:2078:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2078:13:2078:28 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:13:2078:48 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:22:2078:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2078:22:2078:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2078:33:2078:36 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2078:33:2078:36 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2078:33:2078:48 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:42:2078:46 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2078:42:2078:46 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2081:15:2081:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2081:15:2081:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2081:22:2081:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2081:22:2081:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2081:44:2083:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:13:2082:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2082:13:2082:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2082:13:2082:29 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:13:2082:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:23:2082:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2082:23:2082:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2082:34:2082:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2082:34:2082:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2082:34:2082:50 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:44:2082:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2082:44:2082:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2085:15:2085:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2085:15:2085:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2085:22:2085:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2085:22:2085:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2085:44:2087:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:13:2086:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2086:13:2086:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2086:13:2086:28 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:13:2086:48 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:22:2086:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2086:22:2086:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2086:33:2086:36 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2086:33:2086:36 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2086:33:2086:48 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:42:2086:46 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2086:42:2086:46 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2089:15:2089:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2089:15:2089:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2089:22:2089:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2089:22:2089:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2089:44:2091:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:13:2090:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2090:13:2090:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2090:13:2090:29 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:13:2090:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:23:2090:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2090:23:2090:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2090:34:2090:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2090:34:2090:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2090:34:2090:50 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:44:2090:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2090:44:2090:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2094:26:2094:26 | a | | main.rs:2094:18:2094:23 | T | +| main.rs:2094:32:2094:32 | b | | main.rs:2094:18:2094:23 | T | +| main.rs:2095:9:2095:9 | a | | main.rs:2094:18:2094:23 | T | +| main.rs:2095:13:2095:13 | b | | main.rs:2094:18:2094:23 | T | +| main.rs:2098:16:2229:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2102:23:2102:26 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2102:31:2102:34 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2103:23:2103:26 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2103:31:2103:34 | 4i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2104:23:2104:26 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2104:30:2104:33 | 6i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2105:23:2105:26 | 7i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2105:31:2105:34 | 8i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2106:23:2106:26 | 9i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2106:30:2106:34 | 10i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2107:23:2107:27 | 11i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2107:32:2107:36 | 12i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:23:2110:27 | 13i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:31:2110:35 | 14i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2111:23:2111:27 | 15i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2111:31:2111:35 | 16i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2112:23:2112:27 | 17i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2112:31:2112:35 | 18i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2113:23:2113:27 | 19i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2113:31:2113:35 | 20i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2114:23:2114:27 | 21i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2114:31:2114:35 | 22i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2115:39:2115:42 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2115:45:2115:48 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2118:17:2118:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2118:34:2118:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2119:9:2119:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2119:27:2119:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2121:17:2121:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2121:34:2121:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2122:9:2122:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2122:27:2122:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2124:17:2124:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2124:34:2124:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2125:9:2125:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2125:27:2125:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2127:17:2127:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2127:34:2127:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2128:9:2128:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2128:27:2128:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2130:17:2130:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2130:34:2130:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2131:9:2131:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2131:27:2131:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2134:26:2134:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2134:34:2134:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2135:25:2135:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2135:33:2135:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2136:26:2136:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2136:34:2136:38 | 38i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2137:23:2137:27 | 39i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2137:32:2137:36 | 40i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2138:23:2138:27 | 41i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2138:32:2138:36 | 42i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2141:17:2141:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2141:37:2141:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2142:9:2142:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2142:30:2142:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2144:17:2144:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2144:36:2144:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2145:9:2145:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2145:29:2145:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2147:17:2147:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2147:37:2147:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2148:9:2148:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2148:30:2148:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2150:17:2150:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2150:34:2150:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2151:9:2151:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2151:28:2151:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2153:17:2153:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2153:34:2153:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2154:9:2154:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2154:28:2154:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2156:24:2156:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2157:24:2157:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2160:13:2160:14 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2160:18:2160:36 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2161:13:2161:14 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2161:18:2161:36 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2164:23:2164:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2164:29:2164:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2165:23:2165:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2165:29:2165:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2166:23:2166:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2166:28:2166:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2167:23:2167:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2167:29:2167:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2168:23:2168:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2168:28:2168:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2169:23:2169:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2169:29:2169:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2172:24:2172:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2172:29:2172:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2173:24:2173:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2173:29:2173:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2174:24:2174:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2174:29:2174:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2175:24:2175:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2175:29:2175:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2176:24:2176:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2176:29:2176:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2179:17:2179:31 | vec2_add_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2179:35:2179:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2180:9:2180:23 | vec2_add_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2180:28:2180:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2182:17:2182:31 | vec2_sub_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2182:35:2182:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2183:9:2183:23 | vec2_sub_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2183:28:2183:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2185:17:2185:31 | vec2_mul_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2185:35:2185:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2186:9:2186:23 | vec2_mul_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2186:28:2186:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2188:17:2188:31 | vec2_div_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2188:35:2188:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2189:9:2189:23 | vec2_div_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2189:28:2189:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2191:17:2191:31 | vec2_rem_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2191:35:2191:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2192:9:2192:23 | vec2_rem_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2192:28:2192:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2195:27:2195:28 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2195:32:2195:33 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2196:26:2196:27 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2196:31:2196:32 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2197:27:2197:28 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2197:32:2197:33 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2198:24:2198:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2198:30:2198:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2199:24:2199:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2199:30:2199:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2202:17:2202:34 | vec2_bitand_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2202:38:2202:39 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2203:9:2203:26 | vec2_bitand_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2203:31:2203:32 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2205:17:2205:33 | vec2_bitor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2205:37:2205:38 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2206:9:2206:25 | vec2_bitor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2206:30:2206:31 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2208:17:2208:34 | vec2_bitxor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2208:38:2208:39 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2209:9:2209:26 | vec2_bitxor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2209:31:2209:32 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2211:17:2211:31 | vec2_shl_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2211:35:2211:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2212:9:2212:23 | vec2_shl_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2212:29:2212:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2214:17:2214:31 | vec2_shr_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2214:35:2214:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2215:9:2215:23 | vec2_shr_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2215:29:2215:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2218:25:2218:26 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2219:25:2219:26 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2223:30:2223:48 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2228:30:2228:48 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2238:18:2238:21 | SelfParam | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2238:24:2238:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2241:25:2243:5 | { ... } | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2246:9:2246:20 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2250:9:2250:16 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2250:9:2250:16 | { ... } | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:2259:13:2259:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | +| main.rs:2259:13:2259:42 | SelfParam | Ptr | {EXTERNAL LOCATION} | &mut | +| main.rs:2259:13:2259:42 | SelfParam | Ptr.TRefMut | main.rs:2253:5:2253:14 | S2 | +| main.rs:2260:13:2260:15 | _cx | | {EXTERNAL LOCATION} | &mut | +| main.rs:2260:13:2260:15 | _cx | TRefMut | {EXTERNAL LOCATION} | Context | +| main.rs:2261:44:2263:9 | { ... } | | {EXTERNAL LOCATION} | Poll | +| main.rs:2261:44:2263:9 | { ... } | T | main.rs:2235:5:2235:14 | S1 | +| main.rs:2270:22:2278:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2271:9:2271:12 | f1(...) | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2271:9:2271:12 | f1(...) | dyn(Output) | main.rs:2235:5:2235:14 | S1 | +| main.rs:2272:9:2272:12 | f2(...) | | main.rs:2245:16:2245:39 | impl ... | +| main.rs:2273:9:2273:12 | f3(...) | | main.rs:2249:16:2249:39 | impl ... | +| main.rs:2274:9:2274:12 | f4(...) | | main.rs:2266:16:2266:39 | impl ... | +| main.rs:2276:13:2276:13 | b | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2276:17:2276:28 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2277:9:2277:9 | b | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2288:15:2288:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2288:15:2288:19 | SelfParam | TRef | main.rs:2287:5:2289:5 | Self [trait Trait1] | +| main.rs:2288:22:2288:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2292:15:2292:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2292:15:2292:19 | SelfParam | TRef | main.rs:2291:5:2293:5 | Self [trait Trait2] | +| main.rs:2292:22:2292:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2296:15:2296:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2296:15:2296:19 | SelfParam | TRef | main.rs:2282:5:2283:14 | S1 | +| main.rs:2296:22:2296:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2300:15:2300:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2300:15:2300:19 | SelfParam | TRef | main.rs:2282:5:2283:14 | S1 | +| main.rs:2300:22:2300:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2308:18:2308:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2308:18:2308:22 | SelfParam | TRef | main.rs:2307:5:2309:5 | Self [trait MyTrait] | +| main.rs:2312:18:2312:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2312:18:2312:22 | SelfParam | TRef | main.rs:2282:5:2283:14 | S1 | +| main.rs:2312:31:2314:9 | { ... } | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2318:18:2318:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2318:18:2318:22 | SelfParam | TRef | main.rs:2285:5:2285:22 | S3 | +| main.rs:2318:18:2318:22 | SelfParam | TRef.T3 | main.rs:2317:10:2317:17 | T | +| main.rs:2318:30:2321:9 | { ... } | | main.rs:2317:10:2317:17 | T | +| main.rs:2319:25:2319:28 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2319:25:2319:28 | self | TRef | main.rs:2285:5:2285:22 | S3 | +| main.rs:2319:25:2319:28 | self | TRef.T3 | main.rs:2317:10:2317:17 | T | +| main.rs:2328:41:2328:41 | t | | main.rs:2328:26:2328:38 | B | +| main.rs:2328:52:2330:5 | { ... } | | main.rs:2328:23:2328:23 | A | +| main.rs:2329:9:2329:9 | t | | main.rs:2328:26:2328:38 | B | +| main.rs:2332:34:2332:34 | x | | main.rs:2332:24:2332:31 | T | +| main.rs:2332:59:2334:5 | { ... } | | main.rs:2332:43:2332:57 | impl ... | +| main.rs:2332:59:2334:5 | { ... } | impl(T) | main.rs:2332:24:2332:31 | T | +| main.rs:2333:12:2333:12 | x | | main.rs:2332:24:2332:31 | T | +| main.rs:2336:34:2336:34 | x | | main.rs:2336:24:2336:31 | T | +| main.rs:2336:67:2338:5 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2336:67:2338:5 | { ... } | T | main.rs:2336:50:2336:64 | impl ... | +| main.rs:2336:67:2338:5 | { ... } | T.impl(T) | main.rs:2336:24:2336:31 | T | +| main.rs:2337:17:2337:17 | x | | main.rs:2336:24:2336:31 | T | +| main.rs:2340:34:2340:34 | x | | main.rs:2340:24:2340:31 | T | +| main.rs:2340:78:2342:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2340:78:2342:5 | { ... } | T0 | main.rs:2340:44:2340:58 | impl ... | +| main.rs:2340:78:2342:5 | { ... } | T0.impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2340:78:2342:5 | { ... } | T1 | main.rs:2340:61:2340:75 | impl ... | +| main.rs:2340:78:2342:5 | { ... } | T1.impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2341:9:2341:30 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2341:13:2341:13 | x | | main.rs:2340:24:2340:31 | T | +| main.rs:2341:28:2341:28 | x | | main.rs:2340:24:2340:31 | T | +| main.rs:2344:26:2344:26 | t | | main.rs:2344:29:2344:43 | impl ... | +| main.rs:2344:51:2346:5 | { ... } | | main.rs:2344:23:2344:23 | A | +| main.rs:2345:9:2345:9 | t | | main.rs:2344:29:2344:43 | impl ... | +| main.rs:2348:16:2362:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2349:13:2349:13 | x | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2349:17:2349:20 | f1(...) | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2350:9:2350:9 | x | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2351:9:2351:9 | x | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2352:13:2352:13 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2352:17:2352:32 | get_a_my_trait(...) | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2353:32:2353:32 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2354:13:2354:13 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2354:17:2354:32 | get_a_my_trait(...) | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2355:32:2355:32 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2357:17:2357:35 | get_a_my_trait2(...) | | main.rs:2332:43:2332:57 | impl ... | +| main.rs:2360:17:2360:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2360:17:2360:35 | get_a_my_trait3(...) | T | main.rs:2336:50:2336:64 | impl ... | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | T0 | main.rs:2340:44:2340:58 | impl ... | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | T1 | main.rs:2340:61:2340:75 | impl ... | +| main.rs:2372:16:2372:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2372:16:2372:20 | SelfParam | TRef | main.rs:2368:5:2369:13 | S | +| main.rs:2372:31:2374:9 | { ... } | | main.rs:2368:5:2369:13 | S | +| main.rs:2383:26:2385:9 | { ... } | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2383:26:2385:9 | { ... } | T | main.rs:2382:10:2382:10 | T | +| main.rs:2384:13:2384:38 | MyVec {...} | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2384:27:2384:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2384:27:2384:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2387:17:2387:25 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2387:17:2387:25 | SelfParam | TRefMut | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2387:17:2387:25 | SelfParam | TRefMut.T | main.rs:2382:10:2382:10 | T | +| main.rs:2387:28:2387:32 | value | | main.rs:2382:10:2382:10 | T | +| main.rs:2387:38:2389:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2388:13:2388:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2388:13:2388:16 | self | TRefMut | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2388:13:2388:16 | self | TRefMut.T | main.rs:2382:10:2382:10 | T | +| main.rs:2388:28:2388:32 | value | | main.rs:2382:10:2382:10 | T | +| main.rs:2396:18:2396:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2396:18:2396:22 | SelfParam | TRef | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2396:18:2396:22 | SelfParam | TRef.T | main.rs:2392:10:2392:10 | T | +| main.rs:2396:25:2396:29 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2396:56:2398:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:2396:56:2398:9 | { ... } | TRef | main.rs:2392:10:2392:10 | T | +| main.rs:2397:13:2397:29 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2397:14:2397:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2397:14:2397:17 | self | TRef | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2397:14:2397:17 | self | TRef.T | main.rs:2392:10:2392:10 | T | +| main.rs:2397:24:2397:28 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2401:22:2401:26 | slice | | {EXTERNAL LOCATION} | & | +| main.rs:2401:22:2401:26 | slice | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:2401:22:2401:26 | slice | TRef.TSlice | main.rs:2368:5:2369:13 | S | +| main.rs:2401:35:2403:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2402:17:2402:21 | slice | | {EXTERNAL LOCATION} | & | +| main.rs:2402:17:2402:21 | slice | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:2402:17:2402:21 | slice | TRef.TSlice | main.rs:2368:5:2369:13 | S | +| main.rs:2405:37:2405:37 | a | | main.rs:2405:20:2405:34 | T | +| main.rs:2405:43:2405:43 | b | | {EXTERNAL LOCATION} | usize | +| main.rs:2409:9:2409:9 | a | | main.rs:2405:20:2405:34 | T | +| main.rs:2409:11:2409:11 | b | | {EXTERNAL LOCATION} | usize | +| main.rs:2412:16:2423:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2413:17:2413:19 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2413:23:2413:34 | ...::new(...) | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2414:9:2414:11 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2415:9:2415:11 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2417:13:2417:14 | xs | | {EXTERNAL LOCATION} | [;] | +| main.rs:2417:13:2417:14 | xs | TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2417:26:2417:28 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2418:17:2418:18 | xs | | {EXTERNAL LOCATION} | [;] | +| main.rs:2418:17:2418:18 | xs | TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2420:29:2420:31 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2422:9:2422:26 | analyze_slice(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2422:23:2422:25 | &xs | | {EXTERNAL LOCATION} | & | +| main.rs:2422:24:2422:25 | xs | | {EXTERNAL LOCATION} | [;] | +| main.rs:2422:24:2422:25 | xs | TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2427:16:2429:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2428:25:2428:35 | "Hello, {}" | | {EXTERNAL LOCATION} | & | +| main.rs:2428:25:2428:35 | "Hello, {}" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2428:25:2428:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2428:38:2428:45 | "World!" | | {EXTERNAL LOCATION} | & | +| main.rs:2428:38:2428:45 | "World!" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2437:19:2437:22 | SelfParam | | main.rs:2433:5:2438:5 | Self [trait MyAdd] | +| main.rs:2437:25:2437:27 | rhs | | main.rs:2433:17:2433:26 | Rhs | +| main.rs:2444:19:2444:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2444:25:2444:29 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2444:45:2446:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2445:13:2445:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2453:19:2453:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2453:25:2453:29 | value | | {EXTERNAL LOCATION} | & | +| main.rs:2453:25:2453:29 | value | TRef | {EXTERNAL LOCATION} | i64 | +| main.rs:2453:46:2455:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2454:14:2454:18 | value | | {EXTERNAL LOCATION} | & | +| main.rs:2454:14:2454:18 | value | TRef | {EXTERNAL LOCATION} | i64 | +| main.rs:2462:19:2462:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2462:25:2462:29 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2462:46:2468:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2463:16:2463:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2477:19:2477:22 | SelfParam | | main.rs:2471:5:2471:19 | S | +| main.rs:2477:19:2477:22 | SelfParam | T | main.rs:2473:10:2473:17 | T | +| main.rs:2477:25:2477:29 | other | | main.rs:2471:5:2471:19 | S | +| main.rs:2477:25:2477:29 | other | T | main.rs:2473:10:2473:17 | T | +| main.rs:2477:54:2479:9 | { ... } | | main.rs:2471:5:2471:19 | S | +| main.rs:2478:16:2478:19 | self | | main.rs:2471:5:2471:19 | S | +| main.rs:2478:16:2478:19 | self | T | main.rs:2473:10:2473:17 | T | +| main.rs:2478:31:2478:35 | other | | main.rs:2471:5:2471:19 | S | +| main.rs:2478:31:2478:35 | other | T | main.rs:2473:10:2473:17 | T | +| main.rs:2486:19:2486:22 | SelfParam | | main.rs:2471:5:2471:19 | S | +| main.rs:2486:19:2486:22 | SelfParam | T | main.rs:2482:10:2482:17 | T | +| main.rs:2486:25:2486:29 | other | | main.rs:2482:10:2482:17 | T | +| main.rs:2486:51:2488:9 | { ... } | | main.rs:2471:5:2471:19 | S | +| main.rs:2487:16:2487:19 | self | | main.rs:2471:5:2471:19 | S | +| main.rs:2487:16:2487:19 | self | T | main.rs:2482:10:2482:17 | T | +| main.rs:2487:31:2487:35 | other | | main.rs:2482:10:2482:17 | T | +| main.rs:2498:19:2498:22 | SelfParam | | main.rs:2471:5:2471:19 | S | +| main.rs:2498:19:2498:22 | SelfParam | T | main.rs:2491:14:2491:14 | T | +| main.rs:2498:25:2498:29 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2498:25:2498:29 | other | TRef | main.rs:2491:14:2491:14 | T | +| main.rs:2498:55:2500:9 | { ... } | | main.rs:2471:5:2471:19 | S | +| main.rs:2499:16:2499:19 | self | | main.rs:2471:5:2471:19 | S | +| main.rs:2499:16:2499:19 | self | T | main.rs:2491:14:2491:14 | T | +| main.rs:2499:31:2499:35 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2499:31:2499:35 | other | TRef | main.rs:2491:14:2491:14 | T | +| main.rs:2505:20:2505:24 | value | | main.rs:2503:18:2503:18 | T | +| main.rs:2510:20:2510:24 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2510:40:2512:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2511:13:2511:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2517:20:2517:24 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2517:41:2523:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2518:16:2518:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2528:21:2528:25 | value | | main.rs:2526:19:2526:19 | T | +| main.rs:2528:31:2528:31 | x | | main.rs:2526:5:2529:5 | Self [trait MyFrom2] | +| main.rs:2533:21:2533:25 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2533:33:2533:33 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2533:48:2535:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2534:13:2534:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2540:21:2540:25 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2540:34:2540:34 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2540:49:2546:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2541:16:2541:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2551:15:2551:15 | x | | main.rs:2549:5:2555:5 | Self [trait MySelfTrait] | +| main.rs:2554:15:2554:15 | x | | main.rs:2549:5:2555:5 | Self [trait MySelfTrait] | +| main.rs:2559:15:2559:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2559:31:2561:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2560:13:2560:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2564:15:2564:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2564:32:2566:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2565:13:2565:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2571:15:2571:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2571:31:2573:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2576:15:2576:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2576:32:2578:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2577:13:2577:13 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2581:16:2606:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2582:13:2582:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2583:9:2583:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2583:18:2583:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2584:9:2584:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2584:18:2584:22 | &5i64 | | {EXTERNAL LOCATION} | & | +| main.rs:2584:19:2584:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2585:9:2585:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2585:18:2585:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2587:11:2587:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2587:26:2587:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2588:11:2588:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2588:24:2588:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2589:11:2589:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2589:24:2589:28 | &3i64 | | {EXTERNAL LOCATION} | & | +| main.rs:2589:25:2589:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2591:13:2591:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2591:17:2591:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2591:30:2591:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2592:13:2592:13 | y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2592:17:2592:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2592:30:2592:33 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2593:13:2593:13 | z | | {EXTERNAL LOCATION} | i64 | +| main.rs:2593:38:2593:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2594:9:2594:34 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2594:23:2594:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2594:30:2594:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2595:9:2595:33 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2595:23:2595:26 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2595:29:2595:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2596:9:2596:38 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2596:27:2596:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2596:34:2596:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2598:9:2598:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2598:17:2598:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2599:9:2599:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2599:17:2599:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2600:9:2600:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2600:18:2600:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2601:9:2601:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2601:18:2601:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2602:9:2602:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2602:25:2602:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2603:25:2603:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2604:9:2604:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2604:25:2604:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2605:25:2605:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2613:26:2615:9 | { ... } | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2614:13:2614:25 | MyCallable {...} | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2617:17:2617:21 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2617:17:2617:21 | SelfParam | TRef | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2617:31:2619:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2622:16:2729:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2625:9:2625:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2625:18:2625:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2625:28:2625:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2626:9:2626:44 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2626:18:2626:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2626:43:2626:44 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2627:9:2627:41 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2627:18:2627:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2627:40:2627:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2629:13:2629:17 | vals1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2629:21:2629:31 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2629:22:2629:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2630:9:2630:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2630:18:2630:22 | vals1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2630:24:2630:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2632:13:2632:17 | vals2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2632:21:2632:29 | [1u16; 3] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2632:22:2632:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2633:9:2633:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2633:18:2633:22 | vals2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2633:24:2633:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2635:13:2635:17 | vals3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2635:13:2635:17 | vals3 | TArray | {EXTERNAL LOCATION} | u32 | +| main.rs:2635:31:2635:39 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2636:9:2636:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2636:18:2636:22 | vals3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2636:18:2636:22 | vals3 | TArray | {EXTERNAL LOCATION} | u32 | +| main.rs:2636:24:2636:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2638:13:2638:17 | vals4 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2638:13:2638:17 | vals4 | TArray | {EXTERNAL LOCATION} | u64 | +| main.rs:2638:31:2638:36 | [1; 3] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2639:9:2639:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2639:18:2639:22 | vals4 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2639:18:2639:22 | vals4 | TArray | {EXTERNAL LOCATION} | u64 | +| main.rs:2639:24:2639:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2641:17:2641:24 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2641:28:2641:48 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2641:29:2641:33 | "foo" | | {EXTERNAL LOCATION} | & | +| main.rs:2641:29:2641:33 | "foo" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2641:36:2641:40 | "bar" | | {EXTERNAL LOCATION} | & | +| main.rs:2641:36:2641:40 | "bar" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2641:43:2641:47 | "baz" | | {EXTERNAL LOCATION} | & | +| main.rs:2641:43:2641:47 | "baz" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2642:9:2642:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2642:18:2642:26 | &strings1 | | {EXTERNAL LOCATION} | & | +| main.rs:2642:19:2642:26 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2642:28:2642:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2643:9:2643:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2643:18:2643:30 | &mut strings1 | | {EXTERNAL LOCATION} | &mut | +| main.rs:2643:23:2643:30 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2643:32:2643:33 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2644:9:2644:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2644:18:2644:25 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2644:27:2644:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2646:13:2646:20 | strings2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2647:9:2651:9 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2648:13:2648:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2648:26:2648:30 | "foo" | | {EXTERNAL LOCATION} | & | +| main.rs:2648:26:2648:30 | "foo" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2649:13:2649:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2649:26:2649:30 | "bar" | | {EXTERNAL LOCATION} | & | +| main.rs:2649:26:2649:30 | "bar" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2650:13:2650:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2650:26:2650:30 | "baz" | | {EXTERNAL LOCATION} | & | +| main.rs:2650:26:2650:30 | "baz" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2652:9:2652:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2652:18:2652:25 | strings2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2652:27:2652:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2654:13:2654:20 | strings3 | | {EXTERNAL LOCATION} | & | +| main.rs:2655:9:2659:9 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2655:10:2659:9 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2656:13:2656:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2656:26:2656:30 | "foo" | | {EXTERNAL LOCATION} | & | +| main.rs:2656:26:2656:30 | "foo" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2657:13:2657:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2657:26:2657:30 | "bar" | | {EXTERNAL LOCATION} | & | +| main.rs:2657:26:2657:30 | "bar" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2658:13:2658:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2658:26:2658:30 | "baz" | | {EXTERNAL LOCATION} | & | +| main.rs:2658:26:2658:30 | "baz" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2660:9:2660:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2660:18:2660:25 | strings3 | | {EXTERNAL LOCATION} | & | +| main.rs:2660:27:2660:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2662:13:2662:21 | callables | | {EXTERNAL LOCATION} | [;] | +| main.rs:2662:25:2662:81 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2662:26:2662:42 | ...::new(...) | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2662:45:2662:61 | ...::new(...) | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2662:64:2662:80 | ...::new(...) | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2663:9:2667:9 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2664:12:2664:20 | callables | | {EXTERNAL LOCATION} | [;] | +| main.rs:2665:9:2667:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2671:9:2671:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2671:18:2671:22 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2671:24:2671:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2672:9:2672:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2672:18:2672:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2672:19:2672:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2672:19:2672:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2672:28:2672:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2673:13:2673:17 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2673:21:2673:25 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2674:9:2674:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2674:18:2674:22 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2674:24:2674:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2675:13:2675:22 | range_full | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2675:26:2675:27 | .. | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2676:9:2676:51 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2676:18:2676:48 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2676:19:2676:36 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2676:20:2676:23 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2676:26:2676:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2676:32:2676:35 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2676:38:2676:47 | range_full | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2676:50:2676:51 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2678:13:2678:18 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2679:9:2682:9 | ...::Range {...} | | {EXTERNAL LOCATION} | Range | +| main.rs:2680:20:2680:23 | 0u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2681:18:2681:22 | 10u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2683:9:2683:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2683:18:2683:23 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2683:25:2683:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2688:9:2688:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2688:24:2688:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2690:13:2690:18 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2690:13:2690:18 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2690:13:2690:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2690:32:2690:43 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2690:33:2690:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2691:9:2691:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2691:18:2691:23 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2691:18:2691:23 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2691:18:2691:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2691:25:2691:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2693:22:2693:33 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2693:23:2693:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2694:9:2694:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2694:25:2694:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2696:13:2696:17 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2696:21:2696:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2696:31:2696:42 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2696:32:2696:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2697:9:2697:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2697:18:2697:22 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2697:24:2697:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2699:13:2699:17 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2699:13:2699:17 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2699:13:2699:17 | vals6 | T | {EXTERNAL LOCATION} | & | +| main.rs:2699:13:2699:17 | vals6 | T.TRef | {EXTERNAL LOCATION} | u64 | +| main.rs:2699:32:2699:43 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2699:33:2699:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2700:9:2700:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2700:18:2700:22 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2700:18:2700:22 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2700:18:2700:22 | vals6 | T | {EXTERNAL LOCATION} | & | +| main.rs:2700:18:2700:22 | vals6 | T.TRef | {EXTERNAL LOCATION} | u64 | +| main.rs:2700:24:2700:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2702:17:2702:21 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2702:17:2702:21 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2702:25:2702:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2702:25:2702:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2703:9:2703:13 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2703:9:2703:13 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2703:20:2703:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2704:9:2704:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2704:18:2704:22 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2704:18:2704:22 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2704:24:2704:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2708:17:2711:9 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2709:13:2710:13 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2709:29:2710:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2713:17:2713:20 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2713:17:2713:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2713:24:2713:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2713:24:2713:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2714:9:2714:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2714:9:2714:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2714:24:2714:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2714:24:2714:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2714:33:2714:37 | "one" | | {EXTERNAL LOCATION} | & | +| main.rs:2714:33:2714:37 | "one" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2715:9:2715:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2715:9:2715:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2715:24:2715:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2715:24:2715:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2715:33:2715:37 | "two" | | {EXTERNAL LOCATION} | & | +| main.rs:2715:33:2715:37 | "two" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2716:9:2716:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2716:20:2716:23 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2716:20:2716:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2716:32:2716:33 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2717:9:2717:37 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2717:22:2717:25 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2717:22:2717:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2717:36:2717:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2718:9:2718:42 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2718:13:2718:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2718:29:2718:32 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2718:29:2718:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2718:41:2718:42 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2719:9:2719:36 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2719:13:2719:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2719:29:2719:33 | &map1 | | {EXTERNAL LOCATION} | & | +| main.rs:2719:30:2719:33 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2719:30:2719:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2719:35:2719:36 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2723:17:2723:17 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2725:17:2728:9 | while ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2725:23:2725:23 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2726:9:2728:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2727:13:2727:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2739:40:2741:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2739:40:2741:9 | { ... } | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2739:40:2741:9 | { ... } | T.T | main.rs:2738:10:2738:19 | T | +| main.rs:2743:30:2745:9 | { ... } | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2743:30:2745:9 | { ... } | T | main.rs:2738:10:2738:19 | T | +| main.rs:2747:19:2747:22 | SelfParam | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2747:19:2747:22 | SelfParam | T | main.rs:2738:10:2738:19 | T | +| main.rs:2747:33:2749:9 | { ... } | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2747:33:2749:9 | { ... } | T | main.rs:2738:10:2738:19 | T | +| main.rs:2748:13:2748:16 | self | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2748:13:2748:16 | self | T | main.rs:2738:10:2738:19 | T | +| main.rs:2760:15:2760:15 | x | | main.rs:2760:12:2760:12 | T | +| main.rs:2760:26:2762:5 | { ... } | | main.rs:2760:12:2760:12 | T | +| main.rs:2761:9:2761:9 | x | | main.rs:2760:12:2760:12 | T | +| main.rs:2764:16:2786:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2765:13:2765:14 | x1 | | {EXTERNAL LOCATION} | Option | +| main.rs:2765:13:2765:14 | x1 | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2765:13:2765:14 | x1 | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2765:34:2765:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2765:34:2765:48 | ...::assoc_fun(...) | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2766:13:2766:14 | x2 | | {EXTERNAL LOCATION} | Option | +| main.rs:2766:13:2766:14 | x2 | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2766:13:2766:14 | x2 | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2766:18:2766:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2766:18:2766:38 | ...::assoc_fun(...) | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2766:18:2766:38 | ...::assoc_fun(...) | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2767:13:2767:14 | x3 | | {EXTERNAL LOCATION} | Option | +| main.rs:2767:13:2767:14 | x3 | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2767:13:2767:14 | x3 | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2767:18:2767:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2767:18:2767:32 | ...::assoc_fun(...) | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2767:18:2767:32 | ...::assoc_fun(...) | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2768:13:2768:14 | x4 | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2768:13:2768:14 | x4 | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2768:18:2768:48 | ...::method(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2768:18:2768:48 | ...::method(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2768:35:2768:47 | ...::default(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2769:13:2769:14 | x5 | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2769:13:2769:14 | x5 | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2769:18:2769:42 | ...::method(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2769:18:2769:42 | ...::method(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2769:29:2769:41 | ...::default(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2773:21:2773:33 | ...::default(...) | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2774:13:2774:15 | x10 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2774:13:2774:15 | x10 | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2774:19:2777:9 | S5::<...> {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2774:19:2777:9 | S5::<...> {...} | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2778:13:2778:15 | x11 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2778:19:2778:34 | S5 {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2779:13:2779:15 | x12 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2779:19:2779:33 | S5 {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2780:13:2780:15 | x13 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2780:19:2783:9 | S5 {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2782:20:2782:32 | ...::default(...) | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2784:13:2784:15 | x14 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2784:19:2784:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2785:13:2785:15 | x15 | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2785:13:2785:15 | x15 | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2785:19:2785:37 | ...::default(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2785:19:2785:37 | ...::default(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2794:35:2796:9 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2794:35:2796:9 | { ... } | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2794:35:2796:9 | { ... } | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2795:13:2795:26 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2795:14:2795:18 | S1 {...} | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2795:21:2795:25 | S1 {...} | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2797:16:2797:19 | SelfParam | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2797:22:2797:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2800:16:2834:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2801:13:2801:13 | a | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2801:13:2801:13 | a | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2801:13:2801:13 | a | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2801:17:2801:30 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2801:17:2801:30 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2801:17:2801:30 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:17:2802:17 | b | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2802:17:2802:17 | b | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:17:2802:17 | b | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:21:2802:34 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2802:21:2802:34 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:21:2802:34 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:13:2803:18 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2803:22:2803:35 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2803:22:2803:35 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:22:2803:35 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:13:2804:22 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2804:26:2804:39 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2804:26:2804:39 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:26:2804:39 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:13:2805:26 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2805:30:2805:43 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2805:30:2805:43 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:30:2805:43 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2807:9:2807:9 | a | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2807:9:2807:9 | a | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2807:9:2807:9 | a | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2808:9:2808:9 | b | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2808:9:2808:9 | b | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2808:9:2808:9 | b | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2821:13:2821:16 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2821:20:2821:25 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2822:13:2822:13 | i | | {EXTERNAL LOCATION} | i64 | +| main.rs:2822:22:2822:25 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2823:13:2823:13 | j | | {EXTERNAL LOCATION} | bool | +| main.rs:2823:23:2823:26 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2825:20:2825:25 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2827:13:2827:18 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2827:30:2827:41 | "unexpected" | | {EXTERNAL LOCATION} | & | +| main.rs:2827:30:2827:41 | "unexpected" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2827:30:2827:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2827:30:2827:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2828:25:2828:34 | "expected" | | {EXTERNAL LOCATION} | & | +| main.rs:2828:25:2828:34 | "expected" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2828:25:2828:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2828:25:2828:34 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2832:13:2832:13 | y | | {EXTERNAL LOCATION} | & | +| main.rs:2832:17:2832:31 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2832:18:2832:31 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2832:18:2832:31 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2832:18:2832:31 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2833:9:2833:9 | y | | {EXTERNAL LOCATION} | & | +| main.rs:2839:27:2861:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2840:13:2840:23 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2840:13:2840:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2840:27:2840:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2840:27:2840:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2840:36:2840:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2843:15:2843:25 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2843:15:2843:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2844:24:2846:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2845:26:2845:36 | "Boxed 100\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2845:26:2845:36 | "Boxed 100\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2845:26:2845:36 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2845:26:2845:36 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2847:22:2850:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2849:26:2849:42 | "Boxed value: {}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2849:26:2849:42 | "Boxed value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2849:26:2849:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2849:26:2849:51 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2854:13:2854:22 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2854:13:2854:22 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:26:2854:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2854:26:2854:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:35:2854:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2854:35:2854:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:44:2854:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2855:15:2855:24 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2855:15:2855:24 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2856:26:2859:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2858:26:2858:43 | "Nested boxed: {}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2858:26:2858:43 | "Nested boxed: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2858:26:2858:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2858:26:2858:59 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2870:36:2872:9 | { ... } | | main.rs:2867:5:2867:22 | Path | +| main.rs:2871:13:2871:19 | Path {...} | | main.rs:2867:5:2867:22 | Path | +| main.rs:2874:29:2874:33 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2874:29:2874:33 | SelfParam | TRef | main.rs:2867:5:2867:22 | Path | +| main.rs:2874:59:2876:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:2874:59:2876:9 | { ... } | E | {EXTERNAL LOCATION} | () | +| main.rs:2874:59:2876:9 | { ... } | T | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2875:16:2875:29 | ...::new(...) | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2882:39:2884:9 | { ... } | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2883:13:2883:22 | PathBuf {...} | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2892:18:2892:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2892:18:2892:22 | SelfParam | TRef | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2892:34:2896:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:2892:34:2896:9 | { ... } | TRef | main.rs:2867:5:2867:22 | Path | +| main.rs:2894:33:2894:43 | ...::new(...) | | main.rs:2867:5:2867:22 | Path | +| main.rs:2895:13:2895:17 | &path | | {EXTERNAL LOCATION} | & | +| main.rs:2899:16:2907:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2900:13:2900:17 | path1 | | main.rs:2867:5:2867:22 | Path | +| main.rs:2900:21:2900:31 | ...::new(...) | | main.rs:2867:5:2867:22 | Path | +| main.rs:2901:21:2901:25 | path1 | | main.rs:2867:5:2867:22 | Path | +| main.rs:2904:13:2904:20 | pathbuf1 | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2904:24:2904:37 | ...::new(...) | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2905:24:2905:31 | pathbuf1 | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2912:14:2912:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2912:14:2912:18 | SelfParam | TRef | main.rs:2911:5:2913:5 | Self [trait MyTrait] | +| main.rs:2919:14:2919:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2919:14:2919:18 | SelfParam | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2919:14:2919:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2919:28:2921:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2920:13:2920:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2920:13:2920:16 | self | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2920:13:2920:16 | self | TRef.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2925:14:2925:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2925:14:2925:18 | SelfParam | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2925:14:2925:18 | SelfParam | TRef.T | main.rs:2915:5:2916:19 | S | +| main.rs:2925:14:2925:18 | SelfParam | TRef.T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2925:28:2927:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2926:13:2926:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2926:13:2926:16 | self | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2926:13:2926:16 | self | TRef.T | main.rs:2915:5:2916:19 | S | +| main.rs:2926:13:2926:16 | self | TRef.T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2931:15:2931:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2931:15:2931:19 | SelfParam | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2931:15:2931:19 | SelfParam | TRef.T | main.rs:2930:10:2930:16 | T | +| main.rs:2931:33:2933:9 | { ... } | | main.rs:2915:5:2916:19 | S | +| main.rs:2931:33:2933:9 | { ... } | T | main.rs:2915:5:2916:19 | S | +| main.rs:2931:33:2933:9 | { ... } | T.T | main.rs:2930:10:2930:16 | T | +| main.rs:2932:17:2932:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2932:17:2932:20 | self | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2932:17:2932:20 | self | TRef.T | main.rs:2930:10:2930:16 | T | +| main.rs:2936:14:2936:14 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2936:48:2953:5 | { ... } | | {EXTERNAL LOCATION} | Box | +| main.rs:2936:48:2953:5 | { ... } | A | {EXTERNAL LOCATION} | Global | +| main.rs:2936:48:2953:5 | { ... } | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:2936:48:2953:5 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2937:20:2937:20 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2947:12:2947:12 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2949:13:2949:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2949:13:2949:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2951:13:2951:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2951:13:2951:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2957:22:2961:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2958:18:2958:18 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:2958:33:2960:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2959:13:2959:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:2966:11:2966:14 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2966:30:2974:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2969:13:2971:13 | if cond {...} | | {EXTERNAL LOCATION} | () | +| main.rs:2969:16:2969:19 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2969:21:2971:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2977:20:2984:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2982:18:2982:26 | "b: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2982:18:2982:26 | "b: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2982:18:2982:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2982:18:2982:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2986:20:2988:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2991:11:2991:14 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2991:30:2999:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2992:13:2992:13 | a | | {EXTERNAL LOCATION} | () | +| main.rs:2992:17:2996:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2993:13:2995:13 | if cond {...} | | {EXTERNAL LOCATION} | () | +| main.rs:2993:16:2993:19 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2993:21:2995:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2997:18:2997:26 | "a: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2997:18:2997:26 | "a: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2997:18:2997:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2997:18:2997:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2997:29:2997:29 | a | | {EXTERNAL LOCATION} | () | +| main.rs:3003:16:3050:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3005:13:3005:13 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3005:13:3005:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3009:26:3009:28 | opt | | {EXTERNAL LOCATION} | Option | +| main.rs:3009:26:3009:28 | opt | T | main.rs:3009:23:3009:23 | T | +| main.rs:3009:42:3009:42 | x | | main.rs:3009:23:3009:23 | T | +| main.rs:3009:48:3009:49 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3012:9:3012:24 | pin_option(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3019:13:3019:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3019:17:3019:39 | ...::A {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3020:13:3020:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3020:13:3020:13 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3020:13:3020:13 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3020:40:3020:40 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3021:13:3021:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3021:13:3021:13 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3021:17:3021:52 | ...::A {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3021:17:3021:52 | ...::A {...} | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3023:13:3023:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3023:13:3023:13 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3023:17:3025:9 | ...::B::<...> {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3023:17:3025:9 | ...::B::<...> {...} | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3024:20:3024:32 | ...::new(...) | | {EXTERNAL LOCATION} | String | +| main.rs:3027:29:3027:29 | e | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3027:29:3027:29 | e | T1 | main.rs:3027:26:3027:26 | T | +| main.rs:3027:29:3027:29 | e | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3027:53:3027:53 | x | | main.rs:3027:26:3027:26 | T | +| main.rs:3027:59:3027:60 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3030:13:3030:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3030:17:3032:9 | ...::B {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3031:20:3031:32 | ...::new(...) | | {EXTERNAL LOCATION} | String | +| main.rs:3033:9:3033:27 | pin_my_either(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3033:23:3033:23 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3036:13:3036:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3036:13:3036:13 | x | E | {EXTERNAL LOCATION} | String | +| main.rs:3036:13:3036:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3040:29:3040:31 | res | | {EXTERNAL LOCATION} | Result | +| main.rs:3040:29:3040:31 | res | E | main.rs:3040:26:3040:26 | E | +| main.rs:3040:29:3040:31 | res | T | main.rs:3040:23:3040:23 | T | +| main.rs:3040:48:3040:48 | x | | main.rs:3040:26:3040:26 | E | +| main.rs:3040:54:3040:55 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3043:9:3043:28 | pin_result(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3043:23:3043:27 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:3045:17:3045:17 | x | | {EXTERNAL LOCATION} | Vec | +| main.rs:3045:17:3045:17 | x | A | {EXTERNAL LOCATION} | Global | +| main.rs:3045:21:3045:30 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:3045:21:3045:30 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:3046:9:3046:9 | x | | {EXTERNAL LOCATION} | Vec | +| main.rs:3046:9:3046:9 | x | A | {EXTERNAL LOCATION} | Global | +| main.rs:3049:9:3049:9 | x | | {EXTERNAL LOCATION} | Vec | +| main.rs:3049:9:3049:9 | x | A | {EXTERNAL LOCATION} | Global | +| main.rs:3056:14:3056:17 | SelfParam | | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3059:14:3059:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:3059:14:3059:18 | SelfParam | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3059:21:3059:25 | other | | {EXTERNAL LOCATION} | & | +| main.rs:3059:21:3059:25 | other | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3059:44:3061:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:3059:44:3061:9 | { ... } | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3060:13:3060:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:3060:13:3060:16 | self | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3066:14:3066:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | +| main.rs:3066:28:3068:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:3067:13:3067:16 | self | | {EXTERNAL LOCATION} | i32 | +| main.rs:3073:14:3073:17 | SelfParam | | {EXTERNAL LOCATION} | usize | +| main.rs:3073:28:3075:9 | { ... } | | {EXTERNAL LOCATION} | usize | +| main.rs:3074:13:3074:16 | self | | {EXTERNAL LOCATION} | usize | +| main.rs:3080:14:3080:17 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:3080:14:3080:17 | SelfParam | TRef | main.rs:3078:10:3078:10 | T | +| main.rs:3080:28:3082:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:3080:28:3082:9 | { ... } | TRef | main.rs:3078:10:3078:10 | T | +| main.rs:3081:13:3081:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:3081:13:3081:16 | self | TRef | main.rs:3078:10:3078:10 | T | +| main.rs:3085:25:3089:5 | { ... } | | {EXTERNAL LOCATION} | usize | +| main.rs:3091:12:3099:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3092:13:3092:13 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3093:13:3093:13 | y | | {EXTERNAL LOCATION} | & | +| main.rs:3093:17:3093:18 | &1 | | {EXTERNAL LOCATION} | & | +| main.rs:3094:17:3094:17 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3094:21:3094:21 | y | | {EXTERNAL LOCATION} | & | +| main.rs:3097:13:3097:13 | y | | {EXTERNAL LOCATION} | usize | +| main.rs:3098:23:3098:23 | y | | {EXTERNAL LOCATION} | usize | +| main.rs:3107:11:3142:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3108:5:3108:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3109:5:3109:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:3110:5:3110:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:3110:20:3110:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:3110:41:3110:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:3111:5:3111:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3112:5:3112:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3113:5:3113:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3114:5:3114:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3115:5:3115:33 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3116:5:3116:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3117:5:3117:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3118:5:3118:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3119:5:3119:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3120:5:3120:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3121:5:3121:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3122:5:3122:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3123:5:3123:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3124:5:3124:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3125:5:3125:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3126:5:3126:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3127:5:3127:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:3127:5:3127:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:3128:5:3128:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3129:5:3129:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3130:5:3130:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3131:5:3131:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3132:5:3132:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3133:5:3133:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3134:5:3134:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3135:5:3135:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3136:5:3136:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3137:5:3137:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3138:5:3138:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3139:5:3139:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3140:5:3140:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:3140:5:3140:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:3140:5:3140:20 | ...::f(...) | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:3140:5:3140:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:3140:16:3140:19 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:3141:5:3141:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:13:26:133:1 | { ... } | | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:13:26:133:1 | { ... } | T | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:15:5:18:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:15:31:18:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:17:18:17:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:17:18:17:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:20:23:23:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:22:22:22:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:22:22:22:29 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:24:17:24:18 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:28:14:28:21 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:28:14:28:21 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:30:14:30:21 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:30:14:30:21 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:32:9:32:14 | value2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:32:18:32:26 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:33:5:36:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:33:12:33:22 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:33:26:33:31 | value2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:33:33:36:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:35:18:35:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:35:18:35:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:39:5:42:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:39:16:39:19 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:39:30:42:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:40:13:40:16 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:40:20:40:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:41:18:41:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:41:18:41:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:41:20:41:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:45:5:48:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:45:21:45:24 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:45:36:48:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:46:13:46:16 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:46:20:46:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:47:18:47:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:47:20:47:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:50:13:50:18 | value5 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:51:9:51:9 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:51:13:51:18 | value5 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:53:9:53:24 | my_record_struct | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | +| pattern_matching.rs:53:28:56:5 | MyRecordStruct {...} | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | +| pattern_matching.rs:55:17:55:21 | false | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:57:5:61:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:57:12:57:44 | MyRecordStruct {...} | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | +| pattern_matching.rs:57:48:57:63 | my_record_struct | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | +| pattern_matching.rs:57:65:61:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:60:9:60:10 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:63:45:63:49 | false | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:64:5:68:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:64:60:68:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:67:9:67:10 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:70:9:70:16 | my_enum1 | | pattern_matching.rs:8:1:11:1 | MyEnum | +| pattern_matching.rs:70:20:73:5 | ...::Variant1 {...} | | pattern_matching.rs:8:1:11:1 | MyEnum | +| pattern_matching.rs:72:17:72:21 | false | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:74:11:74:18 | my_enum1 | | pattern_matching.rs:8:1:11:1 | MyEnum | +| pattern_matching.rs:75:9:75:43 | ...::Variant1 {...} | | pattern_matching.rs:8:1:11:1 | MyEnum | +| pattern_matching.rs:75:48:79:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:78:13:78:14 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:80:45:84:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:83:13:83:14 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:88:9:88:13 | false | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:89:9:92:9 | MyRecordStruct {...} | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | +| pattern_matching.rs:91:21:91:28 | "string" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:91:21:91:28 | "string" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:98:13:101:13 | MyRecordStruct {...} | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | +| pattern_matching.rs:102:14:107:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:106:13:106:14 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:108:14:108:15 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:113:13:116:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:114:5:116:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:120:13:123:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:121:5:123:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:127:13:130:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:128:5:130:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:168:27:217:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:169:9:169:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:169:17:169:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:171:11:171:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:173:15:176:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:174:17:174:29 | literal_match | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:174:33:174:37 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:175:22:175:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:175:22:175:57 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:175:45:175:57 | literal_match | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:177:15:180:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:178:17:178:32 | negative_literal | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:178:36:178:40 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:179:22:179:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:179:22:179:61 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:179:46:179:61 | negative_literal | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:181:14:184:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:182:17:182:28 | zero_literal | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:182:32:182:36 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:183:22:183:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:183:22:183:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:183:42:183:53 | zero_literal | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:185:14:185:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:188:9:188:17 | float_val | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:188:21:188:27 | 3.14f64 | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:189:11:189:19 | float_val | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:190:17:193:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:191:17:191:24 | pi_match | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:191:28:191:36 | float_val | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:192:22:192:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:192:22:192:47 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:192:40:192:47 | pi_match | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:194:14:194:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:197:9:197:18 | string_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:197:9:197:18 | string_val | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:197:22:197:28 | "hello" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:197:22:197:28 | "hello" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:198:11:198:20 | string_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:198:11:198:20 | string_val | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:199:9:199:15 | "hello" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:199:9:199:15 | "hello" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:199:20:202:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:200:17:200:27 | hello_match | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:200:17:200:27 | hello_match | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:200:31:200:40 | string_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:200:31:200:40 | string_val | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:201:22:201:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:201:22:201:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:201:44:201:54 | hello_match | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:201:44:201:54 | hello_match | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:203:14:203:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:206:9:206:16 | bool_val | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:206:20:206:23 | true | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:207:11:207:18 | bool_val | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:208:9:208:12 | true | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:208:17:211:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:209:17:209:26 | true_match | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:209:30:209:37 | bool_val | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:210:22:210:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:210:22:210:51 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:210:42:210:51 | true_match | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:212:9:212:13 | false | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:212:18:215:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:213:17:213:27 | false_match | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:213:31:213:38 | bool_val | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:214:22:214:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:214:22:214:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:214:43:214:53 | false_match | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:219:30:277:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:220:9:220:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:220:17:220:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:223:11:223:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:224:14:227:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:226:22:226:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:226:22:226:58 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:231:11:231:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:231:12:231:16 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:232:13:232:13 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:232:18:235:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:233:17:233:25 | ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:233:29:233:29 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:234:22:234:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:234:22:234:60 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:234:52:234:60 | ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:239:13:239:25 | mutable_value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:239:29:239:33 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:240:11:240:23 | mutable_value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:241:18:245:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:244:22:244:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:244:22:244:56 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:249:39:249:43 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:251:35:254:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:253:22:253:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:253:22:253:59 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:255:40:258:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:257:22:257:63 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:257:22:257:63 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:259:30:262:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:261:22:261:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:261:22:261:49 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:263:27:265:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:264:22:264:33 | "None value\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:264:22:264:33 | "None value\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:264:22:264:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:264:22:264:33 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:269:13:269:23 | ref_mut_val | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:269:27:269:30 | 5i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:270:16:270:26 | ref_mut_val | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:271:17:271:17 | x | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:271:22:275:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:272:17:272:29 | ref_mut_bound | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:272:33:272:33 | x | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:273:15:273:27 | ref_mut_bound | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:274:22:274:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:274:22:274:38 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:279:28:290:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:280:9:280:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:280:17:280:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:282:11:282:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:283:24:283:39 | "Specific match\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:283:24:283:39 | "Specific match\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:283:24:283:39 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:283:24:283:39 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:285:14:288:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:286:17:286:32 | wildcard_context | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:286:36:286:40 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:287:22:287:65 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:287:22:287:65 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:287:50:287:65 | wildcard_context | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:292:25:324:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:293:9:293:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:293:17:293:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:295:11:295:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:297:19:300:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:298:17:298:31 | range_inclusive | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:298:35:298:39 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:299:22:299:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:299:22:299:59 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:299:45:299:59 | range_inclusive | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:301:17:304:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:302:17:302:26 | range_from | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:302:30:302:34 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:303:22:303:52 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:303:22:303:52 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:303:43:303:52 | range_from | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:305:17:308:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:306:17:306:34 | range_to_inclusive | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:306:38:306:42 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:307:22:307:67 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:307:22:307:67 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:307:50:307:67 | range_to_inclusive | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:309:14:309:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:312:9:312:16 | char_val | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:312:20:312:22 | 'c' | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:313:11:313:18 | char_val | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:314:9:314:11 | 'a' | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:314:15:314:17 | 'z' | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:314:22:317:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:315:17:315:30 | lowercase_char | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:315:34:315:41 | char_val | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:316:22:316:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:316:22:316:57 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:316:44:316:57 | lowercase_char | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:318:9:318:11 | 'A' | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:318:15:318:17 | 'Z' | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:318:22:321:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:319:17:319:30 | uppercase_char | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:319:34:319:41 | char_val | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:320:22:320:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:320:22:320:57 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:320:44:320:57 | uppercase_char | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:322:14:322:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:326:29:355:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:327:9:327:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:327:17:327:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:328:13:328:25 | mutable_value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:328:29:328:33 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:331:11:331:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:331:12:331:16 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:332:9:332:11 | &42 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:332:16:335:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:333:17:333:27 | deref_match | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:333:31:333:35 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:334:22:334:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:334:22:334:58 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:334:48:334:58 | deref_match | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:336:9:336:10 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:336:15:339:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:338:22:338:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:338:22:338:60 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:342:11:342:28 | &mut mutable_value | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:342:16:342:28 | mutable_value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:343:9:343:18 | &mut ... | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:343:18:343:18 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:343:23:346:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:344:17:344:29 | mut_ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:344:33:344:33 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:345:22:345:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:345:22:345:61 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:345:49:345:61 | mut_ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:349:11:349:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:349:12:349:16 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:350:13:350:13 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:350:18:353:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:351:17:351:27 | ref_pattern | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:351:31:351:31 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:352:22:352:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:352:22:352:57 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:352:47:352:57 | ref_pattern | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:357:26:398:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:358:9:358:13 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:358:17:358:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:361:11:361:15 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:362:9:362:28 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:362:33:365:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:363:17:363:22 | origin | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:363:26:363:30 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:364:22:364:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:364:22:364:49 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:364:44:364:49 | origin | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:366:9:366:25 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:366:30:370:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:368:17:368:28 | x_axis_point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:368:32:368:36 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:369:22:369:80 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:369:22:369:80 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:369:69:369:80 | x_axis_point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:371:9:371:27 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:371:32:374:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:372:17:372:27 | ten_x_point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:372:31:372:35 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:373:22:373:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:373:22:373:57 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:373:47:373:57 | ten_x_point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:375:9:375:22 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:375:27:379:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:378:22:378:68 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:378:22:378:68 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:383:9:383:13 | shape | | pattern_matching.rs:145:1:150:1 | Shape | +| pattern_matching.rs:383:17:386:5 | ...::Rectangle {...} | | pattern_matching.rs:145:1:150:1 | Shape | +| pattern_matching.rs:387:11:387:15 | shape | | pattern_matching.rs:145:1:150:1 | Shape | +| pattern_matching.rs:388:9:391:9 | ...::Rectangle {...} | | pattern_matching.rs:145:1:150:1 | Shape | +| pattern_matching.rs:391:14:395:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:394:22:394:64 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:394:22:394:64 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:396:14:396:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:400:32:441:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:405:29:408:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:407:22:407:48 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:407:22:407:48 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:409:27:417:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:414:17:415:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:414:17:415:62 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:422:27:425:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:424:22:424:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:424:22:424:57 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:426:25:429:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:428:22:428:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:428:22:428:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:436:23:439:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:438:22:438:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:438:22:438:49 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:443:25:498:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:444:9:444:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:444:17:444:36 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:444:18:444:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:24:444:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:444:30:444:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:447:11:447:15 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:448:9:448:19 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:448:24:451:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:449:17:449:27 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:449:31:449:35 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:450:22:450:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:450:22:450:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:450:43:450:53 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:452:9:452:17 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:452:22:457:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:456:22:456:79 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:456:22:456:79 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:461:11:461:15 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:462:24:465:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:464:22:464:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:464:22:464:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:469:9:469:12 | unit | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:469:16:469:17 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:470:11:470:14 | unit | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:471:9:471:10 | TuplePat | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:471:15:474:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:472:17:472:26 | unit_value | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:472:30:472:33 | unit | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:473:22:473:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:22:473:51 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:42:473:51 | unit_value | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:478:9:478:14 | single | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:478:18:478:25 | TupleExpr | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:478:19:478:23 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:479:11:479:16 | single | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:480:9:480:12 | TuplePat | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:480:17:483:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:482:22:482:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:482:22:482:60 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:35:487:41 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:487:36:487:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:488:5:491:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:488:12:488:17 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:488:32:491:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:489:18:489:24 | "n: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:489:18:489:24 | "n: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:489:18:489:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:489:18:489:27 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:490:18:490:24 | "m: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:490:18:490:24 | "m: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:490:18:490:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:490:18:490:27 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:494:35:494:41 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:494:36:494:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:495:9:495:14 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:496:14:496:20 | "n: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:496:14:496:20 | "n: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:496:14:496:23 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:496:14:496:23 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:497:14:497:20 | "m: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:497:14:497:20 | "m: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:497:14:497:23 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:497:14:497:23 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:500:33:520:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:501:9:501:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:501:17:501:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:504:11:504:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:505:16:508:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:507:22:507:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:507:22:507:61 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:512:9:512:13 | tuple | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:512:17:512:28 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:512:18:512:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:512:24:512:27 | 2i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:513:11:513:15 | tuple | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:514:9:514:16 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:514:21:518:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:517:22:517:71 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:517:22:517:71 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:522:25:563:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:523:9:523:13 | slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:523:9:523:13 | slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:523:9:523:13 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:523:25:523:40 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:523:26:523:40 | [...] | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:526:11:526:15 | slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:526:11:526:15 | slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:526:11:526:15 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:527:15:530:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:528:17:528:27 | empty_slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:528:17:528:27 | empty_slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:528:17:528:27 | empty_slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:528:31:528:35 | slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:528:31:528:35 | slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:528:31:528:35 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:529:22:529:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:529:22:529:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:529:43:529:53 | empty_slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:529:43:529:53 | empty_slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:529:43:529:53 | empty_slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:531:16:534:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:533:22:533:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:533:22:533:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:535:28:539:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:538:22:538:70 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:538:22:538:70 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:540:39:550:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:545:17:548:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:545:17:548:34 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:554:9:554:13 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:554:17:554:28 | [...] | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:554:18:554:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:555:11:555:15 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:556:22:561:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:560:22:560:70 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:560:22:560:70 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:565:24:601:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:568:9:568:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:568:17:568:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:570:11:570:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:571:21:574:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:572:17:572:27 | const_match | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:572:31:572:35 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:573:22:573:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:573:22:573:56 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:573:46:573:56 | const_match | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:575:14:575:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:579:33:579:37 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:581:27:583:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:582:22:582:35 | "None variant\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:582:22:582:35 | "None variant\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:582:22:582:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:582:22:582:35 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:584:30:587:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:586:22:586:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:586:22:586:49 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:592:39:595:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:594:22:594:45 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:594:22:594:45 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:596:40:599:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:598:22:598:43 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:598:22:598:43 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:603:22:638:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:604:9:604:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:604:17:604:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:607:11:607:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:608:22:611:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:609:17:609:25 | small_num | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:609:29:609:33 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:610:22:610:50 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:610:22:610:50 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:610:42:610:50 | small_num | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:612:20:615:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:613:17:613:25 | round_num | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:613:29:613:33 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:614:22:614:50 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:614:22:614:50 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:614:42:614:50 | round_num | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:616:14:616:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:620:9:620:13 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:620:17:620:36 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:621:11:621:15 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:622:9:622:29 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:622:33:622:53 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:622:58:626:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:625:22:625:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:625:22:625:62 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:627:14:627:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:631:11:631:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:632:30:635:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:633:17:633:30 | range_or_value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:633:34:633:38 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:634:22:634:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:634:22:634:51 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:634:38:634:51 | range_or_value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:636:14:636:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:640:24:674:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:641:9:641:13 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:641:17:641:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:641:18:641:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:641:24:641:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:641:30:641:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:641:38:641:40 | 4u8 | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:644:11:644:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:645:24:648:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:647:22:647:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:647:22:647:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:651:11:651:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:652:23:655:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:654:22:654:52 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:654:22:654:52 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:658:11:658:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:659:30:663:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:662:22:662:67 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:662:22:662:67 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:667:9:667:13 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:667:17:667:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:668:11:668:15 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:669:9:669:23 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:669:28:672:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:671:22:671:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:671:22:671:47 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:676:25:696:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:694:21:694:25 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:694:21:694:25 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:694:21:694:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:695:21:695:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:695:21:695:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:695:21:695:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:698:34:724:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:700:9:700:20 | complex_data | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:700:24:700:79 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:700:25:700:44 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:702:11:702:22 | complex_data | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:704:9:704:61 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:704:10:704:26 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:704:66:712:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:709:17:710:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:709:17:710:44 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:714:9:714:41 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:714:10:714:24 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:714:45:714:71 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:714:46:714:67 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:714:76:717:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:716:22:716:65 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:716:22:716:65 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:719:18:722:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:721:22:721:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:721:22:721:62 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:726:37:758:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:728:9:728:13 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:728:17:728:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:729:9:729:22 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:729:26:729:30 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:733:9:733:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:733:17:733:36 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:733:18:733:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:733:24:733:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:733:30:733:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:734:9:734:17 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:734:21:734:25 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:739:9:739:13 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:739:17:739:34 | [...] | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:739:18:739:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:740:29:740:33 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:751:9:751:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:751:17:751:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:752:13:752:19 | ref_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:752:13:752:19 | ref_val | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:752:23:752:27 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:753:9:753:15 | let_ref | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:753:9:753:15 | let_ref | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:753:19:753:25 | ref_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:753:19:753:25 | ref_val | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:756:13:756:19 | mut_val | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:756:23:756:27 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:757:9:757:15 | let_mut | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:757:19:757:25 | mut_val | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:760:42:789:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:763:22:763:35 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:763:59:767:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:763:59:767:5 | { ... } | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:763:59:767:5 | { ... } | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:766:9:766:26 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:769:22:769:35 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:769:51:772:5 | { ... } | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:774:22:774:38 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:774:22:774:38 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:774:22:774:38 | TuplePat | T1 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:774:22:774:38 | TuplePat | T2 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:774:74:778:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:774:74:778:5 | { ... } | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:774:74:778:5 | { ... } | T1 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:777:9:777:34 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:781:9:781:13 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:781:17:781:37 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:782:9:782:17 | extracted | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:782:9:782:17 | extracted | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:9:782:17 | extracted | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:21:782:40 | extract_point(...) | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:782:21:782:40 | extract_point(...) | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:21:782:40 | extract_point(...) | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:35:782:39 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:785:9:785:11 | red | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:785:15:785:34 | extract_color(...) | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:787:9:787:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:787:17:787:38 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:787:18:787:22 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:787:25:787:31 | 3.14f64 | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:787:34:787:37 | true | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:788:9:788:23 | tuple_extracted | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:788:9:788:23 | tuple_extracted | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:788:9:788:23 | tuple_extracted | T1 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | T1 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:788:41:788:45 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:792:35:824:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:794:23:794:42 | (...) | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:794:23:794:42 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:794:45:794:64 | (...) | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:794:45:794:64 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:795:5:799:5 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:795:9:795:22 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:795:34:799:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:798:18:798:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:798:18:798:58 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:802:39:802:43 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:803:5:806:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:803:50:806:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:805:18:805:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:805:18:805:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:809:13:809:17 | stack | | {EXTERNAL LOCATION} | Vec | +| pattern_matching.rs:809:13:809:17 | stack | A | {EXTERNAL LOCATION} | Global | +| pattern_matching.rs:809:13:809:17 | stack | T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:809:36:809:39 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:810:5:813:5 | while ... { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:810:25:810:29 | stack | | {EXTERNAL LOCATION} | Vec | +| pattern_matching.rs:810:25:810:29 | stack | A | {EXTERNAL LOCATION} | Global | +| pattern_matching.rs:810:25:810:29 | stack | T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:810:37:813:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:812:18:812:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:812:18:812:42 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:816:9:816:13 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:816:17:816:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:817:11:817:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:818:23:821:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:820:22:820:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:820:22:820:44 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:822:14:822:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:826:28:846:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:827:5:827:7 | f(...) | | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:827:5:827:7 | f(...) | T | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:828:5:828:22 | literal_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:829:5:829:25 | identifier_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:830:5:830:23 | wildcard_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:831:5:831:20 | range_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:832:5:832:24 | reference_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:833:5:833:21 | record_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:834:5:834:27 | tuple_struct_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:835:5:835:20 | tuple_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:836:5:836:28 | parenthesized_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:837:5:837:20 | slice_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:838:5:838:19 | path_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:839:5:839:17 | or_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:840:5:840:19 | rest_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:841:5:841:20 | macro_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:842:5:842:29 | complex_nested_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:843:5:843:32 | patterns_in_let_statements(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:844:5:844:37 | patterns_in_function_parameters(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:845:5:845:30 | patterns_in_control_flow(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:3:28:3:28 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:3:28:3:28 | x | TPtrConst | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:3:50:6:1 | { ... } | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:4:24:4:24 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:4:24:4:24 | x | TPtrConst | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:8:26:8:26 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:8:26:8:26 | x | TPtrMut | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:8:47:11:1 | { ... } | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:9:24:9:24 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:9:24:9:24 | x | TPtrMut | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:13:23:19:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:14:9:14:9 | a | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:15:9:15:9 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:15:13:15:24 | &raw const a | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:15:24:15:24 | a | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:16:5:18:5 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:17:19:17:19 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:21:21:27:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:22:13:22:13 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:22:17:22:21 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:23:9:23:9 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:23:13:23:22 | &raw mut a | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:23:22:23:22 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:24:5:26:5 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:25:19:25:19 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:29:18:29:21 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:29:30:40:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:30:9:30:9 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:30:13:30:17 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:32:9:32:19 | ptr_written | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:32:23:32:32 | null_mut(...) | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:33:5:39:5 | if cond {...} | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:33:8:33:11 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:34:9:38:9 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:36:14:36:24 | ptr_written | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:36:28:36:28 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:37:23:37:33 | ptr_written | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:42:24:42:27 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:42:36:51:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:44:9:44:16 | ptr_read | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:44:20:44:29 | null_mut(...) | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:45:5:50:5 | if cond {...} | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:45:8:45:11 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:46:9:49:9 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:48:17:48:18 | _y | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:48:28:48:35 | ptr_read | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:53:15:60:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:54:5:54:32 | raw_pointer_const_deref(...) | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:54:29:54:31 | &10 | | {EXTERNAL LOCATION} | & | +| raw_pointer.rs:55:5:55:36 | raw_pointer_mut_deref(...) | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:55:27:55:35 | &mut true | | {EXTERNAL LOCATION} | &mut | +| raw_pointer.rs:55:32:55:35 | true | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:56:5:56:22 | raw_const_borrow(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:57:5:57:20 | raw_mut_borrow(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:58:5:58:24 | raw_mut_write(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:58:19:58:23 | false | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:59:5:59:30 | raw_type_from_deref(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:59:25:59:29 | false | | {EXTERNAL LOCATION} | bool | inferType -| blanket_impl.rs:15:18:15:22 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:15:18:15:22 | SelfParam | &T | blanket_impl.rs:9:5:10:14 | S2 | -| blanket_impl.rs:15:42:17:9 | { ... } | | file://:0:0:0:0 | & | -| blanket_impl.rs:15:42:17:9 | { ... } | &T | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:16:13:16:15 | &S1 | | file://:0:0:0:0 | & | -| blanket_impl.rs:16:13:16:15 | &S1 | &T | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:15:18:15:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:15:18:15:22 | SelfParam | TRef | blanket_impl.rs:9:5:10:14 | S2 | +| blanket_impl.rs:15:42:17:9 | { ... } | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:15:42:17:9 | { ... } | TRef | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:16:13:16:15 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:16:13:16:15 | &S1 | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:16:14:16:15 | S1 | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:21:19:21:23 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:21:19:21:23 | SelfParam | &T | blanket_impl.rs:20:5:22:5 | Self [trait Clone1] | -| blanket_impl.rs:25:22:25:26 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:25:22:25:26 | SelfParam | &T | blanket_impl.rs:24:5:28:5 | Self [trait Duplicatable] | -| blanket_impl.rs:32:19:32:23 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:32:19:32:23 | SelfParam | &T | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:21:19:21:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:21:19:21:23 | SelfParam | TRef | blanket_impl.rs:20:5:22:5 | Self [trait Clone1] | +| blanket_impl.rs:25:22:25:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:25:22:25:26 | SelfParam | TRef | blanket_impl.rs:24:5:28:5 | Self [trait Duplicatable] | +| blanket_impl.rs:32:19:32:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:32:19:32:23 | SelfParam | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:32:34:34:9 | { ... } | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:33:13:33:17 | * ... | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:33:14:33:17 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:33:14:33:17 | self | &T | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:40:22:40:26 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:40:22:40:26 | SelfParam | &T | blanket_impl.rs:38:10:38:18 | T | +| blanket_impl.rs:33:14:33:17 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:33:14:33:17 | self | TRef | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:40:22:40:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:40:22:40:26 | SelfParam | TRef | blanket_impl.rs:38:10:38:18 | T | | blanket_impl.rs:40:37:42:9 | { ... } | | blanket_impl.rs:38:10:38:18 | T | -| blanket_impl.rs:41:13:41:16 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:41:13:41:16 | self | &T | blanket_impl.rs:38:10:38:18 | T | +| blanket_impl.rs:41:13:41:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:41:13:41:16 | self | TRef | blanket_impl.rs:38:10:38:18 | T | | blanket_impl.rs:41:13:41:25 | self.clone1() | | blanket_impl.rs:38:10:38:18 | T | -| blanket_impl.rs:45:33:60:5 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:45:33:60:5 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:46:13:46:14 | x1 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:46:18:46:19 | S1 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:46:18:46:28 | S1.clone1() | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:47:18:47:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:47:18:47:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:47:18:47:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:47:18:47:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:47:18:47:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:47:20:47:21 | x1 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:48:13:48:14 | x2 | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:48:18:48:22 | (...) | | file://:0:0:0:0 | & | -| blanket_impl.rs:48:18:48:22 | (...) | &T | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:48:18:48:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:48:18:48:22 | (...) | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:48:18:48:31 | ... .clone1() | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:48:19:48:21 | &S1 | | file://:0:0:0:0 | & | -| blanket_impl.rs:48:19:48:21 | &S1 | &T | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:48:19:48:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:48:19:48:21 | &S1 | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:48:20:48:21 | S1 | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:49:18:49:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:49:18:49:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:49:18:49:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:49:18:49:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:49:18:49:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:49:18:49:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:49:20:49:21 | x2 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:50:13:50:14 | x3 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:50:18:50:19 | S1 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:50:18:50:31 | S1.duplicate() | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:51:18:51:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:51:18:51:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:51:18:51:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:51:18:51:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:51:18:51:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:51:18:51:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:51:20:51:21 | x3 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:52:13:52:14 | x4 | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:52:18:52:22 | (...) | | file://:0:0:0:0 | & | -| blanket_impl.rs:52:18:52:22 | (...) | &T | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:52:18:52:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:52:18:52:22 | (...) | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:52:18:52:34 | ... .duplicate() | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:52:19:52:21 | &S1 | | file://:0:0:0:0 | & | -| blanket_impl.rs:52:19:52:21 | &S1 | &T | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:52:19:52:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:52:19:52:21 | &S1 | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:52:20:52:21 | S1 | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:53:18:53:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:53:18:53:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:53:18:53:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:53:18:53:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:53:18:53:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:53:18:53:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:53:20:53:21 | x4 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:54:13:54:14 | x5 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:54:18:54:35 | ...::duplicate(...) | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:54:32:54:34 | &S1 | | file://:0:0:0:0 | & | -| blanket_impl.rs:54:32:54:34 | &S1 | &T | blanket_impl.rs:6:5:7:14 | S1 | +| blanket_impl.rs:54:32:54:34 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:54:32:54:34 | &S1 | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:54:33:54:34 | S1 | | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:55:18:55:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:55:18:55:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:55:18:55:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:55:18:55:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:55:18:55:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:55:18:55:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:55:20:55:21 | x5 | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:56:18:56:19 | S2 | | blanket_impl.rs:9:5:10:14 | S2 | -| blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:57:18:57:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:57:18:57:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:57:18:57:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:57:18:57:25 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:58:18:58:22 | (...) | | file://:0:0:0:0 | & | -| blanket_impl.rs:58:18:58:22 | (...) | &T | blanket_impl.rs:9:5:10:14 | S2 | -| blanket_impl.rs:58:19:58:21 | &S2 | | file://:0:0:0:0 | & | -| blanket_impl.rs:58:19:58:21 | &S2 | &T | blanket_impl.rs:9:5:10:14 | S2 | +| blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:57:18:57:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:57:18:57:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:58:18:58:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:58:18:58:22 | (...) | TRef | blanket_impl.rs:9:5:10:14 | S2 | +| blanket_impl.rs:58:19:58:21 | &S2 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:58:19:58:21 | &S2 | TRef | blanket_impl.rs:9:5:10:14 | S2 | | blanket_impl.rs:58:20:58:21 | S2 | | blanket_impl.rs:9:5:10:14 | S2 | -| blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:59:18:59:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:59:18:59:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:59:18:59:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:59:18:59:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:59:18:59:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:59:18:59:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:68:24:68:24 | x | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:68:32:68:32 | y | | blanket_impl.rs:67:5:69:5 | Self [trait Trait1] | | blanket_impl.rs:72:24:72:24 | x | | {EXTERNAL LOCATION} | i64 | @@ -115,103 +4618,91 @@ inferType | blanket_impl.rs:85:13:85:32 | ...::assoc_func1(...) | | blanket_impl.rs:82:10:82:18 | T | | blanket_impl.rs:85:28:85:28 | x | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:85:31:85:31 | y | | blanket_impl.rs:82:10:82:18 | T | -| blanket_impl.rs:89:33:98:5 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:89:33:98:5 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:90:13:90:14 | x1 | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:90:18:90:39 | ...::assoc_func1(...) | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:90:34:90:34 | 1 | | {EXTERNAL LOCATION} | i32 | -| blanket_impl.rs:90:34:90:34 | 1 | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:90:37:90:38 | S1 | | blanket_impl.rs:64:5:65:14 | S1 | -| blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:91:18:91:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:91:18:91:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:91:18:91:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:91:18:91:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:91:18:91:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:91:18:91:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:91:20:91:21 | x1 | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:92:13:92:14 | x2 | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:92:18:92:43 | ...::assoc_func1(...) | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:92:38:92:38 | 1 | | {EXTERNAL LOCATION} | i32 | -| blanket_impl.rs:92:38:92:38 | 1 | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:92:41:92:42 | S1 | | blanket_impl.rs:64:5:65:14 | S1 | -| blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:93:18:93:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:93:18:93:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:93:18:93:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:93:18:93:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:93:18:93:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:93:18:93:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:93:20:93:21 | x2 | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:94:13:94:14 | x3 | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:94:18:94:39 | ...::assoc_func2(...) | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:94:34:94:34 | 1 | | {EXTERNAL LOCATION} | i32 | -| blanket_impl.rs:94:34:94:34 | 1 | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:94:37:94:38 | S1 | | blanket_impl.rs:64:5:65:14 | S1 | -| blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:95:18:95:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:95:18:95:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:95:18:95:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:95:18:95:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:95:18:95:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:95:18:95:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:95:20:95:21 | x3 | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:96:13:96:14 | x4 | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:96:18:96:43 | ...::assoc_func2(...) | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:96:38:96:38 | 1 | | {EXTERNAL LOCATION} | i32 | -| blanket_impl.rs:96:38:96:38 | 1 | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:96:41:96:42 | S1 | | blanket_impl.rs:64:5:65:14 | S1 | -| blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:97:18:97:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:97:18:97:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:97:18:97:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:97:18:97:25 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:97:18:97:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:97:18:97:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:97:20:97:21 | x4 | | blanket_impl.rs:64:5:65:14 | S1 | -| blanket_impl.rs:108:22:108:26 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:108:22:108:26 | SelfParam | &T | blanket_impl.rs:107:5:109:5 | Self [trait Flag] | -| blanket_impl.rs:112:26:112:30 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:112:26:112:30 | SelfParam | &T | blanket_impl.rs:111:5:113:5 | Self [trait TryFlag] | -| blanket_impl.rs:119:26:119:30 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:119:26:119:30 | SelfParam | &T | blanket_impl.rs:115:10:115:11 | Fl | +| blanket_impl.rs:108:22:108:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:108:22:108:26 | SelfParam | TRef | blanket_impl.rs:107:5:109:5 | Self [trait Flag] | +| blanket_impl.rs:112:26:112:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:112:26:112:30 | SelfParam | TRef | blanket_impl.rs:111:5:113:5 | Self [trait TryFlag] | +| blanket_impl.rs:119:26:119:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:119:26:119:30 | SelfParam | TRef | blanket_impl.rs:115:10:115:11 | Fl | | blanket_impl.rs:119:49:121:9 | { ... } | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:119:49:121:9 | { ... } | T | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:120:13:120:34 | Some(...) | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:120:13:120:34 | Some(...) | T | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:120:18:120:21 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:120:18:120:21 | self | &T | blanket_impl.rs:115:10:115:11 | Fl | +| blanket_impl.rs:120:18:120:21 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:120:18:120:21 | self | TRef | blanket_impl.rs:115:10:115:11 | Fl | | blanket_impl.rs:120:18:120:33 | self.read_flag() | | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:126:32:126:36 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:126:32:126:36 | SelfParam | &T | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | +| blanket_impl.rs:126:32:126:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:126:32:126:36 | SelfParam | TRef | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | | blanket_impl.rs:126:55:128:9 | { ... } | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:126:55:128:9 | { ... } | T | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:127:13:127:16 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:127:13:127:16 | self | &T | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | +| blanket_impl.rs:127:13:127:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:127:13:127:16 | self | TRef | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | | blanket_impl.rs:127:13:127:32 | self.try_read_flag() | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:127:13:127:32 | self.try_read_flag() | T | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:135:32:135:36 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:135:32:135:36 | SelfParam | &T | blanket_impl.rs:133:5:136:5 | Self [trait AnotherTryFlag] | -| blanket_impl.rs:144:26:144:30 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:144:26:144:30 | SelfParam | &T | blanket_impl.rs:138:5:140:5 | MyTryFlag | +| blanket_impl.rs:135:32:135:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:135:32:135:36 | SelfParam | TRef | blanket_impl.rs:133:5:136:5 | Self [trait AnotherTryFlag] | +| blanket_impl.rs:144:26:144:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:144:26:144:30 | SelfParam | TRef | blanket_impl.rs:138:5:140:5 | MyTryFlag | | blanket_impl.rs:144:49:146:9 | { ... } | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:144:49:146:9 | { ... } | T | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:145:13:145:27 | Some(...) | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:145:13:145:27 | Some(...) | T | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:145:18:145:21 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:145:18:145:21 | self | &T | blanket_impl.rs:138:5:140:5 | MyTryFlag | +| blanket_impl.rs:145:18:145:21 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:145:18:145:21 | self | TRef | blanket_impl.rs:138:5:140:5 | MyTryFlag | | blanket_impl.rs:145:18:145:26 | self.flag | | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:155:22:155:26 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:155:22:155:26 | SelfParam | &T | blanket_impl.rs:149:5:151:5 | MyFlag | +| blanket_impl.rs:155:22:155:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:155:22:155:26 | SelfParam | TRef | blanket_impl.rs:149:5:151:5 | MyFlag | | blanket_impl.rs:155:37:157:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:156:13:156:16 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:156:13:156:16 | self | &T | blanket_impl.rs:149:5:151:5 | MyFlag | +| blanket_impl.rs:156:13:156:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:156:13:156:16 | self | TRef | blanket_impl.rs:149:5:151:5 | MyFlag | | blanket_impl.rs:156:13:156:21 | self.flag | | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:166:32:166:36 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:166:32:166:36 | SelfParam | &T | blanket_impl.rs:160:5:162:5 | MyOtherFlag | +| blanket_impl.rs:166:32:166:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:166:32:166:36 | SelfParam | TRef | blanket_impl.rs:160:5:162:5 | MyOtherFlag | | blanket_impl.rs:166:55:168:9 | { ... } | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:166:55:168:9 | { ... } | T | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:167:13:167:27 | Some(...) | | {EXTERNAL LOCATION} | Option | | blanket_impl.rs:167:13:167:27 | Some(...) | T | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:167:18:167:21 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:167:18:167:21 | self | &T | blanket_impl.rs:160:5:162:5 | MyOtherFlag | +| blanket_impl.rs:167:18:167:21 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:167:18:167:21 | self | TRef | blanket_impl.rs:160:5:162:5 | MyOtherFlag | | blanket_impl.rs:167:18:167:26 | self.flag | | {EXTERNAL LOCATION} | bool | -| blanket_impl.rs:171:15:184:5 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:171:15:184:5 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:172:13:172:23 | my_try_flag | | blanket_impl.rs:138:5:140:5 | MyTryFlag | | blanket_impl.rs:172:27:172:50 | MyTryFlag {...} | | blanket_impl.rs:138:5:140:5 | MyTryFlag | | blanket_impl.rs:172:45:172:48 | true | | {EXTERNAL LOCATION} | bool | @@ -238,135 +4729,131 @@ inferType | blanket_impl.rs:211:15:211:18 | SelfParam | | blanket_impl.rs:209:5:212:5 | Self [trait MyTrait4a] | | blanket_impl.rs:216:15:216:18 | SelfParam | | blanket_impl.rs:214:5:217:5 | Self [trait MyTrait4b] | | blanket_impl.rs:221:15:221:18 | SelfParam | | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:221:21:221:22 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:221:21:221:22 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:226:15:226:18 | SelfParam | | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:226:21:226:22 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:231:15:231:18 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:231:15:231:18 | SelfParam | &T | blanket_impl.rs:229:10:229:27 | T | -| blanket_impl.rs:231:21:233:9 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:232:13:232:16 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:232:13:232:16 | self | &T | blanket_impl.rs:229:10:229:27 | T | -| blanket_impl.rs:232:13:232:21 | self.m1() | | file://:0:0:0:0 | () | -| blanket_impl.rs:238:15:238:18 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:238:15:238:18 | SelfParam | &T | file://:0:0:0:0 | & | -| blanket_impl.rs:238:15:238:18 | SelfParam | &T.&T | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:238:21:240:9 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:239:13:239:16 | self | | file://:0:0:0:0 | & | -| blanket_impl.rs:239:13:239:16 | self | &T | file://:0:0:0:0 | & | -| blanket_impl.rs:239:13:239:16 | self | &T.&T | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:239:13:239:21 | self.m1() | | file://:0:0:0:0 | () | +| blanket_impl.rs:226:21:226:22 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:231:15:231:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:231:15:231:18 | SelfParam | TRef | blanket_impl.rs:229:10:229:27 | T | +| blanket_impl.rs:231:21:233:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:232:13:232:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:232:13:232:16 | self | TRef | blanket_impl.rs:229:10:229:27 | T | +| blanket_impl.rs:232:13:232:21 | self.m1() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:238:15:238:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:238:15:238:18 | SelfParam | TRef | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:238:15:238:18 | SelfParam | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:238:21:240:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:239:13:239:16 | self | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:239:13:239:16 | self | TRef | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:239:13:239:16 | self | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:239:13:239:21 | self.m1() | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:245:15:245:18 | SelfParam | | blanket_impl.rs:243:10:243:20 | T | -| blanket_impl.rs:245:21:247:9 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:245:21:247:9 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:246:13:246:16 | self | | blanket_impl.rs:243:10:243:20 | T | -| blanket_impl.rs:246:13:246:21 | self.m3() | | file://:0:0:0:0 | () | -| blanket_impl.rs:252:15:252:18 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:252:15:252:18 | SelfParam | &T | blanket_impl.rs:250:10:250:10 | T | -| blanket_impl.rs:252:21:252:22 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:255:33:263:5 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:256:13:256:14 | x1 | | file://:0:0:0:0 | () | +| blanket_impl.rs:246:13:246:21 | self.m3() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:252:15:252:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:252:15:252:18 | SelfParam | TRef | blanket_impl.rs:250:10:250:10 | T | +| blanket_impl.rs:252:21:252:22 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:255:33:263:5 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:256:13:256:14 | x1 | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:256:18:256:19 | S1 | | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:256:18:256:24 | S1.m1() | | file://:0:0:0:0 | () | -| blanket_impl.rs:257:13:257:14 | x2 | | file://:0:0:0:0 | () | -| blanket_impl.rs:257:18:257:22 | (...) | | file://:0:0:0:0 | & | -| blanket_impl.rs:257:18:257:22 | (...) | &T | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:257:18:257:27 | ... .m2() | | file://:0:0:0:0 | () | -| blanket_impl.rs:257:19:257:21 | &S1 | | file://:0:0:0:0 | & | -| blanket_impl.rs:257:19:257:21 | &S1 | &T | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:256:18:256:24 | S1.m1() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:257:13:257:14 | x2 | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:257:18:257:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:257:18:257:22 | (...) | TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:257:18:257:27 | ... .m2() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:257:19:257:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:257:19:257:21 | &S1 | TRef | blanket_impl.rs:188:5:189:14 | S1 | | blanket_impl.rs:257:20:257:21 | S1 | | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:258:13:258:14 | x3 | | file://:0:0:0:0 | () | -| blanket_impl.rs:258:18:258:23 | (...) | | file://:0:0:0:0 | & | -| blanket_impl.rs:258:18:258:23 | (...) | &T | file://:0:0:0:0 | & | -| blanket_impl.rs:258:18:258:23 | (...) | &T.&T | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:258:18:258:28 | ... .m2() | | file://:0:0:0:0 | () | -| blanket_impl.rs:258:19:258:22 | &... | | file://:0:0:0:0 | & | -| blanket_impl.rs:258:19:258:22 | &... | &T | file://:0:0:0:0 | & | -| blanket_impl.rs:258:19:258:22 | &... | &T.&T | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:258:20:258:22 | &S1 | | file://:0:0:0:0 | & | -| blanket_impl.rs:258:20:258:22 | &S1 | &T | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:258:13:258:14 | x3 | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:258:18:258:23 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:18:258:23 | (...) | TRef | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:18:258:23 | (...) | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:258:18:258:28 | ... .m2() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:258:19:258:22 | &... | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:19:258:22 | &... | TRef | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:19:258:22 | &... | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:258:20:258:22 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:20:258:22 | &S1 | TRef | blanket_impl.rs:188:5:189:14 | S1 | | blanket_impl.rs:258:21:258:22 | S1 | | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:259:13:259:14 | x4 | | file://:0:0:0:0 | () | +| blanket_impl.rs:259:13:259:14 | x4 | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:259:18:259:19 | S1 | | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:259:18:259:24 | S1.m4() | | file://:0:0:0:0 | () | -| blanket_impl.rs:260:13:260:14 | x5 | | file://:0:0:0:0 | () | -| blanket_impl.rs:260:18:260:22 | (...) | | file://:0:0:0:0 | & | -| blanket_impl.rs:260:18:260:22 | (...) | &T | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:260:18:260:27 | ... .m4() | | file://:0:0:0:0 | () | -| blanket_impl.rs:260:19:260:21 | &S1 | | file://:0:0:0:0 | & | -| blanket_impl.rs:260:19:260:21 | &S1 | &T | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:259:18:259:24 | S1.m4() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:260:13:260:14 | x5 | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:260:18:260:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:260:18:260:22 | (...) | TRef | blanket_impl.rs:188:5:189:14 | S1 | +| blanket_impl.rs:260:18:260:27 | ... .m4() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:260:19:260:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:260:19:260:21 | &S1 | TRef | blanket_impl.rs:188:5:189:14 | S1 | | blanket_impl.rs:260:20:260:21 | S1 | | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:261:13:261:14 | x6 | | file://:0:0:0:0 | () | +| blanket_impl.rs:261:13:261:14 | x6 | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:261:18:261:19 | S2 | | blanket_impl.rs:191:5:192:14 | S2 | -| blanket_impl.rs:261:18:261:24 | S2.m4() | | file://:0:0:0:0 | () | -| blanket_impl.rs:262:13:262:14 | x7 | | file://:0:0:0:0 | () | -| blanket_impl.rs:262:18:262:22 | (...) | | file://:0:0:0:0 | & | -| blanket_impl.rs:262:18:262:22 | (...) | &T | blanket_impl.rs:191:5:192:14 | S2 | -| blanket_impl.rs:262:18:262:27 | ... .m4() | | file://:0:0:0:0 | () | -| blanket_impl.rs:262:19:262:21 | &S2 | | file://:0:0:0:0 | & | -| blanket_impl.rs:262:19:262:21 | &S2 | &T | blanket_impl.rs:191:5:192:14 | S2 | +| blanket_impl.rs:261:18:261:24 | S2.m4() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:262:13:262:14 | x7 | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:262:18:262:22 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:262:18:262:22 | (...) | TRef | blanket_impl.rs:191:5:192:14 | S2 | +| blanket_impl.rs:262:18:262:27 | ... .m4() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:262:19:262:21 | &S2 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:262:19:262:21 | &S2 | TRef | blanket_impl.rs:191:5:192:14 | S2 | | blanket_impl.rs:262:20:262:21 | S2 | | blanket_impl.rs:191:5:192:14 | S2 | -| blanket_impl.rs:272:21:272:25 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:272:21:272:25 | SelfParam | &T | blanket_impl.rs:271:5:274:5 | Self [trait Executor] | -| blanket_impl.rs:273:24:273:28 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:273:24:273:28 | SelfParam | &T | blanket_impl.rs:271:5:274:5 | Self [trait Executor] | +| blanket_impl.rs:272:21:272:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:272:21:272:25 | SelfParam | TRef | blanket_impl.rs:271:5:274:5 | Self [trait Executor] | +| blanket_impl.rs:273:24:273:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:273:24:273:28 | SelfParam | TRef | blanket_impl.rs:271:5:274:5 | Self [trait Executor] | | blanket_impl.rs:273:31:273:35 | query | | blanket_impl.rs:273:21:273:21 | E | -| blanket_impl.rs:277:21:277:25 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:277:21:277:25 | SelfParam | &T | blanket_impl.rs:276:10:276:22 | T | -| blanket_impl.rs:277:28:279:9 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:278:22:278:41 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:278:22:278:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:278:22:278:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:278:22:278:41 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:281:24:281:28 | SelfParam | | file://:0:0:0:0 | & | -| blanket_impl.rs:281:24:281:28 | SelfParam | &T | blanket_impl.rs:276:10:276:22 | T | +| blanket_impl.rs:277:21:277:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:277:21:277:25 | SelfParam | TRef | blanket_impl.rs:276:10:276:22 | T | +| blanket_impl.rs:277:28:279:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:278:22:278:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:278:22:278:41 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:281:24:281:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:281:24:281:28 | SelfParam | TRef | blanket_impl.rs:276:10:276:22 | T | | blanket_impl.rs:281:31:281:36 | _query | | blanket_impl.rs:281:21:281:21 | E | -| blanket_impl.rs:281:42:283:9 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | | file://:0:0:0:0 | & | -| blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:282:22:282:41 | ...::_print(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:282:22:282:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:282:22:282:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| blanket_impl.rs:282:22:282:41 | { ... } | | file://:0:0:0:0 | () | -| blanket_impl.rs:290:16:300:5 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:281:42:283:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:282:22:282:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:282:22:282:41 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:290:16:300:5 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:291:13:291:13 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:291:17:291:34 | MySqlConnection {...} | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:293:9:293:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | -| blanket_impl.rs:293:9:293:20 | c.execute1() | | file://:0:0:0:0 | () | -| blanket_impl.rs:294:9:294:37 | ...::execute1(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:294:35:294:36 | &c | | file://:0:0:0:0 | & | -| blanket_impl.rs:294:35:294:36 | &c | &T | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:293:9:293:20 | c.execute1() | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:294:9:294:37 | ...::execute1(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:294:35:294:36 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:294:35:294:36 | &c | TRef | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:294:36:294:36 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:296:9:296:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | -| blanket_impl.rs:296:9:296:41 | c.execute2(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:296:20:296:40 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| blanket_impl.rs:296:20:296:40 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:296:9:296:41 | c.execute2(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:296:20:296:40 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:296:20:296:40 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | | blanket_impl.rs:297:9:297:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | -| blanket_impl.rs:297:9:297:49 | c.execute2(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:298:9:298:60 | ...::execute2(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:298:35:298:36 | &c | | file://:0:0:0:0 | & | -| blanket_impl.rs:298:35:298:36 | &c | &T | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:297:9:297:49 | c.execute2(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:298:9:298:60 | ...::execute2(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:298:35:298:36 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:298:35:298:36 | &c | TRef | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:298:36:298:36 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | -| blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:299:9:299:68 | ...::execute2::<...>(...) | | file://:0:0:0:0 | () | -| blanket_impl.rs:299:43:299:44 | &c | | file://:0:0:0:0 | & | -| blanket_impl.rs:299:43:299:44 | &c | &T | blanket_impl.rs:286:5:286:29 | MySqlConnection | +| blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:299:9:299:68 | ...::execute2::<...>(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:299:43:299:44 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:299:43:299:44 | &c | TRef | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:299:44:299:44 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | -| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| closure.rs:4:19:31:5 | { ... } | | file://:0:0:0:0 | () | +| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | +| closure.rs:4:19:31:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:6:13:6:22 | my_closure | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:6:13:6:22 | my_closure | dyn(Args) | file://:0:0:0:0 | (T_2) | -| closure.rs:6:13:6:22 | my_closure | dyn(Args).0(2) | {EXTERNAL LOCATION} | bool | -| closure.rs:6:13:6:22 | my_closure | dyn(Args).1(2) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:13:6:22 | my_closure | dyn(Args) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:6:13:6:22 | my_closure | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:6:13:6:22 | my_closure | dyn(Args).T1 | {EXTERNAL LOCATION} | bool | | closure.rs:6:13:6:22 | my_closure | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:6:26:6:38 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_2) | -| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).0(2) | {EXTERNAL LOCATION} | bool | -| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).1(2) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).T1 | {EXTERNAL LOCATION} | bool | | closure.rs:6:26:6:38 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:6:27:6:27 | a | | {EXTERNAL LOCATION} | bool | | closure.rs:6:30:6:30 | b | | {EXTERNAL LOCATION} | bool | @@ -376,12 +4863,12 @@ inferType | closure.rs:8:13:8:13 | x | | {EXTERNAL LOCATION} | i64 | | closure.rs:8:22:8:25 | 1i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:9:13:9:19 | add_one | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:9:13:9:19 | add_one | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:9:13:9:19 | add_one | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:13:9:19 | add_one | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:9:13:9:19 | add_one | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:9:13:9:19 | add_one | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:9:23:9:34 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:9:23:9:34 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:9:23:9:34 | \|...\| ... | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:23:9:34 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:9:23:9:34 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:9:23:9:34 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:9:24:9:24 | n | | {EXTERNAL LOCATION} | i64 | | closure.rs:9:27:9:27 | n | | {EXTERNAL LOCATION} | i64 | @@ -389,64 +4876,64 @@ inferType | closure.rs:9:31:9:34 | 1i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:10:13:10:14 | _y | | {EXTERNAL LOCATION} | i64 | | closure.rs:10:18:10:24 | add_one | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:10:18:10:24 | add_one | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:10:18:10:24 | add_one | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:10:18:10:24 | add_one | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:10:18:10:24 | add_one | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:10:18:10:24 | add_one | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:10:18:10:27 | add_one(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:10:26:10:26 | x | | {EXTERNAL LOCATION} | i64 | | closure.rs:13:13:13:13 | x | | {EXTERNAL LOCATION} | i64 | | closure.rs:13:17:13:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:14:13:14:20 | add_zero | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:14:13:14:20 | add_zero | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:14:13:14:20 | add_zero | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:13:14:20 | add_zero | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:14:13:14:20 | add_zero | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:14:13:14:20 | add_zero | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:14:24:14:33 | \|...\| n | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:14:24:14:33 | \|...\| n | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:14:24:14:33 | \|...\| n | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:24:14:33 | \|...\| n | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:14:24:14:33 | \|...\| n | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:14:24:14:33 | \|...\| n | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:14:25:14:25 | n | | {EXTERNAL LOCATION} | i64 | | closure.rs:14:33:14:33 | n | | {EXTERNAL LOCATION} | i64 | | closure.rs:15:13:15:14 | _y | | {EXTERNAL LOCATION} | i64 | | closure.rs:15:18:15:25 | add_zero | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:15:18:15:25 | add_zero | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:15:18:15:25 | add_zero | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:15:18:15:25 | add_zero | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:15:18:15:25 | add_zero | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:15:18:15:25 | add_zero | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:15:18:15:28 | add_zero(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:15:27:15:27 | x | | {EXTERNAL LOCATION} | i64 | | closure.rs:17:13:17:21 | _get_bool | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:17:13:17:21 | _get_bool | dyn(Args) | file://:0:0:0:0 | () | +| closure.rs:17:13:17:21 | _get_bool | dyn(Args) | {EXTERNAL LOCATION} | () | | closure.rs:17:13:17:21 | _get_bool | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:17:25:21:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:17:25:21:9 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | () | +| closure.rs:17:25:21:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | () | | closure.rs:17:25:21:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:17:36:21:9 | { ... } | | {EXTERNAL LOCATION} | bool | | closure.rs:19:17:19:17 | b | | {EXTERNAL LOCATION} | bool | | closure.rs:19:21:19:38 | ...::default(...) | | {EXTERNAL LOCATION} | bool | | closure.rs:20:13:20:13 | b | | {EXTERNAL LOCATION} | bool | | closure.rs:24:13:24:14 | id | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:24:13:24:14 | id | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:24:13:24:14 | id | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:24:13:24:14 | id | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:24:13:24:14 | id | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:24:13:24:14 | id | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:24:18:24:22 | \|...\| b | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:24:18:24:22 | \|...\| b | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:24:18:24:22 | \|...\| b | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:24:18:24:22 | \|...\| b | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:24:18:24:22 | \|...\| b | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:24:18:24:22 | \|...\| b | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:24:19:24:19 | b | | {EXTERNAL LOCATION} | bool | | closure.rs:24:22:24:22 | b | | {EXTERNAL LOCATION} | bool | | closure.rs:25:13:25:14 | _b | | {EXTERNAL LOCATION} | bool | | closure.rs:25:18:25:19 | id | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:25:18:25:19 | id | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:25:18:25:19 | id | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:25:18:25:19 | id | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:25:18:25:19 | id | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:25:18:25:19 | id | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:25:18:25:25 | id(...) | | {EXTERNAL LOCATION} | bool | | closure.rs:25:21:25:24 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:28:13:28:15 | id2 | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:28:13:28:15 | id2 | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:28:13:28:15 | id2 | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:28:13:28:15 | id2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:28:13:28:15 | id2 | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:28:13:28:15 | id2 | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:28:19:28:23 | \|...\| b | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:28:19:28:23 | \|...\| b | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:28:19:28:23 | \|...\| b | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:28:19:28:23 | \|...\| b | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:28:19:28:23 | \|...\| b | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:28:19:28:23 | \|...\| b | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:28:20:28:20 | b | | {EXTERNAL LOCATION} | bool | | closure.rs:28:23:28:23 | b | | {EXTERNAL LOCATION} | bool | @@ -454,19 +4941,19 @@ inferType | closure.rs:29:19:29:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | | closure.rs:30:13:30:15 | _b2 | | {EXTERNAL LOCATION} | bool | | closure.rs:30:25:30:27 | id2 | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:30:25:30:27 | id2 | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:30:25:30:27 | id2 | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:30:25:30:27 | id2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:30:25:30:27 | id2 | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:30:25:30:27 | id2 | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:30:25:30:32 | id2(...) | | {EXTERNAL LOCATION} | bool | | closure.rs:30:29:30:31 | arg | | {EXTERNAL LOCATION} | bool | | closure.rs:35:44:35:44 | f | | closure.rs:35:20:35:41 | F | -| closure.rs:35:50:37:5 | { ... } | | file://:0:0:0:0 | () | +| closure.rs:35:50:37:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:36:13:36:19 | _return | | {EXTERNAL LOCATION} | i64 | | closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | | closure.rs:36:23:36:29 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:36:25:36:28 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:39:46:39:46 | f | | closure.rs:39:22:39:43 | F | -| closure.rs:39:52:42:5 | { ... } | | file://:0:0:0:0 | () | +| closure.rs:39:52:42:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:40:13:40:15 | arg | | {EXTERNAL LOCATION} | bool | | closure.rs:40:19:40:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | | closure.rs:41:9:41:9 | f | | closure.rs:39:22:39:43 | F | @@ -484,15 +4971,15 @@ inferType | closure.rs:49:9:49:12 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i32 | | closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:52:15:64:5 | { ... } | | file://:0:0:0:0 | () | +| closure.rs:52:15:64:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:53:13:53:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:53:13:53:13 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:53:13:53:13 | f | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:53:13:53:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:53:13:53:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:53:13:53:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | | closure.rs:53:13:53:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:53:17:59:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:53:17:59:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i32 | | closure.rs:53:17:59:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:53:18:53:18 | x | | {EXTERNAL LOCATION} | bool | @@ -514,20 +5001,20 @@ inferType | closure.rs:60:18:60:31 | apply(...) | | {EXTERNAL LOCATION} | i32 | | closure.rs:60:18:60:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:60:24:60:24 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:60:24:60:24 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:60:24:60:24 | f | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:60:24:60:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:60:24:60:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | | closure.rs:60:24:60:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | | closure.rs:60:24:60:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:60:27:60:30 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:62:13:62:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:62:13:62:13 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:62:13:62:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:62:17:62:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:62:17:62:25 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:62:17:62:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:62:25:62:25 | 1 | | {EXTERNAL LOCATION} | i32 | | closure.rs:63:13:63:15 | _r2 | | {EXTERNAL LOCATION} | i64 | | closure.rs:63:19:63:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:63:29:63:29 | f | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:63:29:63:29 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:63:29:63:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:68:54:68:54 | f | | {EXTERNAL LOCATION} | Box | | closure.rs:68:54:68:54 | f | A | {EXTERNAL LOCATION} | Global | | closure.rs:68:54:68:54 | f | T | closure.rs:68:26:68:51 | F | @@ -541,18 +5028,18 @@ inferType | closure.rs:72:30:72:30 | f | | {EXTERNAL LOCATION} | Box | | closure.rs:72:30:72:30 | f | A | {EXTERNAL LOCATION} | Global | | closure.rs:72:30:72:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:72:30:72:30 | f | T.dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:72:30:72:30 | f | T.dyn(Args).0(1) | closure.rs:72:24:72:24 | A | +| closure.rs:72:30:72:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:72:30:72:30 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | | closure.rs:72:30:72:30 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | | closure.rs:72:58:72:60 | arg | | closure.rs:72:24:72:24 | A | -| closure.rs:72:66:75:5 | { ... } | | file://:0:0:0:0 | () | +| closure.rs:72:66:75:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:73:13:73:15 | _r1 | | closure.rs:72:27:72:27 | B | | closure.rs:73:19:73:37 | apply_boxed(...) | | closure.rs:72:27:72:27 | B | | closure.rs:73:31:73:31 | f | | {EXTERNAL LOCATION} | Box | | closure.rs:73:31:73:31 | f | A | {EXTERNAL LOCATION} | Global | | closure.rs:73:31:73:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:73:31:73:31 | f | T.dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:73:31:73:31 | f | T.dyn(Args).0(1) | closure.rs:72:24:72:24 | A | +| closure.rs:73:31:73:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:73:31:73:31 | f | T.dyn(Args).T0 | closure.rs:72:24:72:24 | A | | closure.rs:73:31:73:31 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | | closure.rs:73:34:73:36 | arg | | closure.rs:72:24:72:24 | A | | closure.rs:74:13:74:15 | _r2 | | {EXTERNAL LOCATION} | bool | @@ -560,57 +5047,56 @@ inferType | closure.rs:74:31:74:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | | closure.rs:74:31:74:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | closure.rs:74:31:74:53 | ...::new(...) | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:74:40:74:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:74:40:74:52 | \|...\| true | dyn(Args) | file://:0:0:0:0 | (T_1) | -| closure.rs:74:40:74:52 | \|...\| true | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:40:74:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:74:40:74:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:74:40:74:52 | \|...\| true | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:74:41:74:41 | _ | | {EXTERNAL LOCATION} | i64 | | closure.rs:74:49:74:52 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:74:56:74:56 | 3 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:74:56:74:56 | 3 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:12:14:12:18 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:12:14:12:18 | SelfParam | &T | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:12:29:14:5 | { ... } | | file://:0:0:0:0 | & | -| dereference.rs:12:29:14:5 | { ... } | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:13:9:13:19 | &... | | file://:0:0:0:0 | & | -| dereference.rs:13:9:13:19 | &... | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:13:10:13:13 | self | | file://:0:0:0:0 | & | -| dereference.rs:13:10:13:13 | self | &T | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:12:14:12:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:12:14:12:18 | SelfParam | TRef | dereference.rs:4:1:6:1 | MyIntPointer | +| dereference.rs:12:29:14:5 | { ... } | | {EXTERNAL LOCATION} | & | +| dereference.rs:12:29:14:5 | { ... } | TRef | {EXTERNAL LOCATION} | i64 | +| dereference.rs:13:9:13:19 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:13:9:13:19 | &... | TRef | {EXTERNAL LOCATION} | i64 | +| dereference.rs:13:10:13:13 | self | | {EXTERNAL LOCATION} | & | +| dereference.rs:13:10:13:13 | self | TRef | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:13:10:13:19 | self.value | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:25:14:25:18 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:25:14:25:18 | SelfParam | &T | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:25:14:25:18 | SelfParam | &T.T | dereference.rs:21:6:21:6 | T | -| dereference.rs:25:27:27:5 | { ... } | | file://:0:0:0:0 | & | -| dereference.rs:25:27:27:5 | { ... } | &T | dereference.rs:21:6:21:6 | T | -| dereference.rs:26:9:26:19 | &... | | file://:0:0:0:0 | & | -| dereference.rs:26:9:26:19 | &... | &T | dereference.rs:21:6:21:6 | T | -| dereference.rs:26:10:26:13 | self | | file://:0:0:0:0 | & | -| dereference.rs:26:10:26:13 | self | &T | dereference.rs:17:1:19:1 | MySmartPointer | -| dereference.rs:26:10:26:13 | self | &T.T | dereference.rs:21:6:21:6 | T | +| dereference.rs:25:14:25:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:25:14:25:18 | SelfParam | TRef | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:25:14:25:18 | SelfParam | TRef.T | dereference.rs:21:6:21:6 | T | +| dereference.rs:25:27:27:5 | { ... } | | {EXTERNAL LOCATION} | & | +| dereference.rs:25:27:27:5 | { ... } | TRef | dereference.rs:21:6:21:6 | T | +| dereference.rs:26:9:26:19 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:26:9:26:19 | &... | TRef | dereference.rs:21:6:21:6 | T | +| dereference.rs:26:10:26:13 | self | | {EXTERNAL LOCATION} | & | +| dereference.rs:26:10:26:13 | self | TRef | dereference.rs:17:1:19:1 | MySmartPointer | +| dereference.rs:26:10:26:13 | self | TRef.T | dereference.rs:21:6:21:6 | T | | dereference.rs:26:10:26:19 | self.value | | dereference.rs:21:6:21:6 | T | -| dereference.rs:33:12:33:16 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:33:12:33:16 | SelfParam | &T | dereference.rs:30:1:30:15 | S | -| dereference.rs:33:12:33:16 | SelfParam | &T.T | dereference.rs:32:6:32:6 | T | -| dereference.rs:33:25:35:5 | { ... } | | file://:0:0:0:0 | & | -| dereference.rs:33:25:35:5 | { ... } | &T | dereference.rs:32:6:32:6 | T | -| dereference.rs:34:9:34:15 | &... | | file://:0:0:0:0 | & | -| dereference.rs:34:9:34:15 | &... | &T | dereference.rs:32:6:32:6 | T | -| dereference.rs:34:10:34:13 | self | | file://:0:0:0:0 | & | -| dereference.rs:34:10:34:13 | self | &T | dereference.rs:30:1:30:15 | S | -| dereference.rs:34:10:34:13 | self | &T.T | dereference.rs:32:6:32:6 | T | +| dereference.rs:33:12:33:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:33:12:33:16 | SelfParam | TRef | dereference.rs:30:1:30:15 | S | +| dereference.rs:33:12:33:16 | SelfParam | TRef.T | dereference.rs:32:6:32:6 | T | +| dereference.rs:33:25:35:5 | { ... } | | {EXTERNAL LOCATION} | & | +| dereference.rs:33:25:35:5 | { ... } | TRef | dereference.rs:32:6:32:6 | T | +| dereference.rs:34:9:34:15 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:34:9:34:15 | &... | TRef | dereference.rs:32:6:32:6 | T | +| dereference.rs:34:10:34:13 | self | | {EXTERNAL LOCATION} | & | +| dereference.rs:34:10:34:13 | self | TRef | dereference.rs:30:1:30:15 | S | +| dereference.rs:34:10:34:13 | self | TRef.T | dereference.rs:32:6:32:6 | T | | dereference.rs:34:10:34:15 | self.0 | | dereference.rs:32:6:32:6 | T | -| dereference.rs:38:39:50:1 | { ... } | | file://:0:0:0:0 | () | +| dereference.rs:38:39:50:1 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:40:9:40:10 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:40:14:40:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:40:36:40:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:41:9:41:11 | _b1 | | file://:0:0:0:0 | & | -| dereference.rs:41:9:41:11 | _b1 | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:41:9:41:11 | _b1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:41:9:41:11 | _b1 | TRef | {EXTERNAL LOCATION} | i64 | | dereference.rs:41:15:41:16 | a1 | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:41:15:41:24 | a1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:41:15:41:24 | a1.deref() | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:41:15:41:24 | a1.deref() | | {EXTERNAL LOCATION} | & | +| dereference.rs:41:15:41:24 | a1.deref() | TRef | {EXTERNAL LOCATION} | i64 | | dereference.rs:44:9:44:10 | a2 | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:44:14:44:42 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:44:36:44:40 | 34i64 | | {EXTERNAL LOCATION} | i64 | @@ -625,18 +5111,18 @@ inferType | dereference.rs:49:15:49:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | | dereference.rs:49:16:49:18 | * ... | | {EXTERNAL LOCATION} | i64 | | dereference.rs:49:17:49:18 | a3 | | dereference.rs:4:1:6:1 | MyIntPointer | -| dereference.rs:52:39:64:1 | { ... } | | file://:0:0:0:0 | () | +| dereference.rs:52:39:64:1 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:54:9:54:10 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:54:9:54:10 | c1 | T | {EXTERNAL LOCATION} | char | | dereference.rs:54:14:54:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:54:14:54:42 | MySmartPointer {...} | T | {EXTERNAL LOCATION} | char | | dereference.rs:54:38:54:40 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:55:9:55:11 | _d1 | | file://:0:0:0:0 | & | -| dereference.rs:55:9:55:11 | _d1 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:55:9:55:11 | _d1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:55:9:55:11 | _d1 | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:55:15:55:16 | c1 | | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:55:15:55:16 | c1 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:55:15:55:24 | c1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:55:15:55:24 | c1.deref() | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:55:15:55:24 | c1.deref() | | {EXTERNAL LOCATION} | & | +| dereference.rs:55:15:55:24 | c1.deref() | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:58:9:58:10 | c2 | | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:58:9:58:10 | c2 | T | {EXTERNAL LOCATION} | char | | dereference.rs:58:14:58:42 | MySmartPointer {...} | | dereference.rs:17:1:19:1 | MySmartPointer | @@ -657,39 +5143,39 @@ inferType | dereference.rs:63:16:63:18 | * ... | | {EXTERNAL LOCATION} | i64 | | dereference.rs:63:17:63:18 | c3 | | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:63:17:63:18 | c3 | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:66:31:78:1 | { ... } | | file://:0:0:0:0 | () | -| dereference.rs:68:9:68:10 | e1 | | file://:0:0:0:0 | & | -| dereference.rs:68:9:68:10 | e1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:68:14:68:17 | &'a' | | file://:0:0:0:0 | & | -| dereference.rs:68:14:68:17 | &'a' | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:66:31:78:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:68:9:68:10 | e1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:68:9:68:10 | e1 | TRef | {EXTERNAL LOCATION} | char | +| dereference.rs:68:14:68:17 | &'a' | | {EXTERNAL LOCATION} | & | +| dereference.rs:68:14:68:17 | &'a' | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:68:15:68:17 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:69:9:69:11 | _f1 | | file://:0:0:0:0 | & | -| dereference.rs:69:9:69:11 | _f1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:69:15:69:16 | e1 | | file://:0:0:0:0 | & | -| dereference.rs:69:15:69:16 | e1 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:69:15:69:24 | e1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:69:15:69:24 | e1.deref() | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:72:9:72:10 | e2 | | file://:0:0:0:0 | & | -| dereference.rs:72:9:72:10 | e2 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:72:14:72:17 | &'a' | | file://:0:0:0:0 | & | -| dereference.rs:72:14:72:17 | &'a' | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:69:9:69:11 | _f1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:69:9:69:11 | _f1 | TRef | {EXTERNAL LOCATION} | char | +| dereference.rs:69:15:69:16 | e1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:69:15:69:16 | e1 | TRef | {EXTERNAL LOCATION} | char | +| dereference.rs:69:15:69:24 | e1.deref() | | {EXTERNAL LOCATION} | & | +| dereference.rs:69:15:69:24 | e1.deref() | TRef | {EXTERNAL LOCATION} | char | +| dereference.rs:72:9:72:10 | e2 | | {EXTERNAL LOCATION} | & | +| dereference.rs:72:9:72:10 | e2 | TRef | {EXTERNAL LOCATION} | char | +| dereference.rs:72:14:72:17 | &'a' | | {EXTERNAL LOCATION} | & | +| dereference.rs:72:14:72:17 | &'a' | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:72:15:72:17 | 'a' | | {EXTERNAL LOCATION} | char | | dereference.rs:73:9:73:11 | _f2 | | {EXTERNAL LOCATION} | char | | dereference.rs:73:15:73:17 | * ... | | {EXTERNAL LOCATION} | char | -| dereference.rs:73:16:73:17 | e2 | | file://:0:0:0:0 | & | -| dereference.rs:73:16:73:17 | e2 | &T | {EXTERNAL LOCATION} | char | -| dereference.rs:76:9:76:10 | e3 | | file://:0:0:0:0 | & | -| dereference.rs:76:9:76:10 | e3 | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:76:14:76:19 | &34i64 | | file://:0:0:0:0 | & | -| dereference.rs:76:14:76:19 | &34i64 | &T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:73:16:73:17 | e2 | | {EXTERNAL LOCATION} | & | +| dereference.rs:73:16:73:17 | e2 | TRef | {EXTERNAL LOCATION} | char | +| dereference.rs:76:9:76:10 | e3 | | {EXTERNAL LOCATION} | & | +| dereference.rs:76:9:76:10 | e3 | TRef | {EXTERNAL LOCATION} | i64 | +| dereference.rs:76:14:76:19 | &34i64 | | {EXTERNAL LOCATION} | & | +| dereference.rs:76:14:76:19 | &34i64 | TRef | {EXTERNAL LOCATION} | i64 | | dereference.rs:76:15:76:19 | 34i64 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:77:9:77:11 | _f3 | | {EXTERNAL LOCATION} | bool | | dereference.rs:77:15:77:19 | (...) | | {EXTERNAL LOCATION} | i64 | | dereference.rs:77:15:77:33 | ... .is_positive() | | {EXTERNAL LOCATION} | bool | | dereference.rs:77:16:77:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:77:17:77:18 | e3 | | file://:0:0:0:0 | & | -| dereference.rs:77:17:77:18 | e3 | &T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:80:31:92:1 | { ... } | | file://:0:0:0:0 | () | +| dereference.rs:77:17:77:18 | e3 | | {EXTERNAL LOCATION} | & | +| dereference.rs:77:17:77:18 | e3 | TRef | {EXTERNAL LOCATION} | i64 | +| dereference.rs:80:31:92:1 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:82:9:82:10 | g1 | | {EXTERNAL LOCATION} | Box | | dereference.rs:82:9:82:10 | g1 | A | {EXTERNAL LOCATION} | Global | | dereference.rs:82:9:82:10 | g1 | T | {EXTERNAL LOCATION} | char | @@ -697,13 +5183,13 @@ inferType | dereference.rs:82:25:82:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dereference.rs:82:25:82:37 | ...::new(...) | T | {EXTERNAL LOCATION} | char | | dereference.rs:82:34:82:36 | 'a' | | {EXTERNAL LOCATION} | char | -| dereference.rs:83:9:83:11 | _h1 | | file://:0:0:0:0 | & | -| dereference.rs:83:9:83:11 | _h1 | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:83:9:83:11 | _h1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:83:9:83:11 | _h1 | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:83:15:83:16 | g1 | | {EXTERNAL LOCATION} | Box | | dereference.rs:83:15:83:16 | g1 | A | {EXTERNAL LOCATION} | Global | | dereference.rs:83:15:83:16 | g1 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:83:15:83:24 | g1.deref() | | file://:0:0:0:0 | & | -| dereference.rs:83:15:83:24 | g1.deref() | &T | {EXTERNAL LOCATION} | char | +| dereference.rs:83:15:83:24 | g1.deref() | | {EXTERNAL LOCATION} | & | +| dereference.rs:83:15:83:24 | g1.deref() | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:86:9:86:10 | g2 | | {EXTERNAL LOCATION} | Box | | dereference.rs:86:9:86:10 | g2 | A | {EXTERNAL LOCATION} | Global | | dereference.rs:86:9:86:10 | g2 | T | {EXTERNAL LOCATION} | char | @@ -730,7 +5216,7 @@ inferType | dereference.rs:91:17:91:18 | g3 | | {EXTERNAL LOCATION} | Box | | dereference.rs:91:17:91:18 | g3 | A | {EXTERNAL LOCATION} | Global | | dereference.rs:91:17:91:18 | g3 | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:94:27:105:1 | { ... } | | file://:0:0:0:0 | () | +| dereference.rs:94:27:105:1 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:96:9:96:9 | x | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:96:13:96:41 | MyIntPointer {...} | | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:96:35:96:39 | 34i64 | | {EXTERNAL LOCATION} | i64 | @@ -754,233 +5240,217 @@ inferType | dereference.rs:104:14:104:14 | z | | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:104:14:104:14 | z | T | dereference.rs:30:1:30:15 | S | | dereference.rs:104:14:104:14 | z | T.T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:131:19:139:5 | { ... } | | file://:0:0:0:0 | () | +| dereference.rs:131:19:139:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:132:17:132:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:132:17:132:26 | key_to_key | K | file://:0:0:0:0 | & | -| dereference.rs:132:17:132:26 | key_to_key | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:17:132:26 | key_to_key | K | {EXTERNAL LOCATION} | & | +| dereference.rs:132:17:132:26 | key_to_key | K.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:132:17:132:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:132:17:132:26 | key_to_key | V | file://:0:0:0:0 | & | -| dereference.rs:132:17:132:26 | key_to_key | V.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:17:132:26 | key_to_key | V | {EXTERNAL LOCATION} | & | +| dereference.rs:132:17:132:26 | key_to_key | V.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:132:30:132:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:132:30:132:57 | ...::new(...) | K | file://:0:0:0:0 | & | -| dereference.rs:132:30:132:57 | ...::new(...) | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:30:132:57 | ...::new(...) | K | {EXTERNAL LOCATION} | & | +| dereference.rs:132:30:132:57 | ...::new(...) | K.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:132:30:132:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:132:30:132:57 | ...::new(...) | V | file://:0:0:0:0 | & | -| dereference.rs:132:30:132:57 | ...::new(...) | V.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:133:17:133:19 | key | | file://:0:0:0:0 | & | -| dereference.rs:133:17:133:19 | key | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:133:17:133:19 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:133:17:133:19 | key | &T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:133:23:133:29 | &... | | file://:0:0:0:0 | & | -| dereference.rs:133:23:133:29 | &... | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:133:23:133:29 | &... | &T | file://:0:0:0:0 | & | -| dereference.rs:133:23:133:29 | &... | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:132:30:132:57 | ...::new(...) | V | {EXTERNAL LOCATION} | & | +| dereference.rs:132:30:132:57 | ...::new(...) | V.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:17:133:19 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:133:17:133:19 | key | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:17:133:19 | key | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:133:17:133:19 | key | TRef.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:23:133:29 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:133:23:133:29 | &... | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:133:23:133:29 | &... | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:133:23:133:29 | &... | TRef.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:133:24:133:29 | Key {...} | | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:9:137:9 | if ... {...} | | file://:0:0:0:0 | () | +| dereference.rs:134:9:137:9 | if ... {...} | | {EXTERNAL LOCATION} | () | | dereference.rs:134:16:134:28 | Some(...) | | {EXTERNAL LOCATION} | Option | -| dereference.rs:134:16:134:28 | Some(...) | T | file://:0:0:0:0 | & | -| dereference.rs:134:16:134:28 | Some(...) | T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:16:134:28 | Some(...) | T.&T | file://:0:0:0:0 | & | -| dereference.rs:134:16:134:28 | Some(...) | T.&T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:21:134:27 | ref_key | | file://:0:0:0:0 | & | -| dereference.rs:134:21:134:27 | ref_key | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:21:134:27 | ref_key | &T | file://:0:0:0:0 | & | -| dereference.rs:134:21:134:27 | ref_key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:16:134:28 | Some(...) | T | {EXTERNAL LOCATION} | & | +| dereference.rs:134:16:134:28 | Some(...) | T.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:16:134:28 | Some(...) | T.TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:134:16:134:28 | Some(...) | T.TRef.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:21:134:27 | ref_key | | {EXTERNAL LOCATION} | & | +| dereference.rs:134:21:134:27 | ref_key | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:21:134:27 | ref_key | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:134:21:134:27 | ref_key | TRef.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:134:32:134:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:134:32:134:41 | key_to_key | K | file://:0:0:0:0 | & | -| dereference.rs:134:32:134:41 | key_to_key | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:41 | key_to_key | K | {EXTERNAL LOCATION} | & | +| dereference.rs:134:32:134:41 | key_to_key | K.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:134:32:134:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:134:32:134:41 | key_to_key | V | file://:0:0:0:0 | & | -| dereference.rs:134:32:134:41 | key_to_key | V.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:41 | key_to_key | V | {EXTERNAL LOCATION} | & | +| dereference.rs:134:32:134:41 | key_to_key | V.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:134:32:134:50 | key_to_key.get(...) | | {EXTERNAL LOCATION} | Option | -| dereference.rs:134:32:134:50 | key_to_key.get(...) | T | file://:0:0:0:0 | & | -| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.&T | file://:0:0:0:0 | & | -| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.&T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:47:134:49 | key | | file://:0:0:0:0 | & | -| dereference.rs:134:47:134:49 | key | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:47:134:49 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:134:47:134:49 | key | &T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:134:52:137:9 | { ... } | | file://:0:0:0:0 | () | -| dereference.rs:136:13:136:15 | key | | file://:0:0:0:0 | & | -| dereference.rs:136:13:136:15 | key | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:136:13:136:15 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:136:13:136:15 | key | &T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:136:13:136:25 | ... = ... | | file://:0:0:0:0 | () | -| dereference.rs:136:19:136:25 | ref_key | | file://:0:0:0:0 | & | -| dereference.rs:136:19:136:25 | ref_key | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:136:19:136:25 | ref_key | &T | file://:0:0:0:0 | & | -| dereference.rs:136:19:136:25 | ref_key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T | {EXTERNAL LOCATION} | & | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:134:32:134:50 | key_to_key.get(...) | T.TRef.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:47:134:49 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:134:47:134:49 | key | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:47:134:49 | key | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:134:47:134:49 | key | TRef.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:134:52:137:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:136:13:136:15 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:136:13:136:15 | key | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:136:13:136:15 | key | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:136:13:136:15 | key | TRef.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:136:13:136:25 | ... = ... | | {EXTERNAL LOCATION} | () | +| dereference.rs:136:19:136:25 | ref_key | | {EXTERNAL LOCATION} | & | +| dereference.rs:136:19:136:25 | ref_key | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:136:19:136:25 | ref_key | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:136:19:136:25 | ref_key | TRef.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:138:9:138:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:138:9:138:18 | key_to_key | K | file://:0:0:0:0 | & | -| dereference.rs:138:9:138:18 | key_to_key | K.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:18 | key_to_key | K | {EXTERNAL LOCATION} | & | +| dereference.rs:138:9:138:18 | key_to_key | K.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:138:9:138:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:138:9:138:18 | key_to_key | V | file://:0:0:0:0 | & | -| dereference.rs:138:9:138:18 | key_to_key | V.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:18 | key_to_key | V | {EXTERNAL LOCATION} | & | +| dereference.rs:138:9:138:18 | key_to_key | V.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:138:9:138:35 | key_to_key.insert(...) | | {EXTERNAL LOCATION} | Option | -| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T | file://:0:0:0:0 | & | -| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.&T | file://:0:0:0:0 | & | -| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.&T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:138:27:138:29 | key | | file://:0:0:0:0 | & | -| dereference.rs:138:27:138:29 | key | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:138:27:138:29 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:138:27:138:29 | key | &T.&T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:138:32:138:34 | key | | file://:0:0:0:0 | & | -| dereference.rs:138:32:138:34 | key | &T | dereference.rs:110:5:111:21 | Key | -| dereference.rs:138:32:138:34 | key | &T | file://:0:0:0:0 | & | -| dereference.rs:138:32:138:34 | key | &T.&T | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T | {EXTERNAL LOCATION} | & | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:138:9:138:35 | key_to_key.insert(...) | T.TRef.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:27:138:29 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:138:27:138:29 | key | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:27:138:29 | key | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:138:27:138:29 | key | TRef.TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:32:138:34 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:138:32:138:34 | key | TRef | dereference.rs:110:5:111:21 | Key | +| dereference.rs:138:32:138:34 | key | TRef | {EXTERNAL LOCATION} | & | +| dereference.rs:138:32:138:34 | key | TRef.TRef | dereference.rs:110:5:111:21 | Key | | dereference.rs:144:16:144:19 | SelfParam | | dereference.rs:143:5:145:5 | Self [trait MyTrait1] | -| dereference.rs:151:16:151:19 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:151:16:151:19 | SelfParam | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:151:16:151:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:151:16:151:19 | SelfParam | TRef | dereference.rs:147:5:147:13 | S | | dereference.rs:151:27:153:9 | { ... } | | dereference.rs:147:5:147:13 | S | | dereference.rs:152:13:152:13 | S | | dereference.rs:147:5:147:13 | S | -| dereference.rs:158:16:158:19 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:158:16:158:19 | SelfParam | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:158:16:158:19 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:158:16:158:19 | SelfParam | TRefMut | dereference.rs:147:5:147:13 | S | | dereference.rs:158:29:160:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | dereference.rs:159:13:159:14 | 42 | | {EXTERNAL LOCATION} | i32 | | dereference.rs:159:13:159:14 | 42 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:164:16:164:19 | SelfParam | | dereference.rs:163:5:165:5 | Self [trait MyTrait2] | | dereference.rs:164:22:164:24 | arg | | dereference.rs:163:20:163:21 | T1 | | dereference.rs:169:16:169:19 | SelfParam | | dereference.rs:147:5:147:13 | S | -| dereference.rs:169:22:169:24 | arg | | file://:0:0:0:0 | & | -| dereference.rs:169:22:169:24 | arg | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:169:22:169:24 | arg | | {EXTERNAL LOCATION} | & | +| dereference.rs:169:22:169:24 | arg | TRef | dereference.rs:147:5:147:13 | S | | dereference.rs:169:36:171:9 | { ... } | | dereference.rs:147:5:147:13 | S | | dereference.rs:170:13:170:13 | S | | dereference.rs:147:5:147:13 | S | | dereference.rs:176:16:176:19 | SelfParam | | dereference.rs:147:5:147:13 | S | -| dereference.rs:176:22:176:24 | arg | | file://:0:0:0:0 | & | -| dereference.rs:176:22:176:24 | arg | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:176:22:176:24 | arg | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:176:22:176:24 | arg | TRefMut | dereference.rs:147:5:147:13 | S | | dereference.rs:176:42:178:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | dereference.rs:177:13:177:14 | 42 | | {EXTERNAL LOCATION} | i32 | | dereference.rs:177:13:177:14 | 42 | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:181:19:188:5 | { ... } | | file://:0:0:0:0 | () | +| dereference.rs:181:19:188:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:182:13:182:13 | x | | dereference.rs:147:5:147:13 | S | -| dereference.rs:182:13:182:13 | x | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:182:17:182:20 | (...) | | file://:0:0:0:0 | & | -| dereference.rs:182:17:182:20 | (...) | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:182:17:182:20 | (...) | | {EXTERNAL LOCATION} | & | +| dereference.rs:182:17:182:20 | (...) | TRef | dereference.rs:147:5:147:13 | S | | dereference.rs:182:17:182:26 | ... .foo() | | dereference.rs:147:5:147:13 | S | -| dereference.rs:182:17:182:26 | ... .foo() | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:182:18:182:19 | &S | | file://:0:0:0:0 | & | -| dereference.rs:182:18:182:19 | &S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:182:18:182:19 | &S | | {EXTERNAL LOCATION} | & | +| dereference.rs:182:18:182:19 | &S | TRef | dereference.rs:147:5:147:13 | S | | dereference.rs:182:19:182:19 | S | | dereference.rs:147:5:147:13 | S | | dereference.rs:183:13:183:13 | y | | dereference.rs:147:5:147:13 | S | -| dereference.rs:183:13:183:13 | y | | {EXTERNAL LOCATION} | i64 | | dereference.rs:183:17:183:17 | S | | dereference.rs:147:5:147:13 | S | | dereference.rs:183:17:183:23 | S.foo() | | dereference.rs:147:5:147:13 | S | -| dereference.rs:183:17:183:23 | S.foo() | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:184:13:184:13 | z | | dereference.rs:147:5:147:13 | S | | dereference.rs:184:13:184:13 | z | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:184:17:184:24 | (...) | | file://:0:0:0:0 | & | -| dereference.rs:184:17:184:24 | (...) | &T | dereference.rs:147:5:147:13 | S | -| dereference.rs:184:17:184:30 | ... .foo() | | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:17:184:24 | (...) | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:184:17:184:24 | (...) | TRefMut | dereference.rs:147:5:147:13 | S | | dereference.rs:184:17:184:30 | ... .foo() | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:184:18:184:23 | &mut S | | file://:0:0:0:0 | & | -| dereference.rs:184:18:184:23 | &mut S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:184:18:184:23 | &mut S | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:184:18:184:23 | &mut S | TRefMut | dereference.rs:147:5:147:13 | S | | dereference.rs:184:23:184:23 | S | | dereference.rs:147:5:147:13 | S | | dereference.rs:186:13:186:13 | x | | dereference.rs:147:5:147:13 | S | -| dereference.rs:186:13:186:13 | x | | {EXTERNAL LOCATION} | i64 | | dereference.rs:186:17:186:17 | S | | dereference.rs:147:5:147:13 | S | | dereference.rs:186:17:186:25 | S.bar(...) | | dereference.rs:147:5:147:13 | S | -| dereference.rs:186:17:186:25 | S.bar(...) | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:186:23:186:24 | &S | | file://:0:0:0:0 | & | -| dereference.rs:186:23:186:24 | &S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:186:23:186:24 | &S | | {EXTERNAL LOCATION} | & | +| dereference.rs:186:23:186:24 | &S | TRef | dereference.rs:147:5:147:13 | S | | dereference.rs:186:24:186:24 | S | | dereference.rs:147:5:147:13 | S | -| dereference.rs:187:13:187:13 | y | | dereference.rs:147:5:147:13 | S | | dereference.rs:187:13:187:13 | y | | {EXTERNAL LOCATION} | i64 | | dereference.rs:187:17:187:17 | S | | dereference.rs:147:5:147:13 | S | -| dereference.rs:187:17:187:29 | S.bar(...) | | dereference.rs:147:5:147:13 | S | | dereference.rs:187:17:187:29 | S.bar(...) | | {EXTERNAL LOCATION} | i64 | -| dereference.rs:187:23:187:28 | &mut S | | file://:0:0:0:0 | & | -| dereference.rs:187:23:187:28 | &mut S | &T | dereference.rs:147:5:147:13 | S | +| dereference.rs:187:23:187:28 | &mut S | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:187:23:187:28 | &mut S | TRefMut | dereference.rs:147:5:147:13 | S | | dereference.rs:187:28:187:28 | S | | dereference.rs:147:5:147:13 | S | -| dereference.rs:196:16:196:20 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:196:16:196:20 | SelfParam | &T | dereference.rs:195:5:197:5 | Self [trait Bar] | -| dereference.rs:201:16:201:24 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:201:16:201:24 | SelfParam | &T | dereference.rs:193:5:193:17 | Foo | -| dereference.rs:201:27:203:9 | { ... } | | file://:0:0:0:0 | () | -| dereference.rs:202:13:202:39 | MacroExpr | | file://:0:0:0:0 | () | -| dereference.rs:202:22:202:38 | "In struct impl!\\n" | | file://:0:0:0:0 | & | -| dereference.rs:202:22:202:38 | "In struct impl!\\n" | &T | {EXTERNAL LOCATION} | str | -| dereference.rs:202:22:202:38 | ...::_print(...) | | file://:0:0:0:0 | () | -| dereference.rs:202:22:202:38 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| dereference.rs:202:22:202:38 | MacroBlockExpr | | file://:0:0:0:0 | () | -| dereference.rs:202:22:202:38 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| dereference.rs:202:22:202:38 | { ... } | | file://:0:0:0:0 | () | -| dereference.rs:208:16:208:20 | SelfParam | | file://:0:0:0:0 | & | -| dereference.rs:208:16:208:20 | SelfParam | &T | dereference.rs:193:5:193:17 | Foo | -| dereference.rs:208:23:210:9 | { ... } | | file://:0:0:0:0 | () | -| dereference.rs:209:13:209:38 | MacroExpr | | file://:0:0:0:0 | () | -| dereference.rs:209:22:209:37 | "In trait impl!\\n" | | file://:0:0:0:0 | & | -| dereference.rs:209:22:209:37 | "In trait impl!\\n" | &T | {EXTERNAL LOCATION} | str | -| dereference.rs:209:22:209:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| dereference.rs:209:22:209:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| dereference.rs:209:22:209:37 | MacroBlockExpr | | file://:0:0:0:0 | () | -| dereference.rs:209:22:209:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| dereference.rs:209:22:209:37 | { ... } | | file://:0:0:0:0 | () | -| dereference.rs:213:19:216:5 | { ... } | | file://:0:0:0:0 | () | +| dereference.rs:196:16:196:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:196:16:196:20 | SelfParam | TRef | dereference.rs:195:5:197:5 | Self [trait Bar] | +| dereference.rs:201:16:201:24 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| dereference.rs:201:16:201:24 | SelfParam | TRefMut | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:201:27:203:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:202:13:202:39 | MacroExpr | | {EXTERNAL LOCATION} | () | +| dereference.rs:202:22:202:38 | "In struct impl!\\n" | | {EXTERNAL LOCATION} | & | +| dereference.rs:202:22:202:38 | "In struct impl!\\n" | TRef | {EXTERNAL LOCATION} | str | +| dereference.rs:202:22:202:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:202:22:202:38 | MacroBlockExpr | | {EXTERNAL LOCATION} | () | +| dereference.rs:202:22:202:38 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:208:16:208:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| dereference.rs:208:16:208:20 | SelfParam | TRef | dereference.rs:193:5:193:17 | Foo | +| dereference.rs:208:23:210:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:209:13:209:38 | MacroExpr | | {EXTERNAL LOCATION} | () | +| dereference.rs:209:22:209:37 | "In trait impl!\\n" | | {EXTERNAL LOCATION} | & | +| dereference.rs:209:22:209:37 | "In trait impl!\\n" | TRef | {EXTERNAL LOCATION} | str | +| dereference.rs:209:22:209:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:209:22:209:37 | MacroBlockExpr | | {EXTERNAL LOCATION} | () | +| dereference.rs:209:22:209:37 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:213:19:216:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:214:17:214:17 | f | | dereference.rs:193:5:193:17 | Foo | | dereference.rs:214:21:214:26 | Foo {...} | | dereference.rs:193:5:193:17 | Foo | | dereference.rs:215:9:215:9 | f | | dereference.rs:193:5:193:17 | Foo | -| dereference.rs:215:9:215:15 | f.bar() | | file://:0:0:0:0 | () | -| dereference.rs:219:15:228:1 | { ... } | | file://:0:0:0:0 | () | -| dereference.rs:220:5:220:38 | explicit_monomorphic_dereference(...) | | file://:0:0:0:0 | () | -| dereference.rs:221:5:221:38 | explicit_polymorphic_dereference(...) | | file://:0:0:0:0 | () | -| dereference.rs:222:5:222:30 | explicit_ref_dereference(...) | | file://:0:0:0:0 | () | -| dereference.rs:223:5:223:30 | explicit_box_dereference(...) | | file://:0:0:0:0 | () | -| dereference.rs:224:5:224:26 | implicit_dereference(...) | | file://:0:0:0:0 | () | -| dereference.rs:225:5:225:41 | ...::test(...) | | file://:0:0:0:0 | () | -| dereference.rs:226:5:226:26 | ...::test(...) | | file://:0:0:0:0 | () | -| dereference.rs:227:5:227:34 | ...::main(...) | | file://:0:0:0:0 | () | -| dyn_type.rs:7:10:7:14 | SelfParam | | file://:0:0:0:0 | & | -| dyn_type.rs:7:10:7:14 | SelfParam | &T | dyn_type.rs:5:1:8:1 | Self [trait MyTrait1] | -| dyn_type.rs:12:12:12:16 | SelfParam | | file://:0:0:0:0 | & | -| dyn_type.rs:12:12:12:16 | SelfParam | &T | dyn_type.rs:10:1:13:1 | Self [trait GenericGet] | -| dyn_type.rs:18:12:18:16 | SelfParam | | file://:0:0:0:0 | & | -| dyn_type.rs:18:12:18:16 | SelfParam | &T | dyn_type.rs:15:1:19:1 | Self [trait AssocTrait] | -| dyn_type.rs:28:10:28:14 | SelfParam | | file://:0:0:0:0 | & | -| dyn_type.rs:28:10:28:14 | SelfParam | &T | dyn_type.rs:21:1:24:1 | MyStruct | +| dereference.rs:215:9:215:15 | f.bar() | | {EXTERNAL LOCATION} | () | +| dereference.rs:219:15:228:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:220:5:220:38 | explicit_monomorphic_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:221:5:221:38 | explicit_polymorphic_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:222:5:222:30 | explicit_ref_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:223:5:223:30 | explicit_box_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:224:5:224:26 | implicit_dereference(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:225:5:225:41 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:226:5:226:26 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:227:5:227:34 | ...::main(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:7:10:7:14 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:7:10:7:14 | SelfParam | TRef | dyn_type.rs:5:1:8:1 | Self [trait MyTrait1] | +| dyn_type.rs:12:12:12:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:12:12:12:16 | SelfParam | TRef | dyn_type.rs:10:1:13:1 | Self [trait GenericGet] | +| dyn_type.rs:18:12:18:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:18:12:18:16 | SelfParam | TRef | dyn_type.rs:15:1:19:1 | Self [trait AssocTrait] | +| dyn_type.rs:28:10:28:14 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:28:10:28:14 | SelfParam | TRef | dyn_type.rs:21:1:24:1 | MyStruct | | dyn_type.rs:28:27:30:5 | { ... } | | {EXTERNAL LOCATION} | String | | dyn_type.rs:29:9:29:43 | MacroExpr | | {EXTERNAL LOCATION} | String | -| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | | file://:0:0:0:0 | & | -| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | &T | {EXTERNAL LOCATION} | str | +| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | TRef | {EXTERNAL LOCATION} | str | | dyn_type.rs:29:17:29:42 | ...::format(...) | | {EXTERNAL LOCATION} | String | | dyn_type.rs:29:17:29:42 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | -| dyn_type.rs:29:17:29:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | dyn_type.rs:29:17:29:42 | MacroBlockExpr | | {EXTERNAL LOCATION} | String | -| dyn_type.rs:29:17:29:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | dyn_type.rs:29:17:29:42 | { ... } | | {EXTERNAL LOCATION} | String | -| dyn_type.rs:29:33:29:36 | self | | file://:0:0:0:0 | & | -| dyn_type.rs:29:33:29:36 | self | &T | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:29:33:29:36 | self | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:29:33:29:36 | self | TRef | dyn_type.rs:21:1:24:1 | MyStruct | | dyn_type.rs:29:33:29:42 | self.value | | {EXTERNAL LOCATION} | i32 | -| dyn_type.rs:40:12:40:16 | SelfParam | | file://:0:0:0:0 | & | -| dyn_type.rs:40:12:40:16 | SelfParam | &T | dyn_type.rs:33:1:36:1 | GenStruct | -| dyn_type.rs:40:12:40:16 | SelfParam | &T.A | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:40:12:40:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:40:12:40:16 | SelfParam | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:40:12:40:16 | SelfParam | TRef.A | dyn_type.rs:38:6:38:21 | A | | dyn_type.rs:40:24:42:5 | { ... } | | dyn_type.rs:38:6:38:21 | A | -| dyn_type.rs:41:9:41:12 | self | | file://:0:0:0:0 | & | -| dyn_type.rs:41:9:41:12 | self | &T | dyn_type.rs:33:1:36:1 | GenStruct | -| dyn_type.rs:41:9:41:12 | self | &T.A | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:41:9:41:12 | self | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:41:9:41:12 | self | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:41:9:41:12 | self | TRef.A | dyn_type.rs:38:6:38:21 | A | | dyn_type.rs:41:9:41:18 | self.value | | dyn_type.rs:38:6:38:21 | A | | dyn_type.rs:41:9:41:26 | ... .clone() | | dyn_type.rs:38:6:38:21 | A | -| dyn_type.rs:51:12:51:16 | SelfParam | | file://:0:0:0:0 | & | -| dyn_type.rs:51:12:51:16 | SelfParam | &T | dyn_type.rs:33:1:36:1 | GenStruct | -| dyn_type.rs:51:12:51:16 | SelfParam | &T.A | dyn_type.rs:45:6:45:8 | GGP | -| dyn_type.rs:51:34:53:5 | { ... } | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:51:34:53:5 | { ... } | 0(2) | dyn_type.rs:45:6:45:8 | GGP | -| dyn_type.rs:51:34:53:5 | { ... } | 1(2) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:52:9:52:34 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:52:9:52:34 | TupleExpr | 0(2) | dyn_type.rs:45:6:45:8 | GGP | -| dyn_type.rs:52:9:52:34 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:52:10:52:13 | self | | file://:0:0:0:0 | & | -| dyn_type.rs:52:10:52:13 | self | &T | dyn_type.rs:33:1:36:1 | GenStruct | -| dyn_type.rs:52:10:52:13 | self | &T.A | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:51:12:51:16 | SelfParam | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:51:12:51:16 | SelfParam | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:51:12:51:16 | SelfParam | TRef.A | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:51:34:53:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:51:34:53:5 | { ... } | T0 | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:51:34:53:5 | { ... } | T1 | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:52:9:52:34 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:52:9:52:34 | TupleExpr | T0 | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:52:9:52:34 | TupleExpr | T1 | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:52:10:52:13 | self | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:52:10:52:13 | self | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:52:10:52:13 | self | TRef.A | dyn_type.rs:45:6:45:8 | GGP | | dyn_type.rs:52:10:52:19 | self.value | | dyn_type.rs:45:6:45:8 | GGP | | dyn_type.rs:52:10:52:27 | ... .clone() | | dyn_type.rs:45:6:45:8 | GGP | | dyn_type.rs:52:30:52:33 | true | | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:56:40:56:40 | a | | file://:0:0:0:0 | & | -| dyn_type.rs:56:40:56:40 | a | &T | dyn_type.rs:56:13:56:37 | G | +| dyn_type.rs:56:40:56:40 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:56:40:56:40 | a | TRef | dyn_type.rs:56:13:56:37 | G | | dyn_type.rs:56:52:58:1 | { ... } | | dyn_type.rs:56:10:56:10 | A | -| dyn_type.rs:57:5:57:5 | a | | file://:0:0:0:0 | & | -| dyn_type.rs:57:5:57:5 | a | &T | dyn_type.rs:56:13:56:37 | G | +| dyn_type.rs:57:5:57:5 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:57:5:57:5 | a | TRef | dyn_type.rs:56:13:56:37 | G | | dyn_type.rs:57:5:57:11 | a.get() | | dyn_type.rs:56:10:56:10 | A | | dyn_type.rs:60:46:60:46 | a | | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:60:78:62:1 | { ... } | | {EXTERNAL LOCATION} | Box | @@ -996,34 +5466,34 @@ inferType | dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:61:14:61:35 | GenStruct {...} | A | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:61:33:61:33 | a | | dyn_type.rs:60:18:60:43 | A | -| dyn_type.rs:64:25:64:27 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:64:25:64:27 | obj | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | -| dyn_type.rs:64:45:66:1 | { ... } | | file://:0:0:0:0 | () | +| dyn_type.rs:64:25:64:27 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:64:25:64:27 | obj | TRef | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:64:45:66:1 | { ... } | | {EXTERNAL LOCATION} | () | | dyn_type.rs:65:9:65:15 | _result | | {EXTERNAL LOCATION} | String | | dyn_type.rs:65:19:65:24 | (...) | | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | | dyn_type.rs:65:19:65:28 | ... .m() | | {EXTERNAL LOCATION} | String | | dyn_type.rs:65:20:65:23 | * ... | | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | -| dyn_type.rs:65:21:65:23 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:65:21:65:23 | obj | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | -| dyn_type.rs:68:27:68:29 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:68:27:68:29 | obj | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | -| dyn_type.rs:68:27:68:29 | obj | &T.dyn(A) | {EXTERNAL LOCATION} | String | -| dyn_type.rs:68:57:71:1 | { ... } | | file://:0:0:0:0 | () | +| dyn_type.rs:65:21:65:23 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:65:21:65:23 | obj | TRef | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:68:27:68:29 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:68:27:68:29 | obj | TRef | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:68:27:68:29 | obj | TRef.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:68:57:71:1 | { ... } | | {EXTERNAL LOCATION} | () | | dyn_type.rs:69:9:69:16 | _result1 | | {EXTERNAL LOCATION} | String | | dyn_type.rs:69:20:69:25 | (...) | | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:69:20:69:25 | (...) | dyn(A) | {EXTERNAL LOCATION} | String | | dyn_type.rs:69:20:69:31 | ... .get() | | {EXTERNAL LOCATION} | String | | dyn_type.rs:69:21:69:24 | * ... | | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:69:21:69:24 | * ... | dyn(A) | {EXTERNAL LOCATION} | String | -| dyn_type.rs:69:22:69:24 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:69:22:69:24 | obj | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | -| dyn_type.rs:69:22:69:24 | obj | &T.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:69:22:69:24 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:69:22:69:24 | obj | TRef | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:69:22:69:24 | obj | TRef.dyn(A) | {EXTERNAL LOCATION} | String | | dyn_type.rs:70:9:70:16 | _result2 | | {EXTERNAL LOCATION} | String | | dyn_type.rs:70:20:70:29 | get_a(...) | | {EXTERNAL LOCATION} | String | -| dyn_type.rs:70:26:70:28 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:70:26:70:28 | obj | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | -| dyn_type.rs:70:26:70:28 | obj | &T.dyn(A) | {EXTERNAL LOCATION} | String | -| dyn_type.rs:73:26:76:1 | { ... } | | file://:0:0:0:0 | () | +| dyn_type.rs:70:26:70:28 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:70:26:70:28 | obj | TRef | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:70:26:70:28 | obj | TRef.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:73:26:76:1 | { ... } | | {EXTERNAL LOCATION} | () | | dyn_type.rs:74:9:74:11 | obj | | {EXTERNAL LOCATION} | Box | | dyn_type.rs:74:9:74:11 | obj | A | {EXTERNAL LOCATION} | Global | | dyn_type.rs:74:9:74:11 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | @@ -1043,112 +5513,106 @@ inferType | dyn_type.rs:75:21:75:23 | obj | A | {EXTERNAL LOCATION} | Global | | dyn_type.rs:75:21:75:23 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:75:21:75:23 | obj | T.dyn(A) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:78:24:78:24 | a | | file://:0:0:0:0 | & | -| dyn_type.rs:78:24:78:24 | a | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | -| dyn_type.rs:78:24:78:24 | a | &T.dyn(AP) | dyn_type.rs:78:21:78:21 | B | -| dyn_type.rs:78:24:78:24 | a | &T.dyn(GP) | dyn_type.rs:78:18:78:18 | A | -| dyn_type.rs:78:65:80:1 | { ... } | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:78:65:80:1 | { ... } | 0(2) | dyn_type.rs:78:18:78:18 | A | -| dyn_type.rs:78:65:80:1 | { ... } | 1(2) | dyn_type.rs:78:21:78:21 | B | -| dyn_type.rs:79:5:79:5 | a | | file://:0:0:0:0 | & | -| dyn_type.rs:79:5:79:5 | a | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | -| dyn_type.rs:79:5:79:5 | a | &T.dyn(AP) | dyn_type.rs:78:21:78:21 | B | -| dyn_type.rs:79:5:79:5 | a | &T.dyn(GP) | dyn_type.rs:78:18:78:18 | A | -| dyn_type.rs:79:5:79:11 | a.get() | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:79:5:79:11 | a.get() | 0(2) | dyn_type.rs:78:18:78:18 | A | -| dyn_type.rs:79:5:79:11 | a.get() | 1(2) | dyn_type.rs:78:21:78:21 | B | -| dyn_type.rs:82:55:82:55 | a | | file://:0:0:0:0 | & | -| dyn_type.rs:82:55:82:55 | a | &T | dyn_type.rs:82:20:82:52 | T | -| dyn_type.rs:82:72:84:1 | { ... } | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:82:72:84:1 | { ... } | 0(2) | dyn_type.rs:82:14:82:14 | A | -| dyn_type.rs:82:72:84:1 | { ... } | 1(2) | dyn_type.rs:82:17:82:17 | B | -| dyn_type.rs:83:5:83:5 | a | | file://:0:0:0:0 | & | -| dyn_type.rs:83:5:83:5 | a | &T | dyn_type.rs:82:20:82:52 | T | -| dyn_type.rs:83:5:83:11 | a.get() | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:83:5:83:11 | a.get() | 0(2) | dyn_type.rs:82:14:82:14 | A | -| dyn_type.rs:83:5:83:11 | a.get() | 1(2) | dyn_type.rs:82:17:82:17 | B | -| dyn_type.rs:86:20:86:22 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:86:20:86:22 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | -| dyn_type.rs:86:20:86:22 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:86:20:86:22 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:86:58:99:1 | { ... } | | file://:0:0:0:0 | () | -| dyn_type.rs:87:9:90:5 | TuplePat | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:87:9:90:5 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:87:9:90:5 | TuplePat | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:78:24:78:24 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:78:24:78:24 | a | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:78:24:78:24 | a | TRef.dyn(AP) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:78:24:78:24 | a | TRef.dyn(GP) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:78:65:80:1 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:78:65:80:1 | { ... } | T0 | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:78:65:80:1 | { ... } | T1 | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:79:5:79:5 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:79:5:79:5 | a | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:79:5:79:5 | a | TRef.dyn(AP) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:79:5:79:5 | a | TRef.dyn(GP) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:79:5:79:11 | a.get() | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:79:5:79:11 | a.get() | T0 | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:79:5:79:11 | a.get() | T1 | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:82:55:82:55 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:82:55:82:55 | a | TRef | dyn_type.rs:82:20:82:52 | T | +| dyn_type.rs:82:72:84:1 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:82:72:84:1 | { ... } | T0 | dyn_type.rs:82:14:82:14 | A | +| dyn_type.rs:82:72:84:1 | { ... } | T1 | dyn_type.rs:82:17:82:17 | B | +| dyn_type.rs:83:5:83:5 | a | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:83:5:83:5 | a | TRef | dyn_type.rs:82:20:82:52 | T | +| dyn_type.rs:83:5:83:11 | a.get() | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:83:5:83:11 | a.get() | T0 | dyn_type.rs:82:14:82:14 | A | +| dyn_type.rs:83:5:83:11 | a.get() | T1 | dyn_type.rs:82:17:82:17 | B | +| dyn_type.rs:86:20:86:22 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:86:20:86:22 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:86:20:86:22 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:86:20:86:22 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:86:58:99:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:87:9:90:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:87:9:90:5 | TuplePat | T0 | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:87:9:90:5 | TuplePat | T1 | {EXTERNAL LOCATION} | bool | | dyn_type.rs:88:9:88:11 | _gp | | {EXTERNAL LOCATION} | i64 | | dyn_type.rs:89:9:89:11 | _ap | | {EXTERNAL LOCATION} | bool | | dyn_type.rs:90:9:90:14 | (...) | | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:90:9:90:14 | (...) | dyn(AP) | {EXTERNAL LOCATION} | bool | | dyn_type.rs:90:9:90:14 | (...) | dyn(GP) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:90:9:90:20 | ... .get() | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:90:9:90:20 | ... .get() | 0(2) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:90:9:90:20 | ... .get() | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:9:90:20 | ... .get() | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:90:9:90:20 | ... .get() | T0 | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:90:9:90:20 | ... .get() | T1 | {EXTERNAL LOCATION} | bool | | dyn_type.rs:90:10:90:13 | * ... | | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:90:10:90:13 | * ... | dyn(AP) | {EXTERNAL LOCATION} | bool | | dyn_type.rs:90:10:90:13 | * ... | dyn(GP) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:90:11:90:13 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:90:11:90:13 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | -| dyn_type.rs:90:11:90:13 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:90:11:90:13 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:91:9:94:5 | TuplePat | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:91:9:94:5 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:91:9:94:5 | TuplePat | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:11:90:13 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:90:11:90:13 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:90:11:90:13 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:11:90:13 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:91:9:94:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:91:9:94:5 | TuplePat | T0 | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:91:9:94:5 | TuplePat | T1 | {EXTERNAL LOCATION} | bool | | dyn_type.rs:92:9:92:11 | _gp | | {EXTERNAL LOCATION} | i64 | | dyn_type.rs:93:9:93:11 | _ap | | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | 0(2) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | 1(2) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:94:23:94:25 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:94:23:94:25 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | -| dyn_type.rs:94:23:94:25 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:94:23:94:25 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:95:9:98:5 | TuplePat | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:95:9:98:5 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:95:9:98:5 | TuplePat | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | T0 | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | T1 | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:94:23:94:25 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:94:23:94:25 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:94:23:94:25 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:94:23:94:25 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:95:9:98:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:95:9:98:5 | TuplePat | T0 | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:95:9:98:5 | TuplePat | T1 | {EXTERNAL LOCATION} | bool | | dyn_type.rs:96:9:96:11 | _gp | | {EXTERNAL LOCATION} | i64 | | dyn_type.rs:97:9:97:11 | _ap | | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:98:9:98:22 | assoc_get(...) | | file://:0:0:0:0 | (T_2) | -| dyn_type.rs:98:9:98:22 | assoc_get(...) | 0(2) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:98:9:98:22 | assoc_get(...) | 1(2) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:98:19:98:21 | obj | | file://:0:0:0:0 | & | -| dyn_type.rs:98:19:98:21 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | -| dyn_type.rs:98:19:98:21 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:98:19:98:21 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:101:15:108:1 | { ... } | | file://:0:0:0:0 | () | -| dyn_type.rs:102:5:102:49 | test_basic_dyn_trait(...) | | file://:0:0:0:0 | () | -| dyn_type.rs:102:26:102:48 | &... | | file://:0:0:0:0 | & | -| dyn_type.rs:102:26:102:48 | &... | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | -| dyn_type.rs:102:26:102:48 | &... | &T | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:98:9:98:22 | assoc_get(...) | | {EXTERNAL LOCATION} | (T_2) | +| dyn_type.rs:98:9:98:22 | assoc_get(...) | T0 | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:98:9:98:22 | assoc_get(...) | T1 | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:98:19:98:21 | obj | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:98:19:98:21 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:98:19:98:21 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:98:19:98:21 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:101:15:108:1 | { ... } | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:102:5:102:49 | test_basic_dyn_trait(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:102:26:102:48 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:102:26:102:48 | &... | TRef | dyn_type.rs:21:1:24:1 | MyStruct | | dyn_type.rs:102:27:102:48 | MyStruct {...} | | dyn_type.rs:21:1:24:1 | MyStruct | | dyn_type.rs:102:45:102:46 | 42 | | {EXTERNAL LOCATION} | i32 | -| dyn_type.rs:103:5:105:6 | test_generic_dyn_trait(...) | | file://:0:0:0:0 | () | -| dyn_type.rs:103:28:105:5 | &... | | file://:0:0:0:0 | & | -| dyn_type.rs:103:28:105:5 | &... | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | -| dyn_type.rs:103:28:105:5 | &... | &T | dyn_type.rs:33:1:36:1 | GenStruct | -| dyn_type.rs:103:28:105:5 | &... | &T.A | {EXTERNAL LOCATION} | String | -| dyn_type.rs:103:28:105:5 | &... | &T.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:103:5:105:6 | test_generic_dyn_trait(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:103:28:105:5 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:103:28:105:5 | &... | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:103:28:105:5 | &... | TRef.A | {EXTERNAL LOCATION} | String | | dyn_type.rs:103:29:105:5 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:103:29:105:5 | GenStruct {...} | A | {EXTERNAL LOCATION} | String | -| dyn_type.rs:104:16:104:17 | "" | | file://:0:0:0:0 | & | -| dyn_type.rs:104:16:104:17 | "" | &T | {EXTERNAL LOCATION} | str | +| dyn_type.rs:104:16:104:17 | "" | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:104:16:104:17 | "" | TRef | {EXTERNAL LOCATION} | str | | dyn_type.rs:104:16:104:29 | "".to_string() | | {EXTERNAL LOCATION} | String | -| dyn_type.rs:106:5:106:25 | test_poly_dyn_trait(...) | | file://:0:0:0:0 | () | -| dyn_type.rs:107:5:107:46 | test_assoc_type(...) | | file://:0:0:0:0 | () | -| dyn_type.rs:107:21:107:45 | &... | | file://:0:0:0:0 | & | -| dyn_type.rs:107:21:107:45 | &... | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | -| dyn_type.rs:107:21:107:45 | &... | &T | dyn_type.rs:33:1:36:1 | GenStruct | -| dyn_type.rs:107:21:107:45 | &... | &T.A | {EXTERNAL LOCATION} | i32 | -| dyn_type.rs:107:21:107:45 | &... | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:107:21:107:45 | &... | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:106:5:106:25 | test_poly_dyn_trait(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:107:5:107:46 | test_assoc_type(...) | | {EXTERNAL LOCATION} | () | +| dyn_type.rs:107:21:107:45 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:107:21:107:45 | &... | TRef | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:107:21:107:45 | &... | TRef.A | {EXTERNAL LOCATION} | i32 | | dyn_type.rs:107:22:107:45 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:107:22:107:45 | GenStruct {...} | A | {EXTERNAL LOCATION} | i32 | | dyn_type.rs:107:41:107:43 | 100 | | {EXTERNAL LOCATION} | i32 | | invalid/main.rs:8:16:8:19 | SelfParam | | invalid/main.rs:7:5:9:5 | Self [trait T1] | -| invalid/main.rs:8:22:8:23 | { ... } | | file://:0:0:0:0 | () | +| invalid/main.rs:8:22:8:23 | { ... } | | {EXTERNAL LOCATION} | () | | invalid/main.rs:12:16:12:19 | SelfParam | | invalid/main.rs:11:5:15:5 | Self [trait T2] | -| invalid/main.rs:12:22:14:9 | { ... } | | file://:0:0:0:0 | () | +| invalid/main.rs:12:22:14:9 | { ... } | | {EXTERNAL LOCATION} | () | | invalid/main.rs:13:13:13:16 | self | | invalid/main.rs:11:5:15:5 | Self [trait T2] | -| invalid/main.rs:13:13:13:22 | self.foo() | | file://:0:0:0:0 | () | +| invalid/main.rs:13:13:13:22 | self.foo() | | {EXTERNAL LOCATION} | () | | invalid/main.rs:25:22:25:25 | SelfParam | | invalid/main.rs:24:5:26:5 | Self [trait AddAlias] | | invalid/main.rs:25:28:25:32 | other | | invalid/main.rs:24:5:26:5 | Self [trait AddAlias] | | invalid/main.rs:29:22:29:25 | SelfParam | | invalid/main.rs:21:5:22:20 | Num | @@ -1166,7 +5630,7 @@ inferType | invalid/main.rs:40:13:40:16 | self | | invalid/main.rs:35:10:35:20 | T | | invalid/main.rs:40:13:40:33 | self.add_alias(...) | | invalid/main.rs:35:10:35:20 | T | | invalid/main.rs:40:28:40:32 | other | | invalid/main.rs:35:10:35:20 | T | -| invalid/main.rs:44:30:49:5 | { ... } | | file://:0:0:0:0 | () | +| invalid/main.rs:44:30:49:5 | { ... } | | {EXTERNAL LOCATION} | () | | invalid/main.rs:45:13:45:13 | a | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:45:17:45:22 | Num(...) | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:45:21:45:21 | 5 | | {EXTERNAL LOCATION} | i32 | @@ -1177,70 +5641,64 @@ inferType | invalid/main.rs:47:17:47:17 | a | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:47:17:47:21 | ... + ... | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:47:21:47:21 | b | | invalid/main.rs:21:5:22:20 | Num | -| invalid/main.rs:57:19:57:23 | SelfParam | | file://:0:0:0:0 | & | -| invalid/main.rs:57:19:57:23 | SelfParam | &T | invalid/main.rs:56:5:58:5 | Self [trait Clone1] | -| invalid/main.rs:61:22:61:26 | SelfParam | | file://:0:0:0:0 | & | -| invalid/main.rs:61:22:61:26 | SelfParam | &T | invalid/main.rs:60:5:64:5 | Self [trait Duplicatable] | -| invalid/main.rs:68:19:68:23 | SelfParam | | file://:0:0:0:0 | & | -| invalid/main.rs:68:19:68:23 | SelfParam | &T | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:57:19:57:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:57:19:57:23 | SelfParam | TRef | invalid/main.rs:56:5:58:5 | Self [trait Clone1] | +| invalid/main.rs:61:22:61:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:61:22:61:26 | SelfParam | TRef | invalid/main.rs:60:5:64:5 | Self [trait Duplicatable] | +| invalid/main.rs:68:19:68:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:68:19:68:23 | SelfParam | TRef | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:68:34:70:9 | { ... } | | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:69:13:69:17 | * ... | | invalid/main.rs:53:5:54:14 | S1 | -| invalid/main.rs:69:14:69:17 | self | | file://:0:0:0:0 | & | -| invalid/main.rs:69:14:69:17 | self | &T | invalid/main.rs:53:5:54:14 | S1 | -| invalid/main.rs:75:22:75:26 | SelfParam | | file://:0:0:0:0 | & | -| invalid/main.rs:75:22:75:26 | SelfParam | &T | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:69:14:69:17 | self | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:69:14:69:17 | self | TRef | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:75:22:75:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:75:22:75:26 | SelfParam | TRef | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:75:37:77:9 | { ... } | | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:76:13:76:17 | * ... | | invalid/main.rs:53:5:54:14 | S1 | -| invalid/main.rs:76:14:76:17 | self | | file://:0:0:0:0 | & | -| invalid/main.rs:76:14:76:17 | self | &T | invalid/main.rs:53:5:54:14 | S1 | -| invalid/main.rs:83:22:83:26 | SelfParam | | file://:0:0:0:0 | & | -| invalid/main.rs:83:22:83:26 | SelfParam | &T | invalid/main.rs:81:10:81:18 | T | +| invalid/main.rs:76:14:76:17 | self | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:76:14:76:17 | self | TRef | invalid/main.rs:53:5:54:14 | S1 | +| invalid/main.rs:83:22:83:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:83:22:83:26 | SelfParam | TRef | invalid/main.rs:81:10:81:18 | T | | invalid/main.rs:83:37:85:9 | { ... } | | invalid/main.rs:81:10:81:18 | T | -| invalid/main.rs:84:13:84:16 | self | | file://:0:0:0:0 | & | -| invalid/main.rs:84:13:84:16 | self | &T | invalid/main.rs:81:10:81:18 | T | +| invalid/main.rs:84:13:84:16 | self | | {EXTERNAL LOCATION} | & | +| invalid/main.rs:84:13:84:16 | self | TRef | invalid/main.rs:81:10:81:18 | T | | invalid/main.rs:84:13:84:25 | self.clone1() | | invalid/main.rs:81:10:81:18 | T | -| invalid/main.rs:88:33:92:5 | { ... } | | file://:0:0:0:0 | () | +| invalid/main.rs:88:33:92:5 | { ... } | | {EXTERNAL LOCATION} | () | | invalid/main.rs:91:13:91:13 | x | | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:91:17:91:18 | S1 | | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:91:17:91:30 | S1.duplicate() | | invalid/main.rs:53:5:54:14 | S1 | -| main.rs:25:30:28:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:25:30:28:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:26:13:26:13 | x | | main.rs:5:5:8:5 | MyThing | | main.rs:26:17:26:32 | MyThing {...} | | main.rs:5:5:8:5 | MyThing | | main.rs:26:30:26:30 | S | | main.rs:3:5:4:13 | S | -| main.rs:27:18:27:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:27:18:27:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:27:18:27:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:27:18:27:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:27:18:27:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:27:18:27:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:27:18:27:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:27:18:27:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:27:18:27:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:27:18:27:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:27:26:27:26 | x | | main.rs:5:5:8:5 | MyThing | | main.rs:27:26:27:28 | x.a | | main.rs:3:5:4:13 | S | | main.rs:30:29:30:29 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:30:29:30:29 | x | A | {EXTERNAL LOCATION} | bool | -| main.rs:30:46:33:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:30:46:33:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:31:13:31:13 | a | | {EXTERNAL LOCATION} | bool | | main.rs:31:17:31:17 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:31:17:31:17 | x | A | {EXTERNAL LOCATION} | bool | | main.rs:31:17:31:19 | x.a | | {EXTERNAL LOCATION} | bool | -| main.rs:32:18:32:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:32:18:32:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:32:18:32:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:32:18:32:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:32:18:32:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:32:18:32:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:32:18:32:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:32:18:32:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:32:18:32:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:32:18:32:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:32:26:32:26 | a | | {EXTERNAL LOCATION} | bool | -| main.rs:35:31:63:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:35:31:63:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:37:13:37:13 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:37:13:37:13 | x | A | main.rs:3:5:4:13 | S | | main.rs:37:17:37:42 | GenericThing::<...> {...} | | main.rs:16:5:19:5 | GenericThing | | main.rs:37:17:37:42 | GenericThing::<...> {...} | A | main.rs:3:5:4:13 | S | | main.rs:37:40:37:40 | S | | main.rs:3:5:4:13 | S | -| main.rs:38:18:38:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:38:18:38:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:38:18:38:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:38:18:38:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:38:18:38:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:38:18:38:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:38:18:38:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:38:18:38:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:38:18:38:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:38:18:38:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:38:26:38:26 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:38:26:38:26 | x | A | main.rs:3:5:4:13 | S | | main.rs:38:26:38:28 | x.a | | main.rs:3:5:4:13 | S | @@ -1249,12 +5707,10 @@ inferType | main.rs:41:17:41:37 | GenericThing {...} | | main.rs:16:5:19:5 | GenericThing | | main.rs:41:17:41:37 | GenericThing {...} | A | main.rs:3:5:4:13 | S | | main.rs:41:35:41:35 | S | | main.rs:3:5:4:13 | S | -| main.rs:42:18:42:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:42:18:42:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:42:18:42:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:42:18:42:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:42:18:42:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:42:18:42:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:42:18:42:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:42:18:42:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:42:18:42:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:42:18:42:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:42:26:42:26 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:42:26:42:26 | x | A | main.rs:3:5:4:13 | S | | main.rs:42:26:42:28 | x.a | | main.rs:3:5:4:13 | S | @@ -1262,12 +5718,10 @@ inferType | main.rs:46:17:48:9 | OptionS {...} | | main.rs:21:5:23:5 | OptionS | | main.rs:47:16:47:33 | ...::MyNone(...) | | main.rs:10:5:14:5 | MyOption | | main.rs:47:16:47:33 | ...::MyNone(...) | T | main.rs:3:5:4:13 | S | -| main.rs:49:18:49:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:49:18:49:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:49:18:49:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:49:18:49:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:49:18:49:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:49:18:49:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:49:18:49:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:49:18:49:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:49:18:49:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:49:18:49:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:49:26:49:26 | x | | main.rs:21:5:23:5 | OptionS | | main.rs:49:26:49:28 | x.a | | main.rs:10:5:14:5 | MyOption | | main.rs:49:26:49:28 | x.a | T | main.rs:3:5:4:13 | S | @@ -1279,12 +5733,10 @@ inferType | main.rs:52:17:54:9 | GenericThing::<...> {...} | A.T | main.rs:3:5:4:13 | S | | main.rs:53:16:53:33 | ...::MyNone(...) | | main.rs:10:5:14:5 | MyOption | | main.rs:53:16:53:33 | ...::MyNone(...) | T | main.rs:3:5:4:13 | S | -| main.rs:55:18:55:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:55:18:55:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:55:18:55:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:55:18:55:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:55:18:55:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:55:18:55:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:55:18:55:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:55:18:55:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:55:18:55:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:55:18:55:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:55:26:55:26 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:55:26:55:26 | x | A | main.rs:10:5:14:5 | MyOption | | main.rs:55:26:55:26 | x | A.T | main.rs:3:5:4:13 | S | @@ -1305,17 +5757,15 @@ inferType | main.rs:61:30:61:30 | x | A.T | main.rs:3:5:4:13 | S | | main.rs:61:30:61:32 | x.a | | main.rs:10:5:14:5 | MyOption | | main.rs:61:30:61:32 | x.a | T | main.rs:3:5:4:13 | S | -| main.rs:62:18:62:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:62:18:62:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:62:18:62:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:62:18:62:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:62:18:62:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:62:18:62:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:62:18:62:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:62:18:62:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:62:18:62:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:62:18:62:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:62:26:62:26 | a | | main.rs:10:5:14:5 | MyOption | | main.rs:62:26:62:26 | a | T | main.rs:3:5:4:13 | S | -| main.rs:65:16:68:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:66:9:66:29 | simple_field_access(...) | | file://:0:0:0:0 | () | -| main.rs:67:9:67:30 | generic_field_access(...) | | file://:0:0:0:0 | () | +| main.rs:65:16:68:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:66:9:66:29 | simple_field_access(...) | | {EXTERNAL LOCATION} | () | +| main.rs:67:9:67:30 | generic_field_access(...) | | {EXTERNAL LOCATION} | () | | main.rs:75:19:75:22 | SelfParam | | main.rs:72:5:72:21 | Foo | | main.rs:75:33:77:9 | { ... } | | main.rs:72:5:72:21 | Foo | | main.rs:76:13:76:16 | self | | main.rs:72:5:72:21 | Foo | @@ -1323,12 +5773,10 @@ inferType | main.rs:79:32:81:9 | { ... } | | main.rs:72:5:72:21 | Foo | | main.rs:80:13:80:16 | self | | main.rs:72:5:72:21 | Foo | | main.rs:84:23:89:5 | { ... } | | main.rs:72:5:72:21 | Foo | -| main.rs:85:18:85:33 | "main.rs::m1::f\\n" | | file://:0:0:0:0 | & | -| main.rs:85:18:85:33 | "main.rs::m1::f\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:85:18:85:33 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:85:18:85:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:85:18:85:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:85:18:85:33 | { ... } | | file://:0:0:0:0 | () | +| main.rs:85:18:85:33 | "main.rs::m1::f\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:85:18:85:33 | "main.rs::m1::f\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:85:18:85:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:85:18:85:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:86:13:86:13 | x | | main.rs:72:5:72:21 | Foo | | main.rs:86:17:86:22 | Foo {...} | | main.rs:72:5:72:21 | Foo | | main.rs:87:13:87:13 | y | | main.rs:72:5:72:21 | Foo | @@ -1337,12 +5785,10 @@ inferType | main.rs:91:14:91:14 | x | | main.rs:72:5:72:21 | Foo | | main.rs:91:22:91:22 | y | | main.rs:72:5:72:21 | Foo | | main.rs:91:37:95:5 | { ... } | | main.rs:72:5:72:21 | Foo | -| main.rs:92:18:92:33 | "main.rs::m1::g\\n" | | file://:0:0:0:0 | & | -| main.rs:92:18:92:33 | "main.rs::m1::g\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:92:18:92:33 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:92:18:92:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:92:18:92:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:92:18:92:33 | { ... } | | file://:0:0:0:0 | () | +| main.rs:92:18:92:33 | "main.rs::m1::g\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:92:18:92:33 | "main.rs::m1::g\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:92:18:92:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:92:18:92:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:93:9:93:9 | x | | main.rs:72:5:72:21 | Foo | | main.rs:93:9:93:14 | x.m1() | | main.rs:72:5:72:21 | Foo | | main.rs:94:9:94:9 | y | | main.rs:72:5:72:21 | Foo | @@ -1352,7 +5798,7 @@ inferType | main.rs:110:39:112:9 | { ... } | | {EXTERNAL LOCATION} | bool | | main.rs:111:13:111:16 | self | | main.rs:99:5:102:5 | MyThing | | main.rs:111:13:111:22 | self.field | | {EXTERNAL LOCATION} | bool | -| main.rs:115:16:121:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:115:16:121:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:116:13:116:13 | x | | main.rs:99:5:102:5 | MyThing | | main.rs:116:17:116:39 | MyThing {...} | | main.rs:99:5:102:5 | MyThing | | main.rs:116:34:116:37 | true | | {EXTERNAL LOCATION} | bool | @@ -1365,44 +5811,40 @@ inferType | main.rs:120:13:120:13 | b | | {EXTERNAL LOCATION} | bool | | main.rs:120:17:120:40 | ...::trait_method(...) | | {EXTERNAL LOCATION} | bool | | main.rs:120:39:120:39 | y | | main.rs:99:5:102:5 | MyThing | -| main.rs:130:25:130:29 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:130:25:130:29 | SelfParam | &T | main.rs:128:9:133:9 | Self [trait Foo] | -| main.rs:130:32:132:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:131:26:131:31 | "foo!\\n" | | file://:0:0:0:0 | & | -| main.rs:131:26:131:31 | "foo!\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:131:26:131:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:131:26:131:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:131:26:131:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:131:26:131:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:137:25:137:29 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:137:25:137:29 | SelfParam | &T | main.rs:135:9:140:9 | Self [trait Bar] | -| main.rs:137:32:139:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:138:26:138:31 | "bar!\\n" | | file://:0:0:0:0 | & | -| main.rs:138:26:138:31 | "bar!\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:138:26:138:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:138:26:138:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:138:26:138:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:138:26:138:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:149:15:170:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:130:25:130:29 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:130:25:130:29 | SelfParam | TRef | main.rs:128:9:133:9 | Self [trait Foo] | +| main.rs:130:32:132:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:131:26:131:31 | "foo!\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:131:26:131:31 | "foo!\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:131:26:131:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:131:26:131:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:137:25:137:29 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:137:25:137:29 | SelfParam | TRef | main.rs:135:9:140:9 | Self [trait Bar] | +| main.rs:137:32:139:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:138:26:138:31 | "bar!\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:138:26:138:31 | "bar!\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:138:26:138:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:138:26:138:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:149:15:170:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:150:13:150:13 | x | | main.rs:142:9:142:21 | X | | main.rs:150:17:150:17 | X | | main.rs:142:9:142:21 | X | -| main.rs:151:9:154:9 | { ... } | | file://:0:0:0:0 | () | +| main.rs:151:9:154:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:153:13:153:13 | x | | main.rs:142:9:142:21 | X | -| main.rs:153:13:153:24 | x.a_method() | | file://:0:0:0:0 | () | -| main.rs:155:9:158:9 | { ... } | | file://:0:0:0:0 | () | +| main.rs:153:13:153:24 | x.a_method() | | {EXTERNAL LOCATION} | () | +| main.rs:155:9:158:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:157:13:157:13 | x | | main.rs:142:9:142:21 | X | -| main.rs:157:13:157:24 | x.a_method() | | file://:0:0:0:0 | () | -| main.rs:159:9:162:9 | { ... } | | file://:0:0:0:0 | () | +| main.rs:157:13:157:24 | x.a_method() | | {EXTERNAL LOCATION} | () | +| main.rs:159:9:162:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:161:13:161:13 | x | | main.rs:142:9:142:21 | X | -| main.rs:161:13:161:24 | x.a_method() | | file://:0:0:0:0 | () | -| main.rs:163:9:169:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:167:13:167:29 | ...::a_method(...) | | file://:0:0:0:0 | () | -| main.rs:167:27:167:28 | &x | | file://:0:0:0:0 | & | -| main.rs:167:27:167:28 | &x | &T | main.rs:142:9:142:21 | X | +| main.rs:161:13:161:24 | x.a_method() | | {EXTERNAL LOCATION} | () | +| main.rs:163:9:169:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:167:13:167:29 | ...::a_method(...) | | {EXTERNAL LOCATION} | () | +| main.rs:167:27:167:28 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:167:27:167:28 | &x | TRef | main.rs:142:9:142:21 | X | | main.rs:167:28:167:28 | x | | main.rs:142:9:142:21 | X | -| main.rs:168:13:168:29 | ...::a_method(...) | | file://:0:0:0:0 | () | -| main.rs:168:27:168:28 | &x | | file://:0:0:0:0 | & | -| main.rs:168:27:168:28 | &x | &T | main.rs:142:9:142:21 | X | +| main.rs:168:13:168:29 | ...::a_method(...) | | {EXTERNAL LOCATION} | () | +| main.rs:168:27:168:28 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:168:27:168:28 | &x | TRef | main.rs:142:9:142:21 | X | | main.rs:168:28:168:28 | x | | main.rs:142:9:142:21 | X | | main.rs:186:15:186:18 | SelfParam | | main.rs:174:5:177:5 | MyThing | | main.rs:186:15:186:18 | SelfParam | A | main.rs:179:5:180:14 | S1 | @@ -1425,7 +5867,7 @@ inferType | main.rs:200:13:200:16 | self | | main.rs:174:5:177:5 | MyThing | | main.rs:200:13:200:16 | self | A | main.rs:198:10:198:10 | T | | main.rs:200:13:200:18 | self.a | | main.rs:198:10:198:10 | T | -| main.rs:204:16:220:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:204:16:220:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:205:13:205:13 | x | | main.rs:174:5:177:5 | MyThing | | main.rs:205:13:205:13 | x | A | main.rs:179:5:180:14 | S1 | | main.rs:205:17:205:33 | MyThing {...} | | main.rs:174:5:177:5 | MyThing | @@ -1436,39 +5878,31 @@ inferType | main.rs:206:17:206:33 | MyThing {...} | | main.rs:174:5:177:5 | MyThing | | main.rs:206:17:206:33 | MyThing {...} | A | main.rs:181:5:182:14 | S2 | | main.rs:206:30:206:31 | S2 | | main.rs:181:5:182:14 | S2 | -| main.rs:209:18:209:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:209:18:209:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:209:18:209:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:209:18:209:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:209:18:209:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:209:18:209:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:209:18:209:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:209:18:209:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:209:18:209:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:209:18:209:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:209:26:209:26 | x | | main.rs:174:5:177:5 | MyThing | | main.rs:209:26:209:26 | x | A | main.rs:179:5:180:14 | S1 | | main.rs:209:26:209:28 | x.a | | main.rs:179:5:180:14 | S1 | -| main.rs:210:18:210:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:210:18:210:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:210:18:210:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:210:18:210:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:210:18:210:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:210:18:210:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:210:18:210:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:210:18:210:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:210:18:210:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:210:18:210:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:210:26:210:26 | y | | main.rs:174:5:177:5 | MyThing | | main.rs:210:26:210:26 | y | A | main.rs:181:5:182:14 | S2 | | main.rs:210:26:210:28 | y.a | | main.rs:181:5:182:14 | S2 | -| main.rs:212:18:212:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:212:18:212:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:212:18:212:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:212:18:212:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:212:18:212:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:212:18:212:31 | { ... } | | file://:0:0:0:0 | () | +| main.rs:212:18:212:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:212:18:212:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:212:18:212:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:212:18:212:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:212:26:212:26 | x | | main.rs:174:5:177:5 | MyThing | | main.rs:212:26:212:26 | x | A | main.rs:179:5:180:14 | S1 | | main.rs:212:26:212:31 | x.m1() | | main.rs:179:5:180:14 | S1 | -| main.rs:213:18:213:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:213:18:213:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:213:18:213:33 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:213:18:213:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:213:18:213:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:213:18:213:33 | { ... } | | file://:0:0:0:0 | () | +| main.rs:213:18:213:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:213:18:213:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:213:18:213:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:213:18:213:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:213:26:213:26 | y | | main.rs:174:5:177:5 | MyThing | | main.rs:213:26:213:26 | y | A | main.rs:181:5:182:14 | S2 | | main.rs:213:26:213:31 | y.m1() | | main.rs:174:5:177:5 | MyThing | @@ -1484,21 +5918,17 @@ inferType | main.rs:216:17:216:33 | MyThing {...} | | main.rs:174:5:177:5 | MyThing | | main.rs:216:17:216:33 | MyThing {...} | A | main.rs:181:5:182:14 | S2 | | main.rs:216:30:216:31 | S2 | | main.rs:181:5:182:14 | S2 | -| main.rs:218:18:218:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:218:18:218:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:218:18:218:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:218:18:218:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:218:18:218:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:218:18:218:31 | { ... } | | file://:0:0:0:0 | () | +| main.rs:218:18:218:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:218:18:218:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:218:18:218:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:218:18:218:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:218:26:218:26 | x | | main.rs:174:5:177:5 | MyThing | | main.rs:218:26:218:26 | x | A | main.rs:179:5:180:14 | S1 | | main.rs:218:26:218:31 | x.m2() | | main.rs:179:5:180:14 | S1 | -| main.rs:219:18:219:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:219:18:219:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:219:18:219:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:219:18:219:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:219:18:219:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:219:18:219:31 | { ... } | | file://:0:0:0:0 | () | +| main.rs:219:18:219:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:219:18:219:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:219:18:219:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:219:18:219:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:219:26:219:26 | y | | main.rs:174:5:177:5 | MyThing | | main.rs:219:26:219:26 | y | A | main.rs:181:5:182:14 | S2 | | main.rs:219:26:219:31 | y.m2() | | main.rs:181:5:182:14 | S2 | @@ -1622,7 +6052,7 @@ inferType | main.rs:366:73:369:5 | { ... } | | main.rs:235:5:236:14 | S1 | | main.rs:368:9:368:13 | thing | | main.rs:366:39:366:53 | TP | | main.rs:368:9:368:26 | thing.convert_to() | | main.rs:235:5:236:14 | S1 | -| main.rs:371:16:442:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:371:16:442:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:372:13:372:20 | thing_s1 | | main.rs:224:5:227:5 | MyThing | | main.rs:372:13:372:20 | thing_s1 | A | main.rs:235:5:236:14 | S1 | | main.rs:372:24:372:40 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | @@ -1638,21 +6068,17 @@ inferType | main.rs:374:24:374:40 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | | main.rs:374:24:374:40 | MyThing {...} | A | main.rs:239:5:240:14 | S3 | | main.rs:374:37:374:38 | S3 | | main.rs:239:5:240:14 | S3 | -| main.rs:378:18:378:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:378:18:378:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:378:18:378:38 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:378:18:378:38 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:378:18:378:38 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:378:18:378:38 | { ... } | | file://:0:0:0:0 | () | +| main.rs:378:18:378:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:378:18:378:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:378:18:378:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:378:18:378:38 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:378:26:378:33 | thing_s1 | | main.rs:224:5:227:5 | MyThing | | main.rs:378:26:378:33 | thing_s1 | A | main.rs:235:5:236:14 | S1 | | main.rs:378:26:378:38 | thing_s1.m1() | | main.rs:235:5:236:14 | S1 | -| main.rs:379:18:379:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:379:18:379:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:379:18:379:40 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:379:18:379:40 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:379:18:379:40 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:379:18:379:40 | { ... } | | file://:0:0:0:0 | () | +| main.rs:379:18:379:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:379:18:379:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:379:18:379:40 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:379:18:379:40 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:379:26:379:33 | thing_s2 | | main.rs:224:5:227:5 | MyThing | | main.rs:379:26:379:33 | thing_s2 | A | main.rs:237:5:238:14 | S2 | | main.rs:379:26:379:38 | thing_s2.m1() | | main.rs:224:5:227:5 | MyThing | @@ -1662,12 +6088,10 @@ inferType | main.rs:380:22:380:29 | thing_s3 | | main.rs:224:5:227:5 | MyThing | | main.rs:380:22:380:29 | thing_s3 | A | main.rs:239:5:240:14 | S3 | | main.rs:380:22:380:34 | thing_s3.m1() | | main.rs:239:5:240:14 | S3 | -| main.rs:381:18:381:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:381:18:381:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:381:18:381:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:381:18:381:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:381:18:381:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:381:18:381:27 | { ... } | | file://:0:0:0:0 | () | +| main.rs:381:18:381:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:381:18:381:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:381:18:381:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:381:18:381:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:381:26:381:27 | s3 | | main.rs:239:5:240:14 | S3 | | main.rs:383:13:383:14 | p1 | | main.rs:229:5:233:5 | MyPair | | main.rs:383:13:383:14 | p1 | P1 | main.rs:235:5:236:14 | S1 | @@ -1677,12 +6101,10 @@ inferType | main.rs:383:18:383:42 | MyPair {...} | P2 | main.rs:235:5:236:14 | S1 | | main.rs:383:31:383:32 | S1 | | main.rs:235:5:236:14 | S1 | | main.rs:383:39:383:40 | S1 | | main.rs:235:5:236:14 | S1 | -| main.rs:384:18:384:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:384:18:384:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:384:18:384:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:384:18:384:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:384:18:384:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:384:18:384:32 | { ... } | | file://:0:0:0:0 | () | +| main.rs:384:18:384:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:384:18:384:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:384:18:384:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:384:18:384:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:384:26:384:27 | p1 | | main.rs:229:5:233:5 | MyPair | | main.rs:384:26:384:27 | p1 | P1 | main.rs:235:5:236:14 | S1 | | main.rs:384:26:384:27 | p1 | P2 | main.rs:235:5:236:14 | S1 | @@ -1695,12 +6117,10 @@ inferType | main.rs:386:18:386:42 | MyPair {...} | P2 | main.rs:237:5:238:14 | S2 | | main.rs:386:31:386:32 | S1 | | main.rs:235:5:236:14 | S1 | | main.rs:386:39:386:40 | S2 | | main.rs:237:5:238:14 | S2 | -| main.rs:387:18:387:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:387:18:387:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:387:18:387:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:387:18:387:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:387:18:387:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:387:18:387:32 | { ... } | | file://:0:0:0:0 | () | +| main.rs:387:18:387:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:387:18:387:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:387:18:387:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:387:18:387:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:387:26:387:27 | p2 | | main.rs:229:5:233:5 | MyPair | | main.rs:387:26:387:27 | p2 | P1 | main.rs:235:5:236:14 | S1 | | main.rs:387:26:387:27 | p2 | P2 | main.rs:237:5:238:14 | S2 | @@ -1717,12 +6137,10 @@ inferType | main.rs:390:17:390:33 | MyThing {...} | A | main.rs:235:5:236:14 | S1 | | main.rs:390:30:390:31 | S1 | | main.rs:235:5:236:14 | S1 | | main.rs:391:17:391:18 | S3 | | main.rs:239:5:240:14 | S3 | -| main.rs:393:18:393:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:393:18:393:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:393:18:393:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:393:18:393:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:393:18:393:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:393:18:393:32 | { ... } | | file://:0:0:0:0 | () | +| main.rs:393:18:393:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:393:18:393:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:393:18:393:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:393:18:393:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:393:26:393:27 | p3 | | main.rs:229:5:233:5 | MyPair | | main.rs:393:26:393:27 | p3 | P1 | main.rs:224:5:227:5 | MyThing | | main.rs:393:26:393:27 | p3 | P1.A | main.rs:235:5:236:14 | S1 | @@ -1741,24 +6159,20 @@ inferType | main.rs:397:17:397:17 | a | P1 | main.rs:235:5:236:14 | S1 | | main.rs:397:17:397:17 | a | P2 | main.rs:235:5:236:14 | S1 | | main.rs:397:17:397:23 | a.fst() | | main.rs:235:5:236:14 | S1 | -| main.rs:398:18:398:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:398:18:398:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:398:18:398:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:398:18:398:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:398:18:398:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:398:18:398:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:398:18:398:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:398:18:398:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:398:18:398:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:398:18:398:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:398:26:398:26 | x | | main.rs:235:5:236:14 | S1 | | main.rs:399:13:399:13 | y | | main.rs:235:5:236:14 | S1 | | main.rs:399:17:399:17 | a | | main.rs:229:5:233:5 | MyPair | | main.rs:399:17:399:17 | a | P1 | main.rs:235:5:236:14 | S1 | | main.rs:399:17:399:17 | a | P2 | main.rs:235:5:236:14 | S1 | | main.rs:399:17:399:23 | a.snd() | | main.rs:235:5:236:14 | S1 | -| main.rs:400:18:400:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:400:18:400:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:400:18:400:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:400:18:400:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:400:18:400:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:400:18:400:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:400:18:400:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:400:18:400:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:400:18:400:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:400:18:400:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:400:26:400:26 | y | | main.rs:235:5:236:14 | S1 | | main.rs:406:13:406:13 | b | | main.rs:229:5:233:5 | MyPair | | main.rs:406:13:406:13 | b | P1 | main.rs:237:5:238:14 | S2 | @@ -1773,35 +6187,29 @@ inferType | main.rs:407:17:407:17 | b | P1 | main.rs:237:5:238:14 | S2 | | main.rs:407:17:407:17 | b | P2 | main.rs:235:5:236:14 | S1 | | main.rs:407:17:407:23 | b.fst() | | main.rs:235:5:236:14 | S1 | -| main.rs:408:18:408:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:408:18:408:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:408:18:408:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:408:18:408:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:408:18:408:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:408:18:408:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:408:18:408:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:408:18:408:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:408:18:408:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:408:18:408:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:408:26:408:26 | x | | main.rs:235:5:236:14 | S1 | | main.rs:409:13:409:13 | y | | main.rs:237:5:238:14 | S2 | | main.rs:409:17:409:17 | b | | main.rs:229:5:233:5 | MyPair | | main.rs:409:17:409:17 | b | P1 | main.rs:237:5:238:14 | S2 | | main.rs:409:17:409:17 | b | P2 | main.rs:235:5:236:14 | S1 | | main.rs:409:17:409:23 | b.snd() | | main.rs:237:5:238:14 | S2 | -| main.rs:410:18:410:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:410:18:410:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:410:18:410:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:410:18:410:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:410:18:410:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:410:18:410:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:410:18:410:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:410:18:410:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:410:18:410:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:410:18:410:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:410:26:410:26 | y | | main.rs:237:5:238:14 | S2 | | main.rs:414:13:414:13 | x | | main.rs:235:5:236:14 | S1 | | main.rs:414:17:414:39 | call_trait_m1(...) | | main.rs:235:5:236:14 | S1 | | main.rs:414:31:414:38 | thing_s1 | | main.rs:224:5:227:5 | MyThing | | main.rs:414:31:414:38 | thing_s1 | A | main.rs:235:5:236:14 | S1 | -| main.rs:415:18:415:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:415:18:415:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:415:18:415:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:415:18:415:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:415:18:415:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:415:18:415:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:415:18:415:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:415:18:415:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:415:18:415:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:415:18:415:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:415:26:415:26 | x | | main.rs:235:5:236:14 | S1 | | main.rs:416:13:416:13 | y | | main.rs:224:5:227:5 | MyThing | | main.rs:416:13:416:13 | y | A | main.rs:237:5:238:14 | S2 | @@ -1809,12 +6217,10 @@ inferType | main.rs:416:17:416:39 | call_trait_m1(...) | A | main.rs:237:5:238:14 | S2 | | main.rs:416:31:416:38 | thing_s2 | | main.rs:224:5:227:5 | MyThing | | main.rs:416:31:416:38 | thing_s2 | A | main.rs:237:5:238:14 | S2 | -| main.rs:417:18:417:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:417:18:417:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:417:18:417:28 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:417:18:417:28 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:417:18:417:28 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:417:18:417:28 | { ... } | | file://:0:0:0:0 | () | +| main.rs:417:18:417:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:417:18:417:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:417:18:417:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:417:18:417:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:417:26:417:26 | y | | main.rs:224:5:227:5 | MyThing | | main.rs:417:26:417:26 | y | A | main.rs:237:5:238:14 | S2 | | main.rs:417:26:417:28 | y.a | | main.rs:237:5:238:14 | S2 | @@ -1831,24 +6237,20 @@ inferType | main.rs:421:25:421:25 | a | | main.rs:229:5:233:5 | MyPair | | main.rs:421:25:421:25 | a | P1 | main.rs:235:5:236:14 | S1 | | main.rs:421:25:421:25 | a | P2 | main.rs:235:5:236:14 | S1 | -| main.rs:422:18:422:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:422:18:422:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:422:18:422:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:422:18:422:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:422:18:422:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:422:18:422:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:422:18:422:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:422:18:422:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:422:18:422:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:422:18:422:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:422:26:422:26 | x | | main.rs:235:5:236:14 | S1 | | main.rs:423:13:423:13 | y | | main.rs:235:5:236:14 | S1 | | main.rs:423:17:423:26 | get_snd(...) | | main.rs:235:5:236:14 | S1 | | main.rs:423:25:423:25 | a | | main.rs:229:5:233:5 | MyPair | | main.rs:423:25:423:25 | a | P1 | main.rs:235:5:236:14 | S1 | | main.rs:423:25:423:25 | a | P2 | main.rs:235:5:236:14 | S1 | -| main.rs:424:18:424:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:424:18:424:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:424:18:424:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:424:18:424:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:424:18:424:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:424:18:424:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:424:18:424:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:424:18:424:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:424:18:424:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:424:18:424:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:424:26:424:26 | y | | main.rs:235:5:236:14 | S1 | | main.rs:427:13:427:13 | b | | main.rs:229:5:233:5 | MyPair | | main.rs:427:13:427:13 | b | P1 | main.rs:237:5:238:14 | S2 | @@ -1863,24 +6265,20 @@ inferType | main.rs:428:25:428:25 | b | | main.rs:229:5:233:5 | MyPair | | main.rs:428:25:428:25 | b | P1 | main.rs:237:5:238:14 | S2 | | main.rs:428:25:428:25 | b | P2 | main.rs:235:5:236:14 | S1 | -| main.rs:429:18:429:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:429:18:429:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:429:18:429:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:429:18:429:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:429:18:429:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:429:18:429:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:429:18:429:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:429:18:429:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:429:18:429:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:429:18:429:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:429:26:429:26 | x | | main.rs:235:5:236:14 | S1 | | main.rs:430:13:430:13 | y | | main.rs:237:5:238:14 | S2 | | main.rs:430:17:430:26 | get_snd(...) | | main.rs:237:5:238:14 | S2 | | main.rs:430:25:430:25 | b | | main.rs:229:5:233:5 | MyPair | | main.rs:430:25:430:25 | b | P1 | main.rs:237:5:238:14 | S2 | | main.rs:430:25:430:25 | b | P2 | main.rs:235:5:236:14 | S1 | -| main.rs:431:18:431:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:431:18:431:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:431:18:431:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:431:18:431:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:431:18:431:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:431:18:431:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:431:18:431:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:431:18:431:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:431:18:431:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:431:18:431:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:431:26:431:26 | y | | main.rs:237:5:238:14 | S2 | | main.rs:433:13:433:13 | c | | main.rs:229:5:233:5 | MyPair | | main.rs:433:13:433:13 | c | P1 | main.rs:239:5:240:14 | S3 | @@ -1960,74 +6358,66 @@ inferType | main.rs:512:34:512:35 | s1 | | main.rs:446:5:447:14 | S1 | | main.rs:512:48:514:9 | { ... } | | main.rs:446:5:447:14 | S1 | | main.rs:513:13:513:14 | S1 | | main.rs:446:5:447:14 | S1 | -| main.rs:521:14:521:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:521:14:521:18 | SelfParam | &T | main.rs:520:5:522:5 | Self [trait OverlappingTrait2] | -| main.rs:521:21:521:21 | x | | file://:0:0:0:0 | & | -| main.rs:521:21:521:21 | x | &T | main.rs:520:29:520:29 | T | -| main.rs:526:14:526:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:526:14:526:18 | SelfParam | &T | main.rs:517:5:518:22 | S3 | -| main.rs:526:14:526:18 | SelfParam | &T.T3 | main.rs:524:10:524:10 | T | -| main.rs:526:21:526:21 | x | | file://:0:0:0:0 | & | -| main.rs:526:21:526:21 | x | &T | main.rs:524:10:524:10 | T | -| main.rs:526:37:528:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:526:37:528:9 | { ... } | &T | main.rs:517:5:518:22 | S3 | -| main.rs:526:37:528:9 | { ... } | &T.T3 | main.rs:524:10:524:10 | T | -| main.rs:527:13:527:16 | self | | file://:0:0:0:0 | & | -| main.rs:527:13:527:16 | self | &T | main.rs:517:5:518:22 | S3 | -| main.rs:527:13:527:16 | self | &T.T3 | main.rs:524:10:524:10 | T | -| main.rs:533:14:533:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:533:14:533:18 | SelfParam | &T | main.rs:517:5:518:22 | S3 | -| main.rs:533:14:533:18 | SelfParam | &T.T3 | main.rs:531:10:531:10 | T | +| main.rs:521:14:521:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:521:14:521:18 | SelfParam | TRef | main.rs:520:5:522:5 | Self [trait OverlappingTrait2] | +| main.rs:521:21:521:21 | x | | {EXTERNAL LOCATION} | & | +| main.rs:521:21:521:21 | x | TRef | main.rs:520:29:520:29 | T | +| main.rs:526:14:526:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:526:14:526:18 | SelfParam | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:526:14:526:18 | SelfParam | TRef.T3 | main.rs:524:10:524:10 | T | +| main.rs:526:21:526:21 | x | | {EXTERNAL LOCATION} | & | +| main.rs:526:21:526:21 | x | TRef | main.rs:524:10:524:10 | T | +| main.rs:526:37:528:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:526:37:528:9 | { ... } | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:526:37:528:9 | { ... } | TRef.T3 | main.rs:524:10:524:10 | T | +| main.rs:527:13:527:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:527:13:527:16 | self | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:527:13:527:16 | self | TRef.T3 | main.rs:524:10:524:10 | T | +| main.rs:533:14:533:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:533:14:533:18 | SelfParam | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:533:14:533:18 | SelfParam | TRef.T3 | main.rs:531:10:531:10 | T | | main.rs:533:21:533:21 | x | | main.rs:531:10:531:10 | T | -| main.rs:533:36:535:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:533:36:535:9 | { ... } | &T | main.rs:517:5:518:22 | S3 | -| main.rs:533:36:535:9 | { ... } | &T.T3 | main.rs:531:10:531:10 | T | -| main.rs:534:13:534:16 | self | | file://:0:0:0:0 | & | -| main.rs:534:13:534:16 | self | &T | main.rs:517:5:518:22 | S3 | -| main.rs:534:13:534:16 | self | &T.T3 | main.rs:531:10:531:10 | T | -| main.rs:540:14:540:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:540:14:540:18 | SelfParam | &T | main.rs:538:5:541:5 | Self [trait MyTrait1] | -| main.rs:540:21:540:22 | { ... } | | file://:0:0:0:0 | () | -| main.rs:550:14:550:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:550:14:550:18 | SelfParam | &T | main.rs:545:5:546:14 | S4 | -| main.rs:550:21:550:22 | { ... } | | file://:0:0:0:0 | () | -| main.rs:560:14:560:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:560:14:560:18 | SelfParam | &T | main.rs:555:5:556:22 | S5 | -| main.rs:560:14:560:18 | SelfParam | &T.T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:560:21:560:22 | { ... } | | file://:0:0:0:0 | () | -| main.rs:569:16:595:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:533:36:535:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:533:36:535:9 | { ... } | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:533:36:535:9 | { ... } | TRef.T3 | main.rs:531:10:531:10 | T | +| main.rs:534:13:534:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:534:13:534:16 | self | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:534:13:534:16 | self | TRef.T3 | main.rs:531:10:531:10 | T | +| main.rs:540:14:540:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:540:14:540:18 | SelfParam | TRef | main.rs:538:5:541:5 | Self [trait MyTrait1] | +| main.rs:540:21:540:22 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:550:14:550:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:550:14:550:18 | SelfParam | TRef | main.rs:545:5:546:14 | S4 | +| main.rs:550:21:550:22 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:560:14:560:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:560:14:560:18 | SelfParam | TRef | main.rs:555:5:556:22 | S5 | +| main.rs:560:14:560:18 | SelfParam | TRef.T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:560:21:560:22 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:569:16:595:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:570:13:570:13 | x | | main.rs:446:5:447:14 | S1 | | main.rs:570:17:570:18 | S1 | | main.rs:446:5:447:14 | S1 | -| main.rs:571:18:571:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:571:18:571:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:571:18:571:42 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:571:18:571:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:571:18:571:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:571:18:571:42 | { ... } | | file://:0:0:0:0 | () | +| main.rs:571:18:571:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:571:18:571:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:571:18:571:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:571:18:571:42 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:571:26:571:26 | x | | main.rs:446:5:447:14 | S1 | | main.rs:571:26:571:42 | x.common_method() | | main.rs:446:5:447:14 | S1 | -| main.rs:572:18:572:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:572:18:572:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:572:18:572:45 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:572:18:572:45 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:572:18:572:45 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:572:18:572:45 | { ... } | | file://:0:0:0:0 | () | +| main.rs:572:18:572:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:572:18:572:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:572:18:572:45 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:572:18:572:45 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:572:26:572:45 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | | main.rs:572:44:572:44 | x | | main.rs:446:5:447:14 | S1 | -| main.rs:573:18:573:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:573:18:573:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:573:18:573:44 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:573:18:573:44 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:573:18:573:44 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:573:18:573:44 | { ... } | | file://:0:0:0:0 | () | +| main.rs:573:18:573:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:573:18:573:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:573:18:573:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:573:18:573:44 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:573:26:573:26 | x | | main.rs:446:5:447:14 | S1 | | main.rs:573:26:573:44 | x.common_method_2() | | main.rs:446:5:447:14 | S1 | -| main.rs:574:18:574:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:574:18:574:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:574:18:574:47 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:574:18:574:47 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:574:18:574:47 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:574:18:574:47 | { ... } | | file://:0:0:0:0 | () | +| main.rs:574:18:574:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:574:18:574:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:574:18:574:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:574:18:574:47 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:574:26:574:47 | ...::common_method_2(...) | | main.rs:446:5:447:14 | S1 | | main.rs:574:46:574:46 | x | | main.rs:446:5:447:14 | S1 | | main.rs:576:13:576:13 | y | | main.rs:479:5:479:22 | S2 | @@ -2035,21 +6425,17 @@ inferType | main.rs:576:17:576:22 | S2(...) | | main.rs:479:5:479:22 | S2 | | main.rs:576:17:576:22 | S2(...) | T2 | main.rs:446:5:447:14 | S1 | | main.rs:576:20:576:21 | S1 | | main.rs:446:5:447:14 | S1 | -| main.rs:577:18:577:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:577:18:577:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:577:18:577:42 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:577:18:577:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:577:18:577:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:577:18:577:42 | { ... } | | file://:0:0:0:0 | () | +| main.rs:577:18:577:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:577:18:577:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:577:18:577:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:577:18:577:42 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:577:26:577:26 | y | | main.rs:479:5:479:22 | S2 | | main.rs:577:26:577:26 | y | T2 | main.rs:446:5:447:14 | S1 | | main.rs:577:26:577:42 | y.common_method() | | main.rs:446:5:447:14 | S1 | -| main.rs:578:18:578:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:578:18:578:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:578:18:578:56 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:578:18:578:56 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:578:18:578:56 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:578:18:578:56 | { ... } | | file://:0:0:0:0 | () | +| main.rs:578:18:578:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:578:18:578:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:578:18:578:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:578:18:578:56 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:578:26:578:56 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | | main.rs:578:50:578:55 | S2(...) | | main.rs:479:5:479:22 | S2 | | main.rs:578:50:578:55 | S2(...) | T2 | main.rs:446:5:447:14 | S1 | @@ -2059,31 +6445,25 @@ inferType | main.rs:580:17:580:21 | S2(...) | | main.rs:479:5:479:22 | S2 | | main.rs:580:17:580:21 | S2(...) | T2 | {EXTERNAL LOCATION} | i32 | | main.rs:580:20:580:20 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:581:18:581:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:581:18:581:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:581:18:581:42 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:581:18:581:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:581:18:581:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:581:18:581:42 | { ... } | | file://:0:0:0:0 | () | +| main.rs:581:18:581:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:581:18:581:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:581:18:581:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:581:18:581:42 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:581:26:581:26 | z | | main.rs:479:5:479:22 | S2 | | main.rs:581:26:581:26 | z | T2 | {EXTERNAL LOCATION} | i32 | | main.rs:581:26:581:42 | z.common_method() | | main.rs:446:5:447:14 | S1 | -| main.rs:582:18:582:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:582:18:582:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:582:18:582:49 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:582:18:582:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:582:18:582:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:582:18:582:49 | { ... } | | file://:0:0:0:0 | () | +| main.rs:582:18:582:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:582:18:582:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:582:18:582:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:582:18:582:49 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:582:26:582:49 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | | main.rs:582:44:582:48 | S2(...) | | main.rs:479:5:479:22 | S2 | | main.rs:582:44:582:48 | S2(...) | T2 | {EXTERNAL LOCATION} | i32 | | main.rs:582:47:582:47 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:583:18:583:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:583:18:583:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:583:18:583:56 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:583:18:583:56 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:583:18:583:56 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:583:18:583:56 | { ... } | | file://:0:0:0:0 | () | +| main.rs:583:18:583:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:583:18:583:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:583:18:583:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:583:18:583:56 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:583:26:583:56 | ...::common_method(...) | | main.rs:446:5:447:14 | S1 | | main.rs:583:51:583:55 | S2(...) | | main.rs:479:5:479:22 | S2 | | main.rs:583:51:583:55 | S2(...) | T2 | {EXTERNAL LOCATION} | i32 | @@ -2093,128 +6473,114 @@ inferType | main.rs:585:17:585:22 | S3(...) | | main.rs:517:5:518:22 | S3 | | main.rs:585:17:585:22 | S3(...) | T3 | main.rs:446:5:447:14 | S1 | | main.rs:585:20:585:21 | S1 | | main.rs:446:5:447:14 | S1 | -| main.rs:586:18:586:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:586:18:586:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:586:18:586:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:586:18:586:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:586:18:586:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:586:18:586:31 | { ... } | | file://:0:0:0:0 | () | +| main.rs:586:18:586:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:586:18:586:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:586:18:586:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:586:18:586:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:586:26:586:26 | w | | main.rs:517:5:518:22 | S3 | | main.rs:586:26:586:26 | w | T3 | main.rs:446:5:447:14 | S1 | -| main.rs:586:26:586:31 | w.m(...) | | file://:0:0:0:0 | & | -| main.rs:586:26:586:31 | w.m(...) | &T | main.rs:517:5:518:22 | S3 | -| main.rs:586:26:586:31 | w.m(...) | &T.T3 | main.rs:446:5:447:14 | S1 | +| main.rs:586:26:586:31 | w.m(...) | | {EXTERNAL LOCATION} | & | +| main.rs:586:26:586:31 | w.m(...) | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:586:26:586:31 | w.m(...) | TRef.T3 | main.rs:446:5:447:14 | S1 | | main.rs:586:30:586:30 | x | | main.rs:446:5:447:14 | S1 | -| main.rs:587:18:587:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:587:18:587:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:587:18:587:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:587:18:587:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:587:18:587:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:587:18:587:37 | { ... } | | file://:0:0:0:0 | () | -| main.rs:587:26:587:37 | ...::m(...) | | file://:0:0:0:0 | & | -| main.rs:587:26:587:37 | ...::m(...) | &T | main.rs:517:5:518:22 | S3 | -| main.rs:587:26:587:37 | ...::m(...) | &T.T3 | main.rs:446:5:447:14 | S1 | -| main.rs:587:32:587:33 | &w | | file://:0:0:0:0 | & | -| main.rs:587:32:587:33 | &w | &T | main.rs:517:5:518:22 | S3 | -| main.rs:587:32:587:33 | &w | &T.T3 | main.rs:446:5:447:14 | S1 | +| main.rs:587:18:587:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:587:18:587:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:587:18:587:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:587:18:587:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:587:26:587:37 | ...::m(...) | | {EXTERNAL LOCATION} | & | +| main.rs:587:26:587:37 | ...::m(...) | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:587:26:587:37 | ...::m(...) | TRef.T3 | main.rs:446:5:447:14 | S1 | +| main.rs:587:32:587:33 | &w | | {EXTERNAL LOCATION} | & | +| main.rs:587:32:587:33 | &w | TRef | main.rs:517:5:518:22 | S3 | +| main.rs:587:32:587:33 | &w | TRef.T3 | main.rs:446:5:447:14 | S1 | | main.rs:587:33:587:33 | w | | main.rs:517:5:518:22 | S3 | | main.rs:587:33:587:33 | w | T3 | main.rs:446:5:447:14 | S1 | | main.rs:587:36:587:36 | x | | main.rs:446:5:447:14 | S1 | | main.rs:589:9:589:10 | S4 | | main.rs:545:5:546:14 | S4 | -| main.rs:589:9:589:14 | S4.m() | | file://:0:0:0:0 | () | -| main.rs:590:9:590:18 | ...::m(...) | | file://:0:0:0:0 | () | -| main.rs:590:15:590:17 | &S4 | | file://:0:0:0:0 | & | -| main.rs:590:15:590:17 | &S4 | &T | main.rs:545:5:546:14 | S4 | +| main.rs:589:9:589:14 | S4.m() | | {EXTERNAL LOCATION} | () | +| main.rs:590:9:590:18 | ...::m(...) | | {EXTERNAL LOCATION} | () | +| main.rs:590:15:590:17 | &S4 | | {EXTERNAL LOCATION} | & | +| main.rs:590:15:590:17 | &S4 | TRef | main.rs:545:5:546:14 | S4 | | main.rs:590:16:590:17 | S4 | | main.rs:545:5:546:14 | S4 | | main.rs:591:9:591:16 | S5(...) | | main.rs:555:5:556:22 | S5 | | main.rs:591:9:591:16 | S5(...) | T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:591:9:591:20 | ... .m() | | file://:0:0:0:0 | () | +| main.rs:591:9:591:20 | ... .m() | | {EXTERNAL LOCATION} | () | | main.rs:591:12:591:15 | 0i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:592:9:592:24 | ...::m(...) | | file://:0:0:0:0 | () | -| main.rs:592:15:592:23 | &... | | file://:0:0:0:0 | & | -| main.rs:592:15:592:23 | &... | &T | main.rs:555:5:556:22 | S5 | -| main.rs:592:15:592:23 | &... | &T.T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:592:9:592:24 | ...::m(...) | | {EXTERNAL LOCATION} | () | +| main.rs:592:15:592:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:592:15:592:23 | &... | TRef | main.rs:555:5:556:22 | S5 | +| main.rs:592:15:592:23 | &... | TRef.T5 | {EXTERNAL LOCATION} | i32 | | main.rs:592:16:592:23 | S5(...) | | main.rs:555:5:556:22 | S5 | | main.rs:592:16:592:23 | S5(...) | T5 | {EXTERNAL LOCATION} | i32 | | main.rs:592:19:592:22 | 0i32 | | {EXTERNAL LOCATION} | i32 | | main.rs:593:9:593:16 | S5(...) | | main.rs:555:5:556:22 | S5 | | main.rs:593:9:593:16 | S5(...) | T5 | {EXTERNAL LOCATION} | bool | -| main.rs:593:9:593:20 | ... .m() | | file://:0:0:0:0 | () | +| main.rs:593:9:593:20 | ... .m() | | {EXTERNAL LOCATION} | () | | main.rs:593:12:593:15 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:594:9:594:24 | ...::m(...) | | file://:0:0:0:0 | () | -| main.rs:594:15:594:23 | &... | | file://:0:0:0:0 | & | -| main.rs:594:15:594:23 | &... | &T | main.rs:555:5:556:22 | S5 | -| main.rs:594:15:594:23 | &... | &T.T5 | {EXTERNAL LOCATION} | bool | +| main.rs:594:9:594:24 | ...::m(...) | | {EXTERNAL LOCATION} | () | +| main.rs:594:15:594:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:594:15:594:23 | &... | TRef | main.rs:555:5:556:22 | S5 | +| main.rs:594:15:594:23 | &... | TRef.T5 | {EXTERNAL LOCATION} | bool | | main.rs:594:16:594:23 | S5(...) | | main.rs:555:5:556:22 | S5 | | main.rs:594:16:594:23 | S5(...) | T5 | {EXTERNAL LOCATION} | bool | | main.rs:594:19:594:22 | true | | {EXTERNAL LOCATION} | bool | | main.rs:611:19:611:22 | SelfParam | | main.rs:609:5:612:5 | Self [trait FirstTrait] | | main.rs:616:19:616:22 | SelfParam | | main.rs:614:5:617:5 | Self [trait SecondTrait] | | main.rs:619:64:619:64 | x | | main.rs:619:45:619:61 | T | -| main.rs:619:70:623:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:619:70:623:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:621:13:621:14 | s1 | | main.rs:619:35:619:42 | I | | main.rs:621:18:621:18 | x | | main.rs:619:45:619:61 | T | | main.rs:621:18:621:27 | x.method() | | main.rs:619:35:619:42 | I | -| main.rs:622:18:622:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:622:18:622:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:622:18:622:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:622:18:622:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:622:18:622:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:622:18:622:27 | { ... } | | file://:0:0:0:0 | () | +| main.rs:622:18:622:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:622:18:622:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:622:18:622:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:622:18:622:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:622:26:622:27 | s1 | | main.rs:619:35:619:42 | I | | main.rs:625:65:625:65 | x | | main.rs:625:46:625:62 | T | -| main.rs:625:71:629:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:625:71:629:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:627:13:627:14 | s2 | | main.rs:625:36:625:43 | I | | main.rs:627:18:627:18 | x | | main.rs:625:46:625:62 | T | | main.rs:627:18:627:27 | x.method() | | main.rs:625:36:625:43 | I | -| main.rs:628:18:628:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:628:18:628:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:628:18:628:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:628:18:628:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:628:18:628:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:628:18:628:27 | { ... } | | file://:0:0:0:0 | () | +| main.rs:628:18:628:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:628:18:628:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:628:18:628:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:628:18:628:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:628:26:628:27 | s2 | | main.rs:625:36:625:43 | I | | main.rs:631:49:631:49 | x | | main.rs:631:30:631:46 | T | -| main.rs:631:55:634:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:631:55:634:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:632:13:632:13 | s | | main.rs:601:5:602:14 | S1 | | main.rs:632:17:632:17 | x | | main.rs:631:30:631:46 | T | | main.rs:632:17:632:26 | x.method() | | main.rs:601:5:602:14 | S1 | -| main.rs:633:18:633:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:633:18:633:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:633:18:633:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:633:18:633:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:633:18:633:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:633:18:633:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:633:18:633:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:633:18:633:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:633:18:633:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:633:18:633:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:633:26:633:26 | s | | main.rs:601:5:602:14 | S1 | | main.rs:636:53:636:53 | x | | main.rs:636:34:636:50 | T | -| main.rs:636:59:639:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:636:59:639:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:637:13:637:13 | s | | main.rs:601:5:602:14 | S1 | | main.rs:637:17:637:17 | x | | main.rs:636:34:636:50 | T | | main.rs:637:17:637:26 | x.method() | | main.rs:601:5:602:14 | S1 | -| main.rs:638:18:638:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:638:18:638:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:638:18:638:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:638:18:638:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:638:18:638:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:638:18:638:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:638:18:638:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:638:18:638:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:638:18:638:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:638:18:638:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:638:26:638:26 | s | | main.rs:601:5:602:14 | S1 | | main.rs:641:43:641:43 | x | | main.rs:641:40:641:40 | T | -| main.rs:644:5:647:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:644:5:647:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:645:13:645:13 | s | | main.rs:601:5:602:14 | S1 | | main.rs:645:17:645:17 | x | | main.rs:641:40:641:40 | T | | main.rs:645:17:645:26 | x.method() | | main.rs:601:5:602:14 | S1 | -| main.rs:646:18:646:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:646:18:646:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:646:18:646:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:646:18:646:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:646:18:646:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:646:18:646:26 | { ... } | | file://:0:0:0:0 | () | +| main.rs:646:18:646:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:646:18:646:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:646:18:646:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:646:18:646:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:646:26:646:26 | s | | main.rs:601:5:602:14 | S1 | | main.rs:650:16:650:19 | SelfParam | | main.rs:649:5:653:5 | Self [trait Pair] | | main.rs:652:16:652:19 | SelfParam | | main.rs:649:5:653:5 | Self [trait Pair] | | main.rs:655:53:655:53 | x | | main.rs:655:50:655:50 | T | | main.rs:655:59:655:59 | y | | main.rs:655:50:655:50 | T | -| main.rs:659:5:662:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:659:5:662:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:660:13:660:13 | _ | | main.rs:601:5:602:14 | S1 | | main.rs:660:17:660:17 | x | | main.rs:655:50:655:50 | T | | main.rs:660:17:660:23 | x.fst() | | main.rs:601:5:602:14 | S1 | @@ -2223,79 +6589,71 @@ inferType | main.rs:661:17:661:26 | y.method() | | main.rs:601:5:602:14 | S1 | | main.rs:664:58:664:58 | x | | main.rs:664:41:664:55 | T | | main.rs:664:64:664:64 | y | | main.rs:664:41:664:55 | T | -| main.rs:664:70:669:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:664:70:669:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:666:13:666:14 | s1 | | main.rs:601:5:602:14 | S1 | | main.rs:666:18:666:18 | x | | main.rs:664:41:664:55 | T | | main.rs:666:18:666:24 | x.fst() | | main.rs:601:5:602:14 | S1 | | main.rs:667:13:667:14 | s2 | | main.rs:604:5:605:14 | S2 | | main.rs:667:18:667:18 | y | | main.rs:664:41:664:55 | T | | main.rs:667:18:667:24 | y.snd() | | main.rs:604:5:605:14 | S2 | -| main.rs:668:18:668:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:668:18:668:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:668:18:668:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:668:18:668:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:668:18:668:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:668:18:668:37 | { ... } | | file://:0:0:0:0 | () | +| main.rs:668:18:668:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:668:18:668:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:668:18:668:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:668:18:668:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:668:32:668:33 | s1 | | main.rs:601:5:602:14 | S1 | | main.rs:668:36:668:37 | s2 | | main.rs:604:5:605:14 | S2 | | main.rs:671:69:671:69 | x | | main.rs:671:52:671:66 | T | | main.rs:671:75:671:75 | y | | main.rs:671:52:671:66 | T | -| main.rs:671:81:676:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:671:81:676:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:673:13:673:14 | s1 | | main.rs:601:5:602:14 | S1 | | main.rs:673:18:673:18 | x | | main.rs:671:52:671:66 | T | | main.rs:673:18:673:24 | x.fst() | | main.rs:601:5:602:14 | S1 | | main.rs:674:13:674:14 | s2 | | main.rs:671:41:671:49 | T2 | | main.rs:674:18:674:18 | y | | main.rs:671:52:671:66 | T | | main.rs:674:18:674:24 | y.snd() | | main.rs:671:41:671:49 | T2 | -| main.rs:675:18:675:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:675:18:675:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:675:18:675:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:675:18:675:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:675:18:675:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:675:18:675:37 | { ... } | | file://:0:0:0:0 | () | +| main.rs:675:18:675:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:675:18:675:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:675:18:675:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:675:18:675:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:675:32:675:33 | s1 | | main.rs:601:5:602:14 | S1 | | main.rs:675:36:675:37 | s2 | | main.rs:671:41:671:49 | T2 | | main.rs:678:50:678:50 | x | | main.rs:678:41:678:47 | T | | main.rs:678:56:678:56 | y | | main.rs:678:41:678:47 | T | -| main.rs:678:62:683:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:678:62:683:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:680:13:680:14 | s1 | | {EXTERNAL LOCATION} | bool | | main.rs:680:18:680:18 | x | | main.rs:678:41:678:47 | T | | main.rs:680:18:680:24 | x.fst() | | {EXTERNAL LOCATION} | bool | | main.rs:681:13:681:14 | s2 | | {EXTERNAL LOCATION} | i64 | | main.rs:681:18:681:18 | y | | main.rs:678:41:678:47 | T | | main.rs:681:18:681:24 | y.snd() | | {EXTERNAL LOCATION} | i64 | -| main.rs:682:18:682:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:682:18:682:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:682:18:682:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:682:18:682:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:682:18:682:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:682:18:682:37 | { ... } | | file://:0:0:0:0 | () | +| main.rs:682:18:682:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:682:18:682:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:682:18:682:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:682:18:682:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:682:32:682:33 | s1 | | {EXTERNAL LOCATION} | bool | | main.rs:682:36:682:37 | s2 | | {EXTERNAL LOCATION} | i64 | | main.rs:685:54:685:54 | x | | main.rs:685:41:685:51 | T | | main.rs:685:60:685:60 | y | | main.rs:685:41:685:51 | T | -| main.rs:685:66:690:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:685:66:690:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:687:13:687:14 | s1 | | {EXTERNAL LOCATION} | u8 | | main.rs:687:18:687:18 | x | | main.rs:685:41:685:51 | T | | main.rs:687:18:687:24 | x.fst() | | {EXTERNAL LOCATION} | u8 | | main.rs:688:13:688:14 | s2 | | {EXTERNAL LOCATION} | i64 | | main.rs:688:18:688:18 | y | | main.rs:685:41:685:51 | T | | main.rs:688:18:688:24 | y.snd() | | {EXTERNAL LOCATION} | i64 | -| main.rs:689:18:689:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:689:18:689:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:689:18:689:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:689:18:689:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:689:18:689:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:689:18:689:37 | { ... } | | file://:0:0:0:0 | () | +| main.rs:689:18:689:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:689:18:689:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:689:18:689:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:689:18:689:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:689:32:689:33 | s1 | | {EXTERNAL LOCATION} | u8 | | main.rs:689:36:689:37 | s2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:697:18:697:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:697:18:697:22 | SelfParam | &T | main.rs:694:5:698:5 | Self [trait TraitWithSelfTp] | -| main.rs:700:40:700:44 | thing | | file://:0:0:0:0 | & | -| main.rs:700:40:700:44 | thing | &T | main.rs:700:17:700:37 | T | +| main.rs:697:18:697:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:697:18:697:22 | SelfParam | TRef | main.rs:694:5:698:5 | Self [trait TraitWithSelfTp] | +| main.rs:700:40:700:44 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:700:40:700:44 | thing | TRef | main.rs:700:17:700:37 | T | | main.rs:700:56:702:5 | { ... } | | main.rs:700:14:700:14 | A | -| main.rs:701:9:701:13 | thing | | file://:0:0:0:0 | & | -| main.rs:701:9:701:13 | thing | &T | main.rs:700:17:700:37 | T | +| main.rs:701:9:701:13 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:701:9:701:13 | thing | TRef | main.rs:700:17:700:37 | T | | main.rs:701:9:701:21 | thing.get_a() | | main.rs:700:14:700:14 | A | | main.rs:705:44:705:48 | thing | | main.rs:705:24:705:41 | S | | main.rs:705:61:708:5 | { ... } | | {EXTERNAL LOCATION} | i64 | @@ -2306,26 +6664,26 @@ inferType | main.rs:706:19:706:31 | thing.get_a() | T | main.rs:705:24:705:41 | S | | main.rs:707:9:707:9 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:707:9:707:9 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:713:55:713:59 | thing | | file://:0:0:0:0 | & | -| main.rs:713:55:713:59 | thing | &T | main.rs:713:25:713:52 | S | -| main.rs:713:66:716:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:713:55:713:59 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:713:55:713:59 | thing | TRef | main.rs:713:25:713:52 | S | +| main.rs:713:66:716:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:715:13:715:15 | _ms | | {EXTERNAL LOCATION} | Option | | main.rs:715:13:715:15 | _ms | T | main.rs:713:25:713:52 | S | | main.rs:715:19:715:30 | get_a(...) | | {EXTERNAL LOCATION} | Option | | main.rs:715:19:715:30 | get_a(...) | T | main.rs:713:25:713:52 | S | -| main.rs:715:25:715:29 | thing | | file://:0:0:0:0 | & | -| main.rs:715:25:715:29 | thing | &T | main.rs:713:25:713:52 | S | -| main.rs:724:18:724:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:724:18:724:22 | SelfParam | &T | main.rs:718:5:720:5 | MyStruct | +| main.rs:715:25:715:29 | thing | | {EXTERNAL LOCATION} | & | +| main.rs:715:25:715:29 | thing | TRef | main.rs:713:25:713:52 | S | +| main.rs:724:18:724:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:724:18:724:22 | SelfParam | TRef | main.rs:718:5:720:5 | MyStruct | | main.rs:724:41:726:9 | { ... } | | {EXTERNAL LOCATION} | Option | | main.rs:724:41:726:9 | { ... } | T | main.rs:718:5:720:5 | MyStruct | | main.rs:725:13:725:48 | Some(...) | | {EXTERNAL LOCATION} | Option | | main.rs:725:13:725:48 | Some(...) | T | main.rs:718:5:720:5 | MyStruct | | main.rs:725:18:725:47 | MyStruct {...} | | main.rs:718:5:720:5 | MyStruct | -| main.rs:725:36:725:39 | self | | file://:0:0:0:0 | & | -| main.rs:725:36:725:39 | self | &T | main.rs:718:5:720:5 | MyStruct | +| main.rs:725:36:725:39 | self | | {EXTERNAL LOCATION} | & | +| main.rs:725:36:725:39 | self | TRef | main.rs:718:5:720:5 | MyStruct | | main.rs:725:36:725:45 | self.value | | {EXTERNAL LOCATION} | i32 | -| main.rs:731:19:734:5 | { ... } | | file://:0:0:0:0 | () | +| main.rs:731:19:734:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:732:13:732:13 | s | | main.rs:718:5:720:5 | MyStruct | | main.rs:732:17:732:37 | MyStruct {...} | | main.rs:718:5:720:5 | MyStruct | | main.rs:732:35:732:35 | 0 | | {EXTERNAL LOCATION} | i32 | @@ -2333,8 +6691,8 @@ inferType | main.rs:733:13:733:15 | _ms | T | main.rs:718:5:720:5 | MyStruct | | main.rs:733:19:733:27 | get_a(...) | | {EXTERNAL LOCATION} | Option | | main.rs:733:19:733:27 | get_a(...) | T | main.rs:718:5:720:5 | MyStruct | -| main.rs:733:25:733:26 | &s | | file://:0:0:0:0 | & | -| main.rs:733:25:733:26 | &s | &T | main.rs:718:5:720:5 | MyStruct | +| main.rs:733:25:733:26 | &s | | {EXTERNAL LOCATION} | & | +| main.rs:733:25:733:26 | &s | TRef | main.rs:718:5:720:5 | MyStruct | | main.rs:733:26:733:26 | s | | main.rs:718:5:720:5 | MyStruct | | main.rs:749:15:749:18 | SelfParam | | main.rs:748:5:759:5 | Self [trait MyTrait] | | main.rs:751:15:751:18 | SelfParam | | main.rs:748:5:759:5 | Self [trait MyTrait] | @@ -2342,4342 +6700,4565 @@ inferType | main.rs:755:13:755:16 | self | | main.rs:748:5:759:5 | Self [trait MyTrait] | | main.rs:755:13:755:21 | self.m1() | | main.rs:748:19:748:19 | A | | main.rs:758:18:758:18 | x | | main.rs:748:5:759:5 | Self [trait MyTrait] | -| main.rs:763:50:763:50 | x | | main.rs:763:26:763:47 | T2 | -| main.rs:763:63:766:5 | { ... } | | main.rs:763:22:763:23 | T1 | -| main.rs:764:9:764:9 | x | | main.rs:763:26:763:47 | T2 | -| main.rs:764:9:764:14 | x.m1() | | main.rs:763:22:763:23 | T1 | -| main.rs:765:9:765:9 | x | | main.rs:763:26:763:47 | T2 | -| main.rs:765:9:765:14 | x.m1() | | main.rs:763:22:763:23 | T1 | -| main.rs:767:52:767:52 | x | | main.rs:767:28:767:49 | T2 | -| main.rs:767:65:771:5 | { ... } | | main.rs:767:24:767:25 | T1 | -| main.rs:768:13:768:13 | y | | main.rs:767:24:767:25 | T1 | -| main.rs:768:17:768:25 | ...::m1(...) | | main.rs:767:24:767:25 | T1 | -| main.rs:768:24:768:24 | x | | main.rs:767:28:767:49 | T2 | -| main.rs:769:9:769:9 | y | | main.rs:767:24:767:25 | T1 | -| main.rs:770:9:770:17 | ...::m1(...) | | main.rs:767:24:767:25 | T1 | -| main.rs:770:16:770:16 | x | | main.rs:767:28:767:49 | T2 | -| main.rs:772:52:772:52 | x | | main.rs:772:28:772:49 | T2 | -| main.rs:772:65:776:5 | { ... } | | main.rs:772:24:772:25 | T1 | -| main.rs:773:13:773:13 | y | | main.rs:772:24:772:25 | T1 | -| main.rs:773:17:773:30 | ...::m1(...) | | main.rs:772:24:772:25 | T1 | -| main.rs:773:29:773:29 | x | | main.rs:772:28:772:49 | T2 | -| main.rs:774:9:774:9 | y | | main.rs:772:24:772:25 | T1 | -| main.rs:775:9:775:22 | ...::m1(...) | | main.rs:772:24:772:25 | T1 | -| main.rs:775:21:775:21 | x | | main.rs:772:28:772:49 | T2 | -| main.rs:777:55:777:55 | x | | main.rs:777:31:777:52 | T2 | -| main.rs:777:68:781:5 | { ... } | | main.rs:777:27:777:28 | T1 | -| main.rs:778:13:778:13 | y | | main.rs:777:27:777:28 | T1 | -| main.rs:778:17:778:28 | ...::assoc(...) | | main.rs:777:27:777:28 | T1 | -| main.rs:778:27:778:27 | x | | main.rs:777:31:777:52 | T2 | -| main.rs:779:9:779:9 | y | | main.rs:777:27:777:28 | T1 | -| main.rs:780:9:780:20 | ...::assoc(...) | | main.rs:777:27:777:28 | T1 | -| main.rs:780:19:780:19 | x | | main.rs:777:31:777:52 | T2 | -| main.rs:782:55:782:55 | x | | main.rs:782:31:782:52 | T2 | -| main.rs:782:68:786:5 | { ... } | | main.rs:782:27:782:28 | T1 | -| main.rs:783:13:783:13 | y | | main.rs:782:27:782:28 | T1 | -| main.rs:783:17:783:33 | ...::assoc(...) | | main.rs:782:27:782:28 | T1 | -| main.rs:783:32:783:32 | x | | main.rs:782:31:782:52 | T2 | -| main.rs:784:9:784:9 | y | | main.rs:782:27:782:28 | T1 | -| main.rs:785:9:785:25 | ...::assoc(...) | | main.rs:782:27:782:28 | T1 | -| main.rs:785:24:785:24 | x | | main.rs:782:31:782:52 | T2 | -| main.rs:790:49:790:49 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:790:49:790:49 | x | T | main.rs:790:32:790:46 | T2 | -| main.rs:790:71:792:5 | { ... } | | main.rs:790:28:790:29 | T1 | -| main.rs:791:9:791:9 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:791:9:791:9 | x | T | main.rs:790:32:790:46 | T2 | -| main.rs:791:9:791:11 | x.a | | main.rs:790:32:790:46 | T2 | -| main.rs:791:9:791:16 | ... .m1() | | main.rs:790:28:790:29 | T1 | -| main.rs:793:51:793:51 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:793:51:793:51 | x | T | main.rs:793:34:793:48 | T2 | -| main.rs:793:73:795:5 | { ... } | | main.rs:793:30:793:31 | T1 | -| main.rs:794:9:794:19 | ...::m1(...) | | main.rs:793:30:793:31 | T1 | -| main.rs:794:16:794:16 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:794:16:794:16 | x | T | main.rs:793:34:793:48 | T2 | -| main.rs:794:16:794:18 | x.a | | main.rs:793:34:793:48 | T2 | -| main.rs:796:51:796:51 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:796:51:796:51 | x | T | main.rs:796:34:796:48 | T2 | -| main.rs:796:73:798:5 | { ... } | | main.rs:796:30:796:31 | T1 | -| main.rs:797:9:797:24 | ...::m1(...) | | main.rs:796:30:796:31 | T1 | -| main.rs:797:21:797:21 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:797:21:797:21 | x | T | main.rs:796:34:796:48 | T2 | -| main.rs:797:21:797:23 | x.a | | main.rs:796:34:796:48 | T2 | -| main.rs:801:15:801:18 | SelfParam | | main.rs:738:5:741:5 | MyThing | -| main.rs:801:15:801:18 | SelfParam | T | main.rs:800:10:800:10 | T | -| main.rs:801:26:803:9 | { ... } | | main.rs:800:10:800:10 | T | -| main.rs:802:13:802:16 | self | | main.rs:738:5:741:5 | MyThing | -| main.rs:802:13:802:16 | self | T | main.rs:800:10:800:10 | T | -| main.rs:802:13:802:18 | self.a | | main.rs:800:10:800:10 | T | -| main.rs:805:18:805:18 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:805:18:805:18 | x | T | main.rs:800:10:800:10 | T | -| main.rs:805:32:807:9 | { ... } | | main.rs:800:10:800:10 | T | -| main.rs:806:13:806:13 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:806:13:806:13 | x | T | main.rs:800:10:800:10 | T | -| main.rs:806:13:806:15 | x.a | | main.rs:800:10:800:10 | T | -| main.rs:810:16:866:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:811:13:811:13 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:811:13:811:13 | x | T | main.rs:743:5:744:14 | S1 | -| main.rs:811:17:811:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:811:17:811:33 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | -| main.rs:811:30:811:31 | S1 | | main.rs:743:5:744:14 | S1 | -| main.rs:812:13:812:13 | y | | main.rs:738:5:741:5 | MyThing | -| main.rs:812:13:812:13 | y | T | main.rs:745:5:746:14 | S2 | -| main.rs:812:17:812:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:812:17:812:33 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | -| main.rs:812:30:812:31 | S2 | | main.rs:745:5:746:14 | S2 | -| main.rs:814:18:814:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:814:18:814:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:814:18:814:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:814:18:814:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:814:18:814:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:814:18:814:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:814:26:814:26 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:814:26:814:26 | x | T | main.rs:743:5:744:14 | S1 | -| main.rs:814:26:814:31 | x.m1() | | main.rs:743:5:744:14 | S1 | -| main.rs:815:18:815:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:815:18:815:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:815:18:815:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:815:18:815:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:815:18:815:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:815:18:815:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:815:26:815:26 | y | | main.rs:738:5:741:5 | MyThing | -| main.rs:815:26:815:26 | y | T | main.rs:745:5:746:14 | S2 | -| main.rs:815:26:815:31 | y.m1() | | main.rs:745:5:746:14 | S2 | -| main.rs:817:13:817:13 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:817:13:817:13 | x | T | main.rs:743:5:744:14 | S1 | -| main.rs:817:17:817:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:817:17:817:33 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | -| main.rs:817:30:817:31 | S1 | | main.rs:743:5:744:14 | S1 | -| main.rs:818:13:818:13 | y | | main.rs:738:5:741:5 | MyThing | -| main.rs:818:13:818:13 | y | T | main.rs:745:5:746:14 | S2 | -| main.rs:818:17:818:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:818:17:818:33 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | -| main.rs:818:30:818:31 | S2 | | main.rs:745:5:746:14 | S2 | -| main.rs:820:18:820:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:820:18:820:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:820:18:820:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:820:18:820:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:820:18:820:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:820:18:820:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:820:26:820:26 | x | | main.rs:738:5:741:5 | MyThing | -| main.rs:820:26:820:26 | x | T | main.rs:743:5:744:14 | S1 | -| main.rs:820:26:820:31 | x.m2() | | main.rs:743:5:744:14 | S1 | -| main.rs:821:18:821:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:821:18:821:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:821:18:821:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:821:18:821:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:821:18:821:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:821:18:821:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:821:26:821:26 | y | | main.rs:738:5:741:5 | MyThing | -| main.rs:821:26:821:26 | y | T | main.rs:745:5:746:14 | S2 | -| main.rs:821:26:821:31 | y.m2() | | main.rs:745:5:746:14 | S2 | -| main.rs:823:13:823:14 | x2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:823:13:823:14 | x2 | T | main.rs:743:5:744:14 | S1 | -| main.rs:823:18:823:34 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:823:18:823:34 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | -| main.rs:823:31:823:32 | S1 | | main.rs:743:5:744:14 | S1 | -| main.rs:824:13:824:14 | y2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:824:13:824:14 | y2 | T | main.rs:745:5:746:14 | S2 | -| main.rs:824:18:824:34 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:824:18:824:34 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | -| main.rs:824:31:824:32 | S2 | | main.rs:745:5:746:14 | S2 | -| main.rs:826:13:826:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:826:17:826:33 | call_trait_m1(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:826:31:826:32 | x2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:826:31:826:32 | x2 | T | main.rs:743:5:744:14 | S1 | -| main.rs:827:18:827:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:827:18:827:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:827:18:827:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:827:18:827:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:827:18:827:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:827:18:827:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:827:26:827:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:828:13:828:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:828:17:828:35 | call_trait_m1_2(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:828:33:828:34 | x2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:828:33:828:34 | x2 | T | main.rs:743:5:744:14 | S1 | -| main.rs:829:18:829:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:829:18:829:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:829:18:829:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:829:18:829:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:829:18:829:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:829:18:829:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:829:26:829:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:830:13:830:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:830:17:830:35 | call_trait_m1_3(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:830:33:830:34 | x2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:830:33:830:34 | x2 | T | main.rs:743:5:744:14 | S1 | -| main.rs:831:18:831:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:831:18:831:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:831:18:831:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:831:18:831:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:831:18:831:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:831:18:831:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:831:26:831:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:832:13:832:13 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:832:17:832:33 | call_trait_m1(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:832:31:832:32 | y2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:832:31:832:32 | y2 | T | main.rs:745:5:746:14 | S2 | -| main.rs:833:18:833:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:833:18:833:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:833:18:833:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:833:18:833:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:833:18:833:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:833:18:833:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:833:26:833:26 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:834:13:834:13 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:834:17:834:35 | call_trait_m1_2(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:834:33:834:34 | y2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:834:33:834:34 | y2 | T | main.rs:745:5:746:14 | S2 | -| main.rs:835:18:835:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:835:18:835:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:835:18:835:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:835:18:835:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:835:18:835:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:835:18:835:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:835:26:835:26 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:836:13:836:13 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:836:17:836:35 | call_trait_m1_3(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:836:33:836:34 | y2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:836:33:836:34 | y2 | T | main.rs:745:5:746:14 | S2 | -| main.rs:837:18:837:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:837:18:837:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:837:18:837:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:837:18:837:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:837:18:837:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:837:18:837:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:837:26:837:26 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:838:13:838:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:838:17:838:38 | call_trait_assoc_1(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:838:36:838:37 | x2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:838:36:838:37 | x2 | T | main.rs:743:5:744:14 | S1 | -| main.rs:839:18:839:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:839:18:839:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:839:18:839:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:839:18:839:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:839:18:839:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:839:18:839:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:839:26:839:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:840:13:840:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:840:17:840:38 | call_trait_assoc_2(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:840:36:840:37 | x2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:840:36:840:37 | x2 | T | main.rs:743:5:744:14 | S1 | -| main.rs:841:18:841:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:841:18:841:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:841:18:841:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:841:18:841:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:841:18:841:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:841:18:841:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:841:26:841:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:842:13:842:13 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:842:17:842:38 | call_trait_assoc_1(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:842:36:842:37 | y2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:842:36:842:37 | y2 | T | main.rs:745:5:746:14 | S2 | -| main.rs:843:18:843:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:843:18:843:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:843:18:843:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:843:18:843:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:843:18:843:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:843:18:843:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:843:26:843:26 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:844:13:844:13 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:844:17:844:38 | call_trait_assoc_2(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:844:36:844:37 | y2 | | main.rs:738:5:741:5 | MyThing | -| main.rs:844:36:844:37 | y2 | T | main.rs:745:5:746:14 | S2 | -| main.rs:845:18:845:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:845:18:845:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:845:18:845:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:845:18:845:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:845:18:845:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:845:18:845:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:845:26:845:26 | a | | main.rs:745:5:746:14 | S2 | -| main.rs:847:13:847:14 | x3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:847:13:847:14 | x3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:847:13:847:14 | x3 | T.T | main.rs:743:5:744:14 | S1 | -| main.rs:847:18:849:9 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:847:18:849:9 | MyThing {...} | T | main.rs:738:5:741:5 | MyThing | -| main.rs:847:18:849:9 | MyThing {...} | T.T | main.rs:743:5:744:14 | S1 | -| main.rs:848:16:848:32 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:848:16:848:32 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | -| main.rs:848:29:848:30 | S1 | | main.rs:743:5:744:14 | S1 | -| main.rs:850:13:850:14 | y3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:850:13:850:14 | y3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:850:13:850:14 | y3 | T.T | main.rs:745:5:746:14 | S2 | -| main.rs:850:18:852:9 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:850:18:852:9 | MyThing {...} | T | main.rs:738:5:741:5 | MyThing | -| main.rs:850:18:852:9 | MyThing {...} | T.T | main.rs:745:5:746:14 | S2 | -| main.rs:851:16:851:32 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | -| main.rs:851:16:851:32 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | -| main.rs:851:29:851:30 | S2 | | main.rs:745:5:746:14 | S2 | -| main.rs:854:13:854:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:854:17:854:39 | call_trait_thing_m1(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:854:37:854:38 | x3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:854:37:854:38 | x3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:854:37:854:38 | x3 | T.T | main.rs:743:5:744:14 | S1 | -| main.rs:855:18:855:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:855:18:855:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:855:18:855:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:855:18:855:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:855:18:855:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:855:18:855:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:855:26:855:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:856:13:856:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:856:17:856:41 | call_trait_thing_m1_2(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:856:39:856:40 | x3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:856:39:856:40 | x3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:856:39:856:40 | x3 | T.T | main.rs:743:5:744:14 | S1 | -| main.rs:857:18:857:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:857:18:857:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:857:18:857:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:857:18:857:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:857:18:857:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:857:18:857:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:857:26:857:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:858:13:858:13 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:858:17:858:41 | call_trait_thing_m1_3(...) | | main.rs:743:5:744:14 | S1 | -| main.rs:858:39:858:40 | x3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:858:39:858:40 | x3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:858:39:858:40 | x3 | T.T | main.rs:743:5:744:14 | S1 | -| main.rs:859:18:859:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:859:18:859:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:859:18:859:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:859:18:859:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:859:18:859:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:859:18:859:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:859:26:859:26 | a | | main.rs:743:5:744:14 | S1 | -| main.rs:860:13:860:13 | b | | main.rs:745:5:746:14 | S2 | -| main.rs:860:17:860:39 | call_trait_thing_m1(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:860:37:860:38 | y3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:860:37:860:38 | y3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:860:37:860:38 | y3 | T.T | main.rs:745:5:746:14 | S2 | -| main.rs:861:18:861:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:861:18:861:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:861:18:861:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:861:18:861:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:861:18:861:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:861:18:861:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:861:26:861:26 | b | | main.rs:745:5:746:14 | S2 | -| main.rs:862:13:862:13 | b | | main.rs:745:5:746:14 | S2 | -| main.rs:862:17:862:41 | call_trait_thing_m1_2(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:862:39:862:40 | y3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:862:39:862:40 | y3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:862:39:862:40 | y3 | T.T | main.rs:745:5:746:14 | S2 | -| main.rs:863:18:863:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:863:18:863:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:863:18:863:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:863:18:863:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:863:18:863:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:863:18:863:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:863:26:863:26 | b | | main.rs:745:5:746:14 | S2 | -| main.rs:864:13:864:13 | b | | main.rs:745:5:746:14 | S2 | -| main.rs:864:17:864:41 | call_trait_thing_m1_3(...) | | main.rs:745:5:746:14 | S2 | -| main.rs:864:39:864:40 | y3 | | main.rs:738:5:741:5 | MyThing | -| main.rs:864:39:864:40 | y3 | T | main.rs:738:5:741:5 | MyThing | -| main.rs:864:39:864:40 | y3 | T.T | main.rs:745:5:746:14 | S2 | -| main.rs:865:18:865:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:865:18:865:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:865:18:865:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:865:18:865:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:865:18:865:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:865:18:865:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:865:26:865:26 | b | | main.rs:745:5:746:14 | S2 | -| main.rs:876:19:876:22 | SelfParam | | main.rs:870:5:873:5 | Wrapper | -| main.rs:876:19:876:22 | SelfParam | A | main.rs:875:10:875:10 | A | -| main.rs:876:30:878:9 | { ... } | | main.rs:875:10:875:10 | A | -| main.rs:877:13:877:16 | self | | main.rs:870:5:873:5 | Wrapper | -| main.rs:877:13:877:16 | self | A | main.rs:875:10:875:10 | A | -| main.rs:877:13:877:22 | self.field | | main.rs:875:10:875:10 | A | -| main.rs:885:15:885:18 | SelfParam | | main.rs:881:5:895:5 | Self [trait MyTrait] | -| main.rs:887:15:887:18 | SelfParam | | main.rs:881:5:895:5 | Self [trait MyTrait] | -| main.rs:891:9:894:9 | { ... } | | main.rs:882:9:882:28 | AssociatedType | -| main.rs:892:13:892:16 | self | | main.rs:881:5:895:5 | Self [trait MyTrait] | -| main.rs:892:13:892:21 | self.m1() | | main.rs:882:9:882:28 | AssociatedType | -| main.rs:893:13:893:43 | ...::default(...) | | main.rs:882:9:882:28 | AssociatedType | -| main.rs:901:19:901:23 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:901:19:901:23 | SelfParam | &T | main.rs:897:5:907:5 | Self [trait MyTraitAssoc2] | -| main.rs:901:26:901:26 | a | | main.rs:901:16:901:16 | A | -| main.rs:903:22:903:26 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:903:22:903:26 | SelfParam | &T | main.rs:897:5:907:5 | Self [trait MyTraitAssoc2] | -| main.rs:903:29:903:29 | a | | main.rs:903:19:903:19 | A | -| main.rs:903:35:903:35 | b | | main.rs:903:19:903:19 | A | -| main.rs:903:75:906:9 | { ... } | | main.rs:898:9:898:52 | GenericAssociatedType | -| main.rs:904:13:904:16 | self | | file://:0:0:0:0 | & | -| main.rs:904:13:904:16 | self | &T | main.rs:897:5:907:5 | Self [trait MyTraitAssoc2] | -| main.rs:904:13:904:23 | self.put(...) | | main.rs:898:9:898:52 | GenericAssociatedType | -| main.rs:904:22:904:22 | a | | main.rs:903:19:903:19 | A | -| main.rs:905:13:905:16 | self | | file://:0:0:0:0 | & | -| main.rs:905:13:905:16 | self | &T | main.rs:897:5:907:5 | Self [trait MyTraitAssoc2] | -| main.rs:905:13:905:23 | self.put(...) | | main.rs:898:9:898:52 | GenericAssociatedType | -| main.rs:905:22:905:22 | b | | main.rs:903:19:903:19 | A | -| main.rs:914:21:914:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:914:21:914:25 | SelfParam | &T | main.rs:909:5:919:5 | Self [trait TraitMultipleAssoc] | -| main.rs:916:20:916:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:916:20:916:24 | SelfParam | &T | main.rs:909:5:919:5 | Self [trait TraitMultipleAssoc] | -| main.rs:918:20:918:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:918:20:918:24 | SelfParam | &T | main.rs:909:5:919:5 | Self [trait TraitMultipleAssoc] | -| main.rs:934:15:934:18 | SelfParam | | main.rs:921:5:922:13 | S | -| main.rs:934:45:936:9 | { ... } | | main.rs:927:5:928:14 | AT | -| main.rs:935:13:935:14 | AT | | main.rs:927:5:928:14 | AT | -| main.rs:944:19:944:23 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:944:19:944:23 | SelfParam | &T | main.rs:921:5:922:13 | S | -| main.rs:944:26:944:26 | a | | main.rs:944:16:944:16 | A | -| main.rs:944:46:946:9 | { ... } | | main.rs:870:5:873:5 | Wrapper | -| main.rs:944:46:946:9 | { ... } | A | main.rs:944:16:944:16 | A | -| main.rs:945:13:945:32 | Wrapper {...} | | main.rs:870:5:873:5 | Wrapper | -| main.rs:945:13:945:32 | Wrapper {...} | A | main.rs:944:16:944:16 | A | -| main.rs:945:30:945:30 | a | | main.rs:944:16:944:16 | A | -| main.rs:953:15:953:18 | SelfParam | | main.rs:924:5:925:14 | S2 | -| main.rs:953:45:955:9 | { ... } | | main.rs:870:5:873:5 | Wrapper | -| main.rs:953:45:955:9 | { ... } | A | main.rs:924:5:925:14 | S2 | -| main.rs:954:13:954:35 | Wrapper {...} | | main.rs:870:5:873:5 | Wrapper | -| main.rs:954:13:954:35 | Wrapper {...} | A | main.rs:924:5:925:14 | S2 | -| main.rs:954:30:954:33 | self | | main.rs:924:5:925:14 | S2 | -| main.rs:960:30:962:9 | { ... } | | main.rs:870:5:873:5 | Wrapper | -| main.rs:960:30:962:9 | { ... } | A | main.rs:924:5:925:14 | S2 | -| main.rs:961:13:961:33 | Wrapper {...} | | main.rs:870:5:873:5 | Wrapper | -| main.rs:961:13:961:33 | Wrapper {...} | A | main.rs:924:5:925:14 | S2 | -| main.rs:961:30:961:31 | S2 | | main.rs:924:5:925:14 | S2 | -| main.rs:967:22:967:26 | thing | | main.rs:967:10:967:19 | T | -| main.rs:968:9:968:13 | thing | | main.rs:967:10:967:19 | T | -| main.rs:975:21:975:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:975:21:975:25 | SelfParam | &T | main.rs:927:5:928:14 | AT | -| main.rs:975:34:977:9 | { ... } | | main.rs:927:5:928:14 | AT | -| main.rs:976:13:976:14 | AT | | main.rs:927:5:928:14 | AT | -| main.rs:979:20:979:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:979:20:979:24 | SelfParam | &T | main.rs:927:5:928:14 | AT | -| main.rs:979:43:981:9 | { ... } | | main.rs:921:5:922:13 | S | -| main.rs:980:13:980:13 | S | | main.rs:921:5:922:13 | S | -| main.rs:983:20:983:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:983:20:983:24 | SelfParam | &T | main.rs:927:5:928:14 | AT | -| main.rs:983:43:985:9 | { ... } | | main.rs:924:5:925:14 | S2 | -| main.rs:984:13:984:14 | S2 | | main.rs:924:5:925:14 | S2 | -| main.rs:988:16:1016:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:989:13:989:14 | x1 | | main.rs:921:5:922:13 | S | -| main.rs:989:18:989:18 | S | | main.rs:921:5:922:13 | S | -| main.rs:991:18:991:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:991:18:991:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:991:18:991:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:991:18:991:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:991:18:991:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:991:18:991:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:991:26:991:27 | x1 | | main.rs:921:5:922:13 | S | -| main.rs:991:26:991:32 | x1.m1() | | main.rs:927:5:928:14 | AT | -| main.rs:993:13:993:14 | x2 | | main.rs:921:5:922:13 | S | -| main.rs:993:18:993:18 | S | | main.rs:921:5:922:13 | S | -| main.rs:995:13:995:13 | y | | main.rs:927:5:928:14 | AT | -| main.rs:995:17:995:18 | x2 | | main.rs:921:5:922:13 | S | -| main.rs:995:17:995:23 | x2.m2() | | main.rs:927:5:928:14 | AT | -| main.rs:996:18:996:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:996:18:996:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:996:18:996:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:996:18:996:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:996:18:996:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:996:18:996:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:996:26:996:26 | y | | main.rs:927:5:928:14 | AT | -| main.rs:998:13:998:14 | x3 | | main.rs:921:5:922:13 | S | -| main.rs:998:18:998:18 | S | | main.rs:921:5:922:13 | S | -| main.rs:1000:18:1000:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1000:18:1000:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1000:18:1000:43 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1000:18:1000:43 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1000:18:1000:43 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1000:18:1000:43 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1000:26:1000:27 | x3 | | main.rs:921:5:922:13 | S | -| main.rs:1000:26:1000:34 | x3.put(...) | | main.rs:870:5:873:5 | Wrapper | -| main.rs:1000:26:1000:34 | x3.put(...) | A | {EXTERNAL LOCATION} | i32 | -| main.rs:1000:26:1000:43 | ... .unwrap() | | {EXTERNAL LOCATION} | i32 | -| main.rs:1000:33:1000:33 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1003:18:1003:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1003:18:1003:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1003:18:1003:49 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1003:18:1003:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1003:18:1003:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1003:18:1003:49 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1003:26:1003:27 | x3 | | main.rs:921:5:922:13 | S | -| main.rs:1003:26:1003:40 | x3.putTwo(...) | | main.rs:870:5:873:5 | Wrapper | -| main.rs:1003:26:1003:40 | x3.putTwo(...) | A | main.rs:941:36:941:50 | AssociatedParam | -| main.rs:1003:26:1003:49 | ... .unwrap() | | main.rs:941:36:941:50 | AssociatedParam | -| main.rs:1003:36:1003:36 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1003:39:1003:39 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1005:20:1005:20 | S | | main.rs:921:5:922:13 | S | -| main.rs:1006:18:1006:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1006:18:1006:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1006:18:1006:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1006:18:1006:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1006:18:1006:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1006:18:1006:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1008:13:1008:14 | x5 | | main.rs:924:5:925:14 | S2 | -| main.rs:1008:18:1008:19 | S2 | | main.rs:924:5:925:14 | S2 | -| main.rs:1009:18:1009:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1009:18:1009:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1009:18:1009:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1009:18:1009:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1009:18:1009:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1009:18:1009:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1009:26:1009:27 | x5 | | main.rs:924:5:925:14 | S2 | -| main.rs:1009:26:1009:32 | x5.m1() | | main.rs:870:5:873:5 | Wrapper | -| main.rs:1009:26:1009:32 | x5.m1() | A | main.rs:924:5:925:14 | S2 | -| main.rs:1010:13:1010:14 | x6 | | main.rs:924:5:925:14 | S2 | -| main.rs:1010:18:1010:19 | S2 | | main.rs:924:5:925:14 | S2 | -| main.rs:1011:18:1011:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1011:18:1011:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1011:18:1011:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1011:18:1011:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1011:18:1011:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1011:18:1011:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1011:26:1011:27 | x6 | | main.rs:924:5:925:14 | S2 | -| main.rs:1011:26:1011:32 | x6.m2() | | main.rs:870:5:873:5 | Wrapper | -| main.rs:1011:26:1011:32 | x6.m2() | A | main.rs:924:5:925:14 | S2 | -| main.rs:1013:13:1013:22 | assoc_zero | | main.rs:927:5:928:14 | AT | -| main.rs:1013:26:1013:27 | AT | | main.rs:927:5:928:14 | AT | -| main.rs:1013:26:1013:38 | AT.get_zero() | | main.rs:927:5:928:14 | AT | -| main.rs:1014:13:1014:21 | assoc_one | | main.rs:921:5:922:13 | S | -| main.rs:1014:25:1014:26 | AT | | main.rs:927:5:928:14 | AT | -| main.rs:1014:25:1014:36 | AT.get_one() | | main.rs:921:5:922:13 | S | -| main.rs:1015:13:1015:21 | assoc_two | | main.rs:924:5:925:14 | S2 | -| main.rs:1015:25:1015:26 | AT | | main.rs:927:5:928:14 | AT | -| main.rs:1015:25:1015:36 | AT.get_two() | | main.rs:924:5:925:14 | S2 | -| main.rs:1023:19:1023:23 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1023:19:1023:23 | SelfParam | &T | main.rs:1020:5:1024:5 | Self [trait Supertrait] | -| main.rs:1023:26:1023:32 | content | | main.rs:1021:9:1021:21 | Content | -| main.rs:1028:24:1028:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1028:24:1028:28 | SelfParam | &T | main.rs:1026:5:1029:5 | Self [trait Subtrait] | -| main.rs:1037:23:1037:27 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1037:23:1037:27 | SelfParam | &T | main.rs:1031:5:1041:5 | Self [trait Subtrait2] | -| main.rs:1037:30:1037:31 | c1 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1037:49:1037:50 | c2 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1037:68:1040:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1038:13:1038:16 | self | | file://:0:0:0:0 | & | -| main.rs:1038:13:1038:16 | self | &T | main.rs:1031:5:1041:5 | Self [trait Subtrait2] | -| main.rs:1038:13:1038:27 | self.insert(...) | | file://:0:0:0:0 | () | -| main.rs:1038:25:1038:26 | c1 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1039:13:1039:16 | self | | file://:0:0:0:0 | & | -| main.rs:1039:13:1039:16 | self | &T | main.rs:1031:5:1041:5 | Self [trait Subtrait2] | -| main.rs:1039:13:1039:27 | self.insert(...) | | file://:0:0:0:0 | () | -| main.rs:1039:25:1039:26 | c2 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1047:19:1047:23 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1047:19:1047:23 | SelfParam | &T | main.rs:1043:5:1043:24 | MyType | -| main.rs:1047:19:1047:23 | SelfParam | &T.T | main.rs:1045:10:1045:10 | T | -| main.rs:1047:26:1047:33 | _content | | main.rs:1045:10:1045:10 | T | -| main.rs:1047:51:1049:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1048:22:1048:42 | "Inserting content: \\n" | | file://:0:0:0:0 | & | -| main.rs:1048:22:1048:42 | "Inserting content: \\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1048:22:1048:42 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1048:22:1048:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1048:22:1048:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1048:22:1048:42 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1054:24:1054:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1054:24:1054:28 | SelfParam | &T | main.rs:1043:5:1043:24 | MyType | -| main.rs:1054:24:1054:28 | SelfParam | &T.T | main.rs:1052:10:1052:17 | T | -| main.rs:1054:48:1056:9 | { ... } | | main.rs:1052:10:1052:17 | T | -| main.rs:1055:13:1055:19 | (...) | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1055:13:1055:19 | (...) | T | main.rs:1052:10:1052:17 | T | -| main.rs:1055:13:1055:21 | ... .0 | | main.rs:1052:10:1052:17 | T | -| main.rs:1055:13:1055:29 | ... .clone() | | main.rs:1052:10:1052:17 | T | -| main.rs:1055:14:1055:18 | * ... | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1055:14:1055:18 | * ... | T | main.rs:1052:10:1052:17 | T | -| main.rs:1055:15:1055:18 | self | | file://:0:0:0:0 | & | -| main.rs:1055:15:1055:18 | self | &T | main.rs:1043:5:1043:24 | MyType | -| main.rs:1055:15:1055:18 | self | &T.T | main.rs:1052:10:1052:17 | T | -| main.rs:1059:33:1059:36 | item | | file://:0:0:0:0 | & | -| main.rs:1059:33:1059:36 | item | &T | main.rs:1059:20:1059:30 | T | -| main.rs:1059:57:1061:5 | { ... } | | main.rs:1021:9:1021:21 | Content | -| main.rs:1060:9:1060:12 | item | | file://:0:0:0:0 | & | -| main.rs:1060:9:1060:12 | item | &T | main.rs:1059:20:1059:30 | T | -| main.rs:1060:9:1060:26 | item.get_content() | | main.rs:1021:9:1021:21 | Content | -| main.rs:1063:35:1063:38 | item | | file://:0:0:0:0 | & | -| main.rs:1063:35:1063:38 | item | &T | main.rs:1063:21:1063:32 | T | -| main.rs:1063:45:1063:46 | c1 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1063:61:1063:62 | c2 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1063:77:1063:78 | c3 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1063:93:1066:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1064:9:1064:12 | item | | file://:0:0:0:0 | & | -| main.rs:1064:9:1064:12 | item | &T | main.rs:1063:21:1063:32 | T | -| main.rs:1064:9:1064:23 | item.insert(...) | | file://:0:0:0:0 | () | -| main.rs:1064:21:1064:22 | c1 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1065:9:1065:12 | item | | file://:0:0:0:0 | & | -| main.rs:1065:9:1065:12 | item | &T | main.rs:1063:21:1063:32 | T | -| main.rs:1065:9:1065:31 | item.insert_two(...) | | file://:0:0:0:0 | () | -| main.rs:1065:25:1065:26 | c2 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1065:29:1065:30 | c3 | | main.rs:1021:9:1021:21 | Content | -| main.rs:1068:15:1074:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1069:13:1069:17 | item1 | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1069:13:1069:17 | item1 | T | {EXTERNAL LOCATION} | i64 | -| main.rs:1069:21:1069:33 | MyType(...) | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1069:21:1069:33 | MyType(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:1069:28:1069:32 | 42i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1070:25:1070:29 | item1 | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1070:25:1070:29 | item1 | T | {EXTERNAL LOCATION} | i64 | -| main.rs:1072:13:1072:17 | item2 | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1072:13:1072:17 | item2 | T | {EXTERNAL LOCATION} | bool | -| main.rs:1072:21:1072:32 | MyType(...) | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1072:21:1072:32 | MyType(...) | T | {EXTERNAL LOCATION} | bool | -| main.rs:1072:28:1072:31 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1073:37:1073:42 | &item2 | | file://:0:0:0:0 | & | -| main.rs:1073:37:1073:42 | &item2 | &T | main.rs:1043:5:1043:24 | MyType | -| main.rs:1073:37:1073:42 | &item2 | &T.T | {EXTERNAL LOCATION} | bool | -| main.rs:1073:38:1073:42 | item2 | | main.rs:1043:5:1043:24 | MyType | -| main.rs:1073:38:1073:42 | item2 | T | {EXTERNAL LOCATION} | bool | -| main.rs:1090:15:1090:18 | SelfParam | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1090:15:1090:18 | SelfParam | A | main.rs:1089:10:1089:10 | T | -| main.rs:1090:26:1095:9 | { ... } | | main.rs:1089:10:1089:10 | T | -| main.rs:1091:13:1094:13 | match self { ... } | | main.rs:1089:10:1089:10 | T | -| main.rs:1091:19:1091:22 | self | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1091:19:1091:22 | self | A | main.rs:1089:10:1089:10 | T | -| main.rs:1092:17:1092:29 | ...::C1(...) | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1092:17:1092:29 | ...::C1(...) | A | main.rs:1089:10:1089:10 | T | -| main.rs:1092:28:1092:28 | a | | main.rs:1089:10:1089:10 | T | -| main.rs:1092:34:1092:34 | a | | main.rs:1089:10:1089:10 | T | -| main.rs:1093:17:1093:32 | ...::C2 {...} | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1093:17:1093:32 | ...::C2 {...} | A | main.rs:1089:10:1089:10 | T | -| main.rs:1093:30:1093:30 | a | | main.rs:1089:10:1089:10 | T | -| main.rs:1093:37:1093:37 | a | | main.rs:1089:10:1089:10 | T | -| main.rs:1098:16:1104:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1099:13:1099:13 | x | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1099:13:1099:13 | x | A | main.rs:1084:5:1085:14 | S1 | -| main.rs:1099:17:1099:30 | ...::C1(...) | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1099:17:1099:30 | ...::C1(...) | A | main.rs:1084:5:1085:14 | S1 | -| main.rs:1099:28:1099:29 | S1 | | main.rs:1084:5:1085:14 | S1 | -| main.rs:1100:13:1100:13 | y | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1100:13:1100:13 | y | A | main.rs:1086:5:1087:14 | S2 | -| main.rs:1100:17:1100:36 | ...::C2 {...} | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1100:17:1100:36 | ...::C2 {...} | A | main.rs:1086:5:1087:14 | S2 | -| main.rs:1100:33:1100:34 | S2 | | main.rs:1086:5:1087:14 | S2 | -| main.rs:1102:18:1102:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1102:18:1102:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1102:18:1102:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1102:18:1102:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1102:18:1102:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1102:18:1102:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1102:26:1102:26 | x | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1102:26:1102:26 | x | A | main.rs:1084:5:1085:14 | S1 | -| main.rs:1102:26:1102:31 | x.m1() | | main.rs:1084:5:1085:14 | S1 | -| main.rs:1103:18:1103:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1103:18:1103:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1103:18:1103:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1103:18:1103:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1103:18:1103:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1103:18:1103:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1103:26:1103:26 | y | | main.rs:1078:5:1082:5 | MyEnum | -| main.rs:1103:26:1103:26 | y | A | main.rs:1086:5:1087:14 | S2 | -| main.rs:1103:26:1103:31 | y.m1() | | main.rs:1086:5:1087:14 | S2 | -| main.rs:1125:15:1125:18 | SelfParam | | main.rs:1123:5:1126:5 | Self [trait MyTrait1] | -| main.rs:1130:15:1130:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1130:15:1130:19 | SelfParam | &T | main.rs:1128:5:1140:5 | Self [trait MyTrait2] | -| main.rs:1133:9:1139:9 | { ... } | | main.rs:1128:20:1128:22 | Tr2 | -| main.rs:1134:13:1138:13 | if ... {...} else {...} | | main.rs:1128:20:1128:22 | Tr2 | -| main.rs:1134:16:1134:16 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1134:16:1134:20 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1134:20:1134:20 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1134:22:1136:13 | { ... } | | main.rs:1128:20:1128:22 | Tr2 | -| main.rs:1135:17:1135:20 | self | | file://:0:0:0:0 | & | -| main.rs:1135:17:1135:20 | self | &T | main.rs:1128:5:1140:5 | Self [trait MyTrait2] | -| main.rs:1135:17:1135:25 | self.m1() | | main.rs:1128:20:1128:22 | Tr2 | -| main.rs:1136:20:1138:13 | { ... } | | main.rs:1128:20:1128:22 | Tr2 | -| main.rs:1137:17:1137:31 | ...::m1(...) | | main.rs:1128:20:1128:22 | Tr2 | -| main.rs:1137:26:1137:30 | * ... | | main.rs:1128:5:1140:5 | Self [trait MyTrait2] | -| main.rs:1137:27:1137:30 | self | | file://:0:0:0:0 | & | -| main.rs:1137:27:1137:30 | self | &T | main.rs:1128:5:1140:5 | Self [trait MyTrait2] | -| main.rs:1144:15:1144:18 | SelfParam | | main.rs:1142:5:1154:5 | Self [trait MyTrait3] | -| main.rs:1147:9:1153:9 | { ... } | | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1148:13:1152:13 | if ... {...} else {...} | | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1148:16:1148:16 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1148:16:1148:20 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1148:20:1148:20 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1148:22:1150:13 | { ... } | | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1149:17:1149:20 | self | | main.rs:1142:5:1154:5 | Self [trait MyTrait3] | -| main.rs:1149:17:1149:25 | self.m2() | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1149:17:1149:25 | self.m2() | A | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1149:17:1149:27 | ... .a | | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1150:20:1152:13 | { ... } | | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1151:17:1151:31 | ...::m2(...) | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1151:17:1151:31 | ...::m2(...) | A | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1151:17:1151:33 | ... .a | | main.rs:1142:20:1142:22 | Tr3 | -| main.rs:1151:26:1151:30 | &self | | file://:0:0:0:0 | & | -| main.rs:1151:26:1151:30 | &self | &T | main.rs:1142:5:1154:5 | Self [trait MyTrait3] | -| main.rs:1151:27:1151:30 | self | | main.rs:1142:5:1154:5 | Self [trait MyTrait3] | -| main.rs:1158:15:1158:18 | SelfParam | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1158:15:1158:18 | SelfParam | A | main.rs:1156:10:1156:10 | T | -| main.rs:1158:26:1160:9 | { ... } | | main.rs:1156:10:1156:10 | T | -| main.rs:1159:13:1159:16 | self | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1159:13:1159:16 | self | A | main.rs:1156:10:1156:10 | T | -| main.rs:1159:13:1159:18 | self.a | | main.rs:1156:10:1156:10 | T | -| main.rs:1167:15:1167:18 | SelfParam | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1167:15:1167:18 | SelfParam | A | main.rs:1165:10:1165:10 | T | -| main.rs:1167:35:1169:9 | { ... } | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1167:35:1169:9 | { ... } | A | main.rs:1165:10:1165:10 | T | -| main.rs:1168:13:1168:33 | MyThing {...} | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1168:13:1168:33 | MyThing {...} | A | main.rs:1165:10:1165:10 | T | -| main.rs:1168:26:1168:29 | self | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1168:26:1168:29 | self | A | main.rs:1165:10:1165:10 | T | -| main.rs:1168:26:1168:31 | self.a | | main.rs:1165:10:1165:10 | T | -| main.rs:1176:44:1176:44 | x | | main.rs:1176:26:1176:41 | T2 | -| main.rs:1176:57:1178:5 | { ... } | | main.rs:1176:22:1176:23 | T1 | -| main.rs:1177:9:1177:9 | x | | main.rs:1176:26:1176:41 | T2 | -| main.rs:1177:9:1177:14 | x.m1() | | main.rs:1176:22:1176:23 | T1 | -| main.rs:1180:56:1180:56 | x | | main.rs:1180:39:1180:53 | T | -| main.rs:1180:62:1184:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1182:13:1182:13 | a | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1182:13:1182:13 | a | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1182:17:1182:17 | x | | main.rs:1180:39:1180:53 | T | -| main.rs:1182:17:1182:22 | x.m1() | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1182:17:1182:22 | x.m1() | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1183:18:1183:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1183:18:1183:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1183:18:1183:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1183:18:1183:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1183:18:1183:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1183:18:1183:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1183:26:1183:26 | a | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1183:26:1183:26 | a | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1186:16:1210:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1187:13:1187:13 | x | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1187:13:1187:13 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1187:17:1187:33 | MyThing {...} | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1187:17:1187:33 | MyThing {...} | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1187:30:1187:31 | S1 | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1188:13:1188:13 | y | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1188:13:1188:13 | y | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1188:17:1188:33 | MyThing {...} | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1188:17:1188:33 | MyThing {...} | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1188:30:1188:31 | S2 | | main.rs:1120:5:1121:14 | S2 | -| main.rs:1190:18:1190:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1190:18:1190:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1190:18:1190:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1190:18:1190:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1190:18:1190:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1190:18:1190:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1190:26:1190:26 | x | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1190:26:1190:26 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1190:26:1190:31 | x.m1() | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1191:18:1191:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1191:18:1191:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1191:18:1191:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1191:18:1191:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1191:18:1191:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1191:18:1191:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1191:26:1191:26 | y | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1191:26:1191:26 | y | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1191:26:1191:31 | y.m1() | | main.rs:1120:5:1121:14 | S2 | -| main.rs:1193:13:1193:13 | x | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1193:13:1193:13 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1193:17:1193:33 | MyThing {...} | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1193:17:1193:33 | MyThing {...} | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1193:30:1193:31 | S1 | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1194:13:1194:13 | y | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1194:13:1194:13 | y | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1194:17:1194:33 | MyThing {...} | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1194:17:1194:33 | MyThing {...} | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1194:30:1194:31 | S2 | | main.rs:1120:5:1121:14 | S2 | -| main.rs:1196:18:1196:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1196:18:1196:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1196:18:1196:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1196:18:1196:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1196:18:1196:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1196:18:1196:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1196:26:1196:26 | x | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1196:26:1196:26 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1196:26:1196:31 | x.m2() | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1197:18:1197:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1197:18:1197:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1197:18:1197:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1197:18:1197:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1197:18:1197:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1197:18:1197:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1197:26:1197:26 | y | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1197:26:1197:26 | y | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1197:26:1197:31 | y.m2() | | main.rs:1120:5:1121:14 | S2 | -| main.rs:1199:13:1199:13 | x | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1199:13:1199:13 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1199:17:1199:34 | MyThing2 {...} | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1199:17:1199:34 | MyThing2 {...} | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1199:31:1199:32 | S1 | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1200:13:1200:13 | y | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1200:13:1200:13 | y | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1200:17:1200:34 | MyThing2 {...} | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1200:17:1200:34 | MyThing2 {...} | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1200:31:1200:32 | S2 | | main.rs:1120:5:1121:14 | S2 | -| main.rs:1202:18:1202:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1202:18:1202:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1202:18:1202:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1202:18:1202:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1202:18:1202:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1202:18:1202:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1202:26:1202:26 | x | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1202:26:1202:26 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1202:26:1202:31 | x.m3() | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1203:18:1203:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1203:18:1203:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1203:18:1203:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1203:18:1203:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1203:18:1203:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1203:18:1203:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1203:26:1203:26 | y | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1203:26:1203:26 | y | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1203:26:1203:31 | y.m3() | | main.rs:1120:5:1121:14 | S2 | -| main.rs:1205:13:1205:13 | x | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1205:13:1205:13 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1205:17:1205:33 | MyThing {...} | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1205:17:1205:33 | MyThing {...} | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1205:30:1205:31 | S1 | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1206:13:1206:13 | s | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1206:17:1206:32 | call_trait_m1(...) | | main.rs:1118:5:1119:14 | S1 | -| main.rs:1206:31:1206:31 | x | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1206:31:1206:31 | x | A | main.rs:1118:5:1119:14 | S1 | -| main.rs:1208:13:1208:13 | x | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1208:13:1208:13 | x | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1208:17:1208:34 | MyThing2 {...} | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1208:17:1208:34 | MyThing2 {...} | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1208:31:1208:32 | S2 | | main.rs:1120:5:1121:14 | S2 | -| main.rs:1209:13:1209:13 | s | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1209:13:1209:13 | s | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1209:17:1209:32 | call_trait_m1(...) | | main.rs:1108:5:1111:5 | MyThing | -| main.rs:1209:17:1209:32 | call_trait_m1(...) | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1209:31:1209:31 | x | | main.rs:1113:5:1116:5 | MyThing2 | -| main.rs:1209:31:1209:31 | x | A | main.rs:1120:5:1121:14 | S2 | -| main.rs:1226:22:1226:22 | x | | file://:0:0:0:0 | & | -| main.rs:1226:22:1226:22 | x | &T | main.rs:1226:11:1226:19 | T | -| main.rs:1226:35:1228:5 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1226:35:1228:5 | { ... } | &T | main.rs:1226:11:1226:19 | T | -| main.rs:1227:9:1227:9 | x | | file://:0:0:0:0 | & | -| main.rs:1227:9:1227:9 | x | &T | main.rs:1226:11:1226:19 | T | -| main.rs:1231:17:1231:20 | SelfParam | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1231:29:1233:9 | { ... } | | main.rs:1219:5:1220:14 | S2 | -| main.rs:1232:13:1232:14 | S2 | | main.rs:1219:5:1220:14 | S2 | -| main.rs:1236:21:1236:21 | x | | main.rs:1236:13:1236:14 | T1 | -| main.rs:1239:5:1241:5 | { ... } | | main.rs:1236:17:1236:18 | T2 | -| main.rs:1240:9:1240:9 | x | | main.rs:1236:13:1236:14 | T1 | -| main.rs:1240:9:1240:16 | x.into() | | main.rs:1236:17:1236:18 | T2 | -| main.rs:1243:16:1259:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1244:13:1244:13 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1244:17:1244:18 | S1 | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1245:18:1245:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1245:18:1245:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1245:18:1245:31 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1245:18:1245:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1245:18:1245:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1245:18:1245:31 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1245:26:1245:31 | id(...) | | file://:0:0:0:0 | & | -| main.rs:1245:26:1245:31 | id(...) | &T | main.rs:1216:5:1217:14 | S1 | -| main.rs:1245:29:1245:30 | &x | | file://:0:0:0:0 | & | -| main.rs:1245:29:1245:30 | &x | &T | main.rs:1216:5:1217:14 | S1 | -| main.rs:1245:30:1245:30 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1247:13:1247:13 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1247:17:1247:18 | S1 | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1248:18:1248:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1248:18:1248:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1248:18:1248:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1248:18:1248:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1248:18:1248:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1248:18:1248:37 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1248:26:1248:37 | id::<...>(...) | | file://:0:0:0:0 | & | -| main.rs:1248:26:1248:37 | id::<...>(...) | &T | main.rs:1216:5:1217:14 | S1 | -| main.rs:1248:35:1248:36 | &x | | file://:0:0:0:0 | & | -| main.rs:1248:35:1248:36 | &x | &T | main.rs:1216:5:1217:14 | S1 | -| main.rs:1248:36:1248:36 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1250:13:1250:13 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1250:13:1250:13 | x | | main.rs:1222:5:1222:25 | dyn Trait | -| main.rs:1250:17:1250:18 | S1 | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1250:17:1250:18 | S1 | | main.rs:1222:5:1222:25 | dyn Trait | -| main.rs:1252:18:1252:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1252:18:1252:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1252:18:1252:44 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1252:18:1252:44 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1252:18:1252:44 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1252:18:1252:44 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1252:26:1252:44 | id::<...>(...) | | file://:0:0:0:0 | & | -| main.rs:1252:26:1252:44 | id::<...>(...) | &T | main.rs:1222:5:1222:25 | dyn Trait | -| main.rs:1252:42:1252:43 | &x | | file://:0:0:0:0 | & | -| main.rs:1252:42:1252:43 | &x | &T | main.rs:1216:5:1217:14 | S1 | -| main.rs:1252:42:1252:43 | &x | &T | main.rs:1222:5:1222:25 | dyn Trait | -| main.rs:1252:43:1252:43 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1252:43:1252:43 | x | | main.rs:1222:5:1222:25 | dyn Trait | -| main.rs:1254:13:1254:13 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1254:17:1254:18 | S1 | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1255:9:1255:25 | into::<...>(...) | | main.rs:1219:5:1220:14 | S2 | -| main.rs:1255:24:1255:24 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1257:13:1257:13 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1257:17:1257:18 | S1 | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1258:13:1258:13 | y | | main.rs:1219:5:1220:14 | S2 | -| main.rs:1258:21:1258:27 | into(...) | | main.rs:1219:5:1220:14 | S2 | -| main.rs:1258:26:1258:26 | x | | main.rs:1216:5:1217:14 | S1 | -| main.rs:1272:22:1272:25 | SelfParam | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1272:22:1272:25 | SelfParam | Fst | main.rs:1271:10:1271:12 | Fst | -| main.rs:1272:22:1272:25 | SelfParam | Snd | main.rs:1271:15:1271:17 | Snd | -| main.rs:1272:35:1279:9 | { ... } | | main.rs:1271:15:1271:17 | Snd | -| main.rs:1273:13:1278:13 | match self { ... } | | file://:0:0:0:0 | ! | -| main.rs:1273:13:1278:13 | match self { ... } | | main.rs:1271:15:1271:17 | Snd | -| main.rs:1273:19:1273:22 | self | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1273:19:1273:22 | self | Fst | main.rs:1271:10:1271:12 | Fst | -| main.rs:1273:19:1273:22 | self | Snd | main.rs:1271:15:1271:17 | Snd | -| main.rs:1274:17:1274:38 | ...::PairNone(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1274:17:1274:38 | ...::PairNone(...) | Fst | main.rs:1271:10:1271:12 | Fst | -| main.rs:1274:17:1274:38 | ...::PairNone(...) | Snd | main.rs:1271:15:1271:17 | Snd | -| main.rs:1274:43:1274:82 | MacroExpr | | file://:0:0:0:0 | ! | -| main.rs:1274:50:1274:81 | "PairNone has no second elemen... | | file://:0:0:0:0 | & | -| main.rs:1274:50:1274:81 | "PairNone has no second elemen... | &T | {EXTERNAL LOCATION} | str | -| main.rs:1274:50:1274:81 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | -| main.rs:1274:50:1274:81 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1274:50:1274:81 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1274:50:1274:81 | MacroExpr | | file://:0:0:0:0 | () | -| main.rs:1274:50:1274:81 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1275:17:1275:38 | ...::PairFst(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1275:17:1275:38 | ...::PairFst(...) | Fst | main.rs:1271:10:1271:12 | Fst | -| main.rs:1275:17:1275:38 | ...::PairFst(...) | Snd | main.rs:1271:15:1271:17 | Snd | -| main.rs:1275:37:1275:37 | _ | | main.rs:1271:10:1271:12 | Fst | -| main.rs:1275:43:1275:81 | MacroExpr | | file://:0:0:0:0 | ! | -| main.rs:1275:50:1275:80 | "PairFst has no second element... | | file://:0:0:0:0 | & | -| main.rs:1275:50:1275:80 | "PairFst has no second element... | &T | {EXTERNAL LOCATION} | str | -| main.rs:1275:50:1275:80 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | -| main.rs:1275:50:1275:80 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1275:50:1275:80 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1275:50:1275:80 | MacroExpr | | file://:0:0:0:0 | () | -| main.rs:1275:50:1275:80 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1276:17:1276:40 | ...::PairSnd(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1276:17:1276:40 | ...::PairSnd(...) | Fst | main.rs:1271:10:1271:12 | Fst | -| main.rs:1276:17:1276:40 | ...::PairSnd(...) | Snd | main.rs:1271:15:1271:17 | Snd | -| main.rs:1276:37:1276:39 | snd | | main.rs:1271:15:1271:17 | Snd | -| main.rs:1276:45:1276:47 | snd | | main.rs:1271:15:1271:17 | Snd | -| main.rs:1277:17:1277:44 | ...::PairBoth(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1277:17:1277:44 | ...::PairBoth(...) | Fst | main.rs:1271:10:1271:12 | Fst | -| main.rs:1277:17:1277:44 | ...::PairBoth(...) | Snd | main.rs:1271:15:1271:17 | Snd | -| main.rs:1277:38:1277:38 | _ | | main.rs:1271:10:1271:12 | Fst | -| main.rs:1277:41:1277:43 | snd | | main.rs:1271:15:1271:17 | Snd | -| main.rs:1277:49:1277:51 | snd | | main.rs:1271:15:1271:17 | Snd | -| main.rs:1303:10:1303:10 | t | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1303:10:1303:10 | t | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1303:10:1303:10 | t | Snd | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1303:10:1303:10 | t | Snd.Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1303:10:1303:10 | t | Snd.Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1303:30:1306:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1304:13:1304:13 | x | | main.rs:1288:5:1289:14 | S3 | -| main.rs:1304:17:1304:17 | t | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1304:17:1304:17 | t | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1304:17:1304:17 | t | Snd | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1304:17:1304:17 | t | Snd.Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1304:17:1304:17 | t | Snd.Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1304:17:1304:29 | t.unwrapSnd() | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1304:17:1304:29 | t.unwrapSnd() | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1304:17:1304:29 | t.unwrapSnd() | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1304:17:1304:41 | ... .unwrapSnd() | | main.rs:1288:5:1289:14 | S3 | -| main.rs:1305:18:1305:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1305:18:1305:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1305:18:1305:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1305:18:1305:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1305:18:1305:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1305:18:1305:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1305:26:1305:26 | x | | main.rs:1288:5:1289:14 | S3 | -| main.rs:1320:22:1320:25 | SelfParam | | main.rs:1318:5:1321:5 | Self [trait TraitWithAssocType] | -| main.rs:1328:22:1328:25 | SelfParam | | main.rs:1316:5:1316:28 | GenS | -| main.rs:1328:22:1328:25 | SelfParam | GenT | main.rs:1323:10:1323:15 | Output | -| main.rs:1328:44:1330:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1328:44:1330:9 | { ... } | E | main.rs:1323:10:1323:15 | Output | -| main.rs:1328:44:1330:9 | { ... } | T | main.rs:1323:10:1323:15 | Output | -| main.rs:1329:13:1329:22 | Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1329:13:1329:22 | Ok(...) | E | main.rs:1323:10:1323:15 | Output | -| main.rs:1329:13:1329:22 | Ok(...) | T | main.rs:1323:10:1323:15 | Output | -| main.rs:1329:16:1329:19 | self | | main.rs:1316:5:1316:28 | GenS | -| main.rs:1329:16:1329:19 | self | GenT | main.rs:1323:10:1323:15 | Output | -| main.rs:1329:16:1329:21 | self.0 | | main.rs:1323:10:1323:15 | Output | -| main.rs:1333:16:1355:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1335:13:1335:14 | p1 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1335:13:1335:14 | p1 | Fst | main.rs:1282:5:1283:14 | S1 | -| main.rs:1335:13:1335:14 | p1 | Snd | main.rs:1285:5:1286:14 | S2 | -| main.rs:1335:26:1335:53 | ...::PairBoth(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1335:26:1335:53 | ...::PairBoth(...) | Fst | main.rs:1282:5:1283:14 | S1 | -| main.rs:1335:26:1335:53 | ...::PairBoth(...) | Snd | main.rs:1285:5:1286:14 | S2 | -| main.rs:1335:47:1335:48 | S1 | | main.rs:1282:5:1283:14 | S1 | -| main.rs:1335:51:1335:52 | S2 | | main.rs:1285:5:1286:14 | S2 | -| main.rs:1336:18:1336:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1336:18:1336:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1336:18:1336:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1336:18:1336:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1336:18:1336:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1336:18:1336:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1336:26:1336:27 | p1 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1336:26:1336:27 | p1 | Fst | main.rs:1282:5:1283:14 | S1 | -| main.rs:1336:26:1336:27 | p1 | Snd | main.rs:1285:5:1286:14 | S2 | -| main.rs:1339:13:1339:14 | p2 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1339:13:1339:14 | p2 | Fst | main.rs:1282:5:1283:14 | S1 | -| main.rs:1339:13:1339:14 | p2 | Snd | main.rs:1285:5:1286:14 | S2 | -| main.rs:1339:26:1339:47 | ...::PairNone(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1339:26:1339:47 | ...::PairNone(...) | Fst | main.rs:1282:5:1283:14 | S1 | -| main.rs:1339:26:1339:47 | ...::PairNone(...) | Snd | main.rs:1285:5:1286:14 | S2 | -| main.rs:1340:18:1340:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1340:18:1340:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1340:18:1340:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1340:18:1340:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1340:18:1340:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1340:18:1340:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1340:26:1340:27 | p2 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1340:26:1340:27 | p2 | Fst | main.rs:1282:5:1283:14 | S1 | -| main.rs:1340:26:1340:27 | p2 | Snd | main.rs:1285:5:1286:14 | S2 | -| main.rs:1343:13:1343:14 | p3 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1343:13:1343:14 | p3 | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1343:13:1343:14 | p3 | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1343:34:1343:56 | ...::PairSnd(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1343:34:1343:56 | ...::PairSnd(...) | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1343:34:1343:56 | ...::PairSnd(...) | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1343:54:1343:55 | S3 | | main.rs:1288:5:1289:14 | S3 | -| main.rs:1344:18:1344:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1344:18:1344:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1344:18:1344:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1344:18:1344:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1344:18:1344:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1344:18:1344:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1344:26:1344:27 | p3 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1344:26:1344:27 | p3 | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1344:26:1344:27 | p3 | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1347:13:1347:14 | p3 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1347:13:1347:14 | p3 | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1347:13:1347:14 | p3 | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1347:35:1347:56 | ...::PairNone(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1347:35:1347:56 | ...::PairNone(...) | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1347:35:1347:56 | ...::PairNone(...) | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1348:18:1348:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1348:18:1348:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1348:18:1348:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1348:18:1348:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1348:18:1348:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1348:18:1348:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1348:26:1348:27 | p3 | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1348:26:1348:27 | p3 | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1348:26:1348:27 | p3 | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1350:9:1350:55 | g(...) | | file://:0:0:0:0 | () | -| main.rs:1350:11:1350:54 | ...::PairSnd(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1350:11:1350:54 | ...::PairSnd(...) | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1350:11:1350:54 | ...::PairSnd(...) | Snd | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1350:11:1350:54 | ...::PairSnd(...) | Snd.Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1350:11:1350:54 | ...::PairSnd(...) | Snd.Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1350:31:1350:53 | ...::PairSnd(...) | | main.rs:1263:5:1269:5 | PairOption | -| main.rs:1350:31:1350:53 | ...::PairSnd(...) | Fst | main.rs:1285:5:1286:14 | S2 | -| main.rs:1350:31:1350:53 | ...::PairSnd(...) | Snd | main.rs:1288:5:1289:14 | S3 | -| main.rs:1350:51:1350:52 | S3 | | main.rs:1288:5:1289:14 | S3 | -| main.rs:1352:13:1352:13 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1352:13:1352:13 | x | E | main.rs:1282:5:1283:14 | S1 | -| main.rs:1352:13:1352:13 | x | T | main.rs:1308:5:1308:34 | S4 | -| main.rs:1352:13:1352:13 | x | T.T41 | main.rs:1285:5:1286:14 | S2 | -| main.rs:1352:13:1352:13 | x | T.T42 | main.rs:1310:5:1310:22 | S5 | -| main.rs:1352:13:1352:13 | x | T.T42.T5 | main.rs:1285:5:1286:14 | S2 | -| main.rs:1354:13:1354:13 | y | | {EXTERNAL LOCATION} | Result | -| main.rs:1354:13:1354:13 | y | E | {EXTERNAL LOCATION} | bool | -| main.rs:1354:13:1354:13 | y | T | {EXTERNAL LOCATION} | bool | -| main.rs:1354:17:1354:26 | GenS(...) | | main.rs:1316:5:1316:28 | GenS | -| main.rs:1354:17:1354:26 | GenS(...) | GenT | {EXTERNAL LOCATION} | bool | -| main.rs:1354:17:1354:38 | ... .get_input() | | {EXTERNAL LOCATION} | Result | -| main.rs:1354:17:1354:38 | ... .get_input() | E | {EXTERNAL LOCATION} | bool | -| main.rs:1354:17:1354:38 | ... .get_input() | T | {EXTERNAL LOCATION} | bool | -| main.rs:1354:22:1354:25 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1367:16:1367:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1367:16:1367:24 | SelfParam | &T | main.rs:1365:5:1372:5 | Self [trait MyTrait] | -| main.rs:1367:27:1367:31 | value | | main.rs:1365:19:1365:19 | S | -| main.rs:1369:21:1369:29 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1369:21:1369:29 | SelfParam | &T | main.rs:1365:5:1372:5 | Self [trait MyTrait] | -| main.rs:1369:32:1369:36 | value | | main.rs:1365:19:1365:19 | S | -| main.rs:1369:42:1371:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1370:13:1370:16 | self | | file://:0:0:0:0 | & | -| main.rs:1370:13:1370:16 | self | &T | main.rs:1365:5:1372:5 | Self [trait MyTrait] | -| main.rs:1370:13:1370:27 | self.set(...) | | file://:0:0:0:0 | () | -| main.rs:1370:22:1370:26 | value | | main.rs:1365:19:1365:19 | S | -| main.rs:1376:16:1376:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1376:16:1376:24 | SelfParam | &T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1376:16:1376:24 | SelfParam | &T.T | main.rs:1374:10:1374:10 | T | -| main.rs:1376:27:1376:31 | value | | main.rs:1374:10:1374:10 | T | -| main.rs:1376:37:1376:38 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1380:26:1382:9 | { ... } | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1380:26:1382:9 | { ... } | T | main.rs:1379:10:1379:10 | T | -| main.rs:1381:13:1381:30 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1381:13:1381:30 | ...::MyNone(...) | T | main.rs:1379:10:1379:10 | T | -| main.rs:1386:20:1386:23 | SelfParam | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1386:20:1386:23 | SelfParam | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1386:20:1386:23 | SelfParam | T.T | main.rs:1385:10:1385:10 | T | -| main.rs:1386:41:1391:9 | { ... } | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1386:41:1391:9 | { ... } | T | main.rs:1385:10:1385:10 | T | -| main.rs:1387:13:1390:13 | match self { ... } | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1387:13:1390:13 | match self { ... } | T | main.rs:1385:10:1385:10 | T | -| main.rs:1387:19:1387:22 | self | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1387:19:1387:22 | self | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1387:19:1387:22 | self | T.T | main.rs:1385:10:1385:10 | T | -| main.rs:1388:17:1388:34 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1388:17:1388:34 | ...::MyNone(...) | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1388:17:1388:34 | ...::MyNone(...) | T.T | main.rs:1385:10:1385:10 | T | -| main.rs:1388:39:1388:56 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1388:39:1388:56 | ...::MyNone(...) | T | main.rs:1385:10:1385:10 | T | -| main.rs:1389:17:1389:35 | ...::MySome(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1389:17:1389:35 | ...::MySome(...) | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1389:17:1389:35 | ...::MySome(...) | T.T | main.rs:1385:10:1385:10 | T | -| main.rs:1389:34:1389:34 | x | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1389:34:1389:34 | x | T | main.rs:1385:10:1385:10 | T | -| main.rs:1389:40:1389:40 | x | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1389:40:1389:40 | x | T | main.rs:1385:10:1385:10 | T | -| main.rs:1397:16:1443:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1398:13:1398:14 | x1 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1398:13:1398:14 | x1 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1398:18:1398:37 | ...::new(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1398:18:1398:37 | ...::new(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1399:18:1399:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1399:18:1399:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1399:18:1399:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1399:18:1399:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1399:18:1399:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1399:18:1399:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1399:26:1399:27 | x1 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1399:26:1399:27 | x1 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1401:17:1401:18 | x2 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1401:17:1401:18 | x2 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1401:22:1401:36 | ...::new(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1401:22:1401:36 | ...::new(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1402:9:1402:10 | x2 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1402:9:1402:10 | x2 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1402:9:1402:17 | x2.set(...) | | file://:0:0:0:0 | () | -| main.rs:1402:16:1402:16 | S | | main.rs:1394:5:1395:13 | S | -| main.rs:1403:18:1403:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1403:18:1403:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1403:18:1403:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1403:18:1403:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1403:18:1403:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1403:18:1403:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1403:26:1403:27 | x2 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1403:26:1403:27 | x2 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1406:17:1406:18 | x3 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1406:22:1406:36 | ...::new(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1407:9:1407:10 | x3 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1407:9:1407:22 | x3.call_set(...) | | file://:0:0:0:0 | () | -| main.rs:1407:21:1407:21 | S | | main.rs:1394:5:1395:13 | S | -| main.rs:1408:18:1408:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1408:18:1408:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1408:18:1408:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1408:18:1408:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1408:18:1408:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1408:18:1408:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1408:26:1408:27 | x3 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1410:17:1410:18 | x4 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1410:17:1410:18 | x4 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1410:22:1410:36 | ...::new(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1410:22:1410:36 | ...::new(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1411:9:1411:33 | ...::set(...) | | file://:0:0:0:0 | () | -| main.rs:1411:23:1411:29 | &mut x4 | | file://:0:0:0:0 | & | -| main.rs:1411:23:1411:29 | &mut x4 | &T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1411:23:1411:29 | &mut x4 | &T.T | main.rs:1394:5:1395:13 | S | -| main.rs:1411:28:1411:29 | x4 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1411:28:1411:29 | x4 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1411:32:1411:32 | S | | main.rs:1394:5:1395:13 | S | -| main.rs:1412:18:1412:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1412:18:1412:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1412:18:1412:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1412:18:1412:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1412:18:1412:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1412:18:1412:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1412:26:1412:27 | x4 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1412:26:1412:27 | x4 | T | main.rs:1394:5:1395:13 | S | -| main.rs:1414:13:1414:14 | x5 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1414:13:1414:14 | x5 | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1414:13:1414:14 | x5 | T.T | main.rs:1394:5:1395:13 | S | -| main.rs:1414:18:1414:58 | ...::MySome(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1414:18:1414:58 | ...::MySome(...) | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1414:18:1414:58 | ...::MySome(...) | T.T | main.rs:1394:5:1395:13 | S | -| main.rs:1414:35:1414:57 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1414:35:1414:57 | ...::MyNone(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1415:18:1415:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1415:18:1415:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1415:18:1415:37 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1415:18:1415:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1415:18:1415:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1415:18:1415:37 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1415:26:1415:27 | x5 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1415:26:1415:27 | x5 | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1415:26:1415:27 | x5 | T.T | main.rs:1394:5:1395:13 | S | -| main.rs:1415:26:1415:37 | x5.flatten() | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1415:26:1415:37 | x5.flatten() | T | main.rs:1394:5:1395:13 | S | -| main.rs:1417:13:1417:14 | x6 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1417:13:1417:14 | x6 | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1417:13:1417:14 | x6 | T.T | main.rs:1394:5:1395:13 | S | -| main.rs:1417:18:1417:58 | ...::MySome(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1417:18:1417:58 | ...::MySome(...) | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1417:18:1417:58 | ...::MySome(...) | T.T | main.rs:1394:5:1395:13 | S | -| main.rs:1417:35:1417:57 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1417:35:1417:57 | ...::MyNone(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1418:18:1418:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1418:18:1418:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1418:18:1418:61 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1418:18:1418:61 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1418:18:1418:61 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1418:18:1418:61 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1418:26:1418:61 | ...::flatten(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1418:26:1418:61 | ...::flatten(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1418:59:1418:60 | x6 | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1418:59:1418:60 | x6 | T | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1418:59:1418:60 | x6 | T.T | main.rs:1394:5:1395:13 | S | -| main.rs:1421:13:1421:19 | from_if | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1421:13:1421:19 | from_if | T | main.rs:1394:5:1395:13 | S | -| main.rs:1421:23:1425:9 | if ... {...} else {...} | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1421:23:1425:9 | if ... {...} else {...} | T | main.rs:1394:5:1395:13 | S | -| main.rs:1421:26:1421:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1421:26:1421:30 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1421:30:1421:30 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1421:32:1423:9 | { ... } | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1421:32:1423:9 | { ... } | T | main.rs:1394:5:1395:13 | S | -| main.rs:1422:13:1422:30 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1422:13:1422:30 | ...::MyNone(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1423:16:1425:9 | { ... } | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1423:16:1425:9 | { ... } | T | main.rs:1394:5:1395:13 | S | -| main.rs:1424:13:1424:31 | ...::MySome(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1424:13:1424:31 | ...::MySome(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1424:30:1424:30 | S | | main.rs:1394:5:1395:13 | S | -| main.rs:1426:18:1426:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1426:18:1426:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1426:18:1426:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1426:18:1426:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1426:18:1426:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1426:18:1426:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1426:26:1426:32 | from_if | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1426:26:1426:32 | from_if | T | main.rs:1394:5:1395:13 | S | -| main.rs:1429:13:1429:22 | from_match | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1429:13:1429:22 | from_match | T | main.rs:1394:5:1395:13 | S | -| main.rs:1429:26:1432:9 | match ... { ... } | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1429:26:1432:9 | match ... { ... } | T | main.rs:1394:5:1395:13 | S | -| main.rs:1429:32:1429:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1429:32:1429:36 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1429:36:1429:36 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1430:13:1430:16 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1430:21:1430:38 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1430:21:1430:38 | ...::MyNone(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1431:13:1431:17 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1431:22:1431:40 | ...::MySome(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1431:22:1431:40 | ...::MySome(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1431:39:1431:39 | S | | main.rs:1394:5:1395:13 | S | -| main.rs:1433:18:1433:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1433:18:1433:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1433:18:1433:35 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1433:18:1433:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1433:18:1433:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1433:18:1433:35 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1433:26:1433:35 | from_match | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1433:26:1433:35 | from_match | T | main.rs:1394:5:1395:13 | S | -| main.rs:1436:13:1436:21 | from_loop | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1436:13:1436:21 | from_loop | T | main.rs:1394:5:1395:13 | S | -| main.rs:1436:25:1441:9 | loop { ... } | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1436:25:1441:9 | loop { ... } | T | main.rs:1394:5:1395:13 | S | -| main.rs:1436:30:1441:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1437:13:1439:13 | if ... {...} | | file://:0:0:0:0 | () | -| main.rs:1437:16:1437:16 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1437:16:1437:20 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1437:20:1437:20 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1437:22:1439:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1438:23:1438:40 | ...::MyNone(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1438:23:1438:40 | ...::MyNone(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1440:19:1440:37 | ...::MySome(...) | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1440:19:1440:37 | ...::MySome(...) | T | main.rs:1394:5:1395:13 | S | -| main.rs:1440:36:1440:36 | S | | main.rs:1394:5:1395:13 | S | -| main.rs:1442:18:1442:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1442:18:1442:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1442:18:1442:34 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1442:18:1442:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1442:18:1442:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1442:18:1442:34 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1442:26:1442:34 | from_loop | | main.rs:1359:5:1363:5 | MyOption | -| main.rs:1442:26:1442:34 | from_loop | T | main.rs:1394:5:1395:13 | S | -| main.rs:1460:15:1460:18 | SelfParam | | main.rs:1448:5:1449:19 | S | -| main.rs:1460:15:1460:18 | SelfParam | T | main.rs:1459:10:1459:10 | T | -| main.rs:1460:26:1462:9 | { ... } | | main.rs:1459:10:1459:10 | T | -| main.rs:1461:13:1461:16 | self | | main.rs:1448:5:1449:19 | S | -| main.rs:1461:13:1461:16 | self | T | main.rs:1459:10:1459:10 | T | -| main.rs:1461:13:1461:18 | self.0 | | main.rs:1459:10:1459:10 | T | -| main.rs:1464:15:1464:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1464:15:1464:19 | SelfParam | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1464:15:1464:19 | SelfParam | &T.T | main.rs:1459:10:1459:10 | T | -| main.rs:1464:28:1466:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1464:28:1466:9 | { ... } | &T | main.rs:1459:10:1459:10 | T | -| main.rs:1465:13:1465:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1465:13:1465:19 | &... | &T | main.rs:1459:10:1459:10 | T | -| main.rs:1465:14:1465:17 | self | | file://:0:0:0:0 | & | -| main.rs:1465:14:1465:17 | self | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1465:14:1465:17 | self | &T.T | main.rs:1459:10:1459:10 | T | -| main.rs:1465:14:1465:19 | self.0 | | main.rs:1459:10:1459:10 | T | -| main.rs:1468:15:1468:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1468:15:1468:25 | SelfParam | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1468:15:1468:25 | SelfParam | &T.T | main.rs:1459:10:1459:10 | T | -| main.rs:1468:34:1470:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1468:34:1470:9 | { ... } | &T | main.rs:1459:10:1459:10 | T | -| main.rs:1469:13:1469:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1469:13:1469:19 | &... | &T | main.rs:1459:10:1459:10 | T | -| main.rs:1469:14:1469:17 | self | | file://:0:0:0:0 | & | -| main.rs:1469:14:1469:17 | self | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1469:14:1469:17 | self | &T.T | main.rs:1459:10:1459:10 | T | -| main.rs:1469:14:1469:19 | self.0 | | main.rs:1459:10:1459:10 | T | -| main.rs:1474:29:1474:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1474:29:1474:33 | SelfParam | &T | main.rs:1473:5:1476:5 | Self [trait ATrait] | -| main.rs:1475:33:1475:36 | SelfParam | | main.rs:1473:5:1476:5 | Self [trait ATrait] | -| main.rs:1481:29:1481:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1481:29:1481:33 | SelfParam | &T | file://:0:0:0:0 | & | -| main.rs:1481:29:1481:33 | SelfParam | &T.&T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1481:43:1483:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:1482:13:1482:22 | (...) | | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1482:13:1482:24 | ... .a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1482:14:1482:21 | * ... | | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1482:15:1482:21 | (...) | | file://:0:0:0:0 | & | -| main.rs:1482:15:1482:21 | (...) | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1482:16:1482:20 | * ... | | file://:0:0:0:0 | & | -| main.rs:1482:16:1482:20 | * ... | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1482:17:1482:20 | self | | file://:0:0:0:0 | & | -| main.rs:1482:17:1482:20 | self | &T | file://:0:0:0:0 | & | -| main.rs:1482:17:1482:20 | self | &T.&T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1486:33:1486:36 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1486:33:1486:36 | SelfParam | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1486:46:1488:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:1487:13:1487:19 | (...) | | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1487:13:1487:21 | ... .a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1487:14:1487:18 | * ... | | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1487:15:1487:18 | self | | file://:0:0:0:0 | & | -| main.rs:1487:15:1487:18 | self | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1491:16:1541:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1492:13:1492:14 | x1 | | main.rs:1448:5:1449:19 | S | -| main.rs:1492:13:1492:14 | x1 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1492:18:1492:22 | S(...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1492:18:1492:22 | S(...) | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1492:20:1492:21 | S2 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1493:18:1493:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1493:18:1493:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1493:18:1493:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1493:18:1493:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1493:18:1493:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1493:18:1493:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1493:26:1493:27 | x1 | | main.rs:1448:5:1449:19 | S | -| main.rs:1493:26:1493:27 | x1 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1493:26:1493:32 | x1.m1() | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1495:13:1495:14 | x2 | | main.rs:1448:5:1449:19 | S | -| main.rs:1495:13:1495:14 | x2 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1495:18:1495:22 | S(...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1495:18:1495:22 | S(...) | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1495:20:1495:21 | S2 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1497:18:1497:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1497:18:1497:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1497:18:1497:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1497:18:1497:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1497:18:1497:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1497:18:1497:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1497:26:1497:27 | x2 | | main.rs:1448:5:1449:19 | S | -| main.rs:1497:26:1497:27 | x2 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1497:26:1497:32 | x2.m2() | | file://:0:0:0:0 | & | -| main.rs:1497:26:1497:32 | x2.m2() | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1498:18:1498:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1498:18:1498:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1498:18:1498:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1498:18:1498:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1498:18:1498:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1498:18:1498:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1498:26:1498:27 | x2 | | main.rs:1448:5:1449:19 | S | -| main.rs:1498:26:1498:27 | x2 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1498:26:1498:32 | x2.m3() | | file://:0:0:0:0 | & | -| main.rs:1498:26:1498:32 | x2.m3() | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1500:13:1500:14 | x3 | | main.rs:1448:5:1449:19 | S | -| main.rs:1500:13:1500:14 | x3 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1500:18:1500:22 | S(...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1500:18:1500:22 | S(...) | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1500:20:1500:21 | S2 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1502:18:1502:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1502:18:1502:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1502:18:1502:41 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1502:18:1502:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1502:18:1502:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1502:18:1502:41 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1502:26:1502:41 | ...::m2(...) | | file://:0:0:0:0 | & | -| main.rs:1502:26:1502:41 | ...::m2(...) | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1502:38:1502:40 | &x3 | | file://:0:0:0:0 | & | -| main.rs:1502:38:1502:40 | &x3 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1502:38:1502:40 | &x3 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1502:39:1502:40 | x3 | | main.rs:1448:5:1449:19 | S | -| main.rs:1502:39:1502:40 | x3 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1503:18:1503:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1503:18:1503:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1503:18:1503:41 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1503:18:1503:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1503:18:1503:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1503:18:1503:41 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1503:26:1503:41 | ...::m3(...) | | file://:0:0:0:0 | & | -| main.rs:1503:26:1503:41 | ...::m3(...) | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1503:38:1503:40 | &x3 | | file://:0:0:0:0 | & | -| main.rs:1503:38:1503:40 | &x3 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1503:38:1503:40 | &x3 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1503:39:1503:40 | x3 | | main.rs:1448:5:1449:19 | S | -| main.rs:1503:39:1503:40 | x3 | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1505:13:1505:14 | x4 | | file://:0:0:0:0 | & | -| main.rs:1505:13:1505:14 | x4 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1505:13:1505:14 | x4 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1505:18:1505:23 | &... | | file://:0:0:0:0 | & | -| main.rs:1505:18:1505:23 | &... | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1505:18:1505:23 | &... | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1505:19:1505:23 | S(...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1505:19:1505:23 | S(...) | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1505:21:1505:22 | S2 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1507:18:1507:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1507:18:1507:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1507:18:1507:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1507:18:1507:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1507:18:1507:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1507:18:1507:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1507:26:1507:27 | x4 | | file://:0:0:0:0 | & | -| main.rs:1507:26:1507:27 | x4 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1507:26:1507:27 | x4 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1507:26:1507:32 | x4.m2() | | file://:0:0:0:0 | & | -| main.rs:1507:26:1507:32 | x4.m2() | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1508:18:1508:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1508:18:1508:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1508:18:1508:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1508:18:1508:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1508:18:1508:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1508:18:1508:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1508:26:1508:27 | x4 | | file://:0:0:0:0 | & | -| main.rs:1508:26:1508:27 | x4 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1508:26:1508:27 | x4 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1508:26:1508:32 | x4.m3() | | file://:0:0:0:0 | & | -| main.rs:1508:26:1508:32 | x4.m3() | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1510:13:1510:14 | x5 | | file://:0:0:0:0 | & | -| main.rs:1510:13:1510:14 | x5 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1510:13:1510:14 | x5 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1510:18:1510:23 | &... | | file://:0:0:0:0 | & | -| main.rs:1510:18:1510:23 | &... | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1510:18:1510:23 | &... | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1510:19:1510:23 | S(...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1510:19:1510:23 | S(...) | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1510:21:1510:22 | S2 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1512:18:1512:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1512:18:1512:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1512:18:1512:32 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1512:18:1512:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1512:18:1512:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1512:18:1512:32 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1512:26:1512:27 | x5 | | file://:0:0:0:0 | & | -| main.rs:1512:26:1512:27 | x5 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1512:26:1512:27 | x5 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1512:26:1512:32 | x5.m1() | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1513:18:1513:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1513:18:1513:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1513:18:1513:29 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1513:18:1513:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1513:18:1513:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1513:18:1513:29 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1513:26:1513:27 | x5 | | file://:0:0:0:0 | & | -| main.rs:1513:26:1513:27 | x5 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1513:26:1513:27 | x5 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1513:26:1513:29 | x5.0 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1515:13:1515:14 | x6 | | file://:0:0:0:0 | & | -| main.rs:1515:13:1515:14 | x6 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1515:13:1515:14 | x6 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1515:18:1515:23 | &... | | file://:0:0:0:0 | & | -| main.rs:1515:18:1515:23 | &... | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1515:18:1515:23 | &... | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1515:19:1515:23 | S(...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1515:19:1515:23 | S(...) | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1515:21:1515:22 | S2 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1518:18:1518:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1518:18:1518:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1518:18:1518:35 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1518:18:1518:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1518:18:1518:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1518:18:1518:35 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1518:26:1518:30 | (...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1518:26:1518:30 | (...) | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1518:26:1518:35 | ... .m1() | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1518:27:1518:29 | * ... | | main.rs:1448:5:1449:19 | S | -| main.rs:1518:27:1518:29 | * ... | T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1518:28:1518:29 | x6 | | file://:0:0:0:0 | & | -| main.rs:1518:28:1518:29 | x6 | &T | main.rs:1448:5:1449:19 | S | -| main.rs:1518:28:1518:29 | x6 | &T.T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1520:13:1520:14 | x7 | | main.rs:1448:5:1449:19 | S | -| main.rs:1520:13:1520:14 | x7 | T | file://:0:0:0:0 | & | -| main.rs:1520:13:1520:14 | x7 | T.&T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1520:18:1520:23 | S(...) | | main.rs:1448:5:1449:19 | S | -| main.rs:1520:18:1520:23 | S(...) | T | file://:0:0:0:0 | & | -| main.rs:1520:18:1520:23 | S(...) | T.&T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1520:20:1520:22 | &S2 | | file://:0:0:0:0 | & | -| main.rs:1520:20:1520:22 | &S2 | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1520:21:1520:22 | S2 | | main.rs:1451:5:1452:14 | S2 | -| main.rs:1523:13:1523:13 | t | | file://:0:0:0:0 | & | -| main.rs:1523:13:1523:13 | t | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1523:17:1523:18 | x7 | | main.rs:1448:5:1449:19 | S | -| main.rs:1523:17:1523:18 | x7 | T | file://:0:0:0:0 | & | -| main.rs:1523:17:1523:18 | x7 | T.&T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1523:17:1523:23 | x7.m1() | | file://:0:0:0:0 | & | -| main.rs:1523:17:1523:23 | x7.m1() | &T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1524:18:1524:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1524:18:1524:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1524:18:1524:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1524:18:1524:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1524:18:1524:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1524:18:1524:27 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1524:26:1524:27 | x7 | | main.rs:1448:5:1449:19 | S | -| main.rs:1524:26:1524:27 | x7 | T | file://:0:0:0:0 | & | -| main.rs:1524:26:1524:27 | x7 | T.&T | main.rs:1451:5:1452:14 | S2 | -| main.rs:1526:13:1526:14 | x9 | | {EXTERNAL LOCATION} | String | -| main.rs:1526:26:1526:32 | "Hello" | | file://:0:0:0:0 | & | -| main.rs:1526:26:1526:32 | "Hello" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1526:26:1526:44 | "Hello".to_string() | | {EXTERNAL LOCATION} | String | -| main.rs:1530:13:1530:13 | u | | {EXTERNAL LOCATION} | Result | -| main.rs:1530:13:1530:13 | u | T | {EXTERNAL LOCATION} | u32 | -| main.rs:1530:17:1530:18 | x9 | | {EXTERNAL LOCATION} | String | -| main.rs:1530:17:1530:33 | x9.parse() | | {EXTERNAL LOCATION} | Result | -| main.rs:1530:17:1530:33 | x9.parse() | T | {EXTERNAL LOCATION} | u32 | -| main.rs:1532:13:1532:20 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1532:13:1532:20 | my_thing | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1532:24:1532:39 | &... | | file://:0:0:0:0 | & | -| main.rs:1532:24:1532:39 | &... | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1532:25:1532:39 | MyInt {...} | | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1532:36:1532:37 | 37 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1532:36:1532:37 | 37 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1534:13:1534:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1534:17:1534:24 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1534:17:1534:24 | my_thing | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1534:17:1534:43 | my_thing.method_on_borrow() | | {EXTERNAL LOCATION} | i64 | -| main.rs:1535:18:1535:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1535:18:1535:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1535:18:1535:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1535:18:1535:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1535:18:1535:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1535:18:1535:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1535:26:1535:26 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1538:13:1538:20 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1538:13:1538:20 | my_thing | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1538:24:1538:39 | &... | | file://:0:0:0:0 | & | -| main.rs:1538:24:1538:39 | &... | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1538:25:1538:39 | MyInt {...} | | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1538:36:1538:37 | 38 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1538:36:1538:37 | 38 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1539:13:1539:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1539:17:1539:24 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1539:17:1539:24 | my_thing | &T | main.rs:1454:5:1457:5 | MyInt | -| main.rs:1539:17:1539:47 | my_thing.method_not_on_borrow() | | {EXTERNAL LOCATION} | i64 | -| main.rs:1540:18:1540:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1540:18:1540:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1540:18:1540:26 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1540:18:1540:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1540:18:1540:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1540:18:1540:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1540:26:1540:26 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1547:16:1547:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1547:16:1547:20 | SelfParam | &T | main.rs:1545:5:1553:5 | Self [trait MyTrait] | -| main.rs:1550:16:1550:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1550:16:1550:20 | SelfParam | &T | main.rs:1545:5:1553:5 | Self [trait MyTrait] | -| main.rs:1550:32:1552:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1550:32:1552:9 | { ... } | &T | main.rs:1545:5:1553:5 | Self [trait MyTrait] | -| main.rs:1551:13:1551:16 | self | | file://:0:0:0:0 | & | -| main.rs:1551:13:1551:16 | self | &T | main.rs:1545:5:1553:5 | Self [trait MyTrait] | -| main.rs:1551:13:1551:22 | self.foo() | | file://:0:0:0:0 | & | -| main.rs:1551:13:1551:22 | self.foo() | &T | main.rs:1545:5:1553:5 | Self [trait MyTrait] | -| main.rs:1559:16:1559:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1559:16:1559:20 | SelfParam | &T | main.rs:1555:5:1555:20 | MyStruct | -| main.rs:1559:36:1561:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1559:36:1561:9 | { ... } | &T | main.rs:1555:5:1555:20 | MyStruct | -| main.rs:1560:13:1560:16 | self | | file://:0:0:0:0 | & | -| main.rs:1560:13:1560:16 | self | &T | main.rs:1555:5:1555:20 | MyStruct | -| main.rs:1564:16:1567:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1565:13:1565:13 | x | | main.rs:1555:5:1555:20 | MyStruct | -| main.rs:1565:17:1565:24 | MyStruct | | main.rs:1555:5:1555:20 | MyStruct | -| main.rs:1566:9:1566:9 | x | | main.rs:1555:5:1555:20 | MyStruct | -| main.rs:1566:9:1566:15 | x.bar() | | file://:0:0:0:0 | & | -| main.rs:1566:9:1566:15 | x.bar() | &T | main.rs:1555:5:1555:20 | MyStruct | -| main.rs:1576:16:1576:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1576:16:1576:20 | SelfParam | &T | main.rs:1573:5:1573:26 | MyStruct | -| main.rs:1576:16:1576:20 | SelfParam | &T.T | main.rs:1575:10:1575:10 | T | -| main.rs:1576:32:1578:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1576:32:1578:9 | { ... } | &T | main.rs:1573:5:1573:26 | MyStruct | -| main.rs:1576:32:1578:9 | { ... } | &T.T | main.rs:1575:10:1575:10 | T | -| main.rs:1577:13:1577:16 | self | | file://:0:0:0:0 | & | -| main.rs:1577:13:1577:16 | self | &T | main.rs:1573:5:1573:26 | MyStruct | -| main.rs:1577:13:1577:16 | self | &T.T | main.rs:1575:10:1575:10 | T | -| main.rs:1581:16:1584:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1582:13:1582:13 | x | | main.rs:1573:5:1573:26 | MyStruct | -| main.rs:1582:13:1582:13 | x | T | main.rs:1571:5:1571:13 | S | -| main.rs:1582:17:1582:27 | MyStruct(...) | | main.rs:1573:5:1573:26 | MyStruct | -| main.rs:1582:17:1582:27 | MyStruct(...) | T | main.rs:1571:5:1571:13 | S | -| main.rs:1582:26:1582:26 | S | | main.rs:1571:5:1571:13 | S | -| main.rs:1583:9:1583:9 | x | | main.rs:1573:5:1573:26 | MyStruct | -| main.rs:1583:9:1583:9 | x | T | main.rs:1571:5:1571:13 | S | -| main.rs:1583:9:1583:15 | x.foo() | | file://:0:0:0:0 | & | -| main.rs:1583:9:1583:15 | x.foo() | &T | main.rs:1573:5:1573:26 | MyStruct | -| main.rs:1583:9:1583:15 | x.foo() | &T.T | main.rs:1571:5:1571:13 | S | -| main.rs:1594:17:1594:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1594:17:1594:25 | SelfParam | &T | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1594:28:1596:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1595:13:1595:16 | self | | file://:0:0:0:0 | & | -| main.rs:1595:13:1595:16 | self | &T | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1595:13:1595:21 | self.bool | | {EXTERNAL LOCATION} | bool | -| main.rs:1595:13:1595:34 | ... = ... | | file://:0:0:0:0 | () | -| main.rs:1595:25:1595:34 | ! ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1595:26:1595:29 | self | | file://:0:0:0:0 | & | -| main.rs:1595:26:1595:29 | self | &T | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1595:26:1595:34 | self.bool | | {EXTERNAL LOCATION} | bool | -| main.rs:1602:15:1602:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1602:15:1602:19 | SelfParam | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1602:31:1604:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1602:31:1604:9 | { ... } | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1603:13:1603:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1603:13:1603:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1603:13:1603:19 | &... | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1603:13:1603:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1603:13:1603:19 | &... | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1603:13:1603:19 | &... | &T.&T.&T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1603:14:1603:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1603:14:1603:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1603:14:1603:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1603:14:1603:19 | &... | &T.&T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1603:15:1603:19 | &self | | file://:0:0:0:0 | & | -| main.rs:1603:15:1603:19 | &self | &T | file://:0:0:0:0 | & | -| main.rs:1603:15:1603:19 | &self | &T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1603:16:1603:19 | self | | file://:0:0:0:0 | & | -| main.rs:1603:16:1603:19 | self | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1606:15:1606:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1606:15:1606:25 | SelfParam | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1606:37:1608:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1606:37:1608:9 | { ... } | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1607:13:1607:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1607:13:1607:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1607:13:1607:19 | &... | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1607:13:1607:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1607:13:1607:19 | &... | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1607:13:1607:19 | &... | &T.&T.&T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1607:14:1607:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1607:14:1607:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1607:14:1607:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1607:14:1607:19 | &... | &T.&T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1607:15:1607:19 | &self | | file://:0:0:0:0 | & | -| main.rs:1607:15:1607:19 | &self | &T | file://:0:0:0:0 | & | -| main.rs:1607:15:1607:19 | &self | &T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1607:16:1607:19 | self | | file://:0:0:0:0 | & | -| main.rs:1607:16:1607:19 | self | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1610:15:1610:15 | x | | file://:0:0:0:0 | & | -| main.rs:1610:15:1610:15 | x | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1610:34:1612:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1610:34:1612:9 | { ... } | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1611:13:1611:13 | x | | file://:0:0:0:0 | & | -| main.rs:1611:13:1611:13 | x | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1614:15:1614:15 | x | | file://:0:0:0:0 | & | -| main.rs:1614:15:1614:15 | x | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1614:34:1616:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1614:34:1616:9 | { ... } | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1615:13:1615:16 | &... | | file://:0:0:0:0 | & | -| main.rs:1615:13:1615:16 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1615:13:1615:16 | &... | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1615:13:1615:16 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1615:13:1615:16 | &... | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1615:13:1615:16 | &... | &T.&T.&T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1615:14:1615:16 | &... | | file://:0:0:0:0 | & | -| main.rs:1615:14:1615:16 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1615:14:1615:16 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1615:14:1615:16 | &... | &T.&T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1615:15:1615:16 | &x | | file://:0:0:0:0 | & | -| main.rs:1615:15:1615:16 | &x | &T | file://:0:0:0:0 | & | -| main.rs:1615:15:1615:16 | &x | &T.&T | main.rs:1599:5:1599:13 | S | -| main.rs:1615:16:1615:16 | x | | file://:0:0:0:0 | & | -| main.rs:1615:16:1615:16 | x | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1619:16:1632:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1620:13:1620:13 | x | | main.rs:1599:5:1599:13 | S | -| main.rs:1620:17:1620:20 | S {...} | | main.rs:1599:5:1599:13 | S | -| main.rs:1621:9:1621:9 | x | | main.rs:1599:5:1599:13 | S | -| main.rs:1621:9:1621:14 | x.f1() | | file://:0:0:0:0 | & | -| main.rs:1621:9:1621:14 | x.f1() | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1622:9:1622:9 | x | | main.rs:1599:5:1599:13 | S | -| main.rs:1622:9:1622:14 | x.f2() | | file://:0:0:0:0 | & | -| main.rs:1622:9:1622:14 | x.f2() | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1623:9:1623:17 | ...::f3(...) | | file://:0:0:0:0 | & | -| main.rs:1623:9:1623:17 | ...::f3(...) | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1623:15:1623:16 | &x | | file://:0:0:0:0 | & | -| main.rs:1623:15:1623:16 | &x | &T | main.rs:1599:5:1599:13 | S | -| main.rs:1623:16:1623:16 | x | | main.rs:1599:5:1599:13 | S | -| main.rs:1625:13:1625:13 | n | | {EXTERNAL LOCATION} | bool | -| main.rs:1625:17:1625:24 | * ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1625:18:1625:24 | * ... | | file://:0:0:0:0 | & | -| main.rs:1625:18:1625:24 | * ... | &T | {EXTERNAL LOCATION} | bool | -| main.rs:1625:19:1625:24 | &... | | file://:0:0:0:0 | & | -| main.rs:1625:19:1625:24 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1625:19:1625:24 | &... | &T.&T | {EXTERNAL LOCATION} | bool | -| main.rs:1625:20:1625:24 | &true | | file://:0:0:0:0 | & | -| main.rs:1625:20:1625:24 | &true | &T | {EXTERNAL LOCATION} | bool | -| main.rs:1625:21:1625:24 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1629:17:1629:20 | flag | | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1629:24:1629:41 | ...::default(...) | | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1630:9:1630:31 | ...::flip(...) | | file://:0:0:0:0 | () | -| main.rs:1630:22:1630:30 | &mut flag | | file://:0:0:0:0 | & | -| main.rs:1630:22:1630:30 | &mut flag | &T | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1630:27:1630:30 | flag | | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1631:18:1631:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1631:18:1631:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1631:18:1631:29 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1631:18:1631:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1631:18:1631:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1631:18:1631:29 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1631:26:1631:29 | flag | | main.rs:1588:5:1591:5 | MyFlag | -| main.rs:1646:43:1649:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1646:43:1649:5 | { ... } | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1646:43:1649:5 | { ... } | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1647:13:1647:13 | x | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1647:17:1647:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1647:17:1647:30 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1647:17:1647:31 | TryExpr | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1647:28:1647:29 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1648:9:1648:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1648:9:1648:22 | ...::Ok(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1648:9:1648:22 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1648:20:1648:21 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1653:46:1657:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1653:46:1657:5 | { ... } | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1653:46:1657:5 | { ... } | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1654:13:1654:13 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1654:13:1654:13 | x | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1654:17:1654:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1654:17:1654:30 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1654:28:1654:29 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1655:13:1655:13 | y | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1655:17:1655:17 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1655:17:1655:17 | x | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1655:17:1655:18 | TryExpr | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1656:9:1656:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1656:9:1656:22 | ...::Ok(...) | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1656:9:1656:22 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1656:20:1656:21 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1661:40:1666:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1661:40:1666:5 | { ... } | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1661:40:1666:5 | { ... } | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1662:13:1662:13 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1662:13:1662:13 | x | T | {EXTERNAL LOCATION} | Result | -| main.rs:1662:13:1662:13 | x | T.T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1662:17:1662:42 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1662:17:1662:42 | ...::Ok(...) | T | {EXTERNAL LOCATION} | Result | -| main.rs:1662:17:1662:42 | ...::Ok(...) | T.T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1662:28:1662:41 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1662:28:1662:41 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1662:39:1662:40 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1664:17:1664:17 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1664:17:1664:17 | x | T | {EXTERNAL LOCATION} | Result | -| main.rs:1664:17:1664:17 | x | T.T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1664:17:1664:18 | TryExpr | | {EXTERNAL LOCATION} | Result | -| main.rs:1664:17:1664:18 | TryExpr | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1664:17:1664:29 | ... .map(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1664:24:1664:28 | \|...\| s | | {EXTERNAL LOCATION} | dyn FnOnce | -| main.rs:1664:24:1664:28 | \|...\| s | dyn(Args) | file://:0:0:0:0 | (T_1) | -| main.rs:1665:9:1665:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1665:9:1665:22 | ...::Ok(...) | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1665:9:1665:22 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1665:20:1665:21 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1670:30:1670:34 | input | | {EXTERNAL LOCATION} | Result | -| main.rs:1670:30:1670:34 | input | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1670:30:1670:34 | input | T | main.rs:1670:20:1670:27 | T | -| main.rs:1670:69:1677:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1670:69:1677:5 | { ... } | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1670:69:1677:5 | { ... } | T | main.rs:1670:20:1670:27 | T | -| main.rs:1671:13:1671:17 | value | | main.rs:1670:20:1670:27 | T | -| main.rs:1671:21:1671:25 | input | | {EXTERNAL LOCATION} | Result | -| main.rs:1671:21:1671:25 | input | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1671:21:1671:25 | input | T | main.rs:1670:20:1670:27 | T | -| main.rs:1671:21:1671:26 | TryExpr | | main.rs:1670:20:1670:27 | T | -| main.rs:1672:22:1672:38 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1672:22:1672:38 | ...::Ok(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1672:22:1672:38 | ...::Ok(...) | T | main.rs:1670:20:1670:27 | T | -| main.rs:1672:22:1675:10 | ... .and_then(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1672:22:1675:10 | ... .and_then(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1672:33:1672:37 | value | | main.rs:1670:20:1670:27 | T | -| main.rs:1672:49:1675:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| main.rs:1672:49:1675:9 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | -| main.rs:1672:49:1675:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | Result | -| main.rs:1672:49:1675:9 | \|...\| ... | dyn(Output).E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1672:53:1675:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1672:53:1675:9 | { ... } | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1673:22:1673:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1673:22:1673:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1673:22:1673:30 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1673:22:1673:30 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1673:22:1673:30 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1673:22:1673:30 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1674:13:1674:34 | ...::Ok::<...>(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1674:13:1674:34 | ...::Ok::<...>(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1676:9:1676:23 | ...::Err(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1676:9:1676:23 | ...::Err(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1676:9:1676:23 | ...::Err(...) | T | main.rs:1670:20:1670:27 | T | -| main.rs:1676:21:1676:22 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1680:16:1696:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1681:9:1683:9 | if ... {...} | | file://:0:0:0:0 | () | -| main.rs:1681:16:1681:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1681:16:1681:33 | ...::Ok(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1681:16:1681:33 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1681:27:1681:32 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1681:37:1681:52 | try_same_error(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1681:37:1681:52 | try_same_error(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1681:37:1681:52 | try_same_error(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1681:54:1683:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1682:22:1682:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1682:22:1682:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1682:22:1682:35 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1682:22:1682:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1682:22:1682:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1682:22:1682:35 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1682:30:1682:35 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1685:9:1687:9 | if ... {...} | | file://:0:0:0:0 | () | -| main.rs:1685:16:1685:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1685:16:1685:33 | ...::Ok(...) | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1685:16:1685:33 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1685:27:1685:32 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1685:37:1685:55 | try_convert_error(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1685:37:1685:55 | try_convert_error(...) | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1685:37:1685:55 | try_convert_error(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1685:57:1687:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1686:22:1686:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1686:22:1686:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1686:22:1686:35 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1686:22:1686:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1686:22:1686:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1686:22:1686:35 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1686:30:1686:35 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1689:9:1691:9 | if ... {...} | | file://:0:0:0:0 | () | -| main.rs:1689:16:1689:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1689:16:1689:33 | ...::Ok(...) | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1689:16:1689:33 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1689:27:1689:32 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1689:37:1689:49 | try_chained(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1689:37:1689:49 | try_chained(...) | E | main.rs:1641:5:1642:14 | S2 | -| main.rs:1689:37:1689:49 | try_chained(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1689:51:1691:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1690:22:1690:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1690:22:1690:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1690:22:1690:35 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1690:22:1690:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1690:22:1690:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1690:22:1690:35 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1690:30:1690:35 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:9:1695:9 | if ... {...} | | file://:0:0:0:0 | () | -| main.rs:1693:16:1693:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1693:16:1693:33 | ...::Ok(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:16:1693:33 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:27:1693:32 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:37:1693:63 | try_complex(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1693:37:1693:63 | try_complex(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:37:1693:63 | try_complex(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:49:1693:62 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1693:49:1693:62 | ...::Ok(...) | E | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:49:1693:62 | ...::Ok(...) | T | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:60:1693:61 | S1 | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1693:65:1695:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1694:22:1694:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1694:22:1694:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1694:22:1694:35 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:1694:22:1694:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1694:22:1694:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1694:22:1694:35 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1694:30:1694:35 | result | | main.rs:1638:5:1639:14 | S1 | -| main.rs:1700:16:1710:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1701:13:1701:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1701:22:1701:22 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1702:13:1702:13 | y | | {EXTERNAL LOCATION} | i32 | -| main.rs:1702:17:1702:17 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1703:13:1703:13 | z | | {EXTERNAL LOCATION} | i32 | -| main.rs:1703:17:1703:17 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1703:17:1703:21 | ... + ... | | {EXTERNAL LOCATION} | i32 | -| main.rs:1703:21:1703:21 | y | | {EXTERNAL LOCATION} | i32 | -| main.rs:1704:13:1704:13 | z | | {EXTERNAL LOCATION} | i32 | -| main.rs:1704:17:1704:17 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1704:17:1704:23 | x.abs() | | {EXTERNAL LOCATION} | i32 | -| main.rs:1705:13:1705:13 | c | | {EXTERNAL LOCATION} | char | -| main.rs:1705:17:1705:19 | 'c' | | {EXTERNAL LOCATION} | char | -| main.rs:1706:13:1706:17 | hello | | file://:0:0:0:0 | & | -| main.rs:1706:13:1706:17 | hello | &T | {EXTERNAL LOCATION} | str | -| main.rs:1706:21:1706:27 | "Hello" | | file://:0:0:0:0 | & | -| main.rs:1706:21:1706:27 | "Hello" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1707:13:1707:13 | f | | {EXTERNAL LOCATION} | f64 | -| main.rs:1707:17:1707:24 | 123.0f64 | | {EXTERNAL LOCATION} | f64 | -| main.rs:1708:13:1708:13 | t | | {EXTERNAL LOCATION} | bool | -| main.rs:1708:17:1708:20 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1709:13:1709:13 | f | | {EXTERNAL LOCATION} | bool | -| main.rs:1709:17:1709:21 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1715:16:1727:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1716:13:1716:13 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:1716:17:1716:20 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1716:17:1716:29 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1716:25:1716:29 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1717:13:1717:13 | y | | {EXTERNAL LOCATION} | bool | -| main.rs:1717:17:1717:20 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1717:17:1717:29 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1717:25:1717:29 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1719:17:1719:17 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1720:13:1720:16 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:1720:20:1720:21 | 34 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1720:20:1720:27 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1720:26:1720:27 | 33 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1721:9:1725:9 | if cond {...} else {...} | | file://:0:0:0:0 | () | -| main.rs:1721:12:1721:15 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:1721:17:1723:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1722:17:1722:17 | z | | file://:0:0:0:0 | () | -| main.rs:1722:21:1722:27 | (...) | | file://:0:0:0:0 | () | -| main.rs:1722:22:1722:22 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1722:22:1722:26 | ... = ... | | file://:0:0:0:0 | () | -| main.rs:1722:26:1722:26 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1723:16:1725:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1724:13:1724:13 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1724:13:1724:17 | ... = ... | | file://:0:0:0:0 | () | -| main.rs:1724:17:1724:17 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1726:9:1726:9 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1740:30:1742:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1741:13:1741:31 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1741:23:1741:23 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1741:23:1741:23 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1741:29:1741:29 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1741:29:1741:29 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1748:16:1748:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1748:22:1748:24 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1748:41:1753:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1749:13:1752:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1750:20:1750:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1750:20:1750:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1750:20:1750:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1750:29:1750:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1750:29:1750:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1751:20:1751:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1751:20:1751:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1751:20:1751:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1751:29:1751:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1751:29:1751:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1758:23:1758:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1758:23:1758:31 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1758:34:1758:36 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1758:45:1761:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1759:13:1759:16 | self | | file://:0:0:0:0 | & | -| main.rs:1759:13:1759:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1759:13:1759:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1759:13:1759:27 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1759:23:1759:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1759:23:1759:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1760:13:1760:16 | self | | file://:0:0:0:0 | & | -| main.rs:1760:13:1760:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1760:13:1760:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1760:13:1760:27 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1760:23:1760:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1760:23:1760:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1766:16:1766:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1766:22:1766:24 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1766:41:1771:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1767:13:1770:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1768:20:1768:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1768:20:1768:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1768:20:1768:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1768:29:1768:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1768:29:1768:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1769:20:1769:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1769:20:1769:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1769:20:1769:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1769:29:1769:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1769:29:1769:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1776:23:1776:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1776:23:1776:31 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1776:34:1776:36 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1776:45:1779:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1777:13:1777:16 | self | | file://:0:0:0:0 | & | -| main.rs:1777:13:1777:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1777:13:1777:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1777:13:1777:27 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1777:23:1777:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1777:23:1777:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1778:13:1778:16 | self | | file://:0:0:0:0 | & | -| main.rs:1778:13:1778:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1778:13:1778:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1778:13:1778:27 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1778:23:1778:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1778:23:1778:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1784:16:1784:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1784:22:1784:24 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1784:41:1789:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1785:13:1788:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1786:20:1786:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1786:20:1786:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1786:20:1786:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1786:29:1786:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1786:29:1786:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1787:20:1787:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1787:20:1787:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1787:20:1787:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1787:29:1787:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1787:29:1787:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1793:23:1793:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1793:23:1793:31 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1793:34:1793:36 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1793:45:1796:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1794:13:1794:16 | self | | file://:0:0:0:0 | & | -| main.rs:1794:13:1794:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1794:13:1794:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1794:13:1794:27 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:1794:23:1794:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1794:23:1794:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1795:13:1795:16 | self | | file://:0:0:0:0 | & | -| main.rs:1795:13:1795:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1795:13:1795:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1795:13:1795:27 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:1795:23:1795:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1795:23:1795:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1801:16:1801:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1801:22:1801:24 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1801:41:1806:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1802:13:1805:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1803:20:1803:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1803:20:1803:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1803:20:1803:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1803:29:1803:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1803:29:1803:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1804:20:1804:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1804:20:1804:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1804:20:1804:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1804:29:1804:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1804:29:1804:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1810:23:1810:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1810:23:1810:31 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1810:34:1810:36 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1810:45:1813:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1811:13:1811:16 | self | | file://:0:0:0:0 | & | -| main.rs:1811:13:1811:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1811:13:1811:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1811:13:1811:27 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:1811:23:1811:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1811:23:1811:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1812:13:1812:16 | self | | file://:0:0:0:0 | & | -| main.rs:1812:13:1812:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1812:13:1812:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1812:13:1812:27 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:1812:23:1812:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1812:23:1812:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1818:16:1818:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1818:22:1818:24 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1818:41:1823:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1819:13:1822:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1820:20:1820:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1820:20:1820:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1820:20:1820:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1820:29:1820:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1820:29:1820:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1821:20:1821:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1821:20:1821:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1821:20:1821:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1821:29:1821:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1821:29:1821:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1827:23:1827:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1827:23:1827:31 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1827:34:1827:36 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1827:45:1830:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1828:13:1828:16 | self | | file://:0:0:0:0 | & | -| main.rs:1828:13:1828:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1828:13:1828:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1828:13:1828:27 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:1828:23:1828:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1828:23:1828:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1829:13:1829:16 | self | | file://:0:0:0:0 | & | -| main.rs:1829:13:1829:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1829:13:1829:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1829:13:1829:27 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:1829:23:1829:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1829:23:1829:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1835:19:1835:22 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1835:25:1835:27 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1835:44:1840:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1836:13:1839:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1837:20:1837:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1837:20:1837:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1837:20:1837:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1837:29:1837:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1837:29:1837:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1838:20:1838:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1838:20:1838:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1838:20:1838:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1838:29:1838:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1838:29:1838:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1844:26:1844:34 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1844:26:1844:34 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1844:37:1844:39 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1844:48:1847:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1845:13:1845:16 | self | | file://:0:0:0:0 | & | -| main.rs:1845:13:1845:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1845:13:1845:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1845:13:1845:27 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1845:23:1845:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1845:23:1845:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1846:13:1846:16 | self | | file://:0:0:0:0 | & | -| main.rs:1846:13:1846:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1846:13:1846:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1846:13:1846:27 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1846:23:1846:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1846:23:1846:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1852:18:1852:21 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1852:24:1852:26 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1852:43:1857:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1853:13:1856:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1854:20:1854:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1854:20:1854:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1854:20:1854:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1854:29:1854:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1854:29:1854:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1855:20:1855:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1855:20:1855:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1855:20:1855:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1855:29:1855:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1855:29:1855:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1861:25:1861:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1861:25:1861:33 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1861:36:1861:38 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1861:47:1864:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1862:13:1862:16 | self | | file://:0:0:0:0 | & | -| main.rs:1862:13:1862:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1862:13:1862:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1862:13:1862:27 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1862:23:1862:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1862:23:1862:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1863:13:1863:16 | self | | file://:0:0:0:0 | & | -| main.rs:1863:13:1863:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1863:13:1863:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1863:13:1863:27 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1863:23:1863:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1863:23:1863:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1869:19:1869:22 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1869:25:1869:27 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1869:44:1874:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1870:13:1873:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1871:20:1871:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1871:20:1871:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1871:20:1871:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1871:29:1871:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1871:29:1871:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1872:20:1872:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1872:20:1872:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1872:20:1872:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1872:29:1872:31 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1872:29:1872:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1878:26:1878:34 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1878:26:1878:34 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1878:37:1878:39 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1878:48:1881:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1879:13:1879:16 | self | | file://:0:0:0:0 | & | -| main.rs:1879:13:1879:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1879:13:1879:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1879:13:1879:27 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:1879:23:1879:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1879:23:1879:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1880:13:1880:16 | self | | file://:0:0:0:0 | & | -| main.rs:1880:13:1880:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1880:13:1880:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1880:13:1880:27 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:1880:23:1880:25 | rhs | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1880:23:1880:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1886:16:1886:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1886:22:1886:24 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1886:40:1891:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1887:13:1890:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1888:20:1888:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1888:20:1888:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1888:20:1888:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1888:30:1888:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1889:20:1889:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1889:20:1889:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1889:20:1889:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1889:30:1889:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1895:23:1895:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1895:23:1895:31 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1895:34:1895:36 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1895:44:1898:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1896:13:1896:16 | self | | file://:0:0:0:0 | & | -| main.rs:1896:13:1896:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1896:13:1896:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1896:13:1896:26 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1896:24:1896:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1897:13:1897:16 | self | | file://:0:0:0:0 | & | -| main.rs:1897:13:1897:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1897:13:1897:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1897:13:1897:26 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1897:24:1897:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1903:16:1903:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1903:22:1903:24 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1903:40:1908:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1904:13:1907:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1905:20:1905:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1905:20:1905:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1905:20:1905:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1905:30:1905:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1906:20:1906:23 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1906:20:1906:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1906:20:1906:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1906:30:1906:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1912:23:1912:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1912:23:1912:31 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1912:34:1912:36 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1912:44:1915:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1913:13:1913:16 | self | | file://:0:0:0:0 | & | -| main.rs:1913:13:1913:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1913:13:1913:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1913:13:1913:26 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1913:24:1913:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1914:13:1914:16 | self | | file://:0:0:0:0 | & | -| main.rs:1914:13:1914:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1914:13:1914:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1914:13:1914:26 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1914:24:1914:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1920:16:1920:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1920:30:1925:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1921:13:1924:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1922:20:1922:26 | - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1922:21:1922:24 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1922:21:1922:26 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1923:20:1923:26 | - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1923:21:1923:24 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1923:21:1923:26 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1930:16:1930:19 | SelfParam | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1930:30:1935:9 | { ... } | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1931:13:1934:13 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1932:20:1932:26 | ! ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1932:21:1932:24 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1932:21:1932:26 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1933:20:1933:26 | ! ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1933:21:1933:24 | self | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1933:21:1933:26 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1939:15:1939:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1939:15:1939:19 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1939:22:1939:26 | other | | file://:0:0:0:0 | & | -| main.rs:1939:22:1939:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1939:44:1941:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1940:13:1940:16 | self | | file://:0:0:0:0 | & | -| main.rs:1940:13:1940:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1940:13:1940:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1940:13:1940:29 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1940:13:1940:50 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1940:23:1940:27 | other | | file://:0:0:0:0 | & | -| main.rs:1940:23:1940:27 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1940:23:1940:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1940:34:1940:37 | self | | file://:0:0:0:0 | & | -| main.rs:1940:34:1940:37 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1940:34:1940:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1940:34:1940:50 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1940:44:1940:48 | other | | file://:0:0:0:0 | & | -| main.rs:1940:44:1940:48 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1940:44:1940:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1943:15:1943:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1943:15:1943:19 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1943:22:1943:26 | other | | file://:0:0:0:0 | & | -| main.rs:1943:22:1943:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1943:44:1945:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1944:13:1944:16 | self | | file://:0:0:0:0 | & | -| main.rs:1944:13:1944:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1944:13:1944:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1944:13:1944:29 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1944:13:1944:50 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1944:23:1944:27 | other | | file://:0:0:0:0 | & | -| main.rs:1944:23:1944:27 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1944:23:1944:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1944:34:1944:37 | self | | file://:0:0:0:0 | & | -| main.rs:1944:34:1944:37 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1944:34:1944:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1944:34:1944:50 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1944:44:1944:48 | other | | file://:0:0:0:0 | & | -| main.rs:1944:44:1944:48 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1944:44:1944:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1949:24:1949:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1949:24:1949:28 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1949:31:1949:35 | other | | file://:0:0:0:0 | & | -| main.rs:1949:31:1949:35 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1949:75:1951:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:1949:75:1951:9 | { ... } | T | {EXTERNAL LOCATION} | Ordering | -| main.rs:1950:13:1950:29 | (...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:13:1950:63 | ... .partial_cmp(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:1950:13:1950:63 | ... .partial_cmp(...) | T | {EXTERNAL LOCATION} | Ordering | -| main.rs:1950:14:1950:17 | self | | file://:0:0:0:0 | & | -| main.rs:1950:14:1950:17 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1950:14:1950:19 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:14:1950:28 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:23:1950:26 | self | | file://:0:0:0:0 | & | -| main.rs:1950:23:1950:26 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1950:23:1950:28 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:43:1950:62 | &... | | file://:0:0:0:0 | & | -| main.rs:1950:43:1950:62 | &... | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:44:1950:62 | (...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:45:1950:49 | other | | file://:0:0:0:0 | & | -| main.rs:1950:45:1950:49 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1950:45:1950:51 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:45:1950:61 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1950:55:1950:59 | other | | file://:0:0:0:0 | & | -| main.rs:1950:55:1950:59 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1950:55:1950:61 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1953:15:1953:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1953:15:1953:19 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1953:22:1953:26 | other | | file://:0:0:0:0 | & | -| main.rs:1953:22:1953:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1953:44:1955:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1954:13:1954:16 | self | | file://:0:0:0:0 | & | -| main.rs:1954:13:1954:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1954:13:1954:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1954:13:1954:28 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1954:13:1954:48 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1954:22:1954:26 | other | | file://:0:0:0:0 | & | -| main.rs:1954:22:1954:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1954:22:1954:28 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1954:33:1954:36 | self | | file://:0:0:0:0 | & | -| main.rs:1954:33:1954:36 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1954:33:1954:38 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1954:33:1954:48 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1954:42:1954:46 | other | | file://:0:0:0:0 | & | -| main.rs:1954:42:1954:46 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1954:42:1954:48 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1957:15:1957:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1957:15:1957:19 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1957:22:1957:26 | other | | file://:0:0:0:0 | & | -| main.rs:1957:22:1957:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1957:44:1959:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1958:13:1958:16 | self | | file://:0:0:0:0 | & | -| main.rs:1958:13:1958:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1958:13:1958:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1958:13:1958:29 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1958:13:1958:50 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1958:23:1958:27 | other | | file://:0:0:0:0 | & | -| main.rs:1958:23:1958:27 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1958:23:1958:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1958:34:1958:37 | self | | file://:0:0:0:0 | & | -| main.rs:1958:34:1958:37 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1958:34:1958:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1958:34:1958:50 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1958:44:1958:48 | other | | file://:0:0:0:0 | & | -| main.rs:1958:44:1958:48 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1958:44:1958:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1961:15:1961:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1961:15:1961:19 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1961:22:1961:26 | other | | file://:0:0:0:0 | & | -| main.rs:1961:22:1961:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1961:44:1963:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1962:13:1962:16 | self | | file://:0:0:0:0 | & | -| main.rs:1962:13:1962:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1962:13:1962:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1962:13:1962:28 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1962:13:1962:48 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1962:22:1962:26 | other | | file://:0:0:0:0 | & | -| main.rs:1962:22:1962:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1962:22:1962:28 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1962:33:1962:36 | self | | file://:0:0:0:0 | & | -| main.rs:1962:33:1962:36 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1962:33:1962:38 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1962:33:1962:48 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1962:42:1962:46 | other | | file://:0:0:0:0 | & | -| main.rs:1962:42:1962:46 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1962:42:1962:48 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1965:15:1965:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1965:15:1965:19 | SelfParam | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1965:22:1965:26 | other | | file://:0:0:0:0 | & | -| main.rs:1965:22:1965:26 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1965:44:1967:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1966:13:1966:16 | self | | file://:0:0:0:0 | & | -| main.rs:1966:13:1966:16 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1966:13:1966:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1966:13:1966:29 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1966:13:1966:50 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1966:23:1966:27 | other | | file://:0:0:0:0 | & | -| main.rs:1966:23:1966:27 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1966:23:1966:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1966:34:1966:37 | self | | file://:0:0:0:0 | & | -| main.rs:1966:34:1966:37 | self | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1966:34:1966:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1966:34:1966:50 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1966:44:1966:48 | other | | file://:0:0:0:0 | & | -| main.rs:1966:44:1966:48 | other | &T | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:1966:44:1966:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1970:26:1970:26 | a | | main.rs:1970:18:1970:23 | T | -| main.rs:1970:32:1970:32 | b | | main.rs:1970:18:1970:23 | T | -| main.rs:1970:51:1972:5 | { ... } | | {EXTERNAL LOCATION} | Output | -| main.rs:1971:9:1971:9 | a | | main.rs:1970:18:1970:23 | T | -| main.rs:1971:9:1971:13 | ... + ... | | {EXTERNAL LOCATION} | Output | -| main.rs:1971:13:1971:13 | b | | main.rs:1970:18:1970:23 | T | -| main.rs:1974:16:2105:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:1978:13:1978:18 | i64_eq | | {EXTERNAL LOCATION} | bool | -| main.rs:1978:22:1978:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1978:23:1978:26 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1978:23:1978:34 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1978:31:1978:34 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1979:13:1979:18 | i64_ne | | {EXTERNAL LOCATION} | bool | -| main.rs:1979:22:1979:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1979:23:1979:26 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1979:23:1979:34 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1979:31:1979:34 | 4i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1980:13:1980:18 | i64_lt | | {EXTERNAL LOCATION} | bool | -| main.rs:1980:22:1980:34 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1980:23:1980:26 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1980:23:1980:33 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1980:30:1980:33 | 6i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1981:13:1981:18 | i64_le | | {EXTERNAL LOCATION} | bool | -| main.rs:1981:22:1981:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1981:23:1981:26 | 7i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1981:23:1981:34 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1981:31:1981:34 | 8i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1982:13:1982:18 | i64_gt | | {EXTERNAL LOCATION} | bool | -| main.rs:1982:22:1982:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1982:23:1982:26 | 9i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1982:23:1982:34 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1982:30:1982:34 | 10i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1983:13:1983:18 | i64_ge | | {EXTERNAL LOCATION} | bool | -| main.rs:1983:22:1983:37 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1983:23:1983:27 | 11i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1983:23:1983:36 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1983:32:1983:36 | 12i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1986:13:1986:19 | i64_add | | {EXTERNAL LOCATION} | i64 | -| main.rs:1986:23:1986:27 | 13i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1986:23:1986:35 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1986:31:1986:35 | 14i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1987:13:1987:19 | i64_sub | | {EXTERNAL LOCATION} | i64 | -| main.rs:1987:23:1987:27 | 15i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1987:23:1987:35 | ... - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1987:31:1987:35 | 16i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1988:13:1988:19 | i64_mul | | {EXTERNAL LOCATION} | i64 | -| main.rs:1988:23:1988:27 | 17i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1988:23:1988:35 | ... * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1988:31:1988:35 | 18i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1989:13:1989:19 | i64_div | | {EXTERNAL LOCATION} | i64 | -| main.rs:1989:23:1989:27 | 19i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1989:23:1989:35 | ... / ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1989:31:1989:35 | 20i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1990:13:1990:19 | i64_rem | | {EXTERNAL LOCATION} | i64 | -| main.rs:1990:23:1990:27 | 21i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1990:23:1990:35 | ... % ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1990:31:1990:35 | 22i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1991:39:1991:42 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1991:45:1991:48 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1994:17:1994:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1994:34:1994:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1995:9:1995:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1995:9:1995:31 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1995:27:1995:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1997:17:1997:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1997:34:1997:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1998:9:1998:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1998:9:1998:31 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1998:27:1998:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2000:17:2000:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2000:34:2000:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2001:9:2001:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2001:9:2001:31 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:2001:27:2001:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2003:17:2003:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2003:34:2003:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2004:9:2004:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2004:9:2004:31 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:2004:27:2004:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2006:17:2006:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2006:34:2006:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2007:9:2007:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2007:9:2007:31 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:2007:27:2007:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2010:13:2010:22 | i64_bitand | | {EXTERNAL LOCATION} | i64 | -| main.rs:2010:26:2010:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2010:26:2010:38 | ... & ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2010:34:2010:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2011:13:2011:21 | i64_bitor | | {EXTERNAL LOCATION} | i64 | -| main.rs:2011:25:2011:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2011:25:2011:37 | ... \| ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2011:33:2011:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2012:13:2012:22 | i64_bitxor | | {EXTERNAL LOCATION} | i64 | -| main.rs:2012:26:2012:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2012:26:2012:38 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2012:34:2012:38 | 38i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2013:13:2013:19 | i64_shl | | {EXTERNAL LOCATION} | i64 | -| main.rs:2013:23:2013:27 | 39i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2013:23:2013:36 | ... << ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2013:32:2013:36 | 40i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2014:13:2014:19 | i64_shr | | {EXTERNAL LOCATION} | i64 | -| main.rs:2014:23:2014:27 | 41i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2014:23:2014:36 | ... >> ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2014:32:2014:36 | 42i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2017:17:2017:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2017:37:2017:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2018:9:2018:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2018:9:2018:34 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:2018:30:2018:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2020:17:2020:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2020:36:2020:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2021:9:2021:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2021:9:2021:33 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:2021:29:2021:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2023:17:2023:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2023:37:2023:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2024:9:2024:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2024:9:2024:34 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:2024:30:2024:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2026:17:2026:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2026:34:2026:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2027:9:2027:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2027:9:2027:32 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:2027:28:2027:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2029:17:2029:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2029:34:2029:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2030:9:2030:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:2030:9:2030:32 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:2030:28:2030:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2032:13:2032:19 | i64_neg | | {EXTERNAL LOCATION} | i64 | -| main.rs:2032:23:2032:28 | - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2032:24:2032:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2033:13:2033:19 | i64_not | | {EXTERNAL LOCATION} | i64 | -| main.rs:2033:23:2033:28 | ! ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2033:24:2033:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2036:13:2036:14 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2036:18:2036:36 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2036:28:2036:28 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2036:28:2036:28 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2036:34:2036:34 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2036:34:2036:34 | 2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2037:13:2037:14 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2037:18:2037:36 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2037:28:2037:28 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2037:28:2037:28 | 3 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2037:34:2037:34 | 4 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2037:34:2037:34 | 4 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2040:13:2040:19 | vec2_eq | | {EXTERNAL LOCATION} | bool | -| main.rs:2040:23:2040:24 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2040:23:2040:30 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2040:29:2040:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2041:13:2041:19 | vec2_ne | | {EXTERNAL LOCATION} | bool | -| main.rs:2041:23:2041:24 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2041:23:2041:30 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2041:29:2041:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2042:13:2042:19 | vec2_lt | | {EXTERNAL LOCATION} | bool | -| main.rs:2042:23:2042:24 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2042:23:2042:29 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2042:28:2042:29 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2043:13:2043:19 | vec2_le | | {EXTERNAL LOCATION} | bool | -| main.rs:2043:23:2043:24 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2043:23:2043:30 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2043:29:2043:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2044:13:2044:19 | vec2_gt | | {EXTERNAL LOCATION} | bool | -| main.rs:2044:23:2044:24 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2044:23:2044:29 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2044:28:2044:29 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2045:13:2045:19 | vec2_ge | | {EXTERNAL LOCATION} | bool | -| main.rs:2045:23:2045:24 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2045:23:2045:30 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2045:29:2045:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2048:13:2048:20 | vec2_add | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2048:24:2048:25 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2048:24:2048:30 | ... + ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2048:29:2048:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2049:13:2049:20 | vec2_sub | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2049:24:2049:25 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2049:24:2049:30 | ... - ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2049:29:2049:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2050:13:2050:20 | vec2_mul | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2050:24:2050:25 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2050:24:2050:30 | ... * ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2050:29:2050:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2051:13:2051:20 | vec2_div | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2051:24:2051:25 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2051:24:2051:30 | ... / ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2051:29:2051:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2052:13:2052:20 | vec2_rem | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2052:24:2052:25 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2052:24:2052:30 | ... % ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2052:29:2052:30 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2055:17:2055:31 | vec2_add_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2055:35:2055:36 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2056:9:2056:23 | vec2_add_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2056:9:2056:29 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:2056:28:2056:29 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2058:17:2058:31 | vec2_sub_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2058:35:2058:36 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2059:9:2059:23 | vec2_sub_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2059:9:2059:29 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:2059:28:2059:29 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2061:17:2061:31 | vec2_mul_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2061:35:2061:36 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2062:9:2062:23 | vec2_mul_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2062:9:2062:29 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:2062:28:2062:29 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2064:17:2064:31 | vec2_div_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2064:35:2064:36 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2065:9:2065:23 | vec2_div_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2065:9:2065:29 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:2065:28:2065:29 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2067:17:2067:31 | vec2_rem_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2067:35:2067:36 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2068:9:2068:23 | vec2_rem_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2068:9:2068:29 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:2068:28:2068:29 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2071:13:2071:23 | vec2_bitand | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2071:27:2071:28 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2071:27:2071:33 | ... & ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2071:32:2071:33 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2072:13:2072:22 | vec2_bitor | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2072:26:2072:27 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2072:26:2072:32 | ... \| ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2072:31:2072:32 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2073:13:2073:23 | vec2_bitxor | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2073:27:2073:28 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2073:27:2073:33 | ... ^ ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2073:32:2073:33 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2074:13:2074:20 | vec2_shl | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2074:24:2074:25 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2074:24:2074:33 | ... << ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2074:30:2074:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2075:13:2075:20 | vec2_shr | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2075:24:2075:25 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2075:24:2075:33 | ... >> ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2075:30:2075:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2078:17:2078:34 | vec2_bitand_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2078:38:2078:39 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2079:9:2079:26 | vec2_bitand_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2079:9:2079:32 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:2079:31:2079:32 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2081:17:2081:33 | vec2_bitor_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2081:37:2081:38 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2082:9:2082:25 | vec2_bitor_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2082:9:2082:31 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:2082:30:2082:31 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2084:17:2084:34 | vec2_bitxor_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2084:38:2084:39 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2085:9:2085:26 | vec2_bitxor_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2085:9:2085:32 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:2085:31:2085:32 | v2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2087:17:2087:31 | vec2_shl_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2087:35:2087:36 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2088:9:2088:23 | vec2_shl_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2088:9:2088:32 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:2088:29:2088:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2090:17:2090:31 | vec2_shr_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2090:35:2090:36 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2091:9:2091:23 | vec2_shr_assign | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2091:9:2091:32 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:2091:29:2091:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2094:13:2094:20 | vec2_neg | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2094:24:2094:26 | - ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2094:25:2094:26 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2095:13:2095:20 | vec2_not | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2095:24:2095:26 | ! ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2095:25:2095:26 | v1 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2098:13:2098:24 | default_vec2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2098:28:2098:45 | ...::default(...) | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2099:13:2099:26 | vec2_zero_plus | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2099:30:2099:48 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2099:30:2099:63 | ... + ... | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2099:40:2099:40 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2099:40:2099:40 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2099:46:2099:46 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2099:46:2099:46 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2099:52:2099:63 | default_vec2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2103:13:2103:24 | default_vec2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2103:28:2103:45 | ...::default(...) | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2104:13:2104:26 | vec2_zero_plus | | {EXTERNAL LOCATION} | bool | -| main.rs:2104:30:2104:48 | Vec2 {...} | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2104:30:2104:64 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2104:40:2104:40 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2104:40:2104:40 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2104:46:2104:46 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2104:46:2104:46 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2104:53:2104:64 | default_vec2 | | main.rs:1733:5:1738:5 | Vec2 | -| main.rs:2114:18:2114:21 | SelfParam | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2114:24:2114:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2117:25:2119:5 | { ... } | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2118:9:2118:10 | S1 | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2121:41:2123:5 | { ... } | | main.rs:2121:16:2121:39 | impl ... | -| main.rs:2122:9:2122:20 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:2122:9:2122:20 | { ... } | Output | main.rs:2111:5:2111:14 | S1 | -| main.rs:2122:17:2122:18 | S1 | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2125:41:2127:5 | { ... } | | main.rs:2125:16:2125:39 | impl ... | -| main.rs:2126:9:2126:16 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:2126:9:2126:16 | { ... } | Output | file://:0:0:0:0 | () | -| main.rs:2135:13:2135:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | -| main.rs:2135:13:2135:42 | SelfParam | Ptr | file://:0:0:0:0 | & | -| main.rs:2135:13:2135:42 | SelfParam | Ptr.&T | main.rs:2129:5:2129:14 | S2 | -| main.rs:2136:13:2136:15 | _cx | | file://:0:0:0:0 | & | -| main.rs:2136:13:2136:15 | _cx | &T | {EXTERNAL LOCATION} | Context | -| main.rs:2137:44:2139:9 | { ... } | | {EXTERNAL LOCATION} | Poll | -| main.rs:2137:44:2139:9 | { ... } | T | main.rs:2111:5:2111:14 | S1 | -| main.rs:2138:13:2138:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll | -| main.rs:2138:13:2138:38 | ...::Ready(...) | T | main.rs:2111:5:2111:14 | S1 | -| main.rs:2138:36:2138:37 | S1 | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2142:41:2144:5 | { ... } | | main.rs:2142:16:2142:39 | impl ... | -| main.rs:2143:9:2143:10 | S2 | | main.rs:2129:5:2129:14 | S2 | -| main.rs:2143:9:2143:10 | S2 | | main.rs:2142:16:2142:39 | impl ... | -| main.rs:2146:22:2154:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2147:9:2147:12 | f1(...) | | {EXTERNAL LOCATION} | trait Future | -| main.rs:2147:9:2147:12 | f1(...) | Output | main.rs:2111:5:2111:14 | S1 | -| main.rs:2147:9:2147:18 | await ... | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2147:9:2147:22 | ... .f() | | file://:0:0:0:0 | () | -| main.rs:2148:9:2148:12 | f2(...) | | main.rs:2121:16:2121:39 | impl ... | -| main.rs:2148:9:2148:18 | await ... | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2148:9:2148:22 | ... .f() | | file://:0:0:0:0 | () | -| main.rs:2149:9:2149:12 | f3(...) | | main.rs:2125:16:2125:39 | impl ... | -| main.rs:2149:9:2149:18 | await ... | | file://:0:0:0:0 | () | -| main.rs:2150:9:2150:12 | f4(...) | | main.rs:2142:16:2142:39 | impl ... | -| main.rs:2150:9:2150:18 | await ... | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2150:9:2150:22 | ... .f() | | file://:0:0:0:0 | () | -| main.rs:2151:9:2151:10 | S2 | | main.rs:2129:5:2129:14 | S2 | -| main.rs:2151:9:2151:16 | await S2 | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2151:9:2151:20 | ... .f() | | file://:0:0:0:0 | () | -| main.rs:2152:13:2152:13 | b | | {EXTERNAL LOCATION} | trait Future | -| main.rs:2152:13:2152:13 | b | Output | main.rs:2111:5:2111:14 | S1 | -| main.rs:2152:17:2152:28 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:2152:17:2152:28 | { ... } | Output | main.rs:2111:5:2111:14 | S1 | -| main.rs:2152:25:2152:26 | S1 | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2153:9:2153:9 | b | | {EXTERNAL LOCATION} | trait Future | -| main.rs:2153:9:2153:9 | b | Output | main.rs:2111:5:2111:14 | S1 | -| main.rs:2153:9:2153:15 | await b | | main.rs:2111:5:2111:14 | S1 | -| main.rs:2153:9:2153:19 | ... .f() | | file://:0:0:0:0 | () | -| main.rs:2164:15:2164:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2164:15:2164:19 | SelfParam | &T | main.rs:2163:5:2165:5 | Self [trait Trait1] | -| main.rs:2164:22:2164:23 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2168:15:2168:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2168:15:2168:19 | SelfParam | &T | main.rs:2167:5:2169:5 | Self [trait Trait2] | -| main.rs:2168:22:2168:23 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2172:15:2172:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2172:15:2172:19 | SelfParam | &T | main.rs:2158:5:2159:14 | S1 | -| main.rs:2172:22:2172:23 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2176:15:2176:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2176:15:2176:19 | SelfParam | &T | main.rs:2158:5:2159:14 | S1 | -| main.rs:2176:22:2176:23 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2179:37:2181:5 | { ... } | | main.rs:2179:16:2179:35 | impl ... + ... | -| main.rs:2180:9:2180:10 | S1 | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2180:9:2180:10 | S1 | | main.rs:2179:16:2179:35 | impl ... + ... | -| main.rs:2184:18:2184:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2184:18:2184:22 | SelfParam | &T | main.rs:2183:5:2185:5 | Self [trait MyTrait] | -| main.rs:2188:18:2188:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2188:18:2188:22 | SelfParam | &T | main.rs:2158:5:2159:14 | S1 | -| main.rs:2188:31:2190:9 | { ... } | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2189:13:2189:14 | S2 | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2194:18:2194:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2194:18:2194:22 | SelfParam | &T | main.rs:2161:5:2161:22 | S3 | -| main.rs:2194:18:2194:22 | SelfParam | &T.T3 | main.rs:2193:10:2193:17 | T | -| main.rs:2194:30:2197:9 | { ... } | | main.rs:2193:10:2193:17 | T | -| main.rs:2195:17:2195:21 | S3(...) | | file://:0:0:0:0 | & | -| main.rs:2195:17:2195:21 | S3(...) | | main.rs:2161:5:2161:22 | S3 | -| main.rs:2195:17:2195:21 | S3(...) | &T | main.rs:2161:5:2161:22 | S3 | -| main.rs:2195:17:2195:21 | S3(...) | &T.T3 | main.rs:2193:10:2193:17 | T | -| main.rs:2195:25:2195:28 | self | | file://:0:0:0:0 | & | -| main.rs:2195:25:2195:28 | self | &T | main.rs:2161:5:2161:22 | S3 | -| main.rs:2195:25:2195:28 | self | &T.T3 | main.rs:2193:10:2193:17 | T | -| main.rs:2196:13:2196:21 | t.clone() | | main.rs:2193:10:2193:17 | T | -| main.rs:2200:45:2202:5 | { ... } | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2201:9:2201:10 | S1 | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2201:9:2201:10 | S1 | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2204:41:2204:41 | t | | main.rs:2204:26:2204:38 | B | -| main.rs:2204:52:2206:5 | { ... } | | main.rs:2204:23:2204:23 | A | -| main.rs:2205:9:2205:9 | t | | main.rs:2204:26:2204:38 | B | -| main.rs:2205:9:2205:17 | t.get_a() | | main.rs:2204:23:2204:23 | A | -| main.rs:2208:34:2208:34 | x | | main.rs:2208:24:2208:31 | T | -| main.rs:2208:59:2210:5 | { ... } | | main.rs:2208:43:2208:57 | impl ... | -| main.rs:2208:59:2210:5 | { ... } | impl(T) | main.rs:2208:24:2208:31 | T | -| main.rs:2209:9:2209:13 | S3(...) | | main.rs:2161:5:2161:22 | S3 | -| main.rs:2209:9:2209:13 | S3(...) | | main.rs:2208:43:2208:57 | impl ... | -| main.rs:2209:9:2209:13 | S3(...) | T3 | main.rs:2208:24:2208:31 | T | -| main.rs:2209:9:2209:13 | S3(...) | impl(T) | main.rs:2208:24:2208:31 | T | -| main.rs:2209:12:2209:12 | x | | main.rs:2208:24:2208:31 | T | -| main.rs:2212:34:2212:34 | x | | main.rs:2212:24:2212:31 | T | -| main.rs:2212:67:2214:5 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:2212:67:2214:5 | { ... } | T | main.rs:2212:50:2212:64 | impl ... | -| main.rs:2212:67:2214:5 | { ... } | T.impl(T) | main.rs:2212:24:2212:31 | T | -| main.rs:2213:9:2213:19 | Some(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2213:9:2213:19 | Some(...) | T | main.rs:2161:5:2161:22 | S3 | -| main.rs:2213:9:2213:19 | Some(...) | T | main.rs:2212:50:2212:64 | impl ... | -| main.rs:2213:9:2213:19 | Some(...) | T.T3 | main.rs:2212:24:2212:31 | T | -| main.rs:2213:9:2213:19 | Some(...) | T.impl(T) | main.rs:2212:24:2212:31 | T | -| main.rs:2213:14:2213:18 | S3(...) | | main.rs:2161:5:2161:22 | S3 | -| main.rs:2213:14:2213:18 | S3(...) | | main.rs:2212:50:2212:64 | impl ... | -| main.rs:2213:14:2213:18 | S3(...) | T3 | main.rs:2212:24:2212:31 | T | -| main.rs:2213:14:2213:18 | S3(...) | impl(T) | main.rs:2212:24:2212:31 | T | -| main.rs:2213:17:2213:17 | x | | main.rs:2212:24:2212:31 | T | -| main.rs:2216:34:2216:34 | x | | main.rs:2216:24:2216:31 | T | -| main.rs:2216:78:2218:5 | { ... } | | file://:0:0:0:0 | (T_2) | -| main.rs:2216:78:2218:5 | { ... } | 0(2) | main.rs:2216:44:2216:58 | impl ... | -| main.rs:2216:78:2218:5 | { ... } | 0(2).impl(T) | main.rs:2216:24:2216:31 | T | -| main.rs:2216:78:2218:5 | { ... } | 1(2) | main.rs:2216:61:2216:75 | impl ... | -| main.rs:2216:78:2218:5 | { ... } | 1(2).impl(T) | main.rs:2216:24:2216:31 | T | -| main.rs:2217:9:2217:30 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| main.rs:2217:9:2217:30 | TupleExpr | 0(2) | main.rs:2161:5:2161:22 | S3 | -| main.rs:2217:9:2217:30 | TupleExpr | 0(2) | main.rs:2216:44:2216:58 | impl ... | -| main.rs:2217:9:2217:30 | TupleExpr | 0(2).T3 | main.rs:2216:24:2216:31 | T | -| main.rs:2217:9:2217:30 | TupleExpr | 0(2).impl(T) | main.rs:2216:24:2216:31 | T | -| main.rs:2217:9:2217:30 | TupleExpr | 1(2) | main.rs:2161:5:2161:22 | S3 | -| main.rs:2217:9:2217:30 | TupleExpr | 1(2) | main.rs:2216:61:2216:75 | impl ... | -| main.rs:2217:9:2217:30 | TupleExpr | 1(2).T3 | main.rs:2216:24:2216:31 | T | -| main.rs:2217:9:2217:30 | TupleExpr | 1(2).impl(T) | main.rs:2216:24:2216:31 | T | -| main.rs:2217:10:2217:22 | S3(...) | | main.rs:2161:5:2161:22 | S3 | -| main.rs:2217:10:2217:22 | S3(...) | | main.rs:2216:44:2216:58 | impl ... | -| main.rs:2217:10:2217:22 | S3(...) | T3 | main.rs:2216:24:2216:31 | T | -| main.rs:2217:10:2217:22 | S3(...) | impl(T) | main.rs:2216:24:2216:31 | T | -| main.rs:2217:13:2217:13 | x | | main.rs:2216:24:2216:31 | T | -| main.rs:2217:13:2217:21 | x.clone() | | main.rs:2216:24:2216:31 | T | -| main.rs:2217:25:2217:29 | S3(...) | | main.rs:2161:5:2161:22 | S3 | -| main.rs:2217:25:2217:29 | S3(...) | | main.rs:2216:61:2216:75 | impl ... | -| main.rs:2217:25:2217:29 | S3(...) | T3 | main.rs:2216:24:2216:31 | T | -| main.rs:2217:25:2217:29 | S3(...) | impl(T) | main.rs:2216:24:2216:31 | T | -| main.rs:2217:28:2217:28 | x | | main.rs:2216:24:2216:31 | T | -| main.rs:2220:26:2220:26 | t | | main.rs:2220:29:2220:43 | impl ... | -| main.rs:2220:51:2222:5 | { ... } | | main.rs:2220:23:2220:23 | A | -| main.rs:2221:9:2221:9 | t | | main.rs:2220:29:2220:43 | impl ... | -| main.rs:2221:9:2221:17 | t.get_a() | | main.rs:2220:23:2220:23 | A | -| main.rs:2224:16:2238:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2225:13:2225:13 | x | | main.rs:2179:16:2179:35 | impl ... + ... | -| main.rs:2225:17:2225:20 | f1(...) | | main.rs:2179:16:2179:35 | impl ... + ... | -| main.rs:2226:9:2226:9 | x | | main.rs:2179:16:2179:35 | impl ... + ... | -| main.rs:2226:9:2226:14 | x.f1() | | file://:0:0:0:0 | () | -| main.rs:2227:9:2227:9 | x | | main.rs:2179:16:2179:35 | impl ... + ... | -| main.rs:2227:9:2227:14 | x.f2() | | file://:0:0:0:0 | () | -| main.rs:2228:13:2228:13 | a | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2228:17:2228:32 | get_a_my_trait(...) | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2229:13:2229:13 | b | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2229:17:2229:33 | uses_my_trait1(...) | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2229:32:2229:32 | a | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2230:13:2230:13 | a | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2230:17:2230:32 | get_a_my_trait(...) | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2231:13:2231:13 | c | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2231:17:2231:33 | uses_my_trait2(...) | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2231:32:2231:32 | a | | main.rs:2200:28:2200:43 | impl ... | -| main.rs:2232:13:2232:13 | d | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2232:17:2232:34 | uses_my_trait2(...) | | main.rs:2160:5:2160:14 | S2 | -| main.rs:2232:32:2232:33 | S1 | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2233:13:2233:13 | e | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2233:17:2233:35 | get_a_my_trait2(...) | | main.rs:2208:43:2208:57 | impl ... | -| main.rs:2233:17:2233:35 | get_a_my_trait2(...) | impl(T) | main.rs:2158:5:2159:14 | S1 | -| main.rs:2233:17:2233:43 | ... .get_a() | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2233:33:2233:34 | S1 | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2236:13:2236:13 | f | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2236:17:2236:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2236:17:2236:35 | get_a_my_trait3(...) | T | main.rs:2212:50:2212:64 | impl ... | -| main.rs:2236:17:2236:35 | get_a_my_trait3(...) | T.impl(T) | main.rs:2158:5:2159:14 | S1 | -| main.rs:2236:17:2236:44 | ... .unwrap() | | main.rs:2212:50:2212:64 | impl ... | -| main.rs:2236:17:2236:44 | ... .unwrap() | impl(T) | main.rs:2158:5:2159:14 | S1 | -| main.rs:2236:17:2236:52 | ... .get_a() | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2236:33:2236:34 | S1 | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2237:13:2237:13 | g | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2237:17:2237:35 | get_a_my_trait4(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2237:17:2237:35 | get_a_my_trait4(...) | 0(2) | main.rs:2216:44:2216:58 | impl ... | -| main.rs:2237:17:2237:35 | get_a_my_trait4(...) | 0(2).impl(T) | main.rs:2158:5:2159:14 | S1 | -| main.rs:2237:17:2237:35 | get_a_my_trait4(...) | 1(2) | main.rs:2216:61:2216:75 | impl ... | -| main.rs:2237:17:2237:35 | get_a_my_trait4(...) | 1(2).impl(T) | main.rs:2158:5:2159:14 | S1 | -| main.rs:2237:17:2237:37 | ... .0 | | main.rs:2216:44:2216:58 | impl ... | -| main.rs:2237:17:2237:37 | ... .0 | impl(T) | main.rs:2158:5:2159:14 | S1 | -| main.rs:2237:17:2237:45 | ... .get_a() | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2237:33:2237:34 | S1 | | main.rs:2158:5:2159:14 | S1 | -| main.rs:2248:16:2248:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2248:16:2248:20 | SelfParam | &T | main.rs:2244:5:2245:13 | S | -| main.rs:2248:31:2250:9 | { ... } | | main.rs:2244:5:2245:13 | S | -| main.rs:2249:13:2249:13 | S | | main.rs:2244:5:2245:13 | S | -| main.rs:2259:26:2261:9 | { ... } | | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2259:26:2261:9 | { ... } | T | main.rs:2258:10:2258:10 | T | -| main.rs:2260:13:2260:38 | MyVec {...} | | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2260:13:2260:38 | MyVec {...} | T | main.rs:2258:10:2258:10 | T | -| main.rs:2260:27:2260:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2260:27:2260:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2260:27:2260:36 | ...::new(...) | T | main.rs:2258:10:2258:10 | T | -| main.rs:2263:17:2263:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2263:17:2263:25 | SelfParam | &T | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2263:17:2263:25 | SelfParam | &T.T | main.rs:2258:10:2258:10 | T | -| main.rs:2263:28:2263:32 | value | | main.rs:2258:10:2258:10 | T | -| main.rs:2263:38:2265:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2264:13:2264:16 | self | | file://:0:0:0:0 | & | -| main.rs:2264:13:2264:16 | self | &T | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2264:13:2264:16 | self | &T.T | main.rs:2258:10:2258:10 | T | -| main.rs:2264:13:2264:21 | self.data | | {EXTERNAL LOCATION} | Vec | -| main.rs:2264:13:2264:21 | self.data | A | {EXTERNAL LOCATION} | Global | -| main.rs:2264:13:2264:21 | self.data | T | main.rs:2258:10:2258:10 | T | -| main.rs:2264:13:2264:33 | ... .push(...) | | file://:0:0:0:0 | () | -| main.rs:2264:28:2264:32 | value | | main.rs:2258:10:2258:10 | T | -| main.rs:2272:18:2272:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2272:18:2272:22 | SelfParam | &T | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2272:18:2272:22 | SelfParam | &T.T | main.rs:2268:10:2268:10 | T | -| main.rs:2272:25:2272:29 | index | | {EXTERNAL LOCATION} | usize | -| main.rs:2272:56:2274:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:2272:56:2274:9 | { ... } | &T | main.rs:2268:10:2268:10 | T | -| main.rs:2273:13:2273:29 | &... | | file://:0:0:0:0 | & | -| main.rs:2273:13:2273:29 | &... | &T | main.rs:2268:10:2268:10 | T | -| main.rs:2273:14:2273:17 | self | | file://:0:0:0:0 | & | -| main.rs:2273:14:2273:17 | self | &T | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2273:14:2273:17 | self | &T.T | main.rs:2268:10:2268:10 | T | -| main.rs:2273:14:2273:22 | self.data | | {EXTERNAL LOCATION} | Vec | -| main.rs:2273:14:2273:22 | self.data | A | {EXTERNAL LOCATION} | Global | -| main.rs:2273:14:2273:22 | self.data | T | main.rs:2268:10:2268:10 | T | -| main.rs:2273:14:2273:29 | ...[index] | | main.rs:2268:10:2268:10 | T | -| main.rs:2273:24:2273:28 | index | | {EXTERNAL LOCATION} | usize | -| main.rs:2277:22:2277:26 | slice | | file://:0:0:0:0 | & | -| main.rs:2277:22:2277:26 | slice | &T | file://:0:0:0:0 | [] | -| main.rs:2277:22:2277:26 | slice | &T.[T] | main.rs:2244:5:2245:13 | S | -| main.rs:2277:35:2279:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2278:13:2278:13 | x | | main.rs:2244:5:2245:13 | S | -| main.rs:2278:17:2278:21 | slice | | file://:0:0:0:0 | & | -| main.rs:2278:17:2278:21 | slice | &T | file://:0:0:0:0 | [] | -| main.rs:2278:17:2278:21 | slice | &T.[T] | main.rs:2244:5:2245:13 | S | -| main.rs:2278:17:2278:24 | slice[0] | | main.rs:2244:5:2245:13 | S | -| main.rs:2278:17:2278:30 | ... .foo() | | main.rs:2244:5:2245:13 | S | -| main.rs:2278:23:2278:23 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2281:37:2281:37 | a | | main.rs:2281:20:2281:34 | T | -| main.rs:2281:43:2281:43 | b | | {EXTERNAL LOCATION} | usize | -| main.rs:2284:5:2286:5 | { ... } | | {EXTERNAL LOCATION} | Output | -| main.rs:2285:9:2285:9 | a | | main.rs:2281:20:2281:34 | T | -| main.rs:2285:9:2285:12 | a[b] | | {EXTERNAL LOCATION} | Output | -| main.rs:2285:11:2285:11 | b | | {EXTERNAL LOCATION} | usize | -| main.rs:2288:16:2299:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2289:17:2289:19 | vec | | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2289:17:2289:19 | vec | T | main.rs:2244:5:2245:13 | S | -| main.rs:2289:23:2289:34 | ...::new(...) | | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2289:23:2289:34 | ...::new(...) | T | main.rs:2244:5:2245:13 | S | -| main.rs:2290:9:2290:11 | vec | | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2290:9:2290:11 | vec | T | main.rs:2244:5:2245:13 | S | -| main.rs:2290:9:2290:19 | vec.push(...) | | file://:0:0:0:0 | () | -| main.rs:2290:18:2290:18 | S | | main.rs:2244:5:2245:13 | S | -| main.rs:2291:9:2291:11 | vec | | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2291:9:2291:11 | vec | T | main.rs:2244:5:2245:13 | S | -| main.rs:2291:9:2291:14 | vec[0] | | main.rs:2244:5:2245:13 | S | -| main.rs:2291:9:2291:20 | ... .foo() | | main.rs:2244:5:2245:13 | S | -| main.rs:2291:13:2291:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2291:13:2291:13 | 0 | | {EXTERNAL LOCATION} | usize | -| main.rs:2293:13:2293:14 | xs | | file://:0:0:0:0 | [] | -| main.rs:2293:13:2293:14 | xs | [T;...] | main.rs:2244:5:2245:13 | S | -| main.rs:2293:21:2293:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2293:26:2293:28 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2293:26:2293:28 | [...] | [T;...] | main.rs:2244:5:2245:13 | S | -| main.rs:2293:27:2293:27 | S | | main.rs:2244:5:2245:13 | S | -| main.rs:2294:13:2294:13 | x | | main.rs:2244:5:2245:13 | S | -| main.rs:2294:17:2294:18 | xs | | file://:0:0:0:0 | [] | -| main.rs:2294:17:2294:18 | xs | [T;...] | main.rs:2244:5:2245:13 | S | -| main.rs:2294:17:2294:21 | xs[0] | | main.rs:2244:5:2245:13 | S | -| main.rs:2294:17:2294:27 | ... .foo() | | main.rs:2244:5:2245:13 | S | -| main.rs:2294:20:2294:20 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2296:29:2296:31 | vec | | main.rs:2253:5:2256:5 | MyVec | -| main.rs:2296:29:2296:31 | vec | T | main.rs:2244:5:2245:13 | S | -| main.rs:2296:34:2296:34 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2296:34:2296:34 | 0 | | {EXTERNAL LOCATION} | usize | -| main.rs:2298:9:2298:26 | analyze_slice(...) | | file://:0:0:0:0 | () | -| main.rs:2298:23:2298:25 | &xs | | file://:0:0:0:0 | & | -| main.rs:2298:23:2298:25 | &xs | &T | file://:0:0:0:0 | [] | -| main.rs:2298:23:2298:25 | &xs | &T | file://:0:0:0:0 | [] | -| main.rs:2298:23:2298:25 | &xs | &T.[T;...] | main.rs:2244:5:2245:13 | S | -| main.rs:2298:23:2298:25 | &xs | &T.[T] | main.rs:2244:5:2245:13 | S | -| main.rs:2298:24:2298:25 | xs | | file://:0:0:0:0 | [] | -| main.rs:2298:24:2298:25 | xs | [T;...] | main.rs:2244:5:2245:13 | S | -| main.rs:2303:16:2305:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2304:13:2304:13 | x | | {EXTERNAL LOCATION} | String | -| main.rs:2304:17:2304:46 | MacroExpr | | {EXTERNAL LOCATION} | String | -| main.rs:2304:25:2304:35 | "Hello, {}" | | file://:0:0:0:0 | & | -| main.rs:2304:25:2304:35 | "Hello, {}" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2304:25:2304:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2304:25:2304:45 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2304:25:2304:45 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2304:25:2304:45 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2304:25:2304:45 | { ... } | | {EXTERNAL LOCATION} | String | -| main.rs:2304:38:2304:45 | "World!" | | file://:0:0:0:0 | & | -| main.rs:2304:38:2304:45 | "World!" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2313:19:2313:22 | SelfParam | | main.rs:2309:5:2314:5 | Self [trait MyAdd] | -| main.rs:2313:25:2313:27 | rhs | | main.rs:2309:17:2309:26 | Rhs | -| main.rs:2320:19:2320:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:2320:25:2320:29 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2320:45:2322:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2321:13:2321:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2329:19:2329:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:2329:25:2329:29 | value | | file://:0:0:0:0 | & | -| main.rs:2329:25:2329:29 | value | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2329:46:2331:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2330:13:2330:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2330:14:2330:18 | value | | file://:0:0:0:0 | & | -| main.rs:2330:14:2330:18 | value | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2338:19:2338:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:2338:25:2338:29 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2338:46:2344:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2339:13:2343:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2339:13:2343:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | -| main.rs:2339:16:2339:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2339:22:2341:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2339:22:2341:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2340:17:2340:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2340:17:2340:17 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2341:20:2343:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2341:20:2343:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2342:17:2342:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2342:17:2342:17 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2353:19:2353:22 | SelfParam | | main.rs:2347:5:2347:19 | S | -| main.rs:2353:19:2353:22 | SelfParam | T | main.rs:2349:10:2349:17 | T | -| main.rs:2353:25:2353:29 | other | | main.rs:2347:5:2347:19 | S | -| main.rs:2353:25:2353:29 | other | T | main.rs:2349:10:2349:17 | T | -| main.rs:2353:54:2355:9 | { ... } | | main.rs:2347:5:2347:19 | S | -| main.rs:2353:54:2355:9 | { ... } | T | main.rs:2310:9:2310:20 | Output | -| main.rs:2354:13:2354:39 | S(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2354:13:2354:39 | S(...) | T | main.rs:2310:9:2310:20 | Output | -| main.rs:2354:15:2354:22 | (...) | | main.rs:2349:10:2349:17 | T | -| main.rs:2354:15:2354:38 | ... .my_add(...) | | main.rs:2310:9:2310:20 | Output | -| main.rs:2354:16:2354:19 | self | | main.rs:2347:5:2347:19 | S | -| main.rs:2354:16:2354:19 | self | T | main.rs:2349:10:2349:17 | T | -| main.rs:2354:16:2354:21 | self.0 | | main.rs:2349:10:2349:17 | T | -| main.rs:2354:31:2354:35 | other | | main.rs:2347:5:2347:19 | S | -| main.rs:2354:31:2354:35 | other | T | main.rs:2349:10:2349:17 | T | -| main.rs:2354:31:2354:37 | other.0 | | main.rs:2349:10:2349:17 | T | -| main.rs:2362:19:2362:22 | SelfParam | | main.rs:2347:5:2347:19 | S | -| main.rs:2362:19:2362:22 | SelfParam | T | main.rs:2358:10:2358:17 | T | -| main.rs:2362:25:2362:29 | other | | main.rs:2358:10:2358:17 | T | -| main.rs:2362:51:2364:9 | { ... } | | main.rs:2347:5:2347:19 | S | -| main.rs:2362:51:2364:9 | { ... } | T | main.rs:2310:9:2310:20 | Output | -| main.rs:2363:13:2363:37 | S(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2363:13:2363:37 | S(...) | T | main.rs:2310:9:2310:20 | Output | -| main.rs:2363:15:2363:22 | (...) | | main.rs:2358:10:2358:17 | T | -| main.rs:2363:15:2363:36 | ... .my_add(...) | | main.rs:2310:9:2310:20 | Output | -| main.rs:2363:16:2363:19 | self | | main.rs:2347:5:2347:19 | S | -| main.rs:2363:16:2363:19 | self | T | main.rs:2358:10:2358:17 | T | -| main.rs:2363:16:2363:21 | self.0 | | main.rs:2358:10:2358:17 | T | -| main.rs:2363:31:2363:35 | other | | main.rs:2358:10:2358:17 | T | -| main.rs:2374:19:2374:22 | SelfParam | | main.rs:2347:5:2347:19 | S | -| main.rs:2374:19:2374:22 | SelfParam | T | main.rs:2367:14:2367:14 | T | -| main.rs:2374:25:2374:29 | other | | file://:0:0:0:0 | & | -| main.rs:2374:25:2374:29 | other | &T | main.rs:2367:14:2367:14 | T | -| main.rs:2374:55:2376:9 | { ... } | | main.rs:2347:5:2347:19 | S | -| main.rs:2375:13:2375:37 | S(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2375:15:2375:22 | (...) | | main.rs:2367:14:2367:14 | T | -| main.rs:2375:16:2375:19 | self | | main.rs:2347:5:2347:19 | S | -| main.rs:2375:16:2375:19 | self | T | main.rs:2367:14:2367:14 | T | -| main.rs:2375:16:2375:21 | self.0 | | main.rs:2367:14:2367:14 | T | -| main.rs:2375:31:2375:35 | other | | file://:0:0:0:0 | & | -| main.rs:2375:31:2375:35 | other | &T | main.rs:2367:14:2367:14 | T | -| main.rs:2381:20:2381:24 | value | | main.rs:2379:18:2379:18 | T | -| main.rs:2386:20:2386:24 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2386:40:2388:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2387:13:2387:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2393:20:2393:24 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2393:41:2399:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2394:13:2398:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2394:13:2398:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | -| main.rs:2394:16:2394:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2394:22:2396:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2394:22:2396:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2395:17:2395:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2395:17:2395:17 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2396:20:2398:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2396:20:2398:13 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2397:17:2397:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2397:17:2397:17 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2404:21:2404:25 | value | | main.rs:2402:19:2402:19 | T | -| main.rs:2404:31:2404:31 | x | | main.rs:2402:5:2405:5 | Self [trait MyFrom2] | -| main.rs:2409:21:2409:25 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2409:33:2409:33 | _ | | {EXTERNAL LOCATION} | i64 | -| main.rs:2409:48:2411:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2410:13:2410:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2416:21:2416:25 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2416:34:2416:34 | _ | | {EXTERNAL LOCATION} | i64 | -| main.rs:2416:49:2422:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2417:13:2421:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2417:16:2417:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2417:22:2419:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2418:17:2418:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2419:20:2421:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2420:17:2420:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2427:15:2427:15 | x | | main.rs:2425:5:2431:5 | Self [trait MySelfTrait] | -| main.rs:2430:15:2430:15 | x | | main.rs:2425:5:2431:5 | Self [trait MySelfTrait] | -| main.rs:2435:15:2435:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2435:31:2437:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2436:13:2436:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2436:13:2436:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2436:17:2436:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2440:15:2440:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2440:32:2442:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2441:13:2441:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2441:13:2441:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2441:17:2441:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2447:15:2447:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2447:31:2449:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2448:13:2448:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2448:13:2448:13 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2452:15:2452:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2452:32:2454:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:2453:13:2453:13 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2457:16:2482:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2458:13:2458:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2458:22:2458:23 | 73 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2458:22:2458:23 | 73 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2459:9:2459:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2459:9:2459:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2459:18:2459:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2460:9:2460:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2460:9:2460:23 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2460:18:2460:22 | &5i64 | | file://:0:0:0:0 | & | -| main.rs:2460:18:2460:22 | &5i64 | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2460:19:2460:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2461:9:2461:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2461:9:2461:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2461:18:2461:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2463:9:2463:15 | S(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2463:9:2463:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2463:9:2463:31 | ... .my_add(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2463:11:2463:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2463:24:2463:30 | S(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2463:24:2463:30 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2463:26:2463:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2464:9:2464:15 | S(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2464:9:2464:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2464:11:2464:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2464:24:2464:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2465:9:2465:15 | S(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2465:9:2465:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2465:9:2465:29 | ... .my_add(...) | | main.rs:2347:5:2347:19 | S | -| main.rs:2465:11:2465:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2465:24:2465:28 | &3i64 | | file://:0:0:0:0 | & | -| main.rs:2465:24:2465:28 | &3i64 | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2465:25:2465:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2467:13:2467:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2467:17:2467:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2467:30:2467:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2468:13:2468:13 | y | | {EXTERNAL LOCATION} | i64 | -| main.rs:2468:17:2468:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2468:30:2468:33 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2469:13:2469:13 | z | | {EXTERNAL LOCATION} | i64 | -| main.rs:2469:22:2469:43 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2469:38:2469:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2470:9:2470:34 | ...::my_from2(...) | | file://:0:0:0:0 | () | -| main.rs:2470:23:2470:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2470:30:2470:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2471:9:2471:33 | ...::my_from2(...) | | file://:0:0:0:0 | () | -| main.rs:2471:23:2471:26 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2471:29:2471:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2472:9:2472:38 | ...::my_from2(...) | | file://:0:0:0:0 | () | -| main.rs:2472:27:2472:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2472:34:2472:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2474:9:2474:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2474:17:2474:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2475:9:2475:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2475:17:2475:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2476:9:2476:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2476:18:2476:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2477:9:2477:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2477:18:2477:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2478:9:2478:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2478:25:2478:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2479:9:2479:30 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2479:25:2479:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2480:9:2480:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2480:25:2480:28 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2481:9:2481:29 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2481:25:2481:28 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2489:26:2491:9 | { ... } | | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2490:13:2490:25 | MyCallable {...} | | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2493:17:2493:21 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2493:17:2493:21 | SelfParam | &T | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2493:31:2495:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2494:13:2494:13 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2494:13:2494:13 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2498:16:2605:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2501:9:2501:29 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2501:13:2501:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2501:18:2501:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2501:18:2501:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2501:19:2501:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2501:22:2501:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2501:25:2501:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2501:28:2501:29 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2502:9:2502:44 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2502:18:2502:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2502:18:2502:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2502:18:2502:41 | ... .map(...) | | file://:0:0:0:0 | [] | -| main.rs:2502:19:2502:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2502:22:2502:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2502:25:2502:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2502:32:2502:40 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | -| main.rs:2502:32:2502:40 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | -| main.rs:2502:40:2502:40 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2502:43:2502:44 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2503:9:2503:41 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2503:13:2503:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2503:13:2503:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2503:18:2503:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2503:18:2503:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2503:18:2503:38 | ... .into_iter() | | {EXTERNAL LOCATION} | IntoIter | -| main.rs:2503:18:2503:38 | ... .into_iter() | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2503:19:2503:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2503:22:2503:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2503:25:2503:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2503:40:2503:41 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2505:13:2505:17 | vals1 | | file://:0:0:0:0 | [] | -| main.rs:2505:13:2505:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2505:13:2505:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2505:21:2505:31 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2505:21:2505:31 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2505:21:2505:31 | [...] | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2505:22:2505:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2505:27:2505:27 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2505:27:2505:27 | 2 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2505:30:2505:30 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2505:30:2505:30 | 3 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2506:9:2506:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2506:13:2506:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2506:13:2506:13 | u | | {EXTERNAL LOCATION} | u8 | -| main.rs:2506:18:2506:22 | vals1 | | file://:0:0:0:0 | [] | -| main.rs:2506:18:2506:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2506:18:2506:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2506:24:2506:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2508:13:2508:17 | vals2 | | file://:0:0:0:0 | [] | -| main.rs:2508:13:2508:17 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2508:21:2508:29 | [1u16; 3] | | file://:0:0:0:0 | [] | -| main.rs:2508:21:2508:29 | [1u16; 3] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2508:22:2508:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2508:28:2508:28 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2509:9:2509:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2509:13:2509:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2509:18:2509:22 | vals2 | | file://:0:0:0:0 | [] | -| main.rs:2509:18:2509:22 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2509:24:2509:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2511:13:2511:17 | vals3 | | file://:0:0:0:0 | [] | -| main.rs:2511:13:2511:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2511:26:2511:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2511:31:2511:39 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2511:31:2511:39 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2511:31:2511:39 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2511:32:2511:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2511:32:2511:32 | 1 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2511:35:2511:35 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2511:35:2511:35 | 2 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2511:38:2511:38 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2511:38:2511:38 | 3 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2512:9:2512:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2512:13:2512:13 | u | | {EXTERNAL LOCATION} | u32 | -| main.rs:2512:18:2512:22 | vals3 | | file://:0:0:0:0 | [] | -| main.rs:2512:18:2512:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2512:24:2512:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2514:13:2514:17 | vals4 | | file://:0:0:0:0 | [] | -| main.rs:2514:13:2514:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2514:26:2514:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2514:31:2514:36 | [1; 3] | | file://:0:0:0:0 | [] | -| main.rs:2514:31:2514:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2514:31:2514:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2514:32:2514:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2514:32:2514:32 | 1 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2514:35:2514:35 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2515:9:2515:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2515:13:2515:13 | u | | {EXTERNAL LOCATION} | u64 | -| main.rs:2515:18:2515:22 | vals4 | | file://:0:0:0:0 | [] | -| main.rs:2515:18:2515:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2515:24:2515:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2517:17:2517:24 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2517:17:2517:24 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2517:17:2517:24 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2517:28:2517:48 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2517:28:2517:48 | [...] | [T;...] | file://:0:0:0:0 | & | -| main.rs:2517:28:2517:48 | [...] | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2517:29:2517:33 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2517:29:2517:33 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2517:36:2517:40 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2517:36:2517:40 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2517:43:2517:47 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2517:43:2517:47 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2518:9:2518:29 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2518:13:2518:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2518:13:2518:13 | s | | file://:0:0:0:0 | & | -| main.rs:2518:13:2518:13 | s | &T | file://:0:0:0:0 | & | -| main.rs:2518:13:2518:13 | s | &T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2518:18:2518:26 | &strings1 | | file://:0:0:0:0 | & | -| main.rs:2518:18:2518:26 | &strings1 | &T | file://:0:0:0:0 | [] | -| main.rs:2518:18:2518:26 | &strings1 | &T.[T;...] | file://:0:0:0:0 | & | -| main.rs:2518:18:2518:26 | &strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2518:19:2518:26 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2518:19:2518:26 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2518:19:2518:26 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2518:28:2518:29 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2519:9:2519:33 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2519:13:2519:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2519:13:2519:13 | s | | file://:0:0:0:0 | & | -| main.rs:2519:13:2519:13 | s | &T | file://:0:0:0:0 | & | -| main.rs:2519:13:2519:13 | s | &T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2519:18:2519:30 | &mut strings1 | | file://:0:0:0:0 | & | -| main.rs:2519:18:2519:30 | &mut strings1 | &T | file://:0:0:0:0 | [] | -| main.rs:2519:18:2519:30 | &mut strings1 | &T.[T;...] | file://:0:0:0:0 | & | -| main.rs:2519:18:2519:30 | &mut strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2519:23:2519:30 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2519:23:2519:30 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2519:23:2519:30 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2519:32:2519:33 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2520:9:2520:28 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2520:13:2520:13 | s | | file://:0:0:0:0 | & | -| main.rs:2520:13:2520:13 | s | &T | {EXTERNAL LOCATION} | str | -| main.rs:2520:18:2520:25 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2520:18:2520:25 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2520:18:2520:25 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2520:27:2520:28 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2522:13:2522:20 | strings2 | | file://:0:0:0:0 | [] | -| main.rs:2522:13:2522:20 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2523:9:2527:9 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2523:9:2527:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2524:13:2524:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2524:26:2524:30 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2524:26:2524:30 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2525:13:2525:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2525:26:2525:30 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2525:26:2525:30 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2526:13:2526:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2526:26:2526:30 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2526:26:2526:30 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2528:9:2528:28 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2528:13:2528:13 | s | | {EXTERNAL LOCATION} | String | -| main.rs:2528:18:2528:25 | strings2 | | file://:0:0:0:0 | [] | -| main.rs:2528:18:2528:25 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2528:27:2528:28 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2530:13:2530:20 | strings3 | | file://:0:0:0:0 | & | -| main.rs:2530:13:2530:20 | strings3 | &T | file://:0:0:0:0 | [] | -| main.rs:2530:13:2530:20 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2531:9:2535:9 | &... | | file://:0:0:0:0 | & | -| main.rs:2531:9:2535:9 | &... | &T | file://:0:0:0:0 | [] | -| main.rs:2531:9:2535:9 | &... | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2531:10:2535:9 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2531:10:2535:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2532:13:2532:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2532:26:2532:30 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2532:26:2532:30 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2533:13:2533:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2533:26:2533:30 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2533:26:2533:30 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2534:13:2534:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2534:26:2534:30 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2534:26:2534:30 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2536:9:2536:28 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2536:13:2536:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2536:13:2536:13 | s | | file://:0:0:0:0 | & | -| main.rs:2536:13:2536:13 | s | &T | {EXTERNAL LOCATION} | String | -| main.rs:2536:18:2536:25 | strings3 | | file://:0:0:0:0 | & | -| main.rs:2536:18:2536:25 | strings3 | &T | file://:0:0:0:0 | [] | -| main.rs:2536:18:2536:25 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2536:27:2536:28 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2538:13:2538:21 | callables | | file://:0:0:0:0 | [] | -| main.rs:2538:13:2538:21 | callables | [T;...] | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2538:25:2538:81 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2538:25:2538:81 | [...] | [T;...] | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2538:26:2538:42 | ...::new(...) | | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2538:45:2538:61 | ...::new(...) | | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2538:64:2538:80 | ...::new(...) | | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2539:9:2543:9 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2539:13:2539:13 | c | | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2540:12:2540:20 | callables | | file://:0:0:0:0 | [] | -| main.rs:2540:12:2540:20 | callables | [T;...] | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2541:9:2543:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2542:17:2542:22 | result | | {EXTERNAL LOCATION} | i64 | -| main.rs:2542:26:2542:26 | c | | main.rs:2486:5:2486:24 | MyCallable | -| main.rs:2542:26:2542:33 | c.call() | | {EXTERNAL LOCATION} | i64 | -| main.rs:2547:9:2547:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2547:13:2547:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2547:13:2547:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2547:18:2547:18 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2547:18:2547:22 | 0..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2547:18:2547:22 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2547:21:2547:22 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2547:24:2547:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2548:9:2548:29 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2548:13:2548:13 | u | | {EXTERNAL LOCATION} | Range | -| main.rs:2548:13:2548:13 | u | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2548:13:2548:13 | u | Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2548:18:2548:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2548:18:2548:26 | [...] | [T;...] | {EXTERNAL LOCATION} | Range | -| main.rs:2548:18:2548:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2548:18:2548:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2548:19:2548:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2548:19:2548:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2548:19:2548:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2548:19:2548:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2548:24:2548:25 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2548:24:2548:25 | 10 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2548:28:2548:29 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2549:13:2549:17 | range | | {EXTERNAL LOCATION} | Range | -| main.rs:2549:13:2549:17 | range | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2549:21:2549:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2549:21:2549:25 | 0..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2549:21:2549:25 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2549:24:2549:25 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2550:9:2550:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2550:13:2550:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2550:13:2550:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2550:18:2550:22 | range | | {EXTERNAL LOCATION} | Range | -| main.rs:2550:18:2550:22 | range | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2550:24:2550:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2551:13:2551:22 | range_full | | {EXTERNAL LOCATION} | RangeFull | -| main.rs:2551:26:2551:27 | .. | | {EXTERNAL LOCATION} | RangeFull | -| main.rs:2552:9:2552:51 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2552:13:2552:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2552:18:2552:48 | &... | | file://:0:0:0:0 | & | -| main.rs:2552:19:2552:36 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2552:19:2552:36 | [...] | [T;...] | {EXTERNAL LOCATION} | i64 | -| main.rs:2552:20:2552:23 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2552:26:2552:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2552:32:2552:35 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2552:38:2552:47 | range_full | | {EXTERNAL LOCATION} | RangeFull | -| main.rs:2552:50:2552:51 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2554:13:2554:18 | range1 | | {EXTERNAL LOCATION} | Range | -| main.rs:2554:13:2554:18 | range1 | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2555:9:2558:9 | ...::Range {...} | | {EXTERNAL LOCATION} | Range | -| main.rs:2555:9:2558:9 | ...::Range {...} | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2556:20:2556:23 | 0u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2557:18:2557:22 | 10u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2559:9:2559:26 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2559:13:2559:13 | u | | {EXTERNAL LOCATION} | Item | -| main.rs:2559:13:2559:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2559:18:2559:23 | range1 | | {EXTERNAL LOCATION} | Range | -| main.rs:2559:18:2559:23 | range1 | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2559:25:2559:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2563:26:2563:26 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2563:29:2563:29 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2563:32:2563:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2564:9:2564:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2564:24:2564:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2566:13:2566:18 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2566:13:2566:18 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2566:13:2566:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2566:32:2566:43 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2566:32:2566:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2566:32:2566:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2566:32:2566:52 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2566:32:2566:52 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2566:32:2566:52 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2566:33:2566:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2566:39:2566:39 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2566:42:2566:42 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2567:9:2567:26 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2567:13:2567:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2567:13:2567:13 | u | | file://:0:0:0:0 | & | -| main.rs:2567:18:2567:23 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2567:18:2567:23 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2567:18:2567:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2567:25:2567:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2569:22:2569:33 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2569:22:2569:33 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2569:22:2569:33 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2569:23:2569:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2569:29:2569:29 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2569:32:2569:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2570:9:2570:26 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2570:25:2570:26 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2572:13:2572:17 | vals5 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2572:13:2572:17 | vals5 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2572:13:2572:17 | vals5 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2572:13:2572:17 | vals5 | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2572:21:2572:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2572:21:2572:43 | ...::from(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2572:21:2572:43 | ...::from(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2572:21:2572:43 | ...::from(...) | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2572:31:2572:42 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2572:31:2572:42 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2572:31:2572:42 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2572:32:2572:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2572:38:2572:38 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2572:41:2572:41 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2573:9:2573:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2573:13:2573:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2573:13:2573:13 | u | | {EXTERNAL LOCATION} | u32 | -| main.rs:2573:13:2573:13 | u | | file://:0:0:0:0 | & | -| main.rs:2573:18:2573:22 | vals5 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2573:18:2573:22 | vals5 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2573:18:2573:22 | vals5 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2573:18:2573:22 | vals5 | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2573:24:2573:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2575:13:2575:17 | vals6 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2575:13:2575:17 | vals6 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2575:13:2575:17 | vals6 | T | file://:0:0:0:0 | & | -| main.rs:2575:13:2575:17 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2575:32:2575:43 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2575:32:2575:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2575:32:2575:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2575:32:2575:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2575:32:2575:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2575:32:2575:60 | ... .collect() | T | file://:0:0:0:0 | & | -| main.rs:2575:32:2575:60 | ... .collect() | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2575:33:2575:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2575:39:2575:39 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2575:42:2575:42 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2576:9:2576:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2576:13:2576:13 | u | | file://:0:0:0:0 | & | -| main.rs:2576:13:2576:13 | u | &T | {EXTERNAL LOCATION} | u64 | -| main.rs:2576:18:2576:22 | vals6 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2576:18:2576:22 | vals6 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2576:18:2576:22 | vals6 | T | file://:0:0:0:0 | & | -| main.rs:2576:18:2576:22 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2576:24:2576:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2578:17:2578:21 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2578:17:2578:21 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2578:17:2578:21 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2578:25:2578:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2578:25:2578:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2578:25:2578:34 | ...::new(...) | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2579:9:2579:13 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2579:9:2579:13 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2579:9:2579:13 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2579:9:2579:23 | vals7.push(...) | | file://:0:0:0:0 | () | -| main.rs:2579:20:2579:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2580:9:2580:25 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2580:13:2580:13 | u | | {EXTERNAL LOCATION} | u8 | -| main.rs:2580:13:2580:13 | u | | file://:0:0:0:0 | & | -| main.rs:2580:18:2580:22 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2580:18:2580:22 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2580:18:2580:22 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2580:24:2580:25 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2582:33:2582:33 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2582:36:2582:36 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2582:45:2582:45 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2582:48:2582:48 | 4 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2584:13:2584:13 | _ | | file://:0:0:0:0 | () | -| main.rs:2584:17:2587:9 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2584:36:2587:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2585:13:2586:13 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2585:29:2586:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2589:17:2589:20 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2589:17:2589:20 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2589:17:2589:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2589:17:2589:20 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2589:17:2589:20 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2589:17:2589:20 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2589:17:2589:20 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2589:24:2589:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2589:24:2589:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2589:24:2589:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2589:24:2589:55 | ...::new(...) | V | {EXTERNAL LOCATION} | Box | -| main.rs:2589:24:2589:55 | ...::new(...) | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2589:24:2589:55 | ...::new(...) | V.T | file://:0:0:0:0 | & | -| main.rs:2589:24:2589:55 | ...::new(...) | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2590:9:2590:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2590:9:2590:12 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2590:9:2590:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2590:9:2590:12 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2590:9:2590:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2590:9:2590:12 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2590:9:2590:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2590:9:2590:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2590:9:2590:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2590:9:2590:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2590:9:2590:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | -| main.rs:2590:9:2590:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2590:21:2590:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2590:24:2590:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2590:24:2590:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2590:24:2590:38 | ...::new(...) | T | file://:0:0:0:0 | & | -| main.rs:2590:24:2590:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2590:33:2590:37 | "one" | | file://:0:0:0:0 | & | -| main.rs:2590:33:2590:37 | "one" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2591:9:2591:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2591:9:2591:12 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2591:9:2591:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2591:9:2591:12 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2591:9:2591:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2591:9:2591:12 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2591:9:2591:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2591:9:2591:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2591:9:2591:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2591:9:2591:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2591:9:2591:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | -| main.rs:2591:9:2591:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2591:21:2591:21 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2591:24:2591:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2591:24:2591:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2591:24:2591:38 | ...::new(...) | T | file://:0:0:0:0 | & | -| main.rs:2591:24:2591:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2591:33:2591:37 | "two" | | file://:0:0:0:0 | & | -| main.rs:2591:33:2591:37 | "two" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2592:9:2592:33 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2592:13:2592:15 | key | | {EXTERNAL LOCATION} | Item | -| main.rs:2592:13:2592:15 | key | | file://:0:0:0:0 | & | -| main.rs:2592:13:2592:15 | key | &T | {EXTERNAL LOCATION} | i32 | -| main.rs:2592:20:2592:23 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2592:20:2592:23 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2592:20:2592:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2592:20:2592:23 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2592:20:2592:23 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2592:20:2592:23 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2592:20:2592:23 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2592:20:2592:30 | map1.keys() | | {EXTERNAL LOCATION} | Keys | -| main.rs:2592:20:2592:30 | map1.keys() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2592:20:2592:30 | map1.keys() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2592:20:2592:30 | map1.keys() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2592:20:2592:30 | map1.keys() | V.T | file://:0:0:0:0 | & | -| main.rs:2592:20:2592:30 | map1.keys() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2592:32:2592:33 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2593:9:2593:37 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2593:13:2593:17 | value | | {EXTERNAL LOCATION} | Item | -| main.rs:2593:13:2593:17 | value | | file://:0:0:0:0 | & | -| main.rs:2593:13:2593:17 | value | &T | {EXTERNAL LOCATION} | Box | -| main.rs:2593:13:2593:17 | value | &T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2593:13:2593:17 | value | &T.T | file://:0:0:0:0 | & | -| main.rs:2593:13:2593:17 | value | &T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2593:22:2593:25 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2593:22:2593:25 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2593:22:2593:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2593:22:2593:25 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2593:22:2593:25 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2593:22:2593:25 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2593:22:2593:25 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2593:22:2593:34 | map1.values() | | {EXTERNAL LOCATION} | Values | -| main.rs:2593:22:2593:34 | map1.values() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2593:22:2593:34 | map1.values() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2593:22:2593:34 | map1.values() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2593:22:2593:34 | map1.values() | V.T | file://:0:0:0:0 | & | -| main.rs:2593:22:2593:34 | map1.values() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2593:36:2593:37 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2594:9:2594:42 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2594:13:2594:24 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2594:13:2594:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | -| main.rs:2594:13:2594:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | -| main.rs:2594:13:2594:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | -| main.rs:2594:13:2594:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | -| main.rs:2594:13:2594:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2594:13:2594:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | -| main.rs:2594:13:2594:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2594:14:2594:16 | key | | file://:0:0:0:0 | & | -| main.rs:2594:14:2594:16 | key | &T | {EXTERNAL LOCATION} | i32 | -| main.rs:2594:19:2594:23 | value | | file://:0:0:0:0 | & | -| main.rs:2594:19:2594:23 | value | &T | {EXTERNAL LOCATION} | Box | -| main.rs:2594:19:2594:23 | value | &T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2594:19:2594:23 | value | &T.T | file://:0:0:0:0 | & | -| main.rs:2594:19:2594:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2594:29:2594:32 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2594:29:2594:32 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2594:29:2594:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2594:29:2594:32 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2594:29:2594:32 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2594:29:2594:32 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2594:29:2594:32 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2594:29:2594:39 | map1.iter() | | {EXTERNAL LOCATION} | Iter | -| main.rs:2594:29:2594:39 | map1.iter() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2594:29:2594:39 | map1.iter() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2594:29:2594:39 | map1.iter() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2594:29:2594:39 | map1.iter() | V.T | file://:0:0:0:0 | & | -| main.rs:2594:29:2594:39 | map1.iter() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2594:41:2594:42 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2595:9:2595:36 | for ... in ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2595:13:2595:24 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2595:13:2595:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | -| main.rs:2595:13:2595:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | -| main.rs:2595:13:2595:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | -| main.rs:2595:13:2595:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | -| main.rs:2595:13:2595:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2595:13:2595:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | -| main.rs:2595:13:2595:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2595:14:2595:16 | key | | file://:0:0:0:0 | & | -| main.rs:2595:14:2595:16 | key | &T | {EXTERNAL LOCATION} | i32 | -| main.rs:2595:19:2595:23 | value | | file://:0:0:0:0 | & | -| main.rs:2595:19:2595:23 | value | &T | {EXTERNAL LOCATION} | Box | -| main.rs:2595:19:2595:23 | value | &T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2595:19:2595:23 | value | &T.T | file://:0:0:0:0 | & | -| main.rs:2595:19:2595:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2595:29:2595:33 | &map1 | | file://:0:0:0:0 | & | -| main.rs:2595:29:2595:33 | &map1 | &T | {EXTERNAL LOCATION} | HashMap | -| main.rs:2595:29:2595:33 | &map1 | &T.K | {EXTERNAL LOCATION} | i32 | -| main.rs:2595:29:2595:33 | &map1 | &T.S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2595:29:2595:33 | &map1 | &T.V | {EXTERNAL LOCATION} | Box | -| main.rs:2595:29:2595:33 | &map1 | &T.V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2595:29:2595:33 | &map1 | &T.V.T | file://:0:0:0:0 | & | -| main.rs:2595:29:2595:33 | &map1 | &T.V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2595:30:2595:33 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2595:30:2595:33 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2595:30:2595:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2595:30:2595:33 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2595:30:2595:33 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2595:30:2595:33 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2595:30:2595:33 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2595:35:2595:36 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2599:17:2599:17 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2599:26:2599:26 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2599:26:2599:26 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2601:13:2601:13 | _ | | file://:0:0:0:0 | () | -| main.rs:2601:17:2604:9 | while ... { ... } | | file://:0:0:0:0 | () | -| main.rs:2601:23:2601:23 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2601:23:2601:28 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2601:27:2601:28 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2601:27:2601:28 | 10 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2602:9:2604:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2603:13:2603:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2603:13:2603:18 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:2603:18:2603:18 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2615:40:2617:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:2615:40:2617:9 | { ... } | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2615:40:2617:9 | { ... } | T.T | main.rs:2614:10:2614:19 | T | -| main.rs:2616:13:2616:16 | None | | {EXTERNAL LOCATION} | Option | -| main.rs:2616:13:2616:16 | None | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2616:13:2616:16 | None | T.T | main.rs:2614:10:2614:19 | T | -| main.rs:2619:30:2621:9 | { ... } | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2619:30:2621:9 | { ... } | T | main.rs:2614:10:2614:19 | T | -| main.rs:2620:13:2620:28 | S1(...) | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2620:13:2620:28 | S1(...) | T | main.rs:2614:10:2614:19 | T | -| main.rs:2620:16:2620:27 | ...::default(...) | | main.rs:2614:10:2614:19 | T | -| main.rs:2623:19:2623:22 | SelfParam | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2623:19:2623:22 | SelfParam | T | main.rs:2614:10:2614:19 | T | -| main.rs:2623:33:2625:9 | { ... } | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2623:33:2625:9 | { ... } | T | main.rs:2614:10:2614:19 | T | -| main.rs:2624:13:2624:16 | self | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2624:13:2624:16 | self | T | main.rs:2614:10:2614:19 | T | -| main.rs:2636:15:2636:15 | x | | main.rs:2636:12:2636:12 | T | -| main.rs:2636:26:2638:5 | { ... } | | main.rs:2636:12:2636:12 | T | -| main.rs:2637:9:2637:9 | x | | main.rs:2636:12:2636:12 | T | -| main.rs:2640:16:2662:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2641:13:2641:14 | x1 | | {EXTERNAL LOCATION} | Option | -| main.rs:2641:13:2641:14 | x1 | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2641:13:2641:14 | x1 | T.T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2641:34:2641:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2641:34:2641:48 | ...::assoc_fun(...) | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2641:34:2641:48 | ...::assoc_fun(...) | T.T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2642:13:2642:14 | x2 | | {EXTERNAL LOCATION} | Option | -| main.rs:2642:13:2642:14 | x2 | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2642:13:2642:14 | x2 | T.T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2642:18:2642:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2642:18:2642:38 | ...::assoc_fun(...) | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2642:18:2642:38 | ...::assoc_fun(...) | T.T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2643:13:2643:14 | x3 | | {EXTERNAL LOCATION} | Option | -| main.rs:2643:13:2643:14 | x3 | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2643:13:2643:14 | x3 | T.T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2643:18:2643:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2643:18:2643:32 | ...::assoc_fun(...) | T | main.rs:2609:5:2609:20 | S1 | -| main.rs:2643:18:2643:32 | ...::assoc_fun(...) | T.T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2644:13:2644:14 | x4 | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2644:13:2644:14 | x4 | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2644:18:2644:48 | ...::method(...) | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2644:18:2644:48 | ...::method(...) | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2644:35:2644:47 | ...::default(...) | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2644:35:2644:47 | ...::default(...) | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2645:13:2645:14 | x5 | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2645:13:2645:14 | x5 | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2645:18:2645:42 | ...::method(...) | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2645:18:2645:42 | ...::method(...) | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2645:29:2645:41 | ...::default(...) | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2645:29:2645:41 | ...::default(...) | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2646:13:2646:14 | x6 | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2646:13:2646:14 | x6 | T4 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2646:18:2646:45 | S4::<...>(...) | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2646:18:2646:45 | S4::<...>(...) | T4 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2646:27:2646:44 | ...::default(...) | | main.rs:2611:5:2612:14 | S2 | -| main.rs:2647:13:2647:14 | x7 | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2647:13:2647:14 | x7 | T4 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2647:18:2647:23 | S4(...) | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2647:18:2647:23 | S4(...) | T4 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2647:21:2647:22 | S2 | | main.rs:2611:5:2612:14 | S2 | -| main.rs:2648:13:2648:14 | x8 | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2648:13:2648:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 | -| main.rs:2648:18:2648:22 | S4(...) | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2648:18:2648:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | -| main.rs:2648:21:2648:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2649:13:2649:14 | x9 | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2649:13:2649:14 | x9 | T4 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2649:18:2649:34 | S4(...) | | main.rs:2630:5:2630:27 | S4 | -| main.rs:2649:18:2649:34 | S4(...) | T4 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2649:21:2649:33 | ...::default(...) | | main.rs:2611:5:2612:14 | S2 | -| main.rs:2650:13:2650:15 | x10 | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2650:13:2650:15 | x10 | T5 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2650:19:2653:9 | S5::<...> {...} | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2650:19:2653:9 | S5::<...> {...} | T5 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2652:20:2652:37 | ...::default(...) | | main.rs:2611:5:2612:14 | S2 | -| main.rs:2654:13:2654:15 | x11 | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2654:13:2654:15 | x11 | T5 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2654:19:2654:34 | S5 {...} | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2654:19:2654:34 | S5 {...} | T5 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2654:31:2654:32 | S2 | | main.rs:2611:5:2612:14 | S2 | -| main.rs:2655:13:2655:15 | x12 | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2655:13:2655:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:2655:19:2655:33 | S5 {...} | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2655:19:2655:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:2655:31:2655:31 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2656:13:2656:15 | x13 | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2656:13:2656:15 | x13 | T5 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2656:19:2659:9 | S5 {...} | | main.rs:2632:5:2634:5 | S5 | -| main.rs:2656:19:2659:9 | S5 {...} | T5 | main.rs:2611:5:2612:14 | S2 | -| main.rs:2658:20:2658:32 | ...::default(...) | | main.rs:2611:5:2612:14 | S2 | -| main.rs:2660:13:2660:15 | x14 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2660:19:2660:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | -| main.rs:2660:30:2660:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | -| main.rs:2661:13:2661:15 | x15 | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2661:13:2661:15 | x15 | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2661:19:2661:37 | ...::default(...) | | main.rs:2609:5:2609:20 | S1 | -| main.rs:2661:19:2661:37 | ...::default(...) | T | main.rs:2611:5:2612:14 | S2 | -| main.rs:2670:35:2672:9 | { ... } | | file://:0:0:0:0 | (T_2) | -| main.rs:2670:35:2672:9 | { ... } | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2670:35:2672:9 | { ... } | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2671:13:2671:26 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| main.rs:2671:13:2671:26 | TupleExpr | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2671:13:2671:26 | TupleExpr | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2671:14:2671:18 | S1 {...} | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2671:21:2671:25 | S1 {...} | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2673:16:2673:19 | SelfParam | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2673:22:2673:23 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2676:16:2710:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2677:13:2677:13 | a | | file://:0:0:0:0 | (T_2) | -| main.rs:2677:13:2677:13 | a | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2677:13:2677:13 | a | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2677:17:2677:30 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2677:17:2677:30 | ...::get_pair(...) | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2677:17:2677:30 | ...::get_pair(...) | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2678:17:2678:17 | b | | file://:0:0:0:0 | (T_2) | -| main.rs:2678:17:2678:17 | b | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2678:17:2678:17 | b | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2678:21:2678:34 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2678:21:2678:34 | ...::get_pair(...) | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2678:21:2678:34 | ...::get_pair(...) | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2679:13:2679:18 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2679:13:2679:18 | TuplePat | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2679:13:2679:18 | TuplePat | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2679:14:2679:14 | c | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2679:17:2679:17 | d | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2679:22:2679:35 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2679:22:2679:35 | ...::get_pair(...) | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2679:22:2679:35 | ...::get_pair(...) | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2680:13:2680:22 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2680:13:2680:22 | TuplePat | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2680:13:2680:22 | TuplePat | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2680:18:2680:18 | e | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2680:21:2680:21 | f | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2680:26:2680:39 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2680:26:2680:39 | ...::get_pair(...) | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2680:26:2680:39 | ...::get_pair(...) | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2681:13:2681:26 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2681:13:2681:26 | TuplePat | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2681:13:2681:26 | TuplePat | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2681:18:2681:18 | g | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2681:25:2681:25 | h | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2681:30:2681:43 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2681:30:2681:43 | ...::get_pair(...) | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2681:30:2681:43 | ...::get_pair(...) | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2683:9:2683:9 | a | | file://:0:0:0:0 | (T_2) | -| main.rs:2683:9:2683:9 | a | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2683:9:2683:9 | a | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2683:9:2683:11 | a.0 | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2683:9:2683:17 | ... .foo() | | file://:0:0:0:0 | () | -| main.rs:2684:9:2684:9 | b | | file://:0:0:0:0 | (T_2) | -| main.rs:2684:9:2684:9 | b | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2684:9:2684:9 | b | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2684:9:2684:11 | b.1 | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2684:9:2684:17 | ... .foo() | | file://:0:0:0:0 | () | -| main.rs:2685:9:2685:9 | c | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2685:9:2685:15 | c.foo() | | file://:0:0:0:0 | () | -| main.rs:2686:9:2686:9 | d | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2686:9:2686:15 | d.foo() | | file://:0:0:0:0 | () | -| main.rs:2687:9:2687:9 | e | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2687:9:2687:15 | e.foo() | | file://:0:0:0:0 | () | -| main.rs:2688:9:2688:9 | f | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2688:9:2688:15 | f.foo() | | file://:0:0:0:0 | () | -| main.rs:2689:9:2689:9 | g | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2689:9:2689:15 | g.foo() | | file://:0:0:0:0 | () | -| main.rs:2690:9:2690:9 | h | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2690:9:2690:15 | h.foo() | | file://:0:0:0:0 | () | -| main.rs:2695:13:2695:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2695:17:2695:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2696:13:2696:13 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2696:17:2696:34 | ...::default(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2697:13:2697:16 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2697:13:2697:16 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2697:13:2697:16 | pair | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2697:20:2697:25 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| main.rs:2697:20:2697:25 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2697:20:2697:25 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2697:21:2697:21 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2697:24:2697:24 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2698:13:2698:13 | i | | {EXTERNAL LOCATION} | i64 | -| main.rs:2698:22:2698:25 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2698:22:2698:25 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2698:22:2698:25 | pair | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2698:22:2698:27 | pair.0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2699:13:2699:13 | j | | {EXTERNAL LOCATION} | bool | -| main.rs:2699:23:2699:26 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2699:23:2699:26 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | -| main.rs:2699:23:2699:26 | pair | 1(2) | {EXTERNAL LOCATION} | bool | -| main.rs:2699:23:2699:28 | pair.1 | | {EXTERNAL LOCATION} | bool | -| main.rs:2701:13:2701:16 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2701:13:2701:16 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2701:13:2701:16 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2701:20:2701:25 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2701:20:2701:25 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2701:20:2701:32 | ... .into() | | file://:0:0:0:0 | (T_2) | -| main.rs:2701:20:2701:32 | ... .into() | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2701:20:2701:32 | ... .into() | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2701:21:2701:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2701:24:2701:24 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2702:9:2705:9 | match pair { ... } | | file://:0:0:0:0 | () | -| main.rs:2702:15:2702:18 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2702:15:2702:18 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2702:15:2702:18 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2703:13:2703:18 | TuplePat | | file://:0:0:0:0 | (T_2) | -| main.rs:2703:13:2703:18 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2703:13:2703:18 | TuplePat | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2703:14:2703:14 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2703:17:2703:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2703:23:2703:42 | MacroExpr | | file://:0:0:0:0 | () | -| main.rs:2703:30:2703:41 | "unexpected" | | file://:0:0:0:0 | & | -| main.rs:2703:30:2703:41 | "unexpected" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2703:30:2703:41 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:2703:30:2703:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2703:30:2703:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2703:30:2703:41 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2704:13:2704:13 | _ | | file://:0:0:0:0 | (T_2) | -| main.rs:2704:13:2704:13 | _ | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2704:13:2704:13 | _ | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2704:18:2704:35 | MacroExpr | | file://:0:0:0:0 | () | -| main.rs:2704:25:2704:34 | "expected" | | file://:0:0:0:0 | & | -| main.rs:2704:25:2704:34 | "expected" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2704:25:2704:34 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:2704:25:2704:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2704:25:2704:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2704:25:2704:34 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2706:13:2706:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2706:17:2706:20 | pair | | file://:0:0:0:0 | (T_2) | -| main.rs:2706:17:2706:20 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2706:17:2706:20 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | -| main.rs:2706:17:2706:22 | pair.0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2708:13:2708:13 | y | | file://:0:0:0:0 | & | -| main.rs:2708:13:2708:13 | y | &T | file://:0:0:0:0 | (T_2) | -| main.rs:2708:13:2708:13 | y | &T.0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2708:13:2708:13 | y | &T.1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2708:17:2708:31 | &... | | file://:0:0:0:0 | & | -| main.rs:2708:17:2708:31 | &... | &T | file://:0:0:0:0 | (T_2) | -| main.rs:2708:17:2708:31 | &... | &T.0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2708:17:2708:31 | &... | &T.1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2708:18:2708:31 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2708:18:2708:31 | ...::get_pair(...) | 0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2708:18:2708:31 | ...::get_pair(...) | 1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2709:9:2709:9 | y | | file://:0:0:0:0 | & | -| main.rs:2709:9:2709:9 | y | &T | file://:0:0:0:0 | (T_2) | -| main.rs:2709:9:2709:9 | y | &T.0(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2709:9:2709:9 | y | &T.1(2) | main.rs:2666:5:2667:16 | S1 | -| main.rs:2709:9:2709:11 | y.0 | | main.rs:2666:5:2667:16 | S1 | -| main.rs:2709:9:2709:17 | ... .foo() | | file://:0:0:0:0 | () | -| main.rs:2715:27:2737:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2716:13:2716:23 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2716:13:2716:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | -| main.rs:2716:13:2716:23 | boxed_value | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2716:27:2716:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2716:27:2716:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2716:27:2716:42 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2716:36:2716:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2719:9:2727:9 | match boxed_value { ... } | | file://:0:0:0:0 | () | -| main.rs:2719:15:2719:25 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2719:15:2719:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | -| main.rs:2719:15:2719:25 | boxed_value | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2720:13:2720:19 | box 100 | | {EXTERNAL LOCATION} | Box | -| main.rs:2720:13:2720:19 | box 100 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2720:13:2720:19 | box 100 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2720:17:2720:19 | 100 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2720:24:2722:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2721:26:2721:36 | "Boxed 100\\n" | | file://:0:0:0:0 | & | -| main.rs:2721:26:2721:36 | "Boxed 100\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2721:26:2721:36 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:2721:26:2721:36 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2721:26:2721:36 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2721:26:2721:36 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2723:13:2723:17 | box ... | | {EXTERNAL LOCATION} | Box | -| main.rs:2723:13:2723:17 | box ... | A | {EXTERNAL LOCATION} | Global | -| main.rs:2723:13:2723:17 | box ... | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2723:22:2726:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2725:26:2725:42 | "Boxed value: {}\\n" | | file://:0:0:0:0 | & | -| main.rs:2725:26:2725:42 | "Boxed value: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2725:26:2725:51 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:2725:26:2725:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2725:26:2725:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2725:26:2725:51 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2730:13:2730:22 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2730:13:2730:22 | nested_box | A | {EXTERNAL LOCATION} | Global | -| main.rs:2730:13:2730:22 | nested_box | T | {EXTERNAL LOCATION} | Box | -| main.rs:2730:13:2730:22 | nested_box | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2730:13:2730:22 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2730:26:2730:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2730:26:2730:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2730:26:2730:50 | ...::new(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2730:26:2730:50 | ...::new(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2730:26:2730:50 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2730:35:2730:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2730:35:2730:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2730:35:2730:49 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2730:44:2730:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2731:9:2736:9 | match nested_box { ... } | | file://:0:0:0:0 | () | -| main.rs:2731:15:2731:24 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2731:15:2731:24 | nested_box | A | {EXTERNAL LOCATION} | Global | -| main.rs:2731:15:2731:24 | nested_box | T | {EXTERNAL LOCATION} | Box | -| main.rs:2731:15:2731:24 | nested_box | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2731:15:2731:24 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2732:13:2732:21 | box ... | | {EXTERNAL LOCATION} | Box | -| main.rs:2732:13:2732:21 | box ... | A | {EXTERNAL LOCATION} | Global | -| main.rs:2732:13:2732:21 | box ... | T | {EXTERNAL LOCATION} | Box | -| main.rs:2732:13:2732:21 | box ... | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2732:13:2732:21 | box ... | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2732:26:2735:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2734:26:2734:43 | "Nested boxed: {}\\n" | | file://:0:0:0:0 | & | -| main.rs:2734:26:2734:43 | "Nested boxed: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2734:26:2734:59 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:2734:26:2734:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2734:26:2734:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2734:26:2734:59 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2746:36:2748:9 | { ... } | | main.rs:2743:5:2743:22 | Path | -| main.rs:2747:13:2747:19 | Path {...} | | main.rs:2743:5:2743:22 | Path | -| main.rs:2750:29:2750:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2750:29:2750:33 | SelfParam | &T | main.rs:2743:5:2743:22 | Path | -| main.rs:2750:59:2752:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:2750:59:2752:9 | { ... } | E | file://:0:0:0:0 | () | -| main.rs:2750:59:2752:9 | { ... } | T | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2751:13:2751:30 | Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:2751:13:2751:30 | Ok(...) | E | file://:0:0:0:0 | () | -| main.rs:2751:13:2751:30 | Ok(...) | T | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2751:16:2751:29 | ...::new(...) | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2758:39:2760:9 | { ... } | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2759:13:2759:22 | PathBuf {...} | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2768:18:2768:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2768:18:2768:22 | SelfParam | &T | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2768:34:2772:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:2768:34:2772:9 | { ... } | &T | main.rs:2743:5:2743:22 | Path | -| main.rs:2770:33:2770:43 | ...::new(...) | | main.rs:2743:5:2743:22 | Path | -| main.rs:2771:13:2771:17 | &path | | file://:0:0:0:0 | & | -| main.rs:2771:13:2771:17 | &path | &T | main.rs:2743:5:2743:22 | Path | -| main.rs:2771:14:2771:17 | path | | main.rs:2743:5:2743:22 | Path | -| main.rs:2775:16:2783:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2776:13:2776:17 | path1 | | main.rs:2743:5:2743:22 | Path | -| main.rs:2776:21:2776:31 | ...::new(...) | | main.rs:2743:5:2743:22 | Path | -| main.rs:2777:13:2777:17 | path2 | | {EXTERNAL LOCATION} | Result | -| main.rs:2777:13:2777:17 | path2 | E | file://:0:0:0:0 | () | -| main.rs:2777:13:2777:17 | path2 | T | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2777:21:2777:25 | path1 | | main.rs:2743:5:2743:22 | Path | -| main.rs:2777:21:2777:40 | path1.canonicalize() | | {EXTERNAL LOCATION} | Result | -| main.rs:2777:21:2777:40 | path1.canonicalize() | E | file://:0:0:0:0 | () | -| main.rs:2777:21:2777:40 | path1.canonicalize() | T | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2778:13:2778:17 | path3 | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2778:21:2778:25 | path2 | | {EXTERNAL LOCATION} | Result | -| main.rs:2778:21:2778:25 | path2 | E | file://:0:0:0:0 | () | -| main.rs:2778:21:2778:25 | path2 | T | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2778:21:2778:34 | path2.unwrap() | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2780:13:2780:20 | pathbuf1 | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2780:24:2780:37 | ...::new(...) | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2781:24:2781:31 | pathbuf1 | | main.rs:2755:5:2755:25 | PathBuf | -| main.rs:2788:14:2788:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2788:14:2788:18 | SelfParam | &T | main.rs:2787:5:2789:5 | Self [trait MyTrait] | -| main.rs:2795:14:2795:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2795:14:2795:18 | SelfParam | &T | main.rs:2791:5:2792:19 | S | -| main.rs:2795:14:2795:18 | SelfParam | &T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2795:28:2797:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2796:13:2796:16 | self | | file://:0:0:0:0 | & | -| main.rs:2796:13:2796:16 | self | &T | main.rs:2791:5:2792:19 | S | -| main.rs:2796:13:2796:16 | self | &T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2796:13:2796:18 | self.0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2801:14:2801:18 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2801:14:2801:18 | SelfParam | &T | main.rs:2791:5:2792:19 | S | -| main.rs:2801:14:2801:18 | SelfParam | &T.T | main.rs:2791:5:2792:19 | S | -| main.rs:2801:14:2801:18 | SelfParam | &T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2801:28:2803:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2802:13:2802:16 | self | | file://:0:0:0:0 | & | -| main.rs:2802:13:2802:16 | self | &T | main.rs:2791:5:2792:19 | S | -| main.rs:2802:13:2802:16 | self | &T.T | main.rs:2791:5:2792:19 | S | -| main.rs:2802:13:2802:16 | self | &T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2802:13:2802:18 | self.0 | | main.rs:2791:5:2792:19 | S | -| main.rs:2802:13:2802:18 | self.0 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2802:13:2802:21 | ... .0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2807:15:2807:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2807:15:2807:19 | SelfParam | &T | main.rs:2791:5:2792:19 | S | -| main.rs:2807:15:2807:19 | SelfParam | &T.T | main.rs:2806:10:2806:16 | T | -| main.rs:2807:33:2809:9 | { ... } | | main.rs:2791:5:2792:19 | S | -| main.rs:2807:33:2809:9 | { ... } | T | main.rs:2791:5:2792:19 | S | -| main.rs:2807:33:2809:9 | { ... } | T.T | main.rs:2806:10:2806:16 | T | -| main.rs:2808:13:2808:24 | S(...) | | main.rs:2791:5:2792:19 | S | -| main.rs:2808:13:2808:24 | S(...) | T | main.rs:2791:5:2792:19 | S | -| main.rs:2808:13:2808:24 | S(...) | T.T | main.rs:2806:10:2806:16 | T | -| main.rs:2808:15:2808:23 | S(...) | | main.rs:2791:5:2792:19 | S | -| main.rs:2808:15:2808:23 | S(...) | T | main.rs:2806:10:2806:16 | T | -| main.rs:2808:17:2808:20 | self | | file://:0:0:0:0 | & | -| main.rs:2808:17:2808:20 | self | &T | main.rs:2791:5:2792:19 | S | -| main.rs:2808:17:2808:20 | self | &T.T | main.rs:2806:10:2806:16 | T | -| main.rs:2808:17:2808:22 | self.0 | | main.rs:2806:10:2806:16 | T | -| main.rs:2812:14:2812:14 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2812:48:2829:5 | { ... } | | {EXTERNAL LOCATION} | Box | -| main.rs:2812:48:2829:5 | { ... } | A | {EXTERNAL LOCATION} | Global | -| main.rs:2812:48:2829:5 | { ... } | T | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2812:48:2829:5 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2813:13:2813:13 | x | | main.rs:2791:5:2792:19 | S | -| main.rs:2813:13:2813:13 | x | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2813:17:2818:9 | if b {...} else {...} | | main.rs:2791:5:2792:19 | S | -| main.rs:2813:17:2818:9 | if b {...} else {...} | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2813:20:2813:20 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2813:22:2816:9 | { ... } | | main.rs:2791:5:2792:19 | S | -| main.rs:2813:22:2816:9 | { ... } | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2814:17:2814:17 | y | | main.rs:2791:5:2792:19 | S | -| main.rs:2814:17:2814:17 | y | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2814:21:2814:38 | ...::default(...) | | main.rs:2791:5:2792:19 | S | -| main.rs:2814:21:2814:38 | ...::default(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2815:13:2815:13 | y | | main.rs:2791:5:2792:19 | S | -| main.rs:2815:13:2815:13 | y | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2816:16:2818:9 | { ... } | | main.rs:2791:5:2792:19 | S | -| main.rs:2816:16:2818:9 | { ... } | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2817:13:2817:16 | S(...) | | main.rs:2791:5:2792:19 | S | -| main.rs:2817:13:2817:16 | S(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2817:15:2817:15 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2822:13:2822:13 | x | | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2822:13:2822:13 | x | | main.rs:2791:5:2792:19 | S | -| main.rs:2822:13:2822:13 | x | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2822:13:2822:13 | x | dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2822:17:2822:20 | S(...) | | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2822:17:2822:20 | S(...) | | main.rs:2791:5:2792:19 | S | -| main.rs:2822:17:2822:20 | S(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2822:17:2822:20 | S(...) | dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2822:19:2822:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2823:9:2828:9 | if b {...} else {...} | | {EXTERNAL LOCATION} | Box | -| main.rs:2823:9:2828:9 | if b {...} else {...} | A | {EXTERNAL LOCATION} | Global | -| main.rs:2823:9:2828:9 | if b {...} else {...} | T | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2823:9:2828:9 | if b {...} else {...} | T | main.rs:2791:5:2792:19 | S | -| main.rs:2823:9:2828:9 | if b {...} else {...} | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2823:9:2828:9 | if b {...} else {...} | T.T | main.rs:2791:5:2792:19 | S | -| main.rs:2823:9:2828:9 | if b {...} else {...} | T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2823:9:2828:9 | if b {...} else {...} | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2823:12:2823:12 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2823:14:2826:9 | { ... } | | {EXTERNAL LOCATION} | Box | -| main.rs:2823:14:2826:9 | { ... } | A | {EXTERNAL LOCATION} | Global | -| main.rs:2823:14:2826:9 | { ... } | T | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2823:14:2826:9 | { ... } | T | main.rs:2791:5:2792:19 | S | -| main.rs:2823:14:2826:9 | { ... } | T.T | main.rs:2791:5:2792:19 | S | -| main.rs:2823:14:2826:9 | { ... } | T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2823:14:2826:9 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2824:17:2824:17 | x | | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2824:17:2824:17 | x | | main.rs:2791:5:2792:19 | S | -| main.rs:2824:17:2824:17 | x | T | main.rs:2791:5:2792:19 | S | -| main.rs:2824:17:2824:17 | x | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2824:17:2824:17 | x | dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2824:21:2824:21 | x | | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2824:21:2824:21 | x | | main.rs:2791:5:2792:19 | S | -| main.rs:2824:21:2824:21 | x | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2824:21:2824:21 | x | dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2824:21:2824:26 | x.m2() | | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2824:21:2824:26 | x.m2() | | main.rs:2791:5:2792:19 | S | -| main.rs:2824:21:2824:26 | x.m2() | T | main.rs:2791:5:2792:19 | S | -| main.rs:2824:21:2824:26 | x.m2() | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2824:21:2824:26 | x.m2() | dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2825:13:2825:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2825:13:2825:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2825:13:2825:23 | ...::new(...) | T | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2825:13:2825:23 | ...::new(...) | T | main.rs:2791:5:2792:19 | S | -| main.rs:2825:13:2825:23 | ...::new(...) | T.T | main.rs:2791:5:2792:19 | S | -| main.rs:2825:13:2825:23 | ...::new(...) | T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2825:13:2825:23 | ...::new(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2825:22:2825:22 | x | | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2825:22:2825:22 | x | | main.rs:2791:5:2792:19 | S | -| main.rs:2825:22:2825:22 | x | T | main.rs:2791:5:2792:19 | S | -| main.rs:2825:22:2825:22 | x | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2825:22:2825:22 | x | dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2826:16:2828:9 | { ... } | | {EXTERNAL LOCATION} | Box | -| main.rs:2826:16:2828:9 | { ... } | A | {EXTERNAL LOCATION} | Global | -| main.rs:2826:16:2828:9 | { ... } | T | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2826:16:2828:9 | { ... } | T | main.rs:2791:5:2792:19 | S | -| main.rs:2826:16:2828:9 | { ... } | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2826:16:2828:9 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2827:13:2827:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2827:13:2827:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2827:13:2827:23 | ...::new(...) | T | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2827:13:2827:23 | ...::new(...) | T | main.rs:2791:5:2792:19 | S | -| main.rs:2827:13:2827:23 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2827:13:2827:23 | ...::new(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2827:22:2827:22 | x | | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2827:22:2827:22 | x | | main.rs:2791:5:2792:19 | S | -| main.rs:2827:22:2827:22 | x | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2827:22:2827:22 | x | dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2833:22:2837:5 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2834:18:2834:18 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2834:33:2836:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2835:13:2835:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2835:13:2835:17 | ... + ... | | {EXTERNAL LOCATION} | i32 | -| main.rs:2835:17:2835:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2842:11:2842:14 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:2842:30:2850:5 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2844:13:2844:13 | a | | file://:0:0:0:0 | () | -| main.rs:2844:17:2848:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2845:13:2847:13 | if cond {...} | | file://:0:0:0:0 | () | -| main.rs:2845:16:2845:19 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:2845:21:2847:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2846:24:2846:25 | 12 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2849:9:2849:9 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2853:20:2860:5 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2856:26:2856:27 | 12 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2858:18:2858:26 | "b: {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:2858:18:2858:26 | "b: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2858:18:2858:29 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:2858:18:2858:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2858:18:2858:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2858:18:2858:29 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2859:9:2859:9 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2862:20:2864:5 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2863:16:2863:16 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2867:11:2867:14 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:2867:30:2875:5 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2868:13:2868:13 | a | | file://:0:0:0:0 | () | -| main.rs:2868:17:2872:9 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2869:13:2871:13 | if cond {...} | | file://:0:0:0:0 | () | -| main.rs:2869:16:2869:19 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:2869:21:2871:13 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2870:24:2870:25 | 12 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2873:18:2873:26 | "a: {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:2873:18:2873:26 | "a: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2873:18:2873:29 | ...::_print(...) | | file://:0:0:0:0 | () | -| main.rs:2873:18:2873:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2873:18:2873:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2873:18:2873:29 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2873:29:2873:29 | a | | file://:0:0:0:0 | () | -| main.rs:2874:9:2874:9 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2883:11:2918:1 | { ... } | | file://:0:0:0:0 | () | -| main.rs:2884:5:2884:21 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2885:5:2885:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2886:5:2886:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2886:20:2886:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2886:41:2886:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2887:5:2887:35 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2888:5:2888:41 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2889:5:2889:45 | ...::test(...) | | file://:0:0:0:0 | () | -| main.rs:2890:5:2890:30 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2891:5:2891:33 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2892:5:2892:21 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2893:5:2893:27 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2894:5:2894:32 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2895:5:2895:23 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2896:5:2896:36 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2897:5:2897:35 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2898:5:2898:29 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2899:5:2899:23 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2900:5:2900:24 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2901:5:2901:17 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2902:5:2902:18 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2903:5:2903:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future | -| main.rs:2903:5:2903:15 | ...::f(...) | Output | file://:0:0:0:0 | () | -| main.rs:2904:5:2904:19 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2905:5:2905:17 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2906:5:2906:14 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2907:5:2907:27 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2908:5:2908:15 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2909:5:2909:43 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2910:5:2910:15 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2911:5:2911:17 | ...::f(...) | | file://:0:0:0:0 | () | -| main.rs:2912:5:2912:23 | ...::test(...) | | file://:0:0:0:0 | () | -| main.rs:2913:5:2913:41 | ...::test_all_patterns(...) | | file://:0:0:0:0 | () | -| main.rs:2914:5:2914:49 | ...::box_patterns(...) | | file://:0:0:0:0 | () | -| main.rs:2915:5:2915:20 | ...::test(...) | | file://:0:0:0:0 | () | -| main.rs:2916:5:2916:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2916:5:2916:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2916:5:2916:20 | ...::f(...) | T | main.rs:2787:5:2789:5 | dyn MyTrait | -| main.rs:2916:5:2916:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2916:16:2916:19 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2917:5:2917:23 | ...::f(...) | | file://:0:0:0:0 | () | +| main.rs:762:15:762:18 | SelfParam | | main.rs:745:5:746:14 | S2 | +| main.rs:762:26:764:9 | { ... } | | main.rs:761:10:761:19 | T | +| main.rs:763:13:763:30 | ...::default(...) | | main.rs:761:10:761:19 | T | +| main.rs:766:18:766:18 | x | | main.rs:745:5:746:14 | S2 | +| main.rs:766:32:768:9 | { ... } | | main.rs:761:10:761:19 | T | +| main.rs:767:13:767:30 | ...::default(...) | | main.rs:761:10:761:19 | T | +| main.rs:772:15:772:18 | SelfParam | | main.rs:743:5:744:14 | S1 | +| main.rs:772:28:774:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:773:13:773:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:776:18:776:18 | x | | main.rs:743:5:744:14 | S1 | +| main.rs:776:34:778:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:777:13:777:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:783:50:783:50 | x | | main.rs:783:26:783:47 | T2 | +| main.rs:783:63:786:5 | { ... } | | main.rs:783:22:783:23 | T1 | +| main.rs:784:9:784:9 | x | | main.rs:783:26:783:47 | T2 | +| main.rs:784:9:784:14 | x.m1() | | main.rs:783:22:783:23 | T1 | +| main.rs:785:9:785:9 | x | | main.rs:783:26:783:47 | T2 | +| main.rs:785:9:785:14 | x.m1() | | main.rs:783:22:783:23 | T1 | +| main.rs:787:52:787:52 | x | | main.rs:787:28:787:49 | T2 | +| main.rs:787:65:791:5 | { ... } | | main.rs:787:24:787:25 | T1 | +| main.rs:788:13:788:13 | y | | main.rs:787:24:787:25 | T1 | +| main.rs:788:17:788:25 | ...::m1(...) | | main.rs:787:24:787:25 | T1 | +| main.rs:788:24:788:24 | x | | main.rs:787:28:787:49 | T2 | +| main.rs:789:9:789:9 | y | | main.rs:787:24:787:25 | T1 | +| main.rs:790:9:790:17 | ...::m1(...) | | main.rs:787:24:787:25 | T1 | +| main.rs:790:16:790:16 | x | | main.rs:787:28:787:49 | T2 | +| main.rs:792:52:792:52 | x | | main.rs:792:28:792:49 | T2 | +| main.rs:792:65:796:5 | { ... } | | main.rs:792:24:792:25 | T1 | +| main.rs:793:13:793:13 | y | | main.rs:792:24:792:25 | T1 | +| main.rs:793:17:793:30 | ...::m1(...) | | main.rs:792:24:792:25 | T1 | +| main.rs:793:29:793:29 | x | | main.rs:792:28:792:49 | T2 | +| main.rs:794:9:794:9 | y | | main.rs:792:24:792:25 | T1 | +| main.rs:795:9:795:22 | ...::m1(...) | | main.rs:792:24:792:25 | T1 | +| main.rs:795:21:795:21 | x | | main.rs:792:28:792:49 | T2 | +| main.rs:797:55:797:55 | x | | main.rs:797:31:797:52 | T2 | +| main.rs:797:68:801:5 | { ... } | | main.rs:797:27:797:28 | T1 | +| main.rs:798:13:798:13 | y | | main.rs:797:27:797:28 | T1 | +| main.rs:798:17:798:28 | ...::assoc(...) | | main.rs:797:27:797:28 | T1 | +| main.rs:798:27:798:27 | x | | main.rs:797:31:797:52 | T2 | +| main.rs:799:9:799:9 | y | | main.rs:797:27:797:28 | T1 | +| main.rs:800:9:800:20 | ...::assoc(...) | | main.rs:797:27:797:28 | T1 | +| main.rs:800:19:800:19 | x | | main.rs:797:31:797:52 | T2 | +| main.rs:802:55:802:55 | x | | main.rs:802:31:802:52 | T2 | +| main.rs:802:68:806:5 | { ... } | | main.rs:802:27:802:28 | T1 | +| main.rs:803:13:803:13 | y | | main.rs:802:27:802:28 | T1 | +| main.rs:803:17:803:33 | ...::assoc(...) | | main.rs:802:27:802:28 | T1 | +| main.rs:803:32:803:32 | x | | main.rs:802:31:802:52 | T2 | +| main.rs:804:9:804:9 | y | | main.rs:802:27:802:28 | T1 | +| main.rs:805:9:805:25 | ...::assoc(...) | | main.rs:802:27:802:28 | T1 | +| main.rs:805:24:805:24 | x | | main.rs:802:31:802:52 | T2 | +| main.rs:810:49:810:49 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:810:49:810:49 | x | T | main.rs:810:32:810:46 | T2 | +| main.rs:810:71:812:5 | { ... } | | main.rs:810:28:810:29 | T1 | +| main.rs:811:9:811:9 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:811:9:811:9 | x | T | main.rs:810:32:810:46 | T2 | +| main.rs:811:9:811:11 | x.a | | main.rs:810:32:810:46 | T2 | +| main.rs:811:9:811:16 | ... .m1() | | main.rs:810:28:810:29 | T1 | +| main.rs:813:51:813:51 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:813:51:813:51 | x | T | main.rs:813:34:813:48 | T2 | +| main.rs:813:73:815:5 | { ... } | | main.rs:813:30:813:31 | T1 | +| main.rs:814:9:814:19 | ...::m1(...) | | main.rs:813:30:813:31 | T1 | +| main.rs:814:16:814:16 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:814:16:814:16 | x | T | main.rs:813:34:813:48 | T2 | +| main.rs:814:16:814:18 | x.a | | main.rs:813:34:813:48 | T2 | +| main.rs:816:51:816:51 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:816:51:816:51 | x | T | main.rs:816:34:816:48 | T2 | +| main.rs:816:73:818:5 | { ... } | | main.rs:816:30:816:31 | T1 | +| main.rs:817:9:817:24 | ...::m1(...) | | main.rs:816:30:816:31 | T1 | +| main.rs:817:21:817:21 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:817:21:817:21 | x | T | main.rs:816:34:816:48 | T2 | +| main.rs:817:21:817:23 | x.a | | main.rs:816:34:816:48 | T2 | +| main.rs:821:15:821:18 | SelfParam | | main.rs:738:5:741:5 | MyThing | +| main.rs:821:15:821:18 | SelfParam | T | main.rs:820:10:820:10 | T | +| main.rs:821:26:823:9 | { ... } | | main.rs:820:10:820:10 | T | +| main.rs:822:13:822:16 | self | | main.rs:738:5:741:5 | MyThing | +| main.rs:822:13:822:16 | self | T | main.rs:820:10:820:10 | T | +| main.rs:822:13:822:18 | self.a | | main.rs:820:10:820:10 | T | +| main.rs:825:18:825:18 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:825:18:825:18 | x | T | main.rs:820:10:820:10 | T | +| main.rs:825:32:827:9 | { ... } | | main.rs:820:10:820:10 | T | +| main.rs:826:13:826:13 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:826:13:826:13 | x | T | main.rs:820:10:820:10 | T | +| main.rs:826:13:826:15 | x.a | | main.rs:820:10:820:10 | T | +| main.rs:832:15:832:18 | SelfParam | | main.rs:830:5:833:5 | Self [trait MyTrait2] | +| main.rs:837:15:837:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:837:15:837:19 | SelfParam | TRef | main.rs:835:5:838:5 | Self [trait MyTrait3] | +| main.rs:840:46:840:46 | x | | main.rs:840:22:840:43 | T | +| main.rs:840:52:840:52 | y | | {EXTERNAL LOCATION} | & | +| main.rs:840:52:840:52 | y | TRef | main.rs:840:22:840:43 | T | +| main.rs:840:59:843:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:841:9:841:9 | x | | main.rs:840:22:840:43 | T | +| main.rs:841:9:841:14 | x.m2() | | {EXTERNAL LOCATION} | () | +| main.rs:842:9:842:9 | y | | {EXTERNAL LOCATION} | & | +| main.rs:842:9:842:9 | y | TRef | main.rs:840:22:840:43 | T | +| main.rs:842:9:842:14 | y.m2() | | {EXTERNAL LOCATION} | () | +| main.rs:845:16:903:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:846:13:846:13 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:846:13:846:13 | x | T | main.rs:743:5:744:14 | S1 | +| main.rs:846:17:846:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:846:17:846:33 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | +| main.rs:846:30:846:31 | S1 | | main.rs:743:5:744:14 | S1 | +| main.rs:847:13:847:13 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:847:13:847:13 | y | T | main.rs:745:5:746:14 | S2 | +| main.rs:847:17:847:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:847:17:847:33 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | +| main.rs:847:30:847:31 | S2 | | main.rs:745:5:746:14 | S2 | +| main.rs:849:18:849:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:849:18:849:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:849:18:849:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:849:18:849:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:849:26:849:26 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:849:26:849:26 | x | T | main.rs:743:5:744:14 | S1 | +| main.rs:849:26:849:31 | x.m1() | | main.rs:743:5:744:14 | S1 | +| main.rs:850:18:850:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:850:18:850:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:850:18:850:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:850:18:850:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:850:26:850:26 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:850:26:850:26 | y | T | main.rs:745:5:746:14 | S2 | +| main.rs:850:26:850:31 | y.m1() | | main.rs:745:5:746:14 | S2 | +| main.rs:852:13:852:13 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:852:13:852:13 | x | T | main.rs:743:5:744:14 | S1 | +| main.rs:852:17:852:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:852:17:852:33 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | +| main.rs:852:30:852:31 | S1 | | main.rs:743:5:744:14 | S1 | +| main.rs:853:13:853:13 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:853:13:853:13 | y | T | main.rs:745:5:746:14 | S2 | +| main.rs:853:17:853:33 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:853:17:853:33 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | +| main.rs:853:30:853:31 | S2 | | main.rs:745:5:746:14 | S2 | +| main.rs:855:18:855:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:855:18:855:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:855:18:855:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:855:18:855:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:855:26:855:26 | x | | main.rs:738:5:741:5 | MyThing | +| main.rs:855:26:855:26 | x | T | main.rs:743:5:744:14 | S1 | +| main.rs:855:26:855:31 | x.m2() | | main.rs:743:5:744:14 | S1 | +| main.rs:856:18:856:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:856:18:856:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:856:18:856:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:856:18:856:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:856:26:856:26 | y | | main.rs:738:5:741:5 | MyThing | +| main.rs:856:26:856:26 | y | T | main.rs:745:5:746:14 | S2 | +| main.rs:856:26:856:31 | y.m2() | | main.rs:745:5:746:14 | S2 | +| main.rs:858:13:858:14 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:858:13:858:14 | x2 | T | main.rs:743:5:744:14 | S1 | +| main.rs:858:18:858:34 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:858:18:858:34 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | +| main.rs:858:31:858:32 | S1 | | main.rs:743:5:744:14 | S1 | +| main.rs:859:13:859:14 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:859:13:859:14 | y2 | T | main.rs:745:5:746:14 | S2 | +| main.rs:859:18:859:34 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:859:18:859:34 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | +| main.rs:859:31:859:32 | S2 | | main.rs:745:5:746:14 | S2 | +| main.rs:861:13:861:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:861:17:861:33 | call_trait_m1(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:861:31:861:32 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:861:31:861:32 | x2 | T | main.rs:743:5:744:14 | S1 | +| main.rs:862:18:862:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:862:18:862:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:862:18:862:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:862:18:862:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:862:26:862:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:863:13:863:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:863:17:863:35 | call_trait_m1_2(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:863:33:863:34 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:863:33:863:34 | x2 | T | main.rs:743:5:744:14 | S1 | +| main.rs:864:18:864:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:864:18:864:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:864:18:864:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:864:18:864:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:864:26:864:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:865:13:865:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:865:17:865:35 | call_trait_m1_3(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:865:33:865:34 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:865:33:865:34 | x2 | T | main.rs:743:5:744:14 | S1 | +| main.rs:866:18:866:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:866:18:866:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:866:18:866:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:866:18:866:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:866:26:866:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:867:13:867:13 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:867:17:867:33 | call_trait_m1(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:867:31:867:32 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:867:31:867:32 | y2 | T | main.rs:745:5:746:14 | S2 | +| main.rs:868:18:868:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:868:18:868:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:868:18:868:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:868:18:868:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:868:26:868:26 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:869:13:869:13 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:869:17:869:35 | call_trait_m1_2(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:869:33:869:34 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:869:33:869:34 | y2 | T | main.rs:745:5:746:14 | S2 | +| main.rs:870:18:870:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:870:18:870:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:870:18:870:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:870:18:870:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:870:26:870:26 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:871:13:871:13 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:871:17:871:35 | call_trait_m1_3(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:871:33:871:34 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:871:33:871:34 | y2 | T | main.rs:745:5:746:14 | S2 | +| main.rs:872:18:872:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:872:18:872:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:872:18:872:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:872:18:872:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:872:26:872:26 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:873:13:873:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:873:17:873:38 | call_trait_assoc_1(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:873:36:873:37 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:873:36:873:37 | x2 | T | main.rs:743:5:744:14 | S1 | +| main.rs:874:18:874:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:874:18:874:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:874:18:874:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:874:18:874:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:874:26:874:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:875:13:875:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:875:17:875:38 | call_trait_assoc_2(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:875:36:875:37 | x2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:875:36:875:37 | x2 | T | main.rs:743:5:744:14 | S1 | +| main.rs:876:18:876:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:876:18:876:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:876:18:876:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:876:18:876:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:876:26:876:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:877:13:877:13 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:877:17:877:38 | call_trait_assoc_1(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:877:36:877:37 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:877:36:877:37 | y2 | T | main.rs:745:5:746:14 | S2 | +| main.rs:878:18:878:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:878:18:878:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:878:18:878:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:878:18:878:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:878:26:878:26 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:879:13:879:13 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:879:17:879:38 | call_trait_assoc_2(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:879:36:879:37 | y2 | | main.rs:738:5:741:5 | MyThing | +| main.rs:879:36:879:37 | y2 | T | main.rs:745:5:746:14 | S2 | +| main.rs:880:18:880:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:880:18:880:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:880:18:880:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:880:18:880:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:880:26:880:26 | a | | main.rs:745:5:746:14 | S2 | +| main.rs:882:13:882:14 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:882:13:882:14 | x3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:882:13:882:14 | x3 | T.T | main.rs:743:5:744:14 | S1 | +| main.rs:882:18:884:9 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:882:18:884:9 | MyThing {...} | T | main.rs:738:5:741:5 | MyThing | +| main.rs:882:18:884:9 | MyThing {...} | T.T | main.rs:743:5:744:14 | S1 | +| main.rs:883:16:883:32 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:883:16:883:32 | MyThing {...} | T | main.rs:743:5:744:14 | S1 | +| main.rs:883:29:883:30 | S1 | | main.rs:743:5:744:14 | S1 | +| main.rs:885:13:885:14 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:885:13:885:14 | y3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:885:13:885:14 | y3 | T.T | main.rs:745:5:746:14 | S2 | +| main.rs:885:18:887:9 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:885:18:887:9 | MyThing {...} | T | main.rs:738:5:741:5 | MyThing | +| main.rs:885:18:887:9 | MyThing {...} | T.T | main.rs:745:5:746:14 | S2 | +| main.rs:886:16:886:32 | MyThing {...} | | main.rs:738:5:741:5 | MyThing | +| main.rs:886:16:886:32 | MyThing {...} | T | main.rs:745:5:746:14 | S2 | +| main.rs:886:29:886:30 | S2 | | main.rs:745:5:746:14 | S2 | +| main.rs:889:13:889:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:889:17:889:39 | call_trait_thing_m1(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:889:37:889:38 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:889:37:889:38 | x3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:889:37:889:38 | x3 | T.T | main.rs:743:5:744:14 | S1 | +| main.rs:890:18:890:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:890:18:890:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:890:18:890:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:890:18:890:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:890:26:890:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:891:13:891:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:891:17:891:41 | call_trait_thing_m1_2(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:891:39:891:40 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:891:39:891:40 | x3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:891:39:891:40 | x3 | T.T | main.rs:743:5:744:14 | S1 | +| main.rs:892:18:892:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:892:18:892:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:892:18:892:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:892:18:892:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:892:26:892:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:893:13:893:13 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:893:17:893:41 | call_trait_thing_m1_3(...) | | main.rs:743:5:744:14 | S1 | +| main.rs:893:39:893:40 | x3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:893:39:893:40 | x3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:893:39:893:40 | x3 | T.T | main.rs:743:5:744:14 | S1 | +| main.rs:894:18:894:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:894:18:894:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:894:18:894:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:894:18:894:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:894:26:894:26 | a | | main.rs:743:5:744:14 | S1 | +| main.rs:895:13:895:13 | b | | main.rs:745:5:746:14 | S2 | +| main.rs:895:17:895:39 | call_trait_thing_m1(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:895:37:895:38 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:895:37:895:38 | y3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:895:37:895:38 | y3 | T.T | main.rs:745:5:746:14 | S2 | +| main.rs:896:18:896:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:896:18:896:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:896:18:896:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:896:18:896:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:896:26:896:26 | b | | main.rs:745:5:746:14 | S2 | +| main.rs:897:13:897:13 | b | | main.rs:745:5:746:14 | S2 | +| main.rs:897:17:897:41 | call_trait_thing_m1_2(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:897:39:897:40 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:897:39:897:40 | y3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:897:39:897:40 | y3 | T.T | main.rs:745:5:746:14 | S2 | +| main.rs:898:18:898:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:898:18:898:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:898:18:898:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:898:18:898:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:898:26:898:26 | b | | main.rs:745:5:746:14 | S2 | +| main.rs:899:13:899:13 | b | | main.rs:745:5:746:14 | S2 | +| main.rs:899:17:899:41 | call_trait_thing_m1_3(...) | | main.rs:745:5:746:14 | S2 | +| main.rs:899:39:899:40 | y3 | | main.rs:738:5:741:5 | MyThing | +| main.rs:899:39:899:40 | y3 | T | main.rs:738:5:741:5 | MyThing | +| main.rs:899:39:899:40 | y3 | T.T | main.rs:745:5:746:14 | S2 | +| main.rs:900:18:900:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:900:18:900:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:900:18:900:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:900:18:900:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:900:26:900:26 | b | | main.rs:745:5:746:14 | S2 | +| main.rs:901:13:901:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:901:17:901:26 | ...::m2(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:901:24:901:25 | S1 | | main.rs:743:5:744:14 | S1 | +| main.rs:902:13:902:13 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:902:22:902:31 | ...::m2(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:902:29:902:30 | S2 | | main.rs:745:5:746:14 | S2 | +| main.rs:913:19:913:22 | SelfParam | | main.rs:907:5:910:5 | Wrapper | +| main.rs:913:19:913:22 | SelfParam | A | main.rs:912:10:912:10 | A | +| main.rs:913:30:915:9 | { ... } | | main.rs:912:10:912:10 | A | +| main.rs:914:13:914:16 | self | | main.rs:907:5:910:5 | Wrapper | +| main.rs:914:13:914:16 | self | A | main.rs:912:10:912:10 | A | +| main.rs:914:13:914:22 | self.field | | main.rs:912:10:912:10 | A | +| main.rs:922:15:922:18 | SelfParam | | main.rs:918:5:932:5 | Self [trait MyTrait] | +| main.rs:924:15:924:18 | SelfParam | | main.rs:918:5:932:5 | Self [trait MyTrait] | +| main.rs:928:9:931:9 | { ... } | | main.rs:919:9:919:28 | AssociatedType | +| main.rs:929:13:929:16 | self | | main.rs:918:5:932:5 | Self [trait MyTrait] | +| main.rs:929:13:929:21 | self.m1() | | main.rs:919:9:919:28 | AssociatedType | +| main.rs:930:13:930:43 | ...::default(...) | | main.rs:919:9:919:28 | AssociatedType | +| main.rs:938:19:938:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:938:19:938:23 | SelfParam | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:938:26:938:26 | a | | main.rs:938:16:938:16 | A | +| main.rs:940:22:940:26 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:940:22:940:26 | SelfParam | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:940:29:940:29 | a | | main.rs:940:19:940:19 | A | +| main.rs:940:35:940:35 | b | | main.rs:940:19:940:19 | A | +| main.rs:940:75:943:9 | { ... } | | main.rs:935:9:935:52 | GenericAssociatedType | +| main.rs:941:13:941:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:941:13:941:16 | self | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:941:13:941:23 | self.put(...) | | main.rs:935:9:935:52 | GenericAssociatedType | +| main.rs:941:22:941:22 | a | | main.rs:940:19:940:19 | A | +| main.rs:942:13:942:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:942:13:942:16 | self | TRef | main.rs:934:5:944:5 | Self [trait MyTraitAssoc2] | +| main.rs:942:13:942:23 | self.put(...) | | main.rs:935:9:935:52 | GenericAssociatedType | +| main.rs:942:22:942:22 | b | | main.rs:940:19:940:19 | A | +| main.rs:951:21:951:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:951:21:951:25 | SelfParam | TRef | main.rs:946:5:956:5 | Self [trait TraitMultipleAssoc] | +| main.rs:953:20:953:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:953:20:953:24 | SelfParam | TRef | main.rs:946:5:956:5 | Self [trait TraitMultipleAssoc] | +| main.rs:955:20:955:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:955:20:955:24 | SelfParam | TRef | main.rs:946:5:956:5 | Self [trait TraitMultipleAssoc] | +| main.rs:971:15:971:18 | SelfParam | | main.rs:958:5:959:13 | S | +| main.rs:971:45:973:9 | { ... } | | main.rs:964:5:965:14 | AT | +| main.rs:972:13:972:14 | AT | | main.rs:964:5:965:14 | AT | +| main.rs:981:19:981:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:981:19:981:23 | SelfParam | TRef | main.rs:958:5:959:13 | S | +| main.rs:981:26:981:26 | a | | main.rs:981:16:981:16 | A | +| main.rs:981:46:983:9 | { ... } | | main.rs:907:5:910:5 | Wrapper | +| main.rs:981:46:983:9 | { ... } | A | main.rs:981:16:981:16 | A | +| main.rs:982:13:982:32 | Wrapper {...} | | main.rs:907:5:910:5 | Wrapper | +| main.rs:982:13:982:32 | Wrapper {...} | A | main.rs:981:16:981:16 | A | +| main.rs:982:30:982:30 | a | | main.rs:981:16:981:16 | A | +| main.rs:990:15:990:18 | SelfParam | | main.rs:961:5:962:14 | S2 | +| main.rs:990:45:992:9 | { ... } | | main.rs:907:5:910:5 | Wrapper | +| main.rs:990:45:992:9 | { ... } | A | main.rs:961:5:962:14 | S2 | +| main.rs:991:13:991:35 | Wrapper {...} | | main.rs:907:5:910:5 | Wrapper | +| main.rs:991:13:991:35 | Wrapper {...} | A | main.rs:961:5:962:14 | S2 | +| main.rs:991:30:991:33 | self | | main.rs:961:5:962:14 | S2 | +| main.rs:997:30:999:9 | { ... } | | main.rs:907:5:910:5 | Wrapper | +| main.rs:997:30:999:9 | { ... } | A | main.rs:961:5:962:14 | S2 | +| main.rs:998:13:998:33 | Wrapper {...} | | main.rs:907:5:910:5 | Wrapper | +| main.rs:998:13:998:33 | Wrapper {...} | A | main.rs:961:5:962:14 | S2 | +| main.rs:998:30:998:31 | S2 | | main.rs:961:5:962:14 | S2 | +| main.rs:1004:22:1004:26 | thing | | main.rs:1004:10:1004:19 | T | +| main.rs:1005:9:1005:13 | thing | | main.rs:1004:10:1004:19 | T | +| main.rs:1012:21:1012:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1012:21:1012:25 | SelfParam | TRef | main.rs:964:5:965:14 | AT | +| main.rs:1012:34:1014:9 | { ... } | | main.rs:964:5:965:14 | AT | +| main.rs:1013:13:1013:14 | AT | | main.rs:964:5:965:14 | AT | +| main.rs:1016:20:1016:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1016:20:1016:24 | SelfParam | TRef | main.rs:964:5:965:14 | AT | +| main.rs:1016:43:1018:9 | { ... } | | main.rs:958:5:959:13 | S | +| main.rs:1017:13:1017:13 | S | | main.rs:958:5:959:13 | S | +| main.rs:1020:20:1020:24 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1020:20:1020:24 | SelfParam | TRef | main.rs:964:5:965:14 | AT | +| main.rs:1020:43:1022:9 | { ... } | | main.rs:961:5:962:14 | S2 | +| main.rs:1021:13:1021:14 | S2 | | main.rs:961:5:962:14 | S2 | +| main.rs:1025:16:1053:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1026:13:1026:14 | x1 | | main.rs:958:5:959:13 | S | +| main.rs:1026:18:1026:18 | S | | main.rs:958:5:959:13 | S | +| main.rs:1028:18:1028:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1028:18:1028:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1028:18:1028:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1028:18:1028:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1028:26:1028:27 | x1 | | main.rs:958:5:959:13 | S | +| main.rs:1028:26:1028:32 | x1.m1() | | main.rs:964:5:965:14 | AT | +| main.rs:1030:13:1030:14 | x2 | | main.rs:958:5:959:13 | S | +| main.rs:1030:18:1030:18 | S | | main.rs:958:5:959:13 | S | +| main.rs:1032:13:1032:13 | y | | main.rs:964:5:965:14 | AT | +| main.rs:1032:17:1032:18 | x2 | | main.rs:958:5:959:13 | S | +| main.rs:1032:17:1032:23 | x2.m2() | | main.rs:964:5:965:14 | AT | +| main.rs:1033:18:1033:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1033:18:1033:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1033:18:1033:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1033:18:1033:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1033:26:1033:26 | y | | main.rs:964:5:965:14 | AT | +| main.rs:1035:13:1035:14 | x3 | | main.rs:958:5:959:13 | S | +| main.rs:1035:18:1035:18 | S | | main.rs:958:5:959:13 | S | +| main.rs:1037:18:1037:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1037:18:1037:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1037:18:1037:43 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1037:18:1037:43 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1037:26:1037:27 | x3 | | main.rs:958:5:959:13 | S | +| main.rs:1037:26:1037:34 | x3.put(...) | | main.rs:907:5:910:5 | Wrapper | +| main.rs:1037:26:1037:34 | x3.put(...) | A | {EXTERNAL LOCATION} | i32 | +| main.rs:1037:26:1037:43 | ... .unwrap() | | {EXTERNAL LOCATION} | i32 | +| main.rs:1037:33:1037:33 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1040:18:1040:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1040:18:1040:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1040:18:1040:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1040:18:1040:49 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1040:26:1040:27 | x3 | | main.rs:958:5:959:13 | S | +| main.rs:1040:26:1040:40 | x3.putTwo(...) | | main.rs:907:5:910:5 | Wrapper | +| main.rs:1040:36:1040:36 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1040:39:1040:39 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1042:20:1042:20 | S | | main.rs:958:5:959:13 | S | +| main.rs:1043:18:1043:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1043:18:1043:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1043:18:1043:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1043:18:1043:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1045:13:1045:14 | x5 | | main.rs:961:5:962:14 | S2 | +| main.rs:1045:18:1045:19 | S2 | | main.rs:961:5:962:14 | S2 | +| main.rs:1046:18:1046:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1046:18:1046:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1046:18:1046:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1046:18:1046:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1046:26:1046:27 | x5 | | main.rs:961:5:962:14 | S2 | +| main.rs:1046:26:1046:32 | x5.m1() | | main.rs:907:5:910:5 | Wrapper | +| main.rs:1046:26:1046:32 | x5.m1() | A | main.rs:961:5:962:14 | S2 | +| main.rs:1047:13:1047:14 | x6 | | main.rs:961:5:962:14 | S2 | +| main.rs:1047:18:1047:19 | S2 | | main.rs:961:5:962:14 | S2 | +| main.rs:1048:18:1048:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1048:18:1048:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1048:18:1048:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1048:18:1048:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1048:26:1048:27 | x6 | | main.rs:961:5:962:14 | S2 | +| main.rs:1048:26:1048:32 | x6.m2() | | main.rs:907:5:910:5 | Wrapper | +| main.rs:1048:26:1048:32 | x6.m2() | A | main.rs:961:5:962:14 | S2 | +| main.rs:1050:13:1050:22 | assoc_zero | | main.rs:964:5:965:14 | AT | +| main.rs:1050:26:1050:27 | AT | | main.rs:964:5:965:14 | AT | +| main.rs:1050:26:1050:38 | AT.get_zero() | | main.rs:964:5:965:14 | AT | +| main.rs:1051:13:1051:21 | assoc_one | | main.rs:958:5:959:13 | S | +| main.rs:1051:25:1051:26 | AT | | main.rs:964:5:965:14 | AT | +| main.rs:1051:25:1051:36 | AT.get_one() | | main.rs:958:5:959:13 | S | +| main.rs:1052:13:1052:21 | assoc_two | | main.rs:961:5:962:14 | S2 | +| main.rs:1052:25:1052:26 | AT | | main.rs:964:5:965:14 | AT | +| main.rs:1052:25:1052:36 | AT.get_two() | | main.rs:961:5:962:14 | S2 | +| main.rs:1060:19:1060:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1060:19:1060:23 | SelfParam | TRef | main.rs:1057:5:1061:5 | Self [trait Supertrait] | +| main.rs:1060:26:1060:32 | content | | main.rs:1058:9:1058:21 | Content | +| main.rs:1065:24:1065:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1065:24:1065:28 | SelfParam | TRef | main.rs:1063:5:1066:5 | Self [trait Subtrait] | +| main.rs:1074:23:1074:27 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1074:23:1074:27 | SelfParam | TRef | main.rs:1068:5:1078:5 | Self [trait Subtrait2] | +| main.rs:1074:68:1077:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1075:13:1075:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1075:13:1075:16 | self | TRef | main.rs:1068:5:1078:5 | Self [trait Subtrait2] | +| main.rs:1075:13:1075:27 | self.insert(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1076:13:1076:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1076:13:1076:16 | self | TRef | main.rs:1068:5:1078:5 | Self [trait Subtrait2] | +| main.rs:1076:13:1076:27 | self.insert(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1084:19:1084:23 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1084:19:1084:23 | SelfParam | TRef | main.rs:1080:5:1080:24 | MyType | +| main.rs:1084:19:1084:23 | SelfParam | TRef.T | main.rs:1082:10:1082:10 | T | +| main.rs:1084:26:1084:33 | _content | | main.rs:1082:10:1082:10 | T | +| main.rs:1084:51:1086:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1085:22:1085:42 | "Inserting content: \\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1085:22:1085:42 | "Inserting content: \\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1085:22:1085:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1085:22:1085:42 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1091:24:1091:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1091:24:1091:28 | SelfParam | TRef | main.rs:1080:5:1080:24 | MyType | +| main.rs:1091:24:1091:28 | SelfParam | TRef.T | main.rs:1089:10:1089:17 | T | +| main.rs:1091:48:1093:9 | { ... } | | main.rs:1089:10:1089:17 | T | +| main.rs:1092:13:1092:19 | (...) | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1092:13:1092:19 | (...) | T | main.rs:1089:10:1089:17 | T | +| main.rs:1092:13:1092:21 | ... .0 | | main.rs:1089:10:1089:17 | T | +| main.rs:1092:13:1092:29 | ... .clone() | | main.rs:1089:10:1089:17 | T | +| main.rs:1092:14:1092:18 | * ... | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1092:14:1092:18 | * ... | T | main.rs:1089:10:1089:17 | T | +| main.rs:1092:15:1092:18 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1092:15:1092:18 | self | TRef | main.rs:1080:5:1080:24 | MyType | +| main.rs:1092:15:1092:18 | self | TRef.T | main.rs:1089:10:1089:17 | T | +| main.rs:1096:33:1096:36 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1096:33:1096:36 | item | TRef | main.rs:1096:20:1096:30 | T | +| main.rs:1097:9:1097:12 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1097:9:1097:12 | item | TRef | main.rs:1096:20:1096:30 | T | +| main.rs:1100:35:1100:38 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1100:35:1100:38 | item | TRef | main.rs:1100:21:1100:32 | T | +| main.rs:1100:93:1103:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1101:9:1101:12 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1101:9:1101:12 | item | TRef | main.rs:1100:21:1100:32 | T | +| main.rs:1101:9:1101:23 | item.insert(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1102:9:1102:12 | item | | {EXTERNAL LOCATION} | & | +| main.rs:1102:9:1102:12 | item | TRef | main.rs:1100:21:1100:32 | T | +| main.rs:1102:9:1102:31 | item.insert_two(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1105:15:1111:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1106:13:1106:17 | item1 | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1106:13:1106:17 | item1 | T | {EXTERNAL LOCATION} | i64 | +| main.rs:1106:21:1106:33 | MyType(...) | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1106:21:1106:33 | MyType(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:1106:28:1106:32 | 42i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1107:25:1107:29 | item1 | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1107:25:1107:29 | item1 | T | {EXTERNAL LOCATION} | i64 | +| main.rs:1109:13:1109:17 | item2 | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1109:13:1109:17 | item2 | T | {EXTERNAL LOCATION} | bool | +| main.rs:1109:21:1109:32 | MyType(...) | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1109:21:1109:32 | MyType(...) | T | {EXTERNAL LOCATION} | bool | +| main.rs:1109:28:1109:31 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1110:37:1110:42 | &item2 | | {EXTERNAL LOCATION} | & | +| main.rs:1110:37:1110:42 | &item2 | TRef | main.rs:1080:5:1080:24 | MyType | +| main.rs:1110:37:1110:42 | &item2 | TRef.T | {EXTERNAL LOCATION} | bool | +| main.rs:1110:38:1110:42 | item2 | | main.rs:1080:5:1080:24 | MyType | +| main.rs:1110:38:1110:42 | item2 | T | {EXTERNAL LOCATION} | bool | +| main.rs:1127:15:1127:18 | SelfParam | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1127:15:1127:18 | SelfParam | A | main.rs:1126:10:1126:10 | T | +| main.rs:1127:26:1132:9 | { ... } | | main.rs:1126:10:1126:10 | T | +| main.rs:1128:13:1131:13 | match self { ... } | | main.rs:1126:10:1126:10 | T | +| main.rs:1128:19:1128:22 | self | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1128:19:1128:22 | self | A | main.rs:1126:10:1126:10 | T | +| main.rs:1129:17:1129:29 | ...::C1(...) | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1129:17:1129:29 | ...::C1(...) | A | main.rs:1126:10:1126:10 | T | +| main.rs:1129:28:1129:28 | a | | main.rs:1126:10:1126:10 | T | +| main.rs:1129:34:1129:34 | a | | main.rs:1126:10:1126:10 | T | +| main.rs:1130:17:1130:32 | ...::C2 {...} | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1130:17:1130:32 | ...::C2 {...} | A | main.rs:1126:10:1126:10 | T | +| main.rs:1130:30:1130:30 | a | | main.rs:1126:10:1126:10 | T | +| main.rs:1130:37:1130:37 | a | | main.rs:1126:10:1126:10 | T | +| main.rs:1135:16:1141:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1136:13:1136:13 | x | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1136:13:1136:13 | x | A | main.rs:1121:5:1122:14 | S1 | +| main.rs:1136:17:1136:30 | ...::C1(...) | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1136:17:1136:30 | ...::C1(...) | A | main.rs:1121:5:1122:14 | S1 | +| main.rs:1136:28:1136:29 | S1 | | main.rs:1121:5:1122:14 | S1 | +| main.rs:1137:13:1137:13 | y | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1137:13:1137:13 | y | A | main.rs:1123:5:1124:14 | S2 | +| main.rs:1137:17:1137:36 | ...::C2 {...} | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1137:17:1137:36 | ...::C2 {...} | A | main.rs:1123:5:1124:14 | S2 | +| main.rs:1137:33:1137:34 | S2 | | main.rs:1123:5:1124:14 | S2 | +| main.rs:1139:18:1139:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1139:18:1139:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1139:18:1139:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1139:18:1139:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1139:26:1139:26 | x | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1139:26:1139:26 | x | A | main.rs:1121:5:1122:14 | S1 | +| main.rs:1139:26:1139:31 | x.m1() | | main.rs:1121:5:1122:14 | S1 | +| main.rs:1140:18:1140:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1140:18:1140:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1140:18:1140:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1140:18:1140:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1140:26:1140:26 | y | | main.rs:1115:5:1119:5 | MyEnum | +| main.rs:1140:26:1140:26 | y | A | main.rs:1123:5:1124:14 | S2 | +| main.rs:1140:26:1140:31 | y.m1() | | main.rs:1123:5:1124:14 | S2 | +| main.rs:1162:15:1162:18 | SelfParam | | main.rs:1160:5:1163:5 | Self [trait MyTrait1] | +| main.rs:1167:15:1167:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1167:15:1167:19 | SelfParam | TRef | main.rs:1165:5:1177:5 | Self [trait MyTrait2] | +| main.rs:1170:9:1176:9 | { ... } | | main.rs:1165:20:1165:22 | Tr2 | +| main.rs:1171:13:1175:13 | if ... {...} else {...} | | main.rs:1165:20:1165:22 | Tr2 | +| main.rs:1171:16:1171:16 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1171:16:1171:20 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1171:20:1171:20 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1171:22:1173:13 | { ... } | | main.rs:1165:20:1165:22 | Tr2 | +| main.rs:1172:17:1172:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1172:17:1172:20 | self | TRef | main.rs:1165:5:1177:5 | Self [trait MyTrait2] | +| main.rs:1172:17:1172:25 | self.m1() | | main.rs:1165:20:1165:22 | Tr2 | +| main.rs:1173:20:1175:13 | { ... } | | main.rs:1165:20:1165:22 | Tr2 | +| main.rs:1174:17:1174:31 | ...::m1(...) | | main.rs:1165:20:1165:22 | Tr2 | +| main.rs:1174:26:1174:30 | * ... | | main.rs:1165:5:1177:5 | Self [trait MyTrait2] | +| main.rs:1174:27:1174:30 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1174:27:1174:30 | self | TRef | main.rs:1165:5:1177:5 | Self [trait MyTrait2] | +| main.rs:1181:15:1181:18 | SelfParam | | main.rs:1179:5:1191:5 | Self [trait MyTrait3] | +| main.rs:1184:9:1190:9 | { ... } | | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1185:13:1189:13 | if ... {...} else {...} | | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1185:16:1185:16 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1185:16:1185:20 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1185:20:1185:20 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1185:22:1187:13 | { ... } | | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1186:17:1186:20 | self | | main.rs:1179:5:1191:5 | Self [trait MyTrait3] | +| main.rs:1186:17:1186:25 | self.m2() | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1186:17:1186:25 | self.m2() | A | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1186:17:1186:27 | ... .a | | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1187:20:1189:13 | { ... } | | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1188:17:1188:31 | ...::m2(...) | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1188:17:1188:31 | ...::m2(...) | A | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1188:17:1188:33 | ... .a | | main.rs:1179:20:1179:22 | Tr3 | +| main.rs:1188:26:1188:30 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:1188:26:1188:30 | &self | TRef | main.rs:1179:5:1191:5 | Self [trait MyTrait3] | +| main.rs:1188:27:1188:30 | self | | main.rs:1179:5:1191:5 | Self [trait MyTrait3] | +| main.rs:1195:15:1195:18 | SelfParam | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1195:15:1195:18 | SelfParam | A | main.rs:1193:10:1193:10 | T | +| main.rs:1195:26:1197:9 | { ... } | | main.rs:1193:10:1193:10 | T | +| main.rs:1196:13:1196:16 | self | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1196:13:1196:16 | self | A | main.rs:1193:10:1193:10 | T | +| main.rs:1196:13:1196:18 | self.a | | main.rs:1193:10:1193:10 | T | +| main.rs:1204:15:1204:18 | SelfParam | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1204:15:1204:18 | SelfParam | A | main.rs:1202:10:1202:10 | T | +| main.rs:1204:35:1206:9 | { ... } | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1204:35:1206:9 | { ... } | A | main.rs:1202:10:1202:10 | T | +| main.rs:1205:13:1205:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1205:13:1205:33 | MyThing {...} | A | main.rs:1202:10:1202:10 | T | +| main.rs:1205:26:1205:29 | self | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1205:26:1205:29 | self | A | main.rs:1202:10:1202:10 | T | +| main.rs:1205:26:1205:31 | self.a | | main.rs:1202:10:1202:10 | T | +| main.rs:1213:44:1213:44 | x | | main.rs:1213:26:1213:41 | T2 | +| main.rs:1213:57:1215:5 | { ... } | | main.rs:1213:22:1213:23 | T1 | +| main.rs:1214:9:1214:9 | x | | main.rs:1213:26:1213:41 | T2 | +| main.rs:1214:9:1214:14 | x.m1() | | main.rs:1213:22:1213:23 | T1 | +| main.rs:1217:56:1217:56 | x | | main.rs:1217:39:1217:53 | T | +| main.rs:1217:62:1221:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1219:13:1219:13 | a | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1219:13:1219:13 | a | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1219:17:1219:17 | x | | main.rs:1217:39:1217:53 | T | +| main.rs:1219:17:1219:22 | x.m1() | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1219:17:1219:22 | x.m1() | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1220:18:1220:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1220:18:1220:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1220:18:1220:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1220:18:1220:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1220:26:1220:26 | a | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1220:26:1220:26 | a | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1223:16:1247:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1224:13:1224:13 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1224:13:1224:13 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1224:17:1224:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1224:17:1224:33 | MyThing {...} | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1224:30:1224:31 | S1 | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1225:13:1225:13 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1225:13:1225:13 | y | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1225:17:1225:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1225:17:1225:33 | MyThing {...} | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1225:30:1225:31 | S2 | | main.rs:1157:5:1158:14 | S2 | +| main.rs:1227:18:1227:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1227:18:1227:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1227:18:1227:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1227:18:1227:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1227:26:1227:26 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1227:26:1227:26 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1227:26:1227:31 | x.m1() | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1228:18:1228:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1228:18:1228:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1228:18:1228:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1228:18:1228:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1228:26:1228:26 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1228:26:1228:26 | y | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1228:26:1228:31 | y.m1() | | main.rs:1157:5:1158:14 | S2 | +| main.rs:1230:13:1230:13 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1230:13:1230:13 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1230:17:1230:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1230:17:1230:33 | MyThing {...} | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1230:30:1230:31 | S1 | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1231:13:1231:13 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1231:13:1231:13 | y | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1231:17:1231:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1231:17:1231:33 | MyThing {...} | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1231:30:1231:31 | S2 | | main.rs:1157:5:1158:14 | S2 | +| main.rs:1233:18:1233:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1233:18:1233:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1233:18:1233:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1233:18:1233:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1233:26:1233:26 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1233:26:1233:26 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1233:26:1233:31 | x.m2() | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1234:18:1234:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1234:18:1234:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1234:18:1234:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1234:18:1234:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1234:26:1234:26 | y | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1234:26:1234:26 | y | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1234:26:1234:31 | y.m2() | | main.rs:1157:5:1158:14 | S2 | +| main.rs:1236:13:1236:13 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1236:13:1236:13 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1236:17:1236:34 | MyThing2 {...} | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1236:17:1236:34 | MyThing2 {...} | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1236:31:1236:32 | S1 | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1237:13:1237:13 | y | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1237:13:1237:13 | y | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1237:17:1237:34 | MyThing2 {...} | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1237:17:1237:34 | MyThing2 {...} | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1237:31:1237:32 | S2 | | main.rs:1157:5:1158:14 | S2 | +| main.rs:1239:18:1239:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1239:18:1239:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1239:18:1239:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1239:18:1239:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1239:26:1239:26 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1239:26:1239:26 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1239:26:1239:31 | x.m3() | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1240:18:1240:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1240:18:1240:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1240:18:1240:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1240:18:1240:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1240:26:1240:26 | y | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1240:26:1240:26 | y | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1240:26:1240:31 | y.m3() | | main.rs:1157:5:1158:14 | S2 | +| main.rs:1242:13:1242:13 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1242:13:1242:13 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1242:17:1242:33 | MyThing {...} | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1242:17:1242:33 | MyThing {...} | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1242:30:1242:31 | S1 | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1243:13:1243:13 | s | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1243:17:1243:32 | call_trait_m1(...) | | main.rs:1155:5:1156:14 | S1 | +| main.rs:1243:31:1243:31 | x | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1243:31:1243:31 | x | A | main.rs:1155:5:1156:14 | S1 | +| main.rs:1245:13:1245:13 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1245:13:1245:13 | x | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1245:17:1245:34 | MyThing2 {...} | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1245:17:1245:34 | MyThing2 {...} | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1245:31:1245:32 | S2 | | main.rs:1157:5:1158:14 | S2 | +| main.rs:1246:13:1246:13 | s | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1246:13:1246:13 | s | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1246:17:1246:32 | call_trait_m1(...) | | main.rs:1145:5:1148:5 | MyThing | +| main.rs:1246:17:1246:32 | call_trait_m1(...) | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1246:31:1246:31 | x | | main.rs:1150:5:1153:5 | MyThing2 | +| main.rs:1246:31:1246:31 | x | A | main.rs:1157:5:1158:14 | S2 | +| main.rs:1263:22:1263:22 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1263:22:1263:22 | x | TRef | main.rs:1263:11:1263:19 | T | +| main.rs:1263:35:1265:5 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1263:35:1265:5 | { ... } | TRef | main.rs:1263:11:1263:19 | T | +| main.rs:1264:9:1264:9 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1264:9:1264:9 | x | TRef | main.rs:1263:11:1263:19 | T | +| main.rs:1268:17:1268:20 | SelfParam | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1268:29:1270:9 | { ... } | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1269:13:1269:14 | S2 | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1273:21:1273:21 | x | | main.rs:1273:13:1273:14 | T1 | +| main.rs:1276:5:1278:5 | { ... } | | main.rs:1273:17:1273:18 | T2 | +| main.rs:1277:9:1277:9 | x | | main.rs:1273:13:1273:14 | T1 | +| main.rs:1277:9:1277:16 | x.into() | | main.rs:1273:17:1273:18 | T2 | +| main.rs:1280:16:1296:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1281:13:1281:13 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1281:17:1281:18 | S1 | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1282:18:1282:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1282:18:1282:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1282:18:1282:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1282:18:1282:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1282:26:1282:31 | id(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1282:26:1282:31 | id(...) | TRef | main.rs:1253:5:1254:14 | S1 | +| main.rs:1282:29:1282:30 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1282:29:1282:30 | &x | TRef | main.rs:1253:5:1254:14 | S1 | +| main.rs:1282:30:1282:30 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1284:13:1284:13 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1284:17:1284:18 | S1 | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1285:18:1285:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1285:18:1285:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1285:18:1285:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1285:18:1285:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1285:26:1285:37 | id::<...>(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1285:26:1285:37 | id::<...>(...) | TRef | main.rs:1253:5:1254:14 | S1 | +| main.rs:1285:35:1285:36 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1285:35:1285:36 | &x | TRef | main.rs:1253:5:1254:14 | S1 | +| main.rs:1285:36:1285:36 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1287:13:1287:13 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1287:17:1287:18 | S1 | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1289:18:1289:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1289:18:1289:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1289:18:1289:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1289:18:1289:44 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1289:26:1289:44 | id::<...>(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1289:26:1289:44 | id::<...>(...) | TRef | main.rs:1259:5:1259:25 | dyn Trait | +| main.rs:1289:42:1289:43 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1289:42:1289:43 | &x | TRef | main.rs:1253:5:1254:14 | S1 | +| main.rs:1289:43:1289:43 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1291:13:1291:13 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1291:17:1291:18 | S1 | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1292:9:1292:25 | into::<...>(...) | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1292:24:1292:24 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1294:13:1294:13 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1294:17:1294:18 | S1 | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1295:13:1295:13 | y | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1295:21:1295:27 | into(...) | | main.rs:1256:5:1257:14 | S2 | +| main.rs:1295:26:1295:26 | x | | main.rs:1253:5:1254:14 | S1 | +| main.rs:1309:22:1309:25 | SelfParam | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1309:22:1309:25 | SelfParam | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1309:22:1309:25 | SelfParam | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1309:35:1316:9 | { ... } | | main.rs:1308:15:1308:17 | Snd | +| main.rs:1310:13:1315:13 | match self { ... } | | file://:0:0:0:0 | ! | +| main.rs:1310:13:1315:13 | match self { ... } | | main.rs:1308:15:1308:17 | Snd | +| main.rs:1310:19:1310:22 | self | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1310:19:1310:22 | self | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1310:19:1310:22 | self | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1311:17:1311:38 | ...::PairNone(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1311:17:1311:38 | ...::PairNone(...) | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1311:17:1311:38 | ...::PairNone(...) | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1311:43:1311:82 | MacroExpr | | file://:0:0:0:0 | ! | +| main.rs:1311:50:1311:81 | "PairNone has no second elemen... | | {EXTERNAL LOCATION} | & | +| main.rs:1311:50:1311:81 | "PairNone has no second elemen... | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1311:50:1311:81 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | +| main.rs:1311:50:1311:81 | MacroExpr | | {EXTERNAL LOCATION} | () | +| main.rs:1311:50:1311:81 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1312:17:1312:38 | ...::PairFst(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1312:17:1312:38 | ...::PairFst(...) | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1312:17:1312:38 | ...::PairFst(...) | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1312:37:1312:37 | _ | | main.rs:1308:10:1308:12 | Fst | +| main.rs:1312:43:1312:81 | MacroExpr | | file://:0:0:0:0 | ! | +| main.rs:1312:50:1312:80 | "PairFst has no second element... | | {EXTERNAL LOCATION} | & | +| main.rs:1312:50:1312:80 | "PairFst has no second element... | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1312:50:1312:80 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | +| main.rs:1312:50:1312:80 | MacroExpr | | {EXTERNAL LOCATION} | () | +| main.rs:1312:50:1312:80 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1313:17:1313:40 | ...::PairSnd(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1313:17:1313:40 | ...::PairSnd(...) | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1313:17:1313:40 | ...::PairSnd(...) | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1313:37:1313:39 | snd | | main.rs:1308:15:1308:17 | Snd | +| main.rs:1313:45:1313:47 | snd | | main.rs:1308:15:1308:17 | Snd | +| main.rs:1314:17:1314:44 | ...::PairBoth(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1314:17:1314:44 | ...::PairBoth(...) | Fst | main.rs:1308:10:1308:12 | Fst | +| main.rs:1314:17:1314:44 | ...::PairBoth(...) | Snd | main.rs:1308:15:1308:17 | Snd | +| main.rs:1314:38:1314:38 | _ | | main.rs:1308:10:1308:12 | Fst | +| main.rs:1314:41:1314:43 | snd | | main.rs:1308:15:1308:17 | Snd | +| main.rs:1314:49:1314:51 | snd | | main.rs:1308:15:1308:17 | Snd | +| main.rs:1340:10:1340:10 | t | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1340:10:1340:10 | t | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1340:10:1340:10 | t | Snd | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1340:10:1340:10 | t | Snd.Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1340:10:1340:10 | t | Snd.Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1340:30:1343:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1341:13:1341:13 | x | | main.rs:1325:5:1326:14 | S3 | +| main.rs:1341:17:1341:17 | t | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1341:17:1341:17 | t | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1341:17:1341:17 | t | Snd | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1341:17:1341:17 | t | Snd.Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1341:17:1341:17 | t | Snd.Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1341:17:1341:29 | t.unwrapSnd() | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1341:17:1341:29 | t.unwrapSnd() | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1341:17:1341:29 | t.unwrapSnd() | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1341:17:1341:41 | ... .unwrapSnd() | | main.rs:1325:5:1326:14 | S3 | +| main.rs:1342:18:1342:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1342:18:1342:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1342:18:1342:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1342:18:1342:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1342:26:1342:26 | x | | main.rs:1325:5:1326:14 | S3 | +| main.rs:1357:22:1357:25 | SelfParam | | main.rs:1355:5:1358:5 | Self [trait TraitWithAssocType] | +| main.rs:1365:22:1365:25 | SelfParam | | main.rs:1353:5:1353:28 | GenS | +| main.rs:1365:22:1365:25 | SelfParam | GenT | main.rs:1360:10:1360:15 | Output | +| main.rs:1365:44:1367:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1365:44:1367:9 | { ... } | E | main.rs:1360:10:1360:15 | Output | +| main.rs:1365:44:1367:9 | { ... } | T | main.rs:1360:10:1360:15 | Output | +| main.rs:1366:13:1366:22 | Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1366:13:1366:22 | Ok(...) | E | main.rs:1360:10:1360:15 | Output | +| main.rs:1366:13:1366:22 | Ok(...) | T | main.rs:1360:10:1360:15 | Output | +| main.rs:1366:16:1366:19 | self | | main.rs:1353:5:1353:28 | GenS | +| main.rs:1366:16:1366:19 | self | GenT | main.rs:1360:10:1360:15 | Output | +| main.rs:1366:16:1366:21 | self.0 | | main.rs:1360:10:1360:15 | Output | +| main.rs:1370:16:1392:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1372:13:1372:14 | p1 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1372:13:1372:14 | p1 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1372:13:1372:14 | p1 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1372:26:1372:53 | ...::PairBoth(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1372:26:1372:53 | ...::PairBoth(...) | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1372:26:1372:53 | ...::PairBoth(...) | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1372:47:1372:48 | S1 | | main.rs:1319:5:1320:14 | S1 | +| main.rs:1372:51:1372:52 | S2 | | main.rs:1322:5:1323:14 | S2 | +| main.rs:1373:18:1373:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1373:18:1373:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1373:18:1373:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1373:18:1373:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1373:26:1373:27 | p1 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1373:26:1373:27 | p1 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1373:26:1373:27 | p1 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1376:13:1376:14 | p2 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1376:13:1376:14 | p2 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1376:13:1376:14 | p2 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1376:26:1376:47 | ...::PairNone(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1376:26:1376:47 | ...::PairNone(...) | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1376:26:1376:47 | ...::PairNone(...) | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1377:18:1377:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1377:18:1377:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1377:18:1377:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1377:18:1377:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1377:26:1377:27 | p2 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1377:26:1377:27 | p2 | Fst | main.rs:1319:5:1320:14 | S1 | +| main.rs:1377:26:1377:27 | p2 | Snd | main.rs:1322:5:1323:14 | S2 | +| main.rs:1380:13:1380:14 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1380:13:1380:14 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1380:13:1380:14 | p3 | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1380:34:1380:56 | ...::PairSnd(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1380:34:1380:56 | ...::PairSnd(...) | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1380:34:1380:56 | ...::PairSnd(...) | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1380:54:1380:55 | S3 | | main.rs:1325:5:1326:14 | S3 | +| main.rs:1381:18:1381:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1381:18:1381:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1381:18:1381:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1381:18:1381:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1381:26:1381:27 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1381:26:1381:27 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1381:26:1381:27 | p3 | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1384:13:1384:14 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1384:13:1384:14 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1384:13:1384:14 | p3 | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1384:35:1384:56 | ...::PairNone(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1384:35:1384:56 | ...::PairNone(...) | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1384:35:1384:56 | ...::PairNone(...) | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1385:18:1385:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1385:18:1385:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1385:18:1385:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1385:18:1385:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1385:26:1385:27 | p3 | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1385:26:1385:27 | p3 | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1385:26:1385:27 | p3 | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1387:9:1387:55 | g(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1387:11:1387:54 | ...::PairSnd(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1387:11:1387:54 | ...::PairSnd(...) | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1387:11:1387:54 | ...::PairSnd(...) | Snd | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1387:11:1387:54 | ...::PairSnd(...) | Snd.Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1387:11:1387:54 | ...::PairSnd(...) | Snd.Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1387:31:1387:53 | ...::PairSnd(...) | | main.rs:1300:5:1306:5 | PairOption | +| main.rs:1387:31:1387:53 | ...::PairSnd(...) | Fst | main.rs:1322:5:1323:14 | S2 | +| main.rs:1387:31:1387:53 | ...::PairSnd(...) | Snd | main.rs:1325:5:1326:14 | S3 | +| main.rs:1387:51:1387:52 | S3 | | main.rs:1325:5:1326:14 | S3 | +| main.rs:1389:13:1389:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1389:13:1389:13 | x | E | main.rs:1319:5:1320:14 | S1 | +| main.rs:1389:13:1389:13 | x | T | main.rs:1345:5:1345:34 | S4 | +| main.rs:1389:13:1389:13 | x | T.T41 | main.rs:1322:5:1323:14 | S2 | +| main.rs:1389:13:1389:13 | x | T.T42 | main.rs:1347:5:1347:22 | S5 | +| main.rs:1389:13:1389:13 | x | T.T42.T5 | main.rs:1322:5:1323:14 | S2 | +| main.rs:1391:13:1391:13 | y | | {EXTERNAL LOCATION} | Result | +| main.rs:1391:13:1391:13 | y | E | {EXTERNAL LOCATION} | bool | +| main.rs:1391:13:1391:13 | y | T | {EXTERNAL LOCATION} | bool | +| main.rs:1391:17:1391:26 | GenS(...) | | main.rs:1353:5:1353:28 | GenS | +| main.rs:1391:17:1391:26 | GenS(...) | GenT | {EXTERNAL LOCATION} | bool | +| main.rs:1391:17:1391:38 | ... .get_input() | | {EXTERNAL LOCATION} | Result | +| main.rs:1391:17:1391:38 | ... .get_input() | E | {EXTERNAL LOCATION} | bool | +| main.rs:1391:17:1391:38 | ... .get_input() | T | {EXTERNAL LOCATION} | bool | +| main.rs:1391:22:1391:25 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1404:16:1404:24 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1404:16:1404:24 | SelfParam | TRefMut | main.rs:1402:5:1409:5 | Self [trait MyTrait] | +| main.rs:1404:27:1404:31 | value | | main.rs:1402:19:1402:19 | S | +| main.rs:1406:21:1406:29 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1406:21:1406:29 | SelfParam | TRefMut | main.rs:1402:5:1409:5 | Self [trait MyTrait] | +| main.rs:1406:32:1406:36 | value | | main.rs:1402:19:1402:19 | S | +| main.rs:1406:42:1408:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1407:13:1407:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1407:13:1407:16 | self | TRefMut | main.rs:1402:5:1409:5 | Self [trait MyTrait] | +| main.rs:1407:13:1407:27 | self.set(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1407:22:1407:26 | value | | main.rs:1402:19:1402:19 | S | +| main.rs:1413:16:1413:24 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1413:16:1413:24 | SelfParam | TRefMut | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1413:16:1413:24 | SelfParam | TRefMut.T | main.rs:1411:10:1411:10 | T | +| main.rs:1413:27:1413:31 | value | | main.rs:1411:10:1411:10 | T | +| main.rs:1413:37:1413:38 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1417:26:1419:9 | { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1417:26:1419:9 | { ... } | T | main.rs:1416:10:1416:10 | T | +| main.rs:1418:13:1418:30 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1418:13:1418:30 | ...::MyNone(...) | T | main.rs:1416:10:1416:10 | T | +| main.rs:1423:20:1423:23 | SelfParam | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1423:20:1423:23 | SelfParam | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1423:20:1423:23 | SelfParam | T.T | main.rs:1422:10:1422:10 | T | +| main.rs:1423:41:1428:9 | { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1423:41:1428:9 | { ... } | T | main.rs:1422:10:1422:10 | T | +| main.rs:1424:13:1427:13 | match self { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1424:13:1427:13 | match self { ... } | T | main.rs:1422:10:1422:10 | T | +| main.rs:1424:19:1424:22 | self | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1424:19:1424:22 | self | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1424:19:1424:22 | self | T.T | main.rs:1422:10:1422:10 | T | +| main.rs:1425:17:1425:34 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1425:17:1425:34 | ...::MyNone(...) | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1425:17:1425:34 | ...::MyNone(...) | T.T | main.rs:1422:10:1422:10 | T | +| main.rs:1425:39:1425:56 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1425:39:1425:56 | ...::MyNone(...) | T | main.rs:1422:10:1422:10 | T | +| main.rs:1426:17:1426:35 | ...::MySome(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1426:17:1426:35 | ...::MySome(...) | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1426:17:1426:35 | ...::MySome(...) | T.T | main.rs:1422:10:1422:10 | T | +| main.rs:1426:34:1426:34 | x | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1426:34:1426:34 | x | T | main.rs:1422:10:1422:10 | T | +| main.rs:1426:40:1426:40 | x | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1426:40:1426:40 | x | T | main.rs:1422:10:1422:10 | T | +| main.rs:1434:16:1479:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1435:13:1435:14 | x1 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1435:13:1435:14 | x1 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1435:18:1435:37 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1435:18:1435:37 | ...::new(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1436:18:1436:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1436:18:1436:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1436:18:1436:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1436:18:1436:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1436:26:1436:27 | x1 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1436:26:1436:27 | x1 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1438:17:1438:18 | x2 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1438:17:1438:18 | x2 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1438:22:1438:36 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1438:22:1438:36 | ...::new(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1439:9:1439:10 | x2 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1439:9:1439:10 | x2 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1439:9:1439:17 | x2.set(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1439:16:1439:16 | S | | main.rs:1431:5:1432:13 | S | +| main.rs:1440:18:1440:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1440:18:1440:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1440:18:1440:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1440:18:1440:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1440:26:1440:27 | x2 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1440:26:1440:27 | x2 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1442:17:1442:18 | x3 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1442:17:1442:18 | x3 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1442:22:1442:36 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1442:22:1442:36 | ...::new(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1443:9:1443:10 | x3 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1443:9:1443:10 | x3 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1443:9:1443:22 | x3.call_set(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1443:21:1443:21 | S | | main.rs:1431:5:1432:13 | S | +| main.rs:1444:18:1444:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1444:18:1444:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1444:18:1444:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1444:18:1444:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1444:26:1444:27 | x3 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1444:26:1444:27 | x3 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1446:17:1446:18 | x4 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1446:17:1446:18 | x4 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1446:22:1446:36 | ...::new(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1446:22:1446:36 | ...::new(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1447:9:1447:33 | ...::set(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1447:23:1447:29 | &mut x4 | | {EXTERNAL LOCATION} | &mut | +| main.rs:1447:23:1447:29 | &mut x4 | TRefMut | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1447:23:1447:29 | &mut x4 | TRefMut.T | main.rs:1431:5:1432:13 | S | +| main.rs:1447:28:1447:29 | x4 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1447:28:1447:29 | x4 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1447:32:1447:32 | S | | main.rs:1431:5:1432:13 | S | +| main.rs:1448:18:1448:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1448:18:1448:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1448:18:1448:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1448:18:1448:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1448:26:1448:27 | x4 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1448:26:1448:27 | x4 | T | main.rs:1431:5:1432:13 | S | +| main.rs:1450:13:1450:14 | x5 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1450:13:1450:14 | x5 | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1450:13:1450:14 | x5 | T.T | main.rs:1431:5:1432:13 | S | +| main.rs:1450:18:1450:58 | ...::MySome(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1450:18:1450:58 | ...::MySome(...) | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1450:18:1450:58 | ...::MySome(...) | T.T | main.rs:1431:5:1432:13 | S | +| main.rs:1450:35:1450:57 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1450:35:1450:57 | ...::MyNone(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1451:18:1451:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1451:18:1451:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1451:18:1451:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1451:18:1451:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1451:26:1451:27 | x5 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1451:26:1451:27 | x5 | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1451:26:1451:27 | x5 | T.T | main.rs:1431:5:1432:13 | S | +| main.rs:1451:26:1451:37 | x5.flatten() | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1451:26:1451:37 | x5.flatten() | T | main.rs:1431:5:1432:13 | S | +| main.rs:1453:13:1453:14 | x6 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1453:13:1453:14 | x6 | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1453:13:1453:14 | x6 | T.T | main.rs:1431:5:1432:13 | S | +| main.rs:1453:18:1453:58 | ...::MySome(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1453:18:1453:58 | ...::MySome(...) | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1453:18:1453:58 | ...::MySome(...) | T.T | main.rs:1431:5:1432:13 | S | +| main.rs:1453:35:1453:57 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1453:35:1453:57 | ...::MyNone(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1454:18:1454:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1454:18:1454:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1454:18:1454:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1454:18:1454:61 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1454:26:1454:61 | ...::flatten(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1454:26:1454:61 | ...::flatten(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1454:59:1454:60 | x6 | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1454:59:1454:60 | x6 | T | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1454:59:1454:60 | x6 | T.T | main.rs:1431:5:1432:13 | S | +| main.rs:1457:13:1457:19 | from_if | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1457:13:1457:19 | from_if | T | main.rs:1431:5:1432:13 | S | +| main.rs:1457:23:1461:9 | if ... {...} else {...} | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1457:23:1461:9 | if ... {...} else {...} | T | main.rs:1431:5:1432:13 | S | +| main.rs:1457:26:1457:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1457:26:1457:30 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1457:30:1457:30 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1457:32:1459:9 | { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1457:32:1459:9 | { ... } | T | main.rs:1431:5:1432:13 | S | +| main.rs:1458:13:1458:30 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1458:13:1458:30 | ...::MyNone(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1459:16:1461:9 | { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1459:16:1461:9 | { ... } | T | main.rs:1431:5:1432:13 | S | +| main.rs:1460:13:1460:31 | ...::MySome(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1460:13:1460:31 | ...::MySome(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1460:30:1460:30 | S | | main.rs:1431:5:1432:13 | S | +| main.rs:1462:18:1462:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1462:18:1462:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1462:18:1462:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1462:18:1462:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1462:26:1462:32 | from_if | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1462:26:1462:32 | from_if | T | main.rs:1431:5:1432:13 | S | +| main.rs:1465:13:1465:22 | from_match | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1465:13:1465:22 | from_match | T | main.rs:1431:5:1432:13 | S | +| main.rs:1465:26:1468:9 | match ... { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1465:26:1468:9 | match ... { ... } | T | main.rs:1431:5:1432:13 | S | +| main.rs:1465:32:1465:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1465:32:1465:36 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1465:36:1465:36 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1466:13:1466:16 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1466:21:1466:38 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1466:21:1466:38 | ...::MyNone(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1467:13:1467:17 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1467:22:1467:40 | ...::MySome(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1467:22:1467:40 | ...::MySome(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1467:39:1467:39 | S | | main.rs:1431:5:1432:13 | S | +| main.rs:1469:18:1469:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1469:18:1469:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1469:18:1469:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1469:18:1469:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1469:26:1469:35 | from_match | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1469:26:1469:35 | from_match | T | main.rs:1431:5:1432:13 | S | +| main.rs:1472:13:1472:21 | from_loop | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1472:13:1472:21 | from_loop | T | main.rs:1431:5:1432:13 | S | +| main.rs:1472:25:1477:9 | loop { ... } | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1472:25:1477:9 | loop { ... } | T | main.rs:1431:5:1432:13 | S | +| main.rs:1472:30:1477:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1473:13:1475:13 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1473:16:1473:16 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1473:16:1473:20 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1473:20:1473:20 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1473:22:1475:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1474:23:1474:40 | ...::MyNone(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1474:23:1474:40 | ...::MyNone(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1476:19:1476:37 | ...::MySome(...) | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1476:19:1476:37 | ...::MySome(...) | T | main.rs:1431:5:1432:13 | S | +| main.rs:1476:36:1476:36 | S | | main.rs:1431:5:1432:13 | S | +| main.rs:1478:18:1478:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1478:18:1478:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1478:18:1478:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1478:18:1478:34 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1478:26:1478:34 | from_loop | | main.rs:1396:5:1400:5 | MyOption | +| main.rs:1478:26:1478:34 | from_loop | T | main.rs:1431:5:1432:13 | S | +| main.rs:1496:15:1496:18 | SelfParam | | main.rs:1484:5:1485:19 | S | +| main.rs:1496:15:1496:18 | SelfParam | T | main.rs:1495:10:1495:10 | T | +| main.rs:1496:26:1498:9 | { ... } | | main.rs:1495:10:1495:10 | T | +| main.rs:1497:13:1497:16 | self | | main.rs:1484:5:1485:19 | S | +| main.rs:1497:13:1497:16 | self | T | main.rs:1495:10:1495:10 | T | +| main.rs:1497:13:1497:18 | self.0 | | main.rs:1495:10:1495:10 | T | +| main.rs:1500:15:1500:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1500:15:1500:19 | SelfParam | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1500:15:1500:19 | SelfParam | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1500:28:1502:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1500:28:1502:9 | { ... } | TRef | main.rs:1495:10:1495:10 | T | +| main.rs:1501:13:1501:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1501:13:1501:19 | &... | TRef | main.rs:1495:10:1495:10 | T | +| main.rs:1501:14:1501:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1501:14:1501:17 | self | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1501:14:1501:17 | self | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1501:14:1501:19 | self.0 | | main.rs:1495:10:1495:10 | T | +| main.rs:1504:15:1504:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1504:15:1504:25 | SelfParam | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1504:15:1504:25 | SelfParam | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1504:34:1506:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1504:34:1506:9 | { ... } | TRef | main.rs:1495:10:1495:10 | T | +| main.rs:1505:13:1505:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1505:13:1505:19 | &... | TRef | main.rs:1495:10:1495:10 | T | +| main.rs:1505:14:1505:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1505:14:1505:17 | self | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1505:14:1505:17 | self | TRef.T | main.rs:1495:10:1495:10 | T | +| main.rs:1505:14:1505:19 | self.0 | | main.rs:1495:10:1495:10 | T | +| main.rs:1510:29:1510:33 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1510:29:1510:33 | SelfParam | TRef | main.rs:1509:5:1512:5 | Self [trait ATrait] | +| main.rs:1511:33:1511:36 | SelfParam | | main.rs:1509:5:1512:5 | Self [trait ATrait] | +| main.rs:1517:29:1517:33 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1517:29:1517:33 | SelfParam | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1517:29:1517:33 | SelfParam | TRef.TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1517:43:1519:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:1518:13:1518:22 | (...) | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1518:13:1518:24 | ... .a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1518:14:1518:21 | * ... | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1518:15:1518:21 | (...) | | {EXTERNAL LOCATION} | & | +| main.rs:1518:15:1518:21 | (...) | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1518:16:1518:20 | * ... | | {EXTERNAL LOCATION} | & | +| main.rs:1518:16:1518:20 | * ... | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1518:17:1518:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1518:17:1518:20 | self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1518:17:1518:20 | self | TRef.TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1522:33:1522:36 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1522:33:1522:36 | SelfParam | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1522:46:1524:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:1523:13:1523:19 | (...) | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1523:13:1523:21 | ... .a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1523:14:1523:18 | * ... | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1523:15:1523:18 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1523:15:1523:18 | self | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1527:16:1577:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1528:13:1528:14 | x1 | | main.rs:1484:5:1485:19 | S | +| main.rs:1528:13:1528:14 | x1 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1528:18:1528:22 | S(...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1528:18:1528:22 | S(...) | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1528:20:1528:21 | S2 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1529:18:1529:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1529:18:1529:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1529:18:1529:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1529:18:1529:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1529:26:1529:27 | x1 | | main.rs:1484:5:1485:19 | S | +| main.rs:1529:26:1529:27 | x1 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1529:26:1529:32 | x1.m1() | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1531:13:1531:14 | x2 | | main.rs:1484:5:1485:19 | S | +| main.rs:1531:13:1531:14 | x2 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1531:18:1531:22 | S(...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1531:18:1531:22 | S(...) | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1531:20:1531:21 | S2 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1533:18:1533:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1533:18:1533:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1533:18:1533:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1533:18:1533:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1533:26:1533:27 | x2 | | main.rs:1484:5:1485:19 | S | +| main.rs:1533:26:1533:27 | x2 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1533:26:1533:32 | x2.m2() | | {EXTERNAL LOCATION} | & | +| main.rs:1533:26:1533:32 | x2.m2() | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1534:18:1534:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1534:18:1534:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1534:18:1534:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1534:18:1534:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1534:26:1534:27 | x2 | | main.rs:1484:5:1485:19 | S | +| main.rs:1534:26:1534:27 | x2 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1534:26:1534:32 | x2.m3() | | {EXTERNAL LOCATION} | & | +| main.rs:1534:26:1534:32 | x2.m3() | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1536:13:1536:14 | x3 | | main.rs:1484:5:1485:19 | S | +| main.rs:1536:13:1536:14 | x3 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1536:18:1536:22 | S(...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1536:18:1536:22 | S(...) | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1536:20:1536:21 | S2 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1538:18:1538:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1538:18:1538:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1538:18:1538:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1538:18:1538:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1538:26:1538:41 | ...::m2(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1538:26:1538:41 | ...::m2(...) | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1538:38:1538:40 | &x3 | | {EXTERNAL LOCATION} | & | +| main.rs:1538:38:1538:40 | &x3 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1538:38:1538:40 | &x3 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1538:39:1538:40 | x3 | | main.rs:1484:5:1485:19 | S | +| main.rs:1538:39:1538:40 | x3 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1539:18:1539:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1539:18:1539:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1539:18:1539:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1539:18:1539:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1539:26:1539:41 | ...::m3(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1539:26:1539:41 | ...::m3(...) | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1539:38:1539:40 | &x3 | | {EXTERNAL LOCATION} | & | +| main.rs:1539:38:1539:40 | &x3 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1539:38:1539:40 | &x3 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1539:39:1539:40 | x3 | | main.rs:1484:5:1485:19 | S | +| main.rs:1539:39:1539:40 | x3 | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1541:13:1541:14 | x4 | | {EXTERNAL LOCATION} | & | +| main.rs:1541:13:1541:14 | x4 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1541:13:1541:14 | x4 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1541:18:1541:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1541:18:1541:23 | &... | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1541:18:1541:23 | &... | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1541:19:1541:23 | S(...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1541:19:1541:23 | S(...) | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1541:21:1541:22 | S2 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1543:18:1543:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1543:18:1543:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1543:18:1543:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1543:18:1543:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1543:26:1543:27 | x4 | | {EXTERNAL LOCATION} | & | +| main.rs:1543:26:1543:27 | x4 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1543:26:1543:27 | x4 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1543:26:1543:32 | x4.m2() | | {EXTERNAL LOCATION} | & | +| main.rs:1543:26:1543:32 | x4.m2() | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1544:18:1544:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1544:18:1544:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1544:18:1544:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1544:18:1544:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1544:26:1544:27 | x4 | | {EXTERNAL LOCATION} | & | +| main.rs:1544:26:1544:27 | x4 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1544:26:1544:27 | x4 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1544:26:1544:32 | x4.m3() | | {EXTERNAL LOCATION} | & | +| main.rs:1544:26:1544:32 | x4.m3() | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1546:13:1546:14 | x5 | | {EXTERNAL LOCATION} | & | +| main.rs:1546:13:1546:14 | x5 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1546:13:1546:14 | x5 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1546:18:1546:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1546:18:1546:23 | &... | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1546:18:1546:23 | &... | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1546:19:1546:23 | S(...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1546:19:1546:23 | S(...) | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1546:21:1546:22 | S2 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1548:18:1548:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1548:18:1548:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1548:18:1548:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1548:18:1548:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1548:26:1548:27 | x5 | | {EXTERNAL LOCATION} | & | +| main.rs:1548:26:1548:27 | x5 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1548:26:1548:27 | x5 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1548:26:1548:32 | x5.m1() | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1549:18:1549:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1549:18:1549:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1549:18:1549:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1549:18:1549:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1549:26:1549:27 | x5 | | {EXTERNAL LOCATION} | & | +| main.rs:1549:26:1549:27 | x5 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1549:26:1549:27 | x5 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1549:26:1549:29 | x5.0 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1551:13:1551:14 | x6 | | {EXTERNAL LOCATION} | & | +| main.rs:1551:13:1551:14 | x6 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1551:13:1551:14 | x6 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1551:18:1551:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1551:18:1551:23 | &... | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1551:18:1551:23 | &... | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1551:19:1551:23 | S(...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1551:19:1551:23 | S(...) | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1551:21:1551:22 | S2 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1554:18:1554:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1554:18:1554:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1554:18:1554:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1554:18:1554:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1554:26:1554:30 | (...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1554:26:1554:30 | (...) | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1554:26:1554:35 | ... .m1() | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1554:27:1554:29 | * ... | | main.rs:1484:5:1485:19 | S | +| main.rs:1554:27:1554:29 | * ... | T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1554:28:1554:29 | x6 | | {EXTERNAL LOCATION} | & | +| main.rs:1554:28:1554:29 | x6 | TRef | main.rs:1484:5:1485:19 | S | +| main.rs:1554:28:1554:29 | x6 | TRef.T | main.rs:1487:5:1488:14 | S2 | +| main.rs:1556:13:1556:14 | x7 | | main.rs:1484:5:1485:19 | S | +| main.rs:1556:13:1556:14 | x7 | T | {EXTERNAL LOCATION} | & | +| main.rs:1556:13:1556:14 | x7 | T.TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1556:18:1556:23 | S(...) | | main.rs:1484:5:1485:19 | S | +| main.rs:1556:18:1556:23 | S(...) | T | {EXTERNAL LOCATION} | & | +| main.rs:1556:18:1556:23 | S(...) | T.TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1556:20:1556:22 | &S2 | | {EXTERNAL LOCATION} | & | +| main.rs:1556:20:1556:22 | &S2 | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1556:21:1556:22 | S2 | | main.rs:1487:5:1488:14 | S2 | +| main.rs:1559:13:1559:13 | t | | {EXTERNAL LOCATION} | & | +| main.rs:1559:13:1559:13 | t | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1559:17:1559:18 | x7 | | main.rs:1484:5:1485:19 | S | +| main.rs:1559:17:1559:18 | x7 | T | {EXTERNAL LOCATION} | & | +| main.rs:1559:17:1559:18 | x7 | T.TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1559:17:1559:23 | x7.m1() | | {EXTERNAL LOCATION} | & | +| main.rs:1559:17:1559:23 | x7.m1() | TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1560:18:1560:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1560:18:1560:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1560:18:1560:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1560:18:1560:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1560:26:1560:27 | x7 | | main.rs:1484:5:1485:19 | S | +| main.rs:1560:26:1560:27 | x7 | T | {EXTERNAL LOCATION} | & | +| main.rs:1560:26:1560:27 | x7 | T.TRef | main.rs:1487:5:1488:14 | S2 | +| main.rs:1562:13:1562:14 | x9 | | {EXTERNAL LOCATION} | String | +| main.rs:1562:26:1562:32 | "Hello" | | {EXTERNAL LOCATION} | & | +| main.rs:1562:26:1562:32 | "Hello" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1562:26:1562:44 | "Hello".to_string() | | {EXTERNAL LOCATION} | String | +| main.rs:1566:13:1566:13 | u | | {EXTERNAL LOCATION} | Result | +| main.rs:1566:13:1566:13 | u | T | {EXTERNAL LOCATION} | u32 | +| main.rs:1566:17:1566:18 | x9 | | {EXTERNAL LOCATION} | String | +| main.rs:1566:17:1566:33 | x9.parse() | | {EXTERNAL LOCATION} | Result | +| main.rs:1566:17:1566:33 | x9.parse() | T | {EXTERNAL LOCATION} | u32 | +| main.rs:1568:13:1568:20 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1568:13:1568:20 | my_thing | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1568:24:1568:39 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1568:24:1568:39 | &... | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1568:25:1568:39 | MyInt {...} | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1568:36:1568:37 | 37 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1570:13:1570:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1570:17:1570:24 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1570:17:1570:24 | my_thing | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1570:17:1570:43 | my_thing.method_on_borrow() | | {EXTERNAL LOCATION} | i64 | +| main.rs:1571:18:1571:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1571:18:1571:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1571:18:1571:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1571:18:1571:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1571:26:1571:26 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1574:13:1574:20 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1574:13:1574:20 | my_thing | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1574:24:1574:39 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1574:24:1574:39 | &... | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1574:25:1574:39 | MyInt {...} | | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1574:36:1574:37 | 38 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1575:13:1575:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1575:17:1575:24 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1575:17:1575:24 | my_thing | TRef | main.rs:1490:5:1493:5 | MyInt | +| main.rs:1575:17:1575:47 | my_thing.method_not_on_borrow() | | {EXTERNAL LOCATION} | i64 | +| main.rs:1576:18:1576:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1576:18:1576:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1576:18:1576:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1576:18:1576:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1576:26:1576:26 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1583:16:1583:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1583:16:1583:20 | SelfParam | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1586:16:1586:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1586:16:1586:20 | SelfParam | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1586:32:1588:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1586:32:1588:9 | { ... } | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1587:13:1587:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1587:13:1587:16 | self | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1587:13:1587:22 | self.foo() | | {EXTERNAL LOCATION} | & | +| main.rs:1587:13:1587:22 | self.foo() | TRef | main.rs:1581:5:1589:5 | Self [trait MyTrait] | +| main.rs:1595:16:1595:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1595:16:1595:20 | SelfParam | TRef | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1595:36:1597:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1595:36:1597:9 | { ... } | TRef | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1596:13:1596:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1596:13:1596:16 | self | TRef | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1600:16:1603:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1601:13:1601:13 | x | | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1601:17:1601:24 | MyStruct | | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1602:9:1602:9 | x | | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1602:9:1602:15 | x.bar() | | {EXTERNAL LOCATION} | & | +| main.rs:1602:9:1602:15 | x.bar() | TRef | main.rs:1591:5:1591:20 | MyStruct | +| main.rs:1612:16:1612:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1612:16:1612:20 | SelfParam | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1612:16:1612:20 | SelfParam | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1612:32:1614:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1612:32:1614:9 | { ... } | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1612:32:1614:9 | { ... } | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1613:13:1613:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1613:13:1613:16 | self | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1613:13:1613:16 | self | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1616:16:1616:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1616:16:1616:20 | SelfParam | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1616:16:1616:20 | SelfParam | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1616:23:1616:23 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1616:23:1616:23 | x | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1616:23:1616:23 | x | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1616:42:1618:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1616:42:1618:9 | { ... } | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1616:42:1618:9 | { ... } | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1617:13:1617:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1617:13:1617:16 | self | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1617:13:1617:16 | self | TRef.T | main.rs:1611:10:1611:10 | T | +| main.rs:1621:16:1627:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1622:13:1622:13 | x | | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1622:13:1622:13 | x | T | main.rs:1607:5:1607:13 | S | +| main.rs:1622:17:1622:27 | MyStruct(...) | | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1622:17:1622:27 | MyStruct(...) | T | main.rs:1607:5:1607:13 | S | +| main.rs:1622:26:1622:26 | S | | main.rs:1607:5:1607:13 | S | +| main.rs:1623:9:1623:9 | x | | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1623:9:1623:9 | x | T | main.rs:1607:5:1607:13 | S | +| main.rs:1623:9:1623:15 | x.foo() | | {EXTERNAL LOCATION} | & | +| main.rs:1623:9:1623:15 | x.foo() | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1623:9:1623:15 | x.foo() | TRef.T | main.rs:1607:5:1607:13 | S | +| main.rs:1624:13:1624:13 | x | | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1624:13:1624:13 | x | T | main.rs:1607:5:1607:13 | S | +| main.rs:1624:17:1624:27 | MyStruct(...) | | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1624:17:1624:27 | MyStruct(...) | T | main.rs:1607:5:1607:13 | S | +| main.rs:1624:26:1624:26 | S | | main.rs:1607:5:1607:13 | S | +| main.rs:1626:9:1626:9 | x | | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1626:9:1626:9 | x | T | main.rs:1607:5:1607:13 | S | +| main.rs:1626:9:1626:18 | x.bar(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1626:9:1626:18 | x.bar(...) | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1626:9:1626:18 | x.bar(...) | TRef.T | main.rs:1607:5:1607:13 | S | +| main.rs:1626:15:1626:17 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1626:15:1626:17 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1626:15:1626:17 | &... | TRef.TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1626:15:1626:17 | &... | TRef.TRef.T | main.rs:1607:5:1607:13 | S | +| main.rs:1626:16:1626:17 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1626:16:1626:17 | &x | TRef | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1626:16:1626:17 | &x | TRef.T | main.rs:1607:5:1607:13 | S | +| main.rs:1626:17:1626:17 | x | | main.rs:1609:5:1609:26 | MyStruct | +| main.rs:1626:17:1626:17 | x | T | main.rs:1607:5:1607:13 | S | +| main.rs:1637:17:1637:25 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1637:17:1637:25 | SelfParam | TRefMut | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1637:28:1639:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1638:13:1638:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1638:13:1638:16 | self | TRefMut | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1638:13:1638:21 | self.bool | | {EXTERNAL LOCATION} | bool | +| main.rs:1638:13:1638:34 | ... = ... | | {EXTERNAL LOCATION} | () | +| main.rs:1638:25:1638:34 | ! ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1638:26:1638:29 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1638:26:1638:29 | self | TRefMut | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1638:26:1638:34 | self.bool | | {EXTERNAL LOCATION} | bool | +| main.rs:1645:15:1645:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1645:15:1645:19 | SelfParam | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1645:31:1647:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1645:31:1647:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1646:13:1646:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1646:13:1646:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1646:13:1646:19 | &... | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1646:13:1646:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1646:13:1646:19 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1646:13:1646:19 | &... | TRef.TRef.TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1646:14:1646:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1646:14:1646:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1646:14:1646:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1646:14:1646:19 | &... | TRef.TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1646:15:1646:19 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:1646:15:1646:19 | &self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1646:15:1646:19 | &self | TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1646:16:1646:19 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1646:16:1646:19 | self | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1649:15:1649:25 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1649:15:1649:25 | SelfParam | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1649:37:1651:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1649:37:1651:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1650:13:1650:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1650:13:1650:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1650:13:1650:19 | &... | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1650:13:1650:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1650:13:1650:19 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1650:13:1650:19 | &... | TRef.TRef.TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1650:14:1650:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1650:14:1650:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1650:14:1650:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1650:14:1650:19 | &... | TRef.TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1650:15:1650:19 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:1650:15:1650:19 | &self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1650:15:1650:19 | &self | TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1650:16:1650:19 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1650:16:1650:19 | self | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1653:15:1653:15 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1653:15:1653:15 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1653:34:1655:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1653:34:1655:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1654:13:1654:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1654:13:1654:13 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1657:15:1657:15 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1657:15:1657:15 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1657:34:1659:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1657:34:1659:9 | { ... } | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1658:13:1658:16 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1658:13:1658:16 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1658:13:1658:16 | &... | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1658:13:1658:16 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1658:13:1658:16 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1658:13:1658:16 | &... | TRef.TRef.TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1658:14:1658:16 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1658:14:1658:16 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1658:14:1658:16 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1658:14:1658:16 | &... | TRef.TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1658:15:1658:16 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1658:15:1658:16 | &x | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1658:15:1658:16 | &x | TRef.TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1658:16:1658:16 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1658:16:1658:16 | x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1662:16:1675:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1663:13:1663:13 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1663:17:1663:20 | S {...} | | main.rs:1642:5:1642:13 | S | +| main.rs:1664:9:1664:9 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1664:9:1664:14 | x.f1() | | {EXTERNAL LOCATION} | & | +| main.rs:1664:9:1664:14 | x.f1() | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1665:9:1665:9 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1665:9:1665:14 | x.f2() | | {EXTERNAL LOCATION} | & | +| main.rs:1665:9:1665:14 | x.f2() | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1666:9:1666:17 | ...::f3(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1666:9:1666:17 | ...::f3(...) | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1666:15:1666:16 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1666:15:1666:16 | &x | TRef | main.rs:1642:5:1642:13 | S | +| main.rs:1666:16:1666:16 | x | | main.rs:1642:5:1642:13 | S | +| main.rs:1668:13:1668:13 | n | | {EXTERNAL LOCATION} | bool | +| main.rs:1668:17:1668:24 | * ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1668:18:1668:24 | * ... | | {EXTERNAL LOCATION} | & | +| main.rs:1668:18:1668:24 | * ... | TRef | {EXTERNAL LOCATION} | bool | +| main.rs:1668:19:1668:24 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1668:19:1668:24 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1668:19:1668:24 | &... | TRef.TRef | {EXTERNAL LOCATION} | bool | +| main.rs:1668:20:1668:24 | &true | | {EXTERNAL LOCATION} | & | +| main.rs:1668:20:1668:24 | &true | TRef | {EXTERNAL LOCATION} | bool | +| main.rs:1668:21:1668:24 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1672:17:1672:20 | flag | | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1672:24:1672:41 | ...::default(...) | | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1673:9:1673:31 | ...::flip(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1673:22:1673:30 | &mut flag | | {EXTERNAL LOCATION} | &mut | +| main.rs:1673:22:1673:30 | &mut flag | TRefMut | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1673:27:1673:30 | flag | | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1674:18:1674:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1674:18:1674:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1674:18:1674:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1674:18:1674:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1674:26:1674:29 | flag | | main.rs:1631:5:1634:5 | MyFlag | +| main.rs:1689:43:1692:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1689:43:1692:5 | { ... } | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1689:43:1692:5 | { ... } | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1690:13:1690:13 | x | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1690:17:1690:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1690:17:1690:30 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1690:17:1690:31 | TryExpr | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1690:28:1690:29 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1691:9:1691:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1691:9:1691:22 | ...::Ok(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1691:9:1691:22 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1691:20:1691:21 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1696:46:1700:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1696:46:1700:5 | { ... } | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1696:46:1700:5 | { ... } | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1697:13:1697:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1697:13:1697:13 | x | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1697:17:1697:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1697:17:1697:30 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1697:28:1697:29 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1698:13:1698:13 | y | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1698:17:1698:17 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1698:17:1698:17 | x | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1698:17:1698:18 | TryExpr | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1699:9:1699:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1699:9:1699:22 | ...::Ok(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1699:9:1699:22 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1699:20:1699:21 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1704:40:1709:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1704:40:1709:5 | { ... } | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1704:40:1709:5 | { ... } | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1705:13:1705:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1705:13:1705:13 | x | T | {EXTERNAL LOCATION} | Result | +| main.rs:1705:13:1705:13 | x | T.T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1705:17:1705:42 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1705:17:1705:42 | ...::Ok(...) | T | {EXTERNAL LOCATION} | Result | +| main.rs:1705:17:1705:42 | ...::Ok(...) | T.T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1705:28:1705:41 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1705:28:1705:41 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1705:39:1705:40 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1707:17:1707:17 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1707:17:1707:17 | x | T | {EXTERNAL LOCATION} | Result | +| main.rs:1707:17:1707:17 | x | T.T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1707:17:1707:18 | TryExpr | | {EXTERNAL LOCATION} | Result | +| main.rs:1707:17:1707:18 | TryExpr | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1707:17:1707:29 | ... .map(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1707:24:1707:28 | \|...\| s | | {EXTERNAL LOCATION} | dyn FnOnce | +| main.rs:1707:24:1707:28 | \|...\| s | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| main.rs:1708:9:1708:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1708:9:1708:22 | ...::Ok(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1708:9:1708:22 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1708:20:1708:21 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1713:30:1713:34 | input | | {EXTERNAL LOCATION} | Result | +| main.rs:1713:30:1713:34 | input | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1713:30:1713:34 | input | T | main.rs:1713:20:1713:27 | T | +| main.rs:1713:69:1720:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1713:69:1720:5 | { ... } | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1713:69:1720:5 | { ... } | T | main.rs:1713:20:1713:27 | T | +| main.rs:1714:13:1714:17 | value | | main.rs:1713:20:1713:27 | T | +| main.rs:1714:21:1714:25 | input | | {EXTERNAL LOCATION} | Result | +| main.rs:1714:21:1714:25 | input | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1714:21:1714:25 | input | T | main.rs:1713:20:1713:27 | T | +| main.rs:1714:21:1714:26 | TryExpr | | main.rs:1713:20:1713:27 | T | +| main.rs:1715:22:1715:38 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1715:22:1715:38 | ...::Ok(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1715:22:1715:38 | ...::Ok(...) | T | main.rs:1713:20:1713:27 | T | +| main.rs:1715:22:1718:10 | ... .and_then(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1715:22:1718:10 | ... .and_then(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1715:33:1715:37 | value | | main.rs:1713:20:1713:27 | T | +| main.rs:1715:49:1718:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| main.rs:1715:49:1718:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| main.rs:1715:49:1718:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | Result | +| main.rs:1715:49:1718:9 | \|...\| ... | dyn(Output).E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1715:53:1718:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1715:53:1718:9 | { ... } | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1716:22:1716:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1716:22:1716:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1716:22:1716:30 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1716:22:1716:30 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1717:13:1717:34 | ...::Ok::<...>(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1717:13:1717:34 | ...::Ok::<...>(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1719:9:1719:23 | ...::Err(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1719:9:1719:23 | ...::Err(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1719:9:1719:23 | ...::Err(...) | T | main.rs:1713:20:1713:27 | T | +| main.rs:1719:21:1719:22 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1723:16:1739:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1724:9:1726:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1724:16:1724:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1724:16:1724:33 | ...::Ok(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1724:16:1724:33 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1724:27:1724:32 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1724:37:1724:52 | try_same_error(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1724:37:1724:52 | try_same_error(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1724:37:1724:52 | try_same_error(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1724:54:1726:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1725:22:1725:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1725:22:1725:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1725:22:1725:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1725:22:1725:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1725:30:1725:35 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1728:9:1730:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1728:16:1728:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1728:16:1728:33 | ...::Ok(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1728:16:1728:33 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1728:27:1728:32 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1728:37:1728:55 | try_convert_error(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1728:37:1728:55 | try_convert_error(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1728:37:1728:55 | try_convert_error(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1728:57:1730:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1729:22:1729:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1729:22:1729:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1729:22:1729:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1729:22:1729:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1729:30:1729:35 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1732:9:1734:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1732:16:1732:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1732:16:1732:33 | ...::Ok(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1732:16:1732:33 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1732:27:1732:32 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1732:37:1732:49 | try_chained(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1732:37:1732:49 | try_chained(...) | E | main.rs:1684:5:1685:14 | S2 | +| main.rs:1732:37:1732:49 | try_chained(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1732:51:1734:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1733:22:1733:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1733:22:1733:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1733:22:1733:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1733:22:1733:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1733:30:1733:35 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:9:1738:9 | if ... {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1736:16:1736:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1736:16:1736:33 | ...::Ok(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:16:1736:33 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:27:1736:32 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:37:1736:63 | try_complex(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1736:37:1736:63 | try_complex(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:37:1736:63 | try_complex(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:49:1736:62 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1736:49:1736:62 | ...::Ok(...) | E | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:49:1736:62 | ...::Ok(...) | T | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:60:1736:61 | S1 | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1736:65:1738:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1737:22:1737:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:1737:22:1737:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1737:22:1737:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1737:22:1737:35 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1737:30:1737:35 | result | | main.rs:1681:5:1682:14 | S1 | +| main.rs:1743:16:1834:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1744:13:1744:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1744:22:1744:22 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1745:13:1745:13 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:1745:17:1745:17 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1746:13:1746:13 | z | | {EXTERNAL LOCATION} | i32 | +| main.rs:1746:17:1746:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1746:17:1746:21 | ... + ... | | {EXTERNAL LOCATION} | i32 | +| main.rs:1746:21:1746:21 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:1747:13:1747:13 | z | | {EXTERNAL LOCATION} | i32 | +| main.rs:1747:17:1747:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1747:17:1747:23 | x.abs() | | {EXTERNAL LOCATION} | i32 | +| main.rs:1748:13:1748:13 | c | | {EXTERNAL LOCATION} | char | +| main.rs:1748:17:1748:19 | 'c' | | {EXTERNAL LOCATION} | char | +| main.rs:1749:13:1749:17 | hello | | {EXTERNAL LOCATION} | & | +| main.rs:1749:13:1749:17 | hello | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1749:21:1749:27 | "Hello" | | {EXTERNAL LOCATION} | & | +| main.rs:1749:21:1749:27 | "Hello" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:1750:13:1750:13 | f | | {EXTERNAL LOCATION} | f64 | +| main.rs:1750:17:1750:24 | 123.0f64 | | {EXTERNAL LOCATION} | f64 | +| main.rs:1751:13:1751:13 | t | | {EXTERNAL LOCATION} | bool | +| main.rs:1751:17:1751:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1752:13:1752:13 | f | | {EXTERNAL LOCATION} | bool | +| main.rs:1752:17:1752:21 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1755:26:1755:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1755:26:1755:30 | SelfParam | TRef | main.rs:1754:9:1758:9 | Self [trait MyTrait] | +| main.rs:1761:26:1761:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1761:26:1761:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:1761:26:1761:30 | SelfParam | TRef.TArray | main.rs:1760:14:1760:23 | T | +| main.rs:1761:39:1763:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1761:39:1763:13 | { ... } | TRef | main.rs:1760:14:1760:23 | T | +| main.rs:1762:17:1762:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1762:17:1762:20 | self | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:1762:17:1762:20 | self | TRef.TArray | main.rs:1760:14:1760:23 | T | +| main.rs:1762:17:1762:36 | ... .unwrap() | | {EXTERNAL LOCATION} | & | +| main.rs:1762:17:1762:36 | ... .unwrap() | TRef | main.rs:1760:14:1760:23 | T | +| main.rs:1762:26:1762:26 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1765:31:1767:13 | { ... } | | main.rs:1760:14:1760:23 | T | +| main.rs:1766:17:1766:28 | ...::default(...) | | main.rs:1760:14:1760:23 | T | +| main.rs:1770:13:1770:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1770:13:1770:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1770:17:1770:25 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:1770:17:1770:25 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:1770:17:1770:37 | ... .my_method() | | {EXTERNAL LOCATION} | & | +| main.rs:1770:17:1770:37 | ... .my_method() | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1770:18:1770:18 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1770:21:1770:21 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1770:24:1770:24 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:13:1771:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1771:13:1771:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:17:1771:47 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1771:17:1771:47 | ...::my_method(...) | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:22:1771:22 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:37:1771:46 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1771:37:1771:46 | &... | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:1771:37:1771:46 | &... | TRef.TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:38:1771:46 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:1771:38:1771:46 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:39:1771:39 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:42:1771:42 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1771:45:1771:45 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1772:13:1772:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1772:17:1772:37 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1772:24:1772:24 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1775:26:1775:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1775:26:1775:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1775:26:1775:30 | SelfParam | TRef.TSlice | main.rs:1774:14:1774:23 | T | +| main.rs:1775:39:1777:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1775:39:1777:13 | { ... } | TRef | main.rs:1774:14:1774:23 | T | +| main.rs:1776:17:1776:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1776:17:1776:20 | self | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1776:17:1776:20 | self | TRef.TSlice | main.rs:1774:14:1774:23 | T | +| main.rs:1776:17:1776:27 | self.get(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:1776:17:1776:27 | self.get(...) | T | {EXTERNAL LOCATION} | & | +| main.rs:1776:17:1776:36 | ... .unwrap() | | {EXTERNAL LOCATION} | & | +| main.rs:1776:17:1776:36 | ... .unwrap() | TRef | main.rs:1774:14:1774:23 | T | +| main.rs:1776:26:1776:26 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1779:31:1781:13 | { ... } | | main.rs:1774:14:1774:23 | T | +| main.rs:1780:17:1780:28 | ...::default(...) | | main.rs:1774:14:1774:23 | T | +| main.rs:1784:13:1784:13 | s | | {EXTERNAL LOCATION} | & | +| main.rs:1784:13:1784:13 | s | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1784:13:1784:13 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| main.rs:1784:25:1784:34 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1784:25:1784:34 | &... | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1784:25:1784:34 | &... | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:1784:25:1784:34 | &... | TRef.TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:1784:25:1784:34 | &... | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| main.rs:1784:26:1784:34 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:1784:26:1784:34 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:1784:27:1784:27 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1784:30:1784:30 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1784:33:1784:33 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1785:13:1785:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1785:13:1785:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1785:17:1785:17 | s | | {EXTERNAL LOCATION} | & | +| main.rs:1785:17:1785:17 | s | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1785:17:1785:17 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| main.rs:1785:17:1785:29 | s.my_method() | | {EXTERNAL LOCATION} | & | +| main.rs:1785:17:1785:29 | s.my_method() | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1786:13:1786:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1786:13:1786:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1786:17:1786:35 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1786:17:1786:35 | ...::my_method(...) | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1786:34:1786:34 | s | | {EXTERNAL LOCATION} | & | +| main.rs:1786:34:1786:34 | s | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:1786:34:1786:34 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| main.rs:1787:13:1787:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1787:17:1787:34 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1790:26:1790:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1790:26:1790:30 | SelfParam | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1790:26:1790:30 | SelfParam | TRef.T0 | main.rs:1789:14:1789:23 | T | +| main.rs:1790:26:1790:30 | SelfParam | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1790:39:1792:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1790:39:1792:13 | { ... } | TRef | main.rs:1789:14:1789:23 | T | +| main.rs:1791:17:1791:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1791:17:1791:23 | &... | TRef | main.rs:1789:14:1789:23 | T | +| main.rs:1791:18:1791:21 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1791:18:1791:21 | self | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1791:18:1791:21 | self | TRef.T0 | main.rs:1789:14:1789:23 | T | +| main.rs:1791:18:1791:21 | self | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1791:18:1791:23 | self.0 | | main.rs:1789:14:1789:23 | T | +| main.rs:1794:31:1796:13 | { ... } | | main.rs:1789:14:1789:23 | T | +| main.rs:1795:17:1795:28 | ...::default(...) | | main.rs:1789:14:1789:23 | T | +| main.rs:1799:13:1799:13 | p | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1799:13:1799:13 | p | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:1799:13:1799:13 | p | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1799:17:1799:23 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1799:17:1799:23 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:1799:17:1799:23 | TupleExpr | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1799:18:1799:19 | 42 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1799:22:1799:22 | 7 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1800:13:1800:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1800:13:1800:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1800:17:1800:17 | p | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1800:17:1800:17 | p | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:1800:17:1800:17 | p | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1800:17:1800:29 | p.my_method() | | {EXTERNAL LOCATION} | & | +| main.rs:1800:17:1800:29 | p.my_method() | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1801:13:1801:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1801:13:1801:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1801:17:1801:39 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1801:17:1801:39 | ...::my_method(...) | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1801:37:1801:38 | &p | | {EXTERNAL LOCATION} | & | +| main.rs:1801:37:1801:38 | &p | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1801:37:1801:38 | &p | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:1801:37:1801:38 | &p | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1801:38:1801:38 | p | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:1801:38:1801:38 | p | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:1801:38:1801:38 | p | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:1802:13:1802:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1802:17:1802:39 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1805:26:1805:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1805:26:1805:30 | SelfParam | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1805:26:1805:30 | SelfParam | TRef.TRef | main.rs:1804:14:1804:23 | T | +| main.rs:1805:39:1807:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1805:39:1807:13 | { ... } | TRef | main.rs:1804:14:1804:23 | T | +| main.rs:1806:17:1806:21 | * ... | | {EXTERNAL LOCATION} | & | +| main.rs:1806:17:1806:21 | * ... | TRef | main.rs:1804:14:1804:23 | T | +| main.rs:1806:18:1806:21 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1806:18:1806:21 | self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1806:18:1806:21 | self | TRef.TRef | main.rs:1804:14:1804:23 | T | +| main.rs:1809:31:1811:13 | { ... } | | main.rs:1804:14:1804:23 | T | +| main.rs:1810:17:1810:28 | ...::default(...) | | main.rs:1804:14:1804:23 | T | +| main.rs:1814:13:1814:13 | r | | {EXTERNAL LOCATION} | & | +| main.rs:1814:13:1814:13 | r | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1814:17:1814:19 | &42 | | {EXTERNAL LOCATION} | & | +| main.rs:1814:17:1814:19 | &42 | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1814:18:1814:19 | 42 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1815:13:1815:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1815:13:1815:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1815:17:1815:17 | r | | {EXTERNAL LOCATION} | & | +| main.rs:1815:17:1815:17 | r | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1815:17:1815:29 | r.my_method() | | {EXTERNAL LOCATION} | & | +| main.rs:1815:17:1815:29 | r.my_method() | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1816:13:1816:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1816:13:1816:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1816:17:1816:35 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1816:17:1816:35 | ...::my_method(...) | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1816:33:1816:34 | &r | | {EXTERNAL LOCATION} | & | +| main.rs:1816:33:1816:34 | &r | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1816:33:1816:34 | &r | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1816:34:1816:34 | r | | {EXTERNAL LOCATION} | & | +| main.rs:1816:34:1816:34 | r | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1817:13:1817:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1817:17:1817:33 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1820:26:1820:30 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:1820:26:1820:30 | SelfParam | TRef | {EXTERNAL LOCATION} | *mut | +| main.rs:1820:26:1820:30 | SelfParam | TRef.TPtrMut | main.rs:1819:14:1819:23 | T | +| main.rs:1820:39:1822:13 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1820:39:1822:13 | { ... } | TRef | main.rs:1819:14:1819:23 | T | +| main.rs:1821:17:1821:34 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1821:17:1821:34 | { ... } | TRef | main.rs:1819:14:1819:23 | T | +| main.rs:1821:26:1821:32 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1821:26:1821:32 | &... | TRef | main.rs:1819:14:1819:23 | T | +| main.rs:1821:27:1821:32 | * ... | | main.rs:1819:14:1819:23 | T | +| main.rs:1821:28:1821:32 | * ... | | {EXTERNAL LOCATION} | *mut | +| main.rs:1821:28:1821:32 | * ... | TPtrMut | main.rs:1819:14:1819:23 | T | +| main.rs:1821:29:1821:32 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1821:29:1821:32 | self | TRef | {EXTERNAL LOCATION} | *mut | +| main.rs:1821:29:1821:32 | self | TRef.TPtrMut | main.rs:1819:14:1819:23 | T | +| main.rs:1824:31:1826:13 | { ... } | | main.rs:1819:14:1819:23 | T | +| main.rs:1825:17:1825:28 | ...::default(...) | | main.rs:1819:14:1819:23 | T | +| main.rs:1829:17:1829:17 | v | | {EXTERNAL LOCATION} | i32 | +| main.rs:1829:21:1829:22 | 42 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1830:13:1830:13 | p | | {EXTERNAL LOCATION} | *mut | +| main.rs:1830:13:1830:13 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1830:27:1830:32 | &mut v | | {EXTERNAL LOCATION} | &mut | +| main.rs:1830:27:1830:32 | &mut v | TRefMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1830:32:1830:32 | v | | {EXTERNAL LOCATION} | i32 | +| main.rs:1831:13:1831:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1831:13:1831:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1831:17:1831:40 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1831:17:1831:40 | { ... } | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1831:26:1831:26 | p | | {EXTERNAL LOCATION} | *mut | +| main.rs:1831:26:1831:26 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1831:26:1831:38 | p.my_method() | | {EXTERNAL LOCATION} | & | +| main.rs:1831:26:1831:38 | p.my_method() | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1832:13:1832:13 | x | | {EXTERNAL LOCATION} | & | +| main.rs:1832:13:1832:13 | x | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1832:17:1832:50 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:1832:17:1832:50 | { ... } | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1832:26:1832:48 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | +| main.rs:1832:26:1832:48 | ...::my_method(...) | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:1832:46:1832:47 | &p | | {EXTERNAL LOCATION} | & | +| main.rs:1832:46:1832:47 | &p | TRef | {EXTERNAL LOCATION} | *mut | +| main.rs:1832:46:1832:47 | &p | TRef.TPtrMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1832:47:1832:47 | p | | {EXTERNAL LOCATION} | *mut | +| main.rs:1832:47:1832:47 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | +| main.rs:1833:13:1833:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1833:17:1833:37 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:1839:16:1851:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1840:13:1840:13 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:17:1840:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:17:1840:29 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:25:1840:29 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:13:1841:13 | y | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:17:1841:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:17:1841:29 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:25:1841:29 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1843:17:1843:17 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1844:13:1844:16 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:1844:20:1844:21 | 34 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1844:20:1844:27 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1844:26:1844:27 | 33 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1845:9:1849:9 | if cond {...} else {...} | | {EXTERNAL LOCATION} | () | +| main.rs:1845:12:1845:15 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:1845:17:1847:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1846:17:1846:17 | z | | {EXTERNAL LOCATION} | () | +| main.rs:1846:21:1846:27 | (...) | | {EXTERNAL LOCATION} | () | +| main.rs:1846:22:1846:22 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1846:22:1846:26 | ... = ... | | {EXTERNAL LOCATION} | () | +| main.rs:1846:26:1846:26 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1847:16:1849:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1848:13:1848:13 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1848:13:1848:17 | ... = ... | | {EXTERNAL LOCATION} | () | +| main.rs:1848:17:1848:17 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1850:9:1850:9 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1864:30:1866:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1865:13:1865:31 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1865:23:1865:23 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1865:29:1865:29 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1872:16:1872:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1872:22:1872:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1872:41:1877:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1873:13:1876:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1874:20:1874:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1874:20:1874:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1874:20:1874:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1874:29:1874:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1874:29:1874:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1875:20:1875:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1875:20:1875:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1875:20:1875:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1875:29:1875:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1875:29:1875:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1882:23:1882:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1882:23:1882:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1882:34:1882:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1882:45:1885:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1883:13:1883:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1883:13:1883:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1883:13:1883:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1883:13:1883:27 | ... += ... | | {EXTERNAL LOCATION} | () | +| main.rs:1883:23:1883:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1883:23:1883:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1884:13:1884:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1884:13:1884:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1884:13:1884:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1884:13:1884:27 | ... += ... | | {EXTERNAL LOCATION} | () | +| main.rs:1884:23:1884:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1884:23:1884:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1890:16:1890:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1890:22:1890:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1890:41:1895:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1891:13:1894:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1892:20:1892:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1892:20:1892:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1892:20:1892:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1892:29:1892:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1892:29:1892:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1893:20:1893:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1893:20:1893:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1893:20:1893:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1893:29:1893:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1893:29:1893:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1900:23:1900:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1900:23:1900:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1900:34:1900:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1900:45:1903:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1901:13:1901:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1901:13:1901:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1901:13:1901:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1901:13:1901:27 | ... -= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1901:23:1901:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1901:23:1901:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1902:13:1902:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1902:13:1902:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1902:13:1902:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1902:13:1902:27 | ... -= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1902:23:1902:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1902:23:1902:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1908:16:1908:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1908:22:1908:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1908:41:1913:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1909:13:1912:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1910:20:1910:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1910:20:1910:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1910:20:1910:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1910:29:1910:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1910:29:1910:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1911:20:1911:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1911:20:1911:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1911:20:1911:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1911:29:1911:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1911:29:1911:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1917:23:1917:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1917:23:1917:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1917:34:1917:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1917:45:1920:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1918:13:1918:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1918:13:1918:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1918:13:1918:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1918:13:1918:27 | ... *= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1918:23:1918:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1918:23:1918:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1919:13:1919:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1919:13:1919:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1919:13:1919:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1919:13:1919:27 | ... *= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1919:23:1919:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1919:23:1919:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1925:16:1925:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1925:22:1925:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1925:41:1930:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1926:13:1929:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1927:20:1927:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1927:20:1927:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1927:20:1927:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1927:29:1927:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1927:29:1927:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1928:20:1928:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1928:20:1928:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1928:20:1928:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1928:29:1928:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1928:29:1928:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1934:23:1934:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1934:23:1934:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1934:34:1934:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1934:45:1937:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1935:13:1935:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1935:13:1935:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1935:13:1935:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1935:13:1935:27 | ... /= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1935:23:1935:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1935:23:1935:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1936:13:1936:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1936:13:1936:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1936:13:1936:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1936:13:1936:27 | ... /= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1936:23:1936:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1936:23:1936:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1942:16:1942:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1942:22:1942:24 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1942:41:1947:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1943:13:1946:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1944:20:1944:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1944:20:1944:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1944:20:1944:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1944:29:1944:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1944:29:1944:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1945:20:1945:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1945:20:1945:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1945:20:1945:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1945:29:1945:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1945:29:1945:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1951:23:1951:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1951:23:1951:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1951:34:1951:36 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1951:45:1954:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1952:13:1952:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1952:13:1952:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1952:13:1952:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1952:13:1952:27 | ... %= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1952:23:1952:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1952:23:1952:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1953:13:1953:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1953:13:1953:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1953:13:1953:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1953:13:1953:27 | ... %= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1953:23:1953:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1953:23:1953:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1959:19:1959:22 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1959:25:1959:27 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1959:44:1964:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1960:13:1963:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1961:20:1961:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1961:20:1961:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1961:20:1961:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1961:29:1961:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1961:29:1961:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1962:20:1962:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1962:20:1962:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1962:20:1962:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1962:29:1962:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1962:29:1962:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1968:26:1968:34 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1968:26:1968:34 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1968:37:1968:39 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1968:48:1971:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1969:13:1969:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1969:13:1969:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1969:13:1969:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1969:13:1969:27 | ... &= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1969:23:1969:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1969:23:1969:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1970:13:1970:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1970:13:1970:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1970:13:1970:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1970:13:1970:27 | ... &= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1970:23:1970:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1970:23:1970:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1976:18:1976:21 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1976:24:1976:26 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1976:43:1981:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1977:13:1980:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1978:20:1978:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1978:20:1978:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1978:20:1978:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1978:29:1978:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1978:29:1978:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1979:20:1979:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1979:20:1979:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1979:20:1979:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1979:29:1979:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1979:29:1979:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1985:25:1985:33 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:1985:25:1985:33 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1985:36:1985:38 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1985:47:1988:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1986:13:1986:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1986:13:1986:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1986:13:1986:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1986:13:1986:27 | ... \|= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1986:23:1986:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1986:23:1986:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1987:13:1987:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:1987:13:1987:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1987:13:1987:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1987:13:1987:27 | ... \|= ... | | {EXTERNAL LOCATION} | () | +| main.rs:1987:23:1987:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1987:23:1987:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1993:19:1993:22 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1993:25:1993:27 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1993:44:1998:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1994:13:1997:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1995:20:1995:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1995:20:1995:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1995:20:1995:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1995:29:1995:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1995:29:1995:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1996:20:1996:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1996:20:1996:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1996:20:1996:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1996:29:1996:31 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:1996:29:1996:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2002:26:2002:34 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2002:26:2002:34 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2002:37:2002:39 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2002:48:2005:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2003:13:2003:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2003:13:2003:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2003:13:2003:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2003:13:2003:27 | ... ^= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2003:23:2003:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2003:23:2003:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2004:13:2004:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2004:13:2004:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2004:13:2004:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2004:13:2004:27 | ... ^= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2004:23:2004:25 | rhs | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2004:23:2004:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2010:16:2010:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2010:22:2010:24 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2010:40:2015:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2011:13:2014:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2012:20:2012:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2012:20:2012:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2012:20:2012:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2012:30:2012:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2013:20:2013:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2013:20:2013:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2013:20:2013:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2013:30:2013:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2019:23:2019:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2019:23:2019:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2019:34:2019:36 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2019:44:2022:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2020:13:2020:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2020:13:2020:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2020:13:2020:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2020:13:2020:26 | ... <<= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2020:24:2020:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2021:13:2021:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2021:13:2021:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2021:13:2021:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2021:13:2021:26 | ... <<= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2021:24:2021:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2027:16:2027:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2027:22:2027:24 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2027:40:2032:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2028:13:2031:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2029:20:2029:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2029:20:2029:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2029:20:2029:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2029:30:2029:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2030:20:2030:23 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2030:20:2030:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2030:20:2030:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2030:30:2030:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2036:23:2036:31 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2036:23:2036:31 | SelfParam | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2036:34:2036:36 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2036:44:2039:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2037:13:2037:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2037:13:2037:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2037:13:2037:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2037:13:2037:26 | ... >>= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2037:24:2037:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2038:13:2038:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2038:13:2038:16 | self | TRefMut | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2038:13:2038:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2038:13:2038:26 | ... >>= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2038:24:2038:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:2044:16:2044:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2044:30:2049:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2045:13:2048:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2046:20:2046:26 | - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2046:21:2046:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2046:21:2046:26 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2047:20:2047:26 | - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2047:21:2047:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2047:21:2047:26 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2054:16:2054:19 | SelfParam | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2054:30:2059:9 | { ... } | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2055:13:2058:13 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2056:20:2056:26 | ! ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2056:21:2056:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2056:21:2056:26 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2057:20:2057:26 | ! ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2057:21:2057:24 | self | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2057:21:2057:26 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2063:15:2063:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2063:15:2063:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2063:22:2063:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2063:22:2063:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2063:44:2065:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:13:2064:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2064:13:2064:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2064:13:2064:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2064:13:2064:29 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:13:2064:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:23:2064:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2064:23:2064:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2064:23:2064:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2064:34:2064:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2064:34:2064:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2064:34:2064:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2064:34:2064:50 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2064:44:2064:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2064:44:2064:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2064:44:2064:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2067:15:2067:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2067:15:2067:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2067:22:2067:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2067:22:2067:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2067:44:2069:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:13:2068:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2068:13:2068:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2068:13:2068:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2068:13:2068:29 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:13:2068:50 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:23:2068:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2068:23:2068:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2068:23:2068:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2068:34:2068:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2068:34:2068:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2068:34:2068:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2068:34:2068:50 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2068:44:2068:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2068:44:2068:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2068:44:2068:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2073:24:2073:28 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2073:24:2073:28 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2073:31:2073:35 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2073:31:2073:35 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2073:75:2075:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2073:75:2075:9 | { ... } | T | {EXTERNAL LOCATION} | Ordering | +| main.rs:2074:13:2074:29 | (...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:13:2074:63 | ... .partial_cmp(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2074:13:2074:63 | ... .partial_cmp(...) | T | {EXTERNAL LOCATION} | Ordering | +| main.rs:2074:14:2074:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2074:14:2074:17 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2074:14:2074:19 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:14:2074:28 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:23:2074:26 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2074:23:2074:26 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2074:23:2074:28 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:43:2074:62 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2074:43:2074:62 | &... | TRef | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:44:2074:62 | (...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:45:2074:49 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2074:45:2074:49 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2074:45:2074:51 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:45:2074:61 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2074:55:2074:59 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2074:55:2074:59 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2074:55:2074:61 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2077:15:2077:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2077:15:2077:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2077:22:2077:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2077:22:2077:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2077:44:2079:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:13:2078:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2078:13:2078:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2078:13:2078:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2078:13:2078:28 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:13:2078:48 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:22:2078:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2078:22:2078:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2078:22:2078:28 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2078:33:2078:36 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2078:33:2078:36 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2078:33:2078:38 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2078:33:2078:48 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2078:42:2078:46 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2078:42:2078:46 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2078:42:2078:48 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2081:15:2081:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2081:15:2081:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2081:22:2081:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2081:22:2081:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2081:44:2083:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:13:2082:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2082:13:2082:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2082:13:2082:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2082:13:2082:29 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:13:2082:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:23:2082:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2082:23:2082:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2082:23:2082:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2082:34:2082:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2082:34:2082:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2082:34:2082:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2082:34:2082:50 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2082:44:2082:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2082:44:2082:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2082:44:2082:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2085:15:2085:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2085:15:2085:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2085:22:2085:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2085:22:2085:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2085:44:2087:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:13:2086:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2086:13:2086:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2086:13:2086:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2086:13:2086:28 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:13:2086:48 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:22:2086:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2086:22:2086:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2086:22:2086:28 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2086:33:2086:36 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2086:33:2086:36 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2086:33:2086:38 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2086:33:2086:48 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2086:42:2086:46 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2086:42:2086:46 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2086:42:2086:48 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2089:15:2089:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2089:15:2089:19 | SelfParam | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2089:22:2089:26 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2089:22:2089:26 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2089:44:2091:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:13:2090:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2090:13:2090:16 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2090:13:2090:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2090:13:2090:29 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:13:2090:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:23:2090:27 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2090:23:2090:27 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2090:23:2090:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2090:34:2090:37 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2090:34:2090:37 | self | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2090:34:2090:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2090:34:2090:50 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2090:44:2090:48 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2090:44:2090:48 | other | TRef | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2090:44:2090:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2094:26:2094:26 | a | | main.rs:2094:18:2094:23 | T | +| main.rs:2094:32:2094:32 | b | | main.rs:2094:18:2094:23 | T | +| main.rs:2095:9:2095:9 | a | | main.rs:2094:18:2094:23 | T | +| main.rs:2095:13:2095:13 | b | | main.rs:2094:18:2094:23 | T | +| main.rs:2098:16:2229:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2102:13:2102:18 | i64_eq | | {EXTERNAL LOCATION} | bool | +| main.rs:2102:22:2102:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2102:23:2102:26 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2102:23:2102:34 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2102:31:2102:34 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2103:13:2103:18 | i64_ne | | {EXTERNAL LOCATION} | bool | +| main.rs:2103:22:2103:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2103:23:2103:26 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2103:23:2103:34 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2103:31:2103:34 | 4i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2104:13:2104:18 | i64_lt | | {EXTERNAL LOCATION} | bool | +| main.rs:2104:22:2104:34 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2104:23:2104:26 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2104:23:2104:33 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2104:30:2104:33 | 6i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2105:13:2105:18 | i64_le | | {EXTERNAL LOCATION} | bool | +| main.rs:2105:22:2105:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2105:23:2105:26 | 7i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2105:23:2105:34 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2105:31:2105:34 | 8i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2106:13:2106:18 | i64_gt | | {EXTERNAL LOCATION} | bool | +| main.rs:2106:22:2106:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2106:23:2106:26 | 9i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2106:23:2106:34 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2106:30:2106:34 | 10i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2107:13:2107:18 | i64_ge | | {EXTERNAL LOCATION} | bool | +| main.rs:2107:22:2107:37 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2107:23:2107:27 | 11i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2107:23:2107:36 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2107:32:2107:36 | 12i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:13:2110:19 | i64_add | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:23:2110:27 | 13i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:23:2110:35 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:31:2110:35 | 14i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2111:13:2111:19 | i64_sub | | {EXTERNAL LOCATION} | i64 | +| main.rs:2111:23:2111:27 | 15i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2111:23:2111:35 | ... - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2111:31:2111:35 | 16i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2112:13:2112:19 | i64_mul | | {EXTERNAL LOCATION} | i64 | +| main.rs:2112:23:2112:27 | 17i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2112:23:2112:35 | ... * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2112:31:2112:35 | 18i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2113:13:2113:19 | i64_div | | {EXTERNAL LOCATION} | i64 | +| main.rs:2113:23:2113:27 | 19i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2113:23:2113:35 | ... / ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2113:31:2113:35 | 20i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2114:13:2114:19 | i64_rem | | {EXTERNAL LOCATION} | i64 | +| main.rs:2114:23:2114:27 | 21i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2114:23:2114:35 | ... % ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2114:31:2114:35 | 22i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2115:39:2115:42 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2115:45:2115:48 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2118:17:2118:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2118:34:2118:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2119:9:2119:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2119:9:2119:31 | ... += ... | | {EXTERNAL LOCATION} | () | +| main.rs:2119:27:2119:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2121:17:2121:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2121:34:2121:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2122:9:2122:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2122:9:2122:31 | ... -= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2122:27:2122:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2124:17:2124:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2124:34:2124:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2125:9:2125:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2125:9:2125:31 | ... *= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2125:27:2125:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2127:17:2127:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2127:34:2127:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2128:9:2128:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2128:9:2128:31 | ... /= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2128:27:2128:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2130:17:2130:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2130:34:2130:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2131:9:2131:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2131:9:2131:31 | ... %= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2131:27:2131:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2134:13:2134:22 | i64_bitand | | {EXTERNAL LOCATION} | i64 | +| main.rs:2134:26:2134:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2134:26:2134:38 | ... & ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2134:34:2134:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2135:13:2135:21 | i64_bitor | | {EXTERNAL LOCATION} | i64 | +| main.rs:2135:25:2135:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2135:25:2135:37 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2135:33:2135:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2136:13:2136:22 | i64_bitxor | | {EXTERNAL LOCATION} | i64 | +| main.rs:2136:26:2136:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2136:26:2136:38 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2136:34:2136:38 | 38i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2137:13:2137:19 | i64_shl | | {EXTERNAL LOCATION} | i64 | +| main.rs:2137:23:2137:27 | 39i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2137:23:2137:36 | ... << ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2137:32:2137:36 | 40i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2138:13:2138:19 | i64_shr | | {EXTERNAL LOCATION} | i64 | +| main.rs:2138:23:2138:27 | 41i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2138:23:2138:36 | ... >> ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2138:32:2138:36 | 42i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2141:17:2141:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2141:37:2141:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2142:9:2142:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2142:9:2142:34 | ... &= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2142:30:2142:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2144:17:2144:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2144:36:2144:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2145:9:2145:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2145:9:2145:33 | ... \|= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2145:29:2145:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2147:17:2147:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2147:37:2147:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2148:9:2148:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2148:9:2148:34 | ... ^= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2148:30:2148:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2150:17:2150:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2150:34:2150:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2151:9:2151:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2151:9:2151:32 | ... <<= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2151:28:2151:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2153:17:2153:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2153:34:2153:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2154:9:2154:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:2154:9:2154:32 | ... >>= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2154:28:2154:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2156:13:2156:19 | i64_neg | | {EXTERNAL LOCATION} | i64 | +| main.rs:2156:23:2156:28 | - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2156:24:2156:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2157:13:2157:19 | i64_not | | {EXTERNAL LOCATION} | i64 | +| main.rs:2157:23:2157:28 | ! ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2157:24:2157:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2160:13:2160:14 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2160:18:2160:36 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2160:28:2160:28 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2160:34:2160:34 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2161:13:2161:14 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2161:18:2161:36 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2161:28:2161:28 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2161:34:2161:34 | 4 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2164:13:2164:19 | vec2_eq | | {EXTERNAL LOCATION} | bool | +| main.rs:2164:23:2164:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2164:23:2164:30 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2164:29:2164:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2165:13:2165:19 | vec2_ne | | {EXTERNAL LOCATION} | bool | +| main.rs:2165:23:2165:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2165:23:2165:30 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2165:29:2165:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2166:13:2166:19 | vec2_lt | | {EXTERNAL LOCATION} | bool | +| main.rs:2166:23:2166:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2166:23:2166:29 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2166:28:2166:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2167:13:2167:19 | vec2_le | | {EXTERNAL LOCATION} | bool | +| main.rs:2167:23:2167:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2167:23:2167:30 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2167:29:2167:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2168:13:2168:19 | vec2_gt | | {EXTERNAL LOCATION} | bool | +| main.rs:2168:23:2168:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2168:23:2168:29 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2168:28:2168:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2169:13:2169:19 | vec2_ge | | {EXTERNAL LOCATION} | bool | +| main.rs:2169:23:2169:24 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2169:23:2169:30 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2169:29:2169:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2172:13:2172:20 | vec2_add | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2172:24:2172:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2172:24:2172:30 | ... + ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2172:29:2172:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2173:13:2173:20 | vec2_sub | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2173:24:2173:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2173:24:2173:30 | ... - ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2173:29:2173:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2174:13:2174:20 | vec2_mul | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2174:24:2174:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2174:24:2174:30 | ... * ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2174:29:2174:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2175:13:2175:20 | vec2_div | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2175:24:2175:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2175:24:2175:30 | ... / ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2175:29:2175:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2176:13:2176:20 | vec2_rem | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2176:24:2176:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2176:24:2176:30 | ... % ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2176:29:2176:30 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2179:17:2179:31 | vec2_add_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2179:35:2179:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2180:9:2180:23 | vec2_add_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2180:9:2180:29 | ... += ... | | {EXTERNAL LOCATION} | () | +| main.rs:2180:28:2180:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2182:17:2182:31 | vec2_sub_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2182:35:2182:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2183:9:2183:23 | vec2_sub_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2183:9:2183:29 | ... -= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2183:28:2183:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2185:17:2185:31 | vec2_mul_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2185:35:2185:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2186:9:2186:23 | vec2_mul_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2186:9:2186:29 | ... *= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2186:28:2186:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2188:17:2188:31 | vec2_div_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2188:35:2188:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2189:9:2189:23 | vec2_div_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2189:9:2189:29 | ... /= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2189:28:2189:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2191:17:2191:31 | vec2_rem_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2191:35:2191:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2192:9:2192:23 | vec2_rem_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2192:9:2192:29 | ... %= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2192:28:2192:29 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2195:13:2195:23 | vec2_bitand | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2195:27:2195:28 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2195:27:2195:33 | ... & ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2195:32:2195:33 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2196:13:2196:22 | vec2_bitor | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2196:26:2196:27 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2196:26:2196:32 | ... \| ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2196:31:2196:32 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2197:13:2197:23 | vec2_bitxor | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2197:27:2197:28 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2197:27:2197:33 | ... ^ ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2197:32:2197:33 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2198:13:2198:20 | vec2_shl | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2198:24:2198:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2198:24:2198:33 | ... << ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2198:30:2198:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2199:13:2199:20 | vec2_shr | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2199:24:2199:25 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2199:24:2199:33 | ... >> ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2199:30:2199:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2202:17:2202:34 | vec2_bitand_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2202:38:2202:39 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2203:9:2203:26 | vec2_bitand_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2203:9:2203:32 | ... &= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2203:31:2203:32 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2205:17:2205:33 | vec2_bitor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2205:37:2205:38 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2206:9:2206:25 | vec2_bitor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2206:9:2206:31 | ... \|= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2206:30:2206:31 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2208:17:2208:34 | vec2_bitxor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2208:38:2208:39 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2209:9:2209:26 | vec2_bitxor_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2209:9:2209:32 | ... ^= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2209:31:2209:32 | v2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2211:17:2211:31 | vec2_shl_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2211:35:2211:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2212:9:2212:23 | vec2_shl_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2212:9:2212:32 | ... <<= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2212:29:2212:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2214:17:2214:31 | vec2_shr_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2214:35:2214:36 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2215:9:2215:23 | vec2_shr_assign | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2215:9:2215:32 | ... >>= ... | | {EXTERNAL LOCATION} | () | +| main.rs:2215:29:2215:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2218:13:2218:20 | vec2_neg | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2218:24:2218:26 | - ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2218:25:2218:26 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2219:13:2219:20 | vec2_not | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2219:24:2219:26 | ! ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2219:25:2219:26 | v1 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2222:13:2222:24 | default_vec2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2222:28:2222:45 | ...::default(...) | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2223:13:2223:26 | vec2_zero_plus | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2223:30:2223:48 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2223:30:2223:63 | ... + ... | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2223:40:2223:40 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2223:46:2223:46 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2223:52:2223:63 | default_vec2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2227:13:2227:24 | default_vec2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2227:28:2227:45 | ...::default(...) | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2228:13:2228:26 | vec2_zero_plus | | {EXTERNAL LOCATION} | bool | +| main.rs:2228:30:2228:48 | Vec2 {...} | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2228:30:2228:64 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2228:40:2228:40 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2228:46:2228:46 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2228:53:2228:64 | default_vec2 | | main.rs:1857:5:1862:5 | Vec2 | +| main.rs:2238:18:2238:21 | SelfParam | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2238:24:2238:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2241:25:2243:5 | { ... } | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2242:9:2242:10 | S1 | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2245:41:2247:5 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2245:41:2247:5 | { ... } | dyn(Output) | main.rs:2235:5:2235:14 | S1 | +| main.rs:2246:9:2246:20 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2246:9:2246:20 | { ... } | dyn(Output) | main.rs:2235:5:2235:14 | S1 | +| main.rs:2246:17:2246:18 | S1 | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2249:41:2251:5 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2249:41:2251:5 | { ... } | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:2250:9:2250:16 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2250:9:2250:16 | { ... } | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:2259:13:2259:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | +| main.rs:2259:13:2259:42 | SelfParam | Ptr | {EXTERNAL LOCATION} | &mut | +| main.rs:2259:13:2259:42 | SelfParam | Ptr.TRefMut | main.rs:2253:5:2253:14 | S2 | +| main.rs:2260:13:2260:15 | _cx | | {EXTERNAL LOCATION} | &mut | +| main.rs:2260:13:2260:15 | _cx | TRefMut | {EXTERNAL LOCATION} | Context | +| main.rs:2261:44:2263:9 | { ... } | | {EXTERNAL LOCATION} | Poll | +| main.rs:2261:44:2263:9 | { ... } | T | main.rs:2235:5:2235:14 | S1 | +| main.rs:2262:13:2262:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll | +| main.rs:2262:13:2262:38 | ...::Ready(...) | T | main.rs:2235:5:2235:14 | S1 | +| main.rs:2262:36:2262:37 | S1 | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2266:41:2268:5 | { ... } | | main.rs:2253:5:2253:14 | S2 | +| main.rs:2267:9:2267:10 | S2 | | main.rs:2253:5:2253:14 | S2 | +| main.rs:2270:22:2278:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2271:9:2271:12 | f1(...) | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2271:9:2271:12 | f1(...) | dyn(Output) | main.rs:2235:5:2235:14 | S1 | +| main.rs:2271:9:2271:18 | await ... | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2271:9:2271:22 | ... .f() | | {EXTERNAL LOCATION} | () | +| main.rs:2272:9:2272:12 | f2(...) | | main.rs:2245:16:2245:39 | impl ... | +| main.rs:2272:9:2272:18 | await ... | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2272:9:2272:22 | ... .f() | | {EXTERNAL LOCATION} | () | +| main.rs:2273:9:2273:12 | f3(...) | | main.rs:2249:16:2249:39 | impl ... | +| main.rs:2273:9:2273:18 | await ... | | {EXTERNAL LOCATION} | () | +| main.rs:2274:9:2274:12 | f4(...) | | main.rs:2266:16:2266:39 | impl ... | +| main.rs:2274:9:2274:18 | await ... | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2274:9:2274:22 | ... .f() | | {EXTERNAL LOCATION} | () | +| main.rs:2275:9:2275:10 | S2 | | main.rs:2253:5:2253:14 | S2 | +| main.rs:2275:9:2275:16 | await S2 | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2275:9:2275:20 | ... .f() | | {EXTERNAL LOCATION} | () | +| main.rs:2276:13:2276:13 | b | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2276:13:2276:13 | b | dyn(Output) | main.rs:2235:5:2235:14 | S1 | +| main.rs:2276:17:2276:28 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2276:17:2276:28 | { ... } | dyn(Output) | main.rs:2235:5:2235:14 | S1 | +| main.rs:2276:25:2276:26 | S1 | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2277:9:2277:9 | b | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2277:9:2277:9 | b | dyn(Output) | main.rs:2235:5:2235:14 | S1 | +| main.rs:2277:9:2277:15 | await b | | main.rs:2235:5:2235:14 | S1 | +| main.rs:2277:9:2277:19 | ... .f() | | {EXTERNAL LOCATION} | () | +| main.rs:2288:15:2288:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2288:15:2288:19 | SelfParam | TRef | main.rs:2287:5:2289:5 | Self [trait Trait1] | +| main.rs:2288:22:2288:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2292:15:2292:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2292:15:2292:19 | SelfParam | TRef | main.rs:2291:5:2293:5 | Self [trait Trait2] | +| main.rs:2292:22:2292:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2296:15:2296:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2296:15:2296:19 | SelfParam | TRef | main.rs:2282:5:2283:14 | S1 | +| main.rs:2296:22:2296:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2300:15:2300:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2300:15:2300:19 | SelfParam | TRef | main.rs:2282:5:2283:14 | S1 | +| main.rs:2300:22:2300:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2303:37:2305:5 | { ... } | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2304:9:2304:10 | S1 | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2308:18:2308:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2308:18:2308:22 | SelfParam | TRef | main.rs:2307:5:2309:5 | Self [trait MyTrait] | +| main.rs:2312:18:2312:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2312:18:2312:22 | SelfParam | TRef | main.rs:2282:5:2283:14 | S1 | +| main.rs:2312:31:2314:9 | { ... } | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2313:13:2313:14 | S2 | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2318:18:2318:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2318:18:2318:22 | SelfParam | TRef | main.rs:2285:5:2285:22 | S3 | +| main.rs:2318:18:2318:22 | SelfParam | TRef.T3 | main.rs:2317:10:2317:17 | T | +| main.rs:2318:30:2321:9 | { ... } | | main.rs:2317:10:2317:17 | T | +| main.rs:2319:17:2319:21 | S3(...) | | {EXTERNAL LOCATION} | & | +| main.rs:2319:17:2319:21 | S3(...) | | main.rs:2285:5:2285:22 | S3 | +| main.rs:2319:17:2319:21 | S3(...) | TRef | main.rs:2285:5:2285:22 | S3 | +| main.rs:2319:17:2319:21 | S3(...) | TRef.T3 | main.rs:2317:10:2317:17 | T | +| main.rs:2319:25:2319:28 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2319:25:2319:28 | self | TRef | main.rs:2285:5:2285:22 | S3 | +| main.rs:2319:25:2319:28 | self | TRef.T3 | main.rs:2317:10:2317:17 | T | +| main.rs:2320:13:2320:21 | t.clone() | | main.rs:2317:10:2317:17 | T | +| main.rs:2324:45:2326:5 | { ... } | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2325:9:2325:10 | S1 | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2328:41:2328:41 | t | | main.rs:2328:26:2328:38 | B | +| main.rs:2328:52:2330:5 | { ... } | | main.rs:2328:23:2328:23 | A | +| main.rs:2329:9:2329:9 | t | | main.rs:2328:26:2328:38 | B | +| main.rs:2329:9:2329:17 | t.get_a() | | main.rs:2328:23:2328:23 | A | +| main.rs:2332:34:2332:34 | x | | main.rs:2332:24:2332:31 | T | +| main.rs:2332:59:2334:5 | { ... } | | main.rs:2332:43:2332:57 | impl ... | +| main.rs:2332:59:2334:5 | { ... } | impl(T) | main.rs:2332:24:2332:31 | T | +| main.rs:2333:9:2333:13 | S3(...) | | main.rs:2285:5:2285:22 | S3 | +| main.rs:2333:9:2333:13 | S3(...) | | main.rs:2332:43:2332:57 | impl ... | +| main.rs:2333:9:2333:13 | S3(...) | T3 | main.rs:2332:24:2332:31 | T | +| main.rs:2333:9:2333:13 | S3(...) | impl(T) | main.rs:2332:24:2332:31 | T | +| main.rs:2333:12:2333:12 | x | | main.rs:2332:24:2332:31 | T | +| main.rs:2336:34:2336:34 | x | | main.rs:2336:24:2336:31 | T | +| main.rs:2336:67:2338:5 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2336:67:2338:5 | { ... } | T | main.rs:2336:50:2336:64 | impl ... | +| main.rs:2336:67:2338:5 | { ... } | T.impl(T) | main.rs:2336:24:2336:31 | T | +| main.rs:2337:9:2337:19 | Some(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2337:9:2337:19 | Some(...) | T | main.rs:2285:5:2285:22 | S3 | +| main.rs:2337:9:2337:19 | Some(...) | T | main.rs:2336:50:2336:64 | impl ... | +| main.rs:2337:9:2337:19 | Some(...) | T.T3 | main.rs:2336:24:2336:31 | T | +| main.rs:2337:9:2337:19 | Some(...) | T.impl(T) | main.rs:2336:24:2336:31 | T | +| main.rs:2337:14:2337:18 | S3(...) | | main.rs:2285:5:2285:22 | S3 | +| main.rs:2337:14:2337:18 | S3(...) | T3 | main.rs:2336:24:2336:31 | T | +| main.rs:2337:17:2337:17 | x | | main.rs:2336:24:2336:31 | T | +| main.rs:2340:34:2340:34 | x | | main.rs:2340:24:2340:31 | T | +| main.rs:2340:78:2342:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2340:78:2342:5 | { ... } | T0 | main.rs:2340:44:2340:58 | impl ... | +| main.rs:2340:78:2342:5 | { ... } | T0.impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2340:78:2342:5 | { ... } | T1 | main.rs:2340:61:2340:75 | impl ... | +| main.rs:2340:78:2342:5 | { ... } | T1.impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2341:9:2341:30 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2341:9:2341:30 | TupleExpr | T0 | main.rs:2285:5:2285:22 | S3 | +| main.rs:2341:9:2341:30 | TupleExpr | T0 | main.rs:2340:44:2340:58 | impl ... | +| main.rs:2341:9:2341:30 | TupleExpr | T0.T3 | main.rs:2340:24:2340:31 | T | +| main.rs:2341:9:2341:30 | TupleExpr | T0.impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2341:9:2341:30 | TupleExpr | T1 | main.rs:2285:5:2285:22 | S3 | +| main.rs:2341:9:2341:30 | TupleExpr | T1 | main.rs:2340:61:2340:75 | impl ... | +| main.rs:2341:9:2341:30 | TupleExpr | T1.T3 | main.rs:2340:24:2340:31 | T | +| main.rs:2341:9:2341:30 | TupleExpr | T1.impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2341:10:2341:22 | S3(...) | | main.rs:2285:5:2285:22 | S3 | +| main.rs:2341:10:2341:22 | S3(...) | | main.rs:2340:44:2340:58 | impl ... | +| main.rs:2341:10:2341:22 | S3(...) | T3 | main.rs:2340:24:2340:31 | T | +| main.rs:2341:10:2341:22 | S3(...) | impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2341:13:2341:13 | x | | main.rs:2340:24:2340:31 | T | +| main.rs:2341:13:2341:21 | x.clone() | | main.rs:2340:24:2340:31 | T | +| main.rs:2341:25:2341:29 | S3(...) | | main.rs:2285:5:2285:22 | S3 | +| main.rs:2341:25:2341:29 | S3(...) | | main.rs:2340:61:2340:75 | impl ... | +| main.rs:2341:25:2341:29 | S3(...) | T3 | main.rs:2340:24:2340:31 | T | +| main.rs:2341:25:2341:29 | S3(...) | impl(T) | main.rs:2340:24:2340:31 | T | +| main.rs:2341:28:2341:28 | x | | main.rs:2340:24:2340:31 | T | +| main.rs:2344:26:2344:26 | t | | main.rs:2344:29:2344:43 | impl ... | +| main.rs:2344:51:2346:5 | { ... } | | main.rs:2344:23:2344:23 | A | +| main.rs:2345:9:2345:9 | t | | main.rs:2344:29:2344:43 | impl ... | +| main.rs:2345:9:2345:17 | t.get_a() | | main.rs:2344:23:2344:23 | A | +| main.rs:2348:16:2362:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2349:13:2349:13 | x | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2349:17:2349:20 | f1(...) | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2350:9:2350:9 | x | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2350:9:2350:14 | x.f1() | | {EXTERNAL LOCATION} | () | +| main.rs:2351:9:2351:9 | x | | main.rs:2303:16:2303:35 | impl ... + ... | +| main.rs:2351:9:2351:14 | x.f2() | | {EXTERNAL LOCATION} | () | +| main.rs:2352:13:2352:13 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2352:17:2352:32 | get_a_my_trait(...) | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2353:13:2353:13 | b | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2353:17:2353:33 | uses_my_trait1(...) | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2353:32:2353:32 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2354:13:2354:13 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2354:17:2354:32 | get_a_my_trait(...) | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2355:13:2355:13 | c | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2355:17:2355:33 | uses_my_trait2(...) | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2355:32:2355:32 | a | | main.rs:2324:28:2324:43 | impl ... | +| main.rs:2356:13:2356:13 | d | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2356:17:2356:34 | uses_my_trait2(...) | | main.rs:2284:5:2284:14 | S2 | +| main.rs:2356:32:2356:33 | S1 | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2357:13:2357:13 | e | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2357:17:2357:35 | get_a_my_trait2(...) | | main.rs:2332:43:2332:57 | impl ... | +| main.rs:2357:17:2357:35 | get_a_my_trait2(...) | impl(T) | main.rs:2282:5:2283:14 | S1 | +| main.rs:2357:17:2357:43 | ... .get_a() | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2357:33:2357:34 | S1 | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2360:13:2360:13 | f | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2360:17:2360:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2360:17:2360:35 | get_a_my_trait3(...) | T | main.rs:2336:50:2336:64 | impl ... | +| main.rs:2360:17:2360:35 | get_a_my_trait3(...) | T.impl(T) | main.rs:2282:5:2283:14 | S1 | +| main.rs:2360:17:2360:44 | ... .unwrap() | | main.rs:2336:50:2336:64 | impl ... | +| main.rs:2360:17:2360:44 | ... .unwrap() | impl(T) | main.rs:2282:5:2283:14 | S1 | +| main.rs:2360:17:2360:52 | ... .get_a() | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2360:33:2360:34 | S1 | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2361:13:2361:13 | g | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | T0 | main.rs:2340:44:2340:58 | impl ... | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | T0.impl(T) | main.rs:2282:5:2283:14 | S1 | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | T1 | main.rs:2340:61:2340:75 | impl ... | +| main.rs:2361:17:2361:35 | get_a_my_trait4(...) | T1.impl(T) | main.rs:2282:5:2283:14 | S1 | +| main.rs:2361:17:2361:37 | ... .0 | | main.rs:2340:44:2340:58 | impl ... | +| main.rs:2361:17:2361:37 | ... .0 | impl(T) | main.rs:2282:5:2283:14 | S1 | +| main.rs:2361:17:2361:45 | ... .get_a() | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2361:33:2361:34 | S1 | | main.rs:2282:5:2283:14 | S1 | +| main.rs:2372:16:2372:20 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2372:16:2372:20 | SelfParam | TRef | main.rs:2368:5:2369:13 | S | +| main.rs:2372:31:2374:9 | { ... } | | main.rs:2368:5:2369:13 | S | +| main.rs:2373:13:2373:13 | S | | main.rs:2368:5:2369:13 | S | +| main.rs:2383:26:2385:9 | { ... } | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2383:26:2385:9 | { ... } | T | main.rs:2382:10:2382:10 | T | +| main.rs:2384:13:2384:38 | MyVec {...} | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2384:13:2384:38 | MyVec {...} | T | main.rs:2382:10:2382:10 | T | +| main.rs:2384:27:2384:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2384:27:2384:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2384:27:2384:36 | ...::new(...) | T | main.rs:2382:10:2382:10 | T | +| main.rs:2387:17:2387:25 | SelfParam | | {EXTERNAL LOCATION} | &mut | +| main.rs:2387:17:2387:25 | SelfParam | TRefMut | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2387:17:2387:25 | SelfParam | TRefMut.T | main.rs:2382:10:2382:10 | T | +| main.rs:2387:28:2387:32 | value | | main.rs:2382:10:2382:10 | T | +| main.rs:2387:38:2389:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2388:13:2388:16 | self | | {EXTERNAL LOCATION} | &mut | +| main.rs:2388:13:2388:16 | self | TRefMut | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2388:13:2388:16 | self | TRefMut.T | main.rs:2382:10:2382:10 | T | +| main.rs:2388:13:2388:21 | self.data | | {EXTERNAL LOCATION} | Vec | +| main.rs:2388:13:2388:21 | self.data | A | {EXTERNAL LOCATION} | Global | +| main.rs:2388:13:2388:21 | self.data | T | main.rs:2382:10:2382:10 | T | +| main.rs:2388:13:2388:33 | ... .push(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2388:28:2388:32 | value | | main.rs:2382:10:2382:10 | T | +| main.rs:2396:18:2396:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2396:18:2396:22 | SelfParam | TRef | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2396:18:2396:22 | SelfParam | TRef.T | main.rs:2392:10:2392:10 | T | +| main.rs:2396:25:2396:29 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2396:56:2398:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:2396:56:2398:9 | { ... } | TRef | main.rs:2392:10:2392:10 | T | +| main.rs:2397:13:2397:29 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2397:13:2397:29 | &... | TRef | main.rs:2392:10:2392:10 | T | +| main.rs:2397:14:2397:17 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2397:14:2397:17 | self | TRef | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2397:14:2397:17 | self | TRef.T | main.rs:2392:10:2392:10 | T | +| main.rs:2397:14:2397:22 | self.data | | {EXTERNAL LOCATION} | Vec | +| main.rs:2397:14:2397:22 | self.data | A | {EXTERNAL LOCATION} | Global | +| main.rs:2397:14:2397:22 | self.data | T | main.rs:2392:10:2392:10 | T | +| main.rs:2397:14:2397:29 | ...[index] | | main.rs:2392:10:2392:10 | T | +| main.rs:2397:24:2397:28 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2401:22:2401:26 | slice | | {EXTERNAL LOCATION} | & | +| main.rs:2401:22:2401:26 | slice | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:2401:22:2401:26 | slice | TRef.TSlice | main.rs:2368:5:2369:13 | S | +| main.rs:2401:35:2403:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2402:13:2402:13 | x | | main.rs:2368:5:2369:13 | S | +| main.rs:2402:17:2402:21 | slice | | {EXTERNAL LOCATION} | & | +| main.rs:2402:17:2402:21 | slice | TRef | {EXTERNAL LOCATION} | [] | +| main.rs:2402:17:2402:21 | slice | TRef.TSlice | main.rs:2368:5:2369:13 | S | +| main.rs:2402:17:2402:24 | slice[0] | | main.rs:2368:5:2369:13 | S | +| main.rs:2402:17:2402:30 | ... .foo() | | main.rs:2368:5:2369:13 | S | +| main.rs:2402:23:2402:23 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2405:37:2405:37 | a | | main.rs:2405:20:2405:34 | T | +| main.rs:2405:43:2405:43 | b | | {EXTERNAL LOCATION} | usize | +| main.rs:2409:9:2409:9 | a | | main.rs:2405:20:2405:34 | T | +| main.rs:2409:11:2409:11 | b | | {EXTERNAL LOCATION} | usize | +| main.rs:2412:16:2423:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2413:17:2413:19 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2413:17:2413:19 | vec | T | main.rs:2368:5:2369:13 | S | +| main.rs:2413:23:2413:34 | ...::new(...) | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2413:23:2413:34 | ...::new(...) | T | main.rs:2368:5:2369:13 | S | +| main.rs:2414:9:2414:11 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2414:9:2414:11 | vec | T | main.rs:2368:5:2369:13 | S | +| main.rs:2414:9:2414:19 | vec.push(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2414:18:2414:18 | S | | main.rs:2368:5:2369:13 | S | +| main.rs:2415:9:2415:11 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2415:9:2415:11 | vec | T | main.rs:2368:5:2369:13 | S | +| main.rs:2415:9:2415:14 | vec[0] | | main.rs:2368:5:2369:13 | S | +| main.rs:2415:9:2415:20 | ... .foo() | | main.rs:2368:5:2369:13 | S | +| main.rs:2415:13:2415:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2417:13:2417:14 | xs | | {EXTERNAL LOCATION} | [;] | +| main.rs:2417:13:2417:14 | xs | TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2417:21:2417:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2417:26:2417:28 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2417:26:2417:28 | [...] | TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2417:27:2417:27 | S | | main.rs:2368:5:2369:13 | S | +| main.rs:2418:13:2418:13 | x | | main.rs:2368:5:2369:13 | S | +| main.rs:2418:17:2418:18 | xs | | {EXTERNAL LOCATION} | [;] | +| main.rs:2418:17:2418:18 | xs | TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2418:17:2418:21 | xs[0] | | main.rs:2368:5:2369:13 | S | +| main.rs:2418:17:2418:27 | ... .foo() | | main.rs:2368:5:2369:13 | S | +| main.rs:2418:20:2418:20 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2420:29:2420:31 | vec | | main.rs:2377:5:2380:5 | MyVec | +| main.rs:2420:29:2420:31 | vec | T | main.rs:2368:5:2369:13 | S | +| main.rs:2420:34:2420:34 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2422:9:2422:26 | analyze_slice(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2422:23:2422:25 | &xs | | {EXTERNAL LOCATION} | & | +| main.rs:2422:23:2422:25 | &xs | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:2422:23:2422:25 | &xs | TRef.TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2422:24:2422:25 | xs | | {EXTERNAL LOCATION} | [;] | +| main.rs:2422:24:2422:25 | xs | TArray | main.rs:2368:5:2369:13 | S | +| main.rs:2427:16:2429:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2428:13:2428:13 | x | | {EXTERNAL LOCATION} | String | +| main.rs:2428:17:2428:46 | MacroExpr | | {EXTERNAL LOCATION} | String | +| main.rs:2428:25:2428:35 | "Hello, {}" | | {EXTERNAL LOCATION} | & | +| main.rs:2428:25:2428:35 | "Hello, {}" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2428:25:2428:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2428:25:2428:45 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2428:25:2428:45 | { ... } | | {EXTERNAL LOCATION} | String | +| main.rs:2428:38:2428:45 | "World!" | | {EXTERNAL LOCATION} | & | +| main.rs:2428:38:2428:45 | "World!" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2437:19:2437:22 | SelfParam | | main.rs:2433:5:2438:5 | Self [trait MyAdd] | +| main.rs:2437:25:2437:27 | rhs | | main.rs:2433:17:2433:26 | Rhs | +| main.rs:2444:19:2444:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2444:25:2444:29 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2444:45:2446:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2445:13:2445:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2453:19:2453:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2453:25:2453:29 | value | | {EXTERNAL LOCATION} | & | +| main.rs:2453:25:2453:29 | value | TRef | {EXTERNAL LOCATION} | i64 | +| main.rs:2453:46:2455:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2454:13:2454:18 | * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2454:14:2454:18 | value | | {EXTERNAL LOCATION} | & | +| main.rs:2454:14:2454:18 | value | TRef | {EXTERNAL LOCATION} | i64 | +| main.rs:2462:19:2462:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2462:25:2462:29 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2462:46:2468:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2463:13:2467:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2463:13:2467:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| main.rs:2463:16:2463:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2463:22:2465:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2463:22:2465:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2464:17:2464:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2464:17:2464:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2465:20:2467:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2465:20:2467:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2466:17:2466:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2466:17:2466:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2477:19:2477:22 | SelfParam | | main.rs:2471:5:2471:19 | S | +| main.rs:2477:19:2477:22 | SelfParam | T | main.rs:2473:10:2473:17 | T | +| main.rs:2477:25:2477:29 | other | | main.rs:2471:5:2471:19 | S | +| main.rs:2477:25:2477:29 | other | T | main.rs:2473:10:2473:17 | T | +| main.rs:2477:54:2479:9 | { ... } | | main.rs:2471:5:2471:19 | S | +| main.rs:2478:13:2478:39 | S(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2478:15:2478:22 | (...) | | main.rs:2473:10:2473:17 | T | +| main.rs:2478:16:2478:19 | self | | main.rs:2471:5:2471:19 | S | +| main.rs:2478:16:2478:19 | self | T | main.rs:2473:10:2473:17 | T | +| main.rs:2478:16:2478:21 | self.0 | | main.rs:2473:10:2473:17 | T | +| main.rs:2478:31:2478:35 | other | | main.rs:2471:5:2471:19 | S | +| main.rs:2478:31:2478:35 | other | T | main.rs:2473:10:2473:17 | T | +| main.rs:2478:31:2478:37 | other.0 | | main.rs:2473:10:2473:17 | T | +| main.rs:2486:19:2486:22 | SelfParam | | main.rs:2471:5:2471:19 | S | +| main.rs:2486:19:2486:22 | SelfParam | T | main.rs:2482:10:2482:17 | T | +| main.rs:2486:25:2486:29 | other | | main.rs:2482:10:2482:17 | T | +| main.rs:2486:51:2488:9 | { ... } | | main.rs:2471:5:2471:19 | S | +| main.rs:2487:13:2487:37 | S(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2487:15:2487:22 | (...) | | main.rs:2482:10:2482:17 | T | +| main.rs:2487:16:2487:19 | self | | main.rs:2471:5:2471:19 | S | +| main.rs:2487:16:2487:19 | self | T | main.rs:2482:10:2482:17 | T | +| main.rs:2487:16:2487:21 | self.0 | | main.rs:2482:10:2482:17 | T | +| main.rs:2487:31:2487:35 | other | | main.rs:2482:10:2482:17 | T | +| main.rs:2498:19:2498:22 | SelfParam | | main.rs:2471:5:2471:19 | S | +| main.rs:2498:19:2498:22 | SelfParam | T | main.rs:2491:14:2491:14 | T | +| main.rs:2498:25:2498:29 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2498:25:2498:29 | other | TRef | main.rs:2491:14:2491:14 | T | +| main.rs:2498:55:2500:9 | { ... } | | main.rs:2471:5:2471:19 | S | +| main.rs:2499:13:2499:37 | S(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2499:15:2499:22 | (...) | | main.rs:2491:14:2491:14 | T | +| main.rs:2499:16:2499:19 | self | | main.rs:2471:5:2471:19 | S | +| main.rs:2499:16:2499:19 | self | T | main.rs:2491:14:2491:14 | T | +| main.rs:2499:16:2499:21 | self.0 | | main.rs:2491:14:2491:14 | T | +| main.rs:2499:31:2499:35 | other | | {EXTERNAL LOCATION} | & | +| main.rs:2499:31:2499:35 | other | TRef | main.rs:2491:14:2491:14 | T | +| main.rs:2505:20:2505:24 | value | | main.rs:2503:18:2503:18 | T | +| main.rs:2510:20:2510:24 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2510:40:2512:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2511:13:2511:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2517:20:2517:24 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2517:41:2523:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2518:13:2522:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2518:13:2522:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| main.rs:2518:16:2518:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2518:22:2520:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2518:22:2520:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2519:17:2519:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2519:17:2519:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2520:20:2522:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2520:20:2522:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2521:17:2521:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2521:17:2521:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2528:21:2528:25 | value | | main.rs:2526:19:2526:19 | T | +| main.rs:2528:31:2528:31 | x | | main.rs:2526:5:2529:5 | Self [trait MyFrom2] | +| main.rs:2533:21:2533:25 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2533:33:2533:33 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2533:48:2535:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2534:13:2534:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2540:21:2540:25 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2540:34:2540:34 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2540:49:2546:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2541:13:2545:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2541:16:2541:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2541:22:2543:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2542:17:2542:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2543:20:2545:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2544:17:2544:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2551:15:2551:15 | x | | main.rs:2549:5:2555:5 | Self [trait MySelfTrait] | +| main.rs:2554:15:2554:15 | x | | main.rs:2549:5:2555:5 | Self [trait MySelfTrait] | +| main.rs:2559:15:2559:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2559:31:2561:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2560:13:2560:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2560:13:2560:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2560:17:2560:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2564:15:2564:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2564:32:2566:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2565:13:2565:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2565:13:2565:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2565:17:2565:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2571:15:2571:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2571:31:2573:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2572:13:2572:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2572:13:2572:13 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2576:15:2576:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2576:32:2578:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2577:13:2577:13 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2581:16:2606:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2582:13:2582:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2582:22:2582:23 | 73 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2582:22:2582:23 | 73 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2583:9:2583:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2583:9:2583:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2583:18:2583:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2584:9:2584:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2584:9:2584:23 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2584:18:2584:22 | &5i64 | | {EXTERNAL LOCATION} | & | +| main.rs:2584:18:2584:22 | &5i64 | TRef | {EXTERNAL LOCATION} | i64 | +| main.rs:2584:19:2584:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2585:9:2585:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2585:9:2585:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2585:18:2585:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2587:9:2587:15 | S(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2587:9:2587:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2587:9:2587:31 | ... .my_add(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2587:11:2587:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2587:24:2587:30 | S(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2587:24:2587:30 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2587:26:2587:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2588:9:2588:15 | S(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2588:9:2588:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2588:11:2588:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2588:24:2588:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2589:9:2589:15 | S(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2589:9:2589:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2589:9:2589:29 | ... .my_add(...) | | main.rs:2471:5:2471:19 | S | +| main.rs:2589:11:2589:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2589:24:2589:28 | &3i64 | | {EXTERNAL LOCATION} | & | +| main.rs:2589:24:2589:28 | &3i64 | TRef | {EXTERNAL LOCATION} | i64 | +| main.rs:2589:25:2589:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2591:13:2591:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2591:17:2591:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2591:30:2591:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2592:13:2592:13 | y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2592:17:2592:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2592:30:2592:33 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2593:13:2593:13 | z | | {EXTERNAL LOCATION} | i64 | +| main.rs:2593:22:2593:43 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2593:38:2593:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2594:9:2594:34 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2594:23:2594:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2594:30:2594:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2595:9:2595:33 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2595:23:2595:26 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2595:29:2595:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2596:9:2596:38 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2596:27:2596:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2596:34:2596:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2598:9:2598:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2598:17:2598:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2599:9:2599:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2599:17:2599:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2600:9:2600:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2600:18:2600:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2601:9:2601:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2601:18:2601:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2602:9:2602:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2602:25:2602:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2603:9:2603:30 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2603:25:2603:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2604:9:2604:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2604:25:2604:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2605:9:2605:29 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2605:25:2605:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2613:26:2615:9 | { ... } | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2614:13:2614:25 | MyCallable {...} | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2617:17:2617:21 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2617:17:2617:21 | SelfParam | TRef | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2617:31:2619:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2618:13:2618:13 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2618:13:2618:13 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2622:16:2729:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2625:9:2625:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2625:13:2625:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2625:18:2625:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2625:18:2625:26 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2625:19:2625:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2625:22:2625:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2625:25:2625:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2625:28:2625:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2626:9:2626:44 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2626:18:2626:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2626:18:2626:26 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2626:18:2626:41 | ... .map(...) | | {EXTERNAL LOCATION} | [;] | +| main.rs:2626:19:2626:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2626:22:2626:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2626:25:2626:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2626:32:2626:40 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| main.rs:2626:32:2626:40 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| main.rs:2626:40:2626:40 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2626:43:2626:44 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2627:9:2627:41 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2627:13:2627:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2627:18:2627:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2627:18:2627:26 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2627:18:2627:38 | ... .into_iter() | | {EXTERNAL LOCATION} | IntoIter | +| main.rs:2627:18:2627:38 | ... .into_iter() | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2627:19:2627:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2627:22:2627:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2627:25:2627:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2627:40:2627:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2629:13:2629:17 | vals1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2629:13:2629:17 | vals1 | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2629:13:2629:17 | vals1 | TArray | {EXTERNAL LOCATION} | u8 | +| main.rs:2629:21:2629:31 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2629:21:2629:31 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2629:21:2629:31 | [...] | TArray | {EXTERNAL LOCATION} | u8 | +| main.rs:2629:22:2629:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2629:27:2629:27 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2629:27:2629:27 | 2 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2629:30:2629:30 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2629:30:2629:30 | 3 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2630:9:2630:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2630:13:2630:13 | u | | {EXTERNAL LOCATION} | i32 | +| main.rs:2630:13:2630:13 | u | | {EXTERNAL LOCATION} | u8 | +| main.rs:2630:18:2630:22 | vals1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2630:18:2630:22 | vals1 | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2630:18:2630:22 | vals1 | TArray | {EXTERNAL LOCATION} | u8 | +| main.rs:2630:24:2630:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2632:13:2632:17 | vals2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2632:13:2632:17 | vals2 | TArray | {EXTERNAL LOCATION} | u16 | +| main.rs:2632:21:2632:29 | [1u16; 3] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2632:21:2632:29 | [1u16; 3] | TArray | {EXTERNAL LOCATION} | u16 | +| main.rs:2632:22:2632:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2632:28:2632:28 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2633:9:2633:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2633:13:2633:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2633:18:2633:22 | vals2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2633:18:2633:22 | vals2 | TArray | {EXTERNAL LOCATION} | u16 | +| main.rs:2633:24:2633:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2635:13:2635:17 | vals3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2635:13:2635:17 | vals3 | TArray | {EXTERNAL LOCATION} | u32 | +| main.rs:2635:26:2635:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2635:31:2635:39 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2635:31:2635:39 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2635:31:2635:39 | [...] | TArray | {EXTERNAL LOCATION} | u32 | +| main.rs:2635:32:2635:32 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2635:32:2635:32 | 1 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2635:35:2635:35 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2635:35:2635:35 | 2 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2635:38:2635:38 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2635:38:2635:38 | 3 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2636:9:2636:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2636:13:2636:13 | u | | {EXTERNAL LOCATION} | u32 | +| main.rs:2636:18:2636:22 | vals3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2636:18:2636:22 | vals3 | TArray | {EXTERNAL LOCATION} | u32 | +| main.rs:2636:24:2636:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2638:13:2638:17 | vals4 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2638:13:2638:17 | vals4 | TArray | {EXTERNAL LOCATION} | u64 | +| main.rs:2638:26:2638:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2638:31:2638:36 | [1; 3] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2638:31:2638:36 | [1; 3] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2638:31:2638:36 | [1; 3] | TArray | {EXTERNAL LOCATION} | u64 | +| main.rs:2638:32:2638:32 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2638:32:2638:32 | 1 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2638:35:2638:35 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2639:9:2639:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2639:13:2639:13 | u | | {EXTERNAL LOCATION} | u64 | +| main.rs:2639:18:2639:22 | vals4 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2639:18:2639:22 | vals4 | TArray | {EXTERNAL LOCATION} | u64 | +| main.rs:2639:24:2639:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2641:17:2641:24 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2641:17:2641:24 | strings1 | TArray | {EXTERNAL LOCATION} | & | +| main.rs:2641:17:2641:24 | strings1 | TArray.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2641:28:2641:48 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2641:28:2641:48 | [...] | TArray | {EXTERNAL LOCATION} | & | +| main.rs:2641:28:2641:48 | [...] | TArray.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2641:29:2641:33 | "foo" | | {EXTERNAL LOCATION} | & | +| main.rs:2641:29:2641:33 | "foo" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2641:36:2641:40 | "bar" | | {EXTERNAL LOCATION} | & | +| main.rs:2641:36:2641:40 | "bar" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2641:43:2641:47 | "baz" | | {EXTERNAL LOCATION} | & | +| main.rs:2641:43:2641:47 | "baz" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2642:9:2642:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2642:13:2642:13 | s | | {EXTERNAL LOCATION} | & | +| main.rs:2642:13:2642:13 | s | TRef | {EXTERNAL LOCATION} | & | +| main.rs:2642:13:2642:13 | s | TRef.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2642:18:2642:26 | &strings1 | | {EXTERNAL LOCATION} | & | +| main.rs:2642:18:2642:26 | &strings1 | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:2642:18:2642:26 | &strings1 | TRef.TArray | {EXTERNAL LOCATION} | & | +| main.rs:2642:18:2642:26 | &strings1 | TRef.TArray.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2642:19:2642:26 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2642:19:2642:26 | strings1 | TArray | {EXTERNAL LOCATION} | & | +| main.rs:2642:19:2642:26 | strings1 | TArray.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2642:28:2642:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2643:9:2643:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2643:13:2643:13 | s | | {EXTERNAL LOCATION} | &mut | +| main.rs:2643:13:2643:13 | s | TRefMut | {EXTERNAL LOCATION} | & | +| main.rs:2643:13:2643:13 | s | TRefMut.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2643:18:2643:30 | &mut strings1 | | {EXTERNAL LOCATION} | &mut | +| main.rs:2643:18:2643:30 | &mut strings1 | TRefMut | {EXTERNAL LOCATION} | [;] | +| main.rs:2643:18:2643:30 | &mut strings1 | TRefMut.TArray | {EXTERNAL LOCATION} | & | +| main.rs:2643:18:2643:30 | &mut strings1 | TRefMut.TArray.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2643:23:2643:30 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2643:23:2643:30 | strings1 | TArray | {EXTERNAL LOCATION} | & | +| main.rs:2643:23:2643:30 | strings1 | TArray.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2643:32:2643:33 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2644:9:2644:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2644:13:2644:13 | s | | {EXTERNAL LOCATION} | & | +| main.rs:2644:13:2644:13 | s | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2644:18:2644:25 | strings1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2644:18:2644:25 | strings1 | TArray | {EXTERNAL LOCATION} | & | +| main.rs:2644:18:2644:25 | strings1 | TArray.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2644:27:2644:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2646:13:2646:20 | strings2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2646:13:2646:20 | strings2 | TArray | {EXTERNAL LOCATION} | String | +| main.rs:2647:9:2651:9 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2647:9:2651:9 | [...] | TArray | {EXTERNAL LOCATION} | String | +| main.rs:2648:13:2648:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2648:26:2648:30 | "foo" | | {EXTERNAL LOCATION} | & | +| main.rs:2648:26:2648:30 | "foo" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2649:13:2649:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2649:26:2649:30 | "bar" | | {EXTERNAL LOCATION} | & | +| main.rs:2649:26:2649:30 | "bar" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2650:13:2650:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2650:26:2650:30 | "baz" | | {EXTERNAL LOCATION} | & | +| main.rs:2650:26:2650:30 | "baz" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2652:9:2652:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2652:13:2652:13 | s | | {EXTERNAL LOCATION} | String | +| main.rs:2652:18:2652:25 | strings2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2652:18:2652:25 | strings2 | TArray | {EXTERNAL LOCATION} | String | +| main.rs:2652:27:2652:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2654:13:2654:20 | strings3 | | {EXTERNAL LOCATION} | & | +| main.rs:2654:13:2654:20 | strings3 | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:2654:13:2654:20 | strings3 | TRef.TArray | {EXTERNAL LOCATION} | String | +| main.rs:2655:9:2659:9 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2655:9:2659:9 | &... | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:2655:9:2659:9 | &... | TRef.TArray | {EXTERNAL LOCATION} | String | +| main.rs:2655:10:2659:9 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2655:10:2659:9 | [...] | TArray | {EXTERNAL LOCATION} | String | +| main.rs:2656:13:2656:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2656:26:2656:30 | "foo" | | {EXTERNAL LOCATION} | & | +| main.rs:2656:26:2656:30 | "foo" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2657:13:2657:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2657:26:2657:30 | "bar" | | {EXTERNAL LOCATION} | & | +| main.rs:2657:26:2657:30 | "bar" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2658:13:2658:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2658:26:2658:30 | "baz" | | {EXTERNAL LOCATION} | & | +| main.rs:2658:26:2658:30 | "baz" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2660:9:2660:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2660:13:2660:13 | s | | {EXTERNAL LOCATION} | & | +| main.rs:2660:13:2660:13 | s | TRef | {EXTERNAL LOCATION} | String | +| main.rs:2660:18:2660:25 | strings3 | | {EXTERNAL LOCATION} | & | +| main.rs:2660:18:2660:25 | strings3 | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:2660:18:2660:25 | strings3 | TRef.TArray | {EXTERNAL LOCATION} | String | +| main.rs:2660:27:2660:28 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2662:13:2662:21 | callables | | {EXTERNAL LOCATION} | [;] | +| main.rs:2662:13:2662:21 | callables | TArray | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2662:25:2662:81 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2662:25:2662:81 | [...] | TArray | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2662:26:2662:42 | ...::new(...) | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2662:45:2662:61 | ...::new(...) | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2662:64:2662:80 | ...::new(...) | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2663:9:2667:9 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2663:13:2663:13 | c | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2664:12:2664:20 | callables | | {EXTERNAL LOCATION} | [;] | +| main.rs:2664:12:2664:20 | callables | TArray | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2665:9:2667:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2666:17:2666:22 | result | | {EXTERNAL LOCATION} | i64 | +| main.rs:2666:26:2666:26 | c | | main.rs:2610:5:2610:24 | MyCallable | +| main.rs:2666:26:2666:33 | c.call() | | {EXTERNAL LOCATION} | i64 | +| main.rs:2671:9:2671:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2671:13:2671:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2671:18:2671:18 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2671:18:2671:22 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2671:18:2671:22 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2671:21:2671:22 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2671:24:2671:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2672:9:2672:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2672:13:2672:13 | u | | {EXTERNAL LOCATION} | Range | +| main.rs:2672:13:2672:13 | u | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2672:13:2672:13 | u | Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2672:18:2672:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2672:18:2672:26 | [...] | TArray | {EXTERNAL LOCATION} | Range | +| main.rs:2672:18:2672:26 | [...] | TArray.Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2672:18:2672:26 | [...] | TArray.Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2672:19:2672:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2672:19:2672:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2672:19:2672:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2672:19:2672:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2672:24:2672:25 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2672:24:2672:25 | 10 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2672:28:2672:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2673:13:2673:17 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2673:13:2673:17 | range | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2673:21:2673:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2673:21:2673:25 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2673:21:2673:25 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2673:24:2673:25 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2674:9:2674:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2674:13:2674:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2674:18:2674:22 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2674:18:2674:22 | range | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2674:24:2674:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2675:13:2675:22 | range_full | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2675:26:2675:27 | .. | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2676:9:2676:51 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2676:18:2676:48 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2676:19:2676:36 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2676:19:2676:36 | [...] | TArray | {EXTERNAL LOCATION} | i64 | +| main.rs:2676:20:2676:23 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2676:26:2676:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2676:32:2676:35 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2676:38:2676:47 | range_full | | {EXTERNAL LOCATION} | RangeFull | +| main.rs:2676:50:2676:51 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2678:13:2678:18 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2678:13:2678:18 | range1 | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2679:9:2682:9 | ...::Range {...} | | {EXTERNAL LOCATION} | Range | +| main.rs:2679:9:2682:9 | ...::Range {...} | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2680:20:2680:23 | 0u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2681:18:2681:22 | 10u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2683:9:2683:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2683:13:2683:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2683:18:2683:23 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2683:18:2683:23 | range1 | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2683:25:2683:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2687:13:2687:17 | vals3 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2687:21:2687:33 | MacroExpr | | {EXTERNAL LOCATION} | Vec | +| main.rs:2687:26:2687:26 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2687:29:2687:29 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2687:32:2687:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2688:9:2688:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2688:18:2688:22 | vals3 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2688:24:2688:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2690:13:2690:18 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2690:13:2690:18 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2690:13:2690:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2690:32:2690:43 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2690:32:2690:43 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2690:32:2690:43 | [...] | TArray | {EXTERNAL LOCATION} | u16 | +| main.rs:2690:32:2690:52 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2690:32:2690:52 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2690:32:2690:52 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2690:33:2690:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2690:39:2690:39 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2690:42:2690:42 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2691:9:2691:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2691:13:2691:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2691:18:2691:23 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2691:18:2691:23 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2691:18:2691:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2691:25:2691:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2693:22:2693:33 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2693:22:2693:33 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2693:22:2693:33 | [...] | TArray | {EXTERNAL LOCATION} | u16 | +| main.rs:2693:23:2693:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2693:29:2693:29 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2693:32:2693:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2694:9:2694:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2694:25:2694:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2696:13:2696:17 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2696:13:2696:17 | vals5 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2696:13:2696:17 | vals5 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2696:13:2696:17 | vals5 | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2696:21:2696:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2696:21:2696:43 | ...::from(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2696:21:2696:43 | ...::from(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2696:21:2696:43 | ...::from(...) | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2696:31:2696:42 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2696:31:2696:42 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2696:31:2696:42 | [...] | TArray | {EXTERNAL LOCATION} | u32 | +| main.rs:2696:32:2696:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2696:38:2696:38 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2696:41:2696:41 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2697:9:2697:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2697:13:2697:13 | u | | {EXTERNAL LOCATION} | i32 | +| main.rs:2697:13:2697:13 | u | | {EXTERNAL LOCATION} | u32 | +| main.rs:2697:18:2697:22 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2697:18:2697:22 | vals5 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2697:18:2697:22 | vals5 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2697:18:2697:22 | vals5 | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2697:24:2697:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2699:13:2699:17 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2699:13:2699:17 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2699:13:2699:17 | vals6 | T | {EXTERNAL LOCATION} | & | +| main.rs:2699:13:2699:17 | vals6 | T.TRef | {EXTERNAL LOCATION} | u64 | +| main.rs:2699:32:2699:43 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2699:32:2699:43 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2699:32:2699:43 | [...] | TArray | {EXTERNAL LOCATION} | u64 | +| main.rs:2699:32:2699:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2699:32:2699:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2699:32:2699:60 | ... .collect() | T | {EXTERNAL LOCATION} | & | +| main.rs:2699:32:2699:60 | ... .collect() | T.TRef | {EXTERNAL LOCATION} | u64 | +| main.rs:2699:33:2699:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2699:39:2699:39 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2699:42:2699:42 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2700:9:2700:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2700:13:2700:13 | u | | {EXTERNAL LOCATION} | & | +| main.rs:2700:13:2700:13 | u | TRef | {EXTERNAL LOCATION} | u64 | +| main.rs:2700:18:2700:22 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2700:18:2700:22 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2700:18:2700:22 | vals6 | T | {EXTERNAL LOCATION} | & | +| main.rs:2700:18:2700:22 | vals6 | T.TRef | {EXTERNAL LOCATION} | u64 | +| main.rs:2700:24:2700:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2702:17:2702:21 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2702:17:2702:21 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2702:17:2702:21 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2702:25:2702:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2702:25:2702:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2702:25:2702:34 | ...::new(...) | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2703:9:2703:13 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2703:9:2703:13 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2703:9:2703:13 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2703:9:2703:23 | vals7.push(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2703:20:2703:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2704:9:2704:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2704:13:2704:13 | u | | {EXTERNAL LOCATION} | u8 | +| main.rs:2704:18:2704:22 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2704:18:2704:22 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2704:18:2704:22 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2704:24:2704:25 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2706:13:2706:19 | matrix1 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2706:23:2706:50 | MacroExpr | | {EXTERNAL LOCATION} | Vec | +| main.rs:2706:28:2706:37 | (...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2706:28:2706:37 | MacroExpr | | {EXTERNAL LOCATION} | Vec | +| main.rs:2706:33:2706:33 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2706:36:2706:36 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2706:40:2706:49 | (...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2706:40:2706:49 | MacroExpr | | {EXTERNAL LOCATION} | Vec | +| main.rs:2706:45:2706:45 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2706:48:2706:48 | 4 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2708:13:2708:13 | _ | | {EXTERNAL LOCATION} | () | +| main.rs:2708:17:2711:9 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2708:28:2708:34 | matrix1 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2708:36:2711:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2709:13:2710:13 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2709:29:2710:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2713:17:2713:20 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2713:17:2713:20 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2713:17:2713:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2713:17:2713:20 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2713:17:2713:20 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2713:17:2713:20 | map1 | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2713:17:2713:20 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2713:24:2713:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2713:24:2713:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2713:24:2713:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2713:24:2713:55 | ...::new(...) | V | {EXTERNAL LOCATION} | Box | +| main.rs:2713:24:2713:55 | ...::new(...) | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2713:24:2713:55 | ...::new(...) | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2713:24:2713:55 | ...::new(...) | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2714:9:2714:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2714:9:2714:12 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2714:9:2714:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2714:9:2714:12 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2714:9:2714:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2714:9:2714:12 | map1 | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2714:9:2714:12 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2714:9:2714:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2714:9:2714:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2714:9:2714:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2714:9:2714:39 | map1.insert(...) | T.T | {EXTERNAL LOCATION} | & | +| main.rs:2714:9:2714:39 | map1.insert(...) | T.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2714:21:2714:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2714:24:2714:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2714:24:2714:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2714:24:2714:38 | ...::new(...) | T | {EXTERNAL LOCATION} | & | +| main.rs:2714:24:2714:38 | ...::new(...) | T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2714:33:2714:37 | "one" | | {EXTERNAL LOCATION} | & | +| main.rs:2714:33:2714:37 | "one" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2715:9:2715:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2715:9:2715:12 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2715:9:2715:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2715:9:2715:12 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2715:9:2715:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2715:9:2715:12 | map1 | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2715:9:2715:12 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2715:9:2715:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2715:9:2715:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2715:9:2715:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2715:9:2715:39 | map1.insert(...) | T.T | {EXTERNAL LOCATION} | & | +| main.rs:2715:9:2715:39 | map1.insert(...) | T.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2715:21:2715:21 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2715:24:2715:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2715:24:2715:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2715:24:2715:38 | ...::new(...) | T | {EXTERNAL LOCATION} | & | +| main.rs:2715:24:2715:38 | ...::new(...) | T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2715:33:2715:37 | "two" | | {EXTERNAL LOCATION} | & | +| main.rs:2715:33:2715:37 | "two" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2716:9:2716:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2716:13:2716:15 | key | | {EXTERNAL LOCATION} | & | +| main.rs:2716:13:2716:15 | key | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:2716:20:2716:23 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2716:20:2716:23 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2716:20:2716:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2716:20:2716:23 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2716:20:2716:23 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2716:20:2716:23 | map1 | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2716:20:2716:23 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2716:20:2716:30 | map1.keys() | | {EXTERNAL LOCATION} | Keys | +| main.rs:2716:20:2716:30 | map1.keys() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2716:20:2716:30 | map1.keys() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2716:20:2716:30 | map1.keys() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2716:20:2716:30 | map1.keys() | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2716:20:2716:30 | map1.keys() | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2716:32:2716:33 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2717:9:2717:37 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2717:13:2717:17 | value | | {EXTERNAL LOCATION} | & | +| main.rs:2717:13:2717:17 | value | TRef | {EXTERNAL LOCATION} | Box | +| main.rs:2717:13:2717:17 | value | TRef.A | {EXTERNAL LOCATION} | Global | +| main.rs:2717:13:2717:17 | value | TRef.T | {EXTERNAL LOCATION} | & | +| main.rs:2717:13:2717:17 | value | TRef.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2717:22:2717:25 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2717:22:2717:25 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2717:22:2717:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2717:22:2717:25 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2717:22:2717:25 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2717:22:2717:25 | map1 | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2717:22:2717:25 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2717:22:2717:34 | map1.values() | | {EXTERNAL LOCATION} | Values | +| main.rs:2717:22:2717:34 | map1.values() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2717:22:2717:34 | map1.values() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2717:22:2717:34 | map1.values() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2717:22:2717:34 | map1.values() | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2717:22:2717:34 | map1.values() | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2717:36:2717:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2718:9:2718:42 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2718:13:2718:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2718:13:2718:24 | TuplePat | T0 | {EXTERNAL LOCATION} | & | +| main.rs:2718:13:2718:24 | TuplePat | T0.TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:2718:13:2718:24 | TuplePat | T1 | {EXTERNAL LOCATION} | & | +| main.rs:2718:13:2718:24 | TuplePat | T1.TRef | {EXTERNAL LOCATION} | Box | +| main.rs:2718:13:2718:24 | TuplePat | T1.TRef.A | {EXTERNAL LOCATION} | Global | +| main.rs:2718:13:2718:24 | TuplePat | T1.TRef.T | {EXTERNAL LOCATION} | & | +| main.rs:2718:13:2718:24 | TuplePat | T1.TRef.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2718:14:2718:16 | key | | {EXTERNAL LOCATION} | & | +| main.rs:2718:14:2718:16 | key | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:2718:19:2718:23 | value | | {EXTERNAL LOCATION} | & | +| main.rs:2718:19:2718:23 | value | TRef | {EXTERNAL LOCATION} | Box | +| main.rs:2718:19:2718:23 | value | TRef.A | {EXTERNAL LOCATION} | Global | +| main.rs:2718:19:2718:23 | value | TRef.T | {EXTERNAL LOCATION} | & | +| main.rs:2718:19:2718:23 | value | TRef.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2718:29:2718:32 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2718:29:2718:32 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2718:29:2718:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2718:29:2718:32 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2718:29:2718:32 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2718:29:2718:32 | map1 | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2718:29:2718:32 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2718:29:2718:39 | map1.iter() | | {EXTERNAL LOCATION} | Iter | +| main.rs:2718:29:2718:39 | map1.iter() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2718:29:2718:39 | map1.iter() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2718:29:2718:39 | map1.iter() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2718:29:2718:39 | map1.iter() | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2718:29:2718:39 | map1.iter() | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2718:41:2718:42 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2719:9:2719:36 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2719:13:2719:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2719:13:2719:24 | TuplePat | T0 | {EXTERNAL LOCATION} | & | +| main.rs:2719:13:2719:24 | TuplePat | T0.TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:2719:13:2719:24 | TuplePat | T1 | {EXTERNAL LOCATION} | & | +| main.rs:2719:13:2719:24 | TuplePat | T1.TRef | {EXTERNAL LOCATION} | Box | +| main.rs:2719:13:2719:24 | TuplePat | T1.TRef.A | {EXTERNAL LOCATION} | Global | +| main.rs:2719:13:2719:24 | TuplePat | T1.TRef.T | {EXTERNAL LOCATION} | & | +| main.rs:2719:13:2719:24 | TuplePat | T1.TRef.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2719:14:2719:16 | key | | {EXTERNAL LOCATION} | & | +| main.rs:2719:14:2719:16 | key | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:2719:19:2719:23 | value | | {EXTERNAL LOCATION} | & | +| main.rs:2719:19:2719:23 | value | TRef | {EXTERNAL LOCATION} | Box | +| main.rs:2719:19:2719:23 | value | TRef.A | {EXTERNAL LOCATION} | Global | +| main.rs:2719:19:2719:23 | value | TRef.T | {EXTERNAL LOCATION} | & | +| main.rs:2719:19:2719:23 | value | TRef.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2719:29:2719:33 | &map1 | | {EXTERNAL LOCATION} | & | +| main.rs:2719:29:2719:33 | &map1 | TRef | {EXTERNAL LOCATION} | HashMap | +| main.rs:2719:29:2719:33 | &map1 | TRef.K | {EXTERNAL LOCATION} | i32 | +| main.rs:2719:29:2719:33 | &map1 | TRef.S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2719:29:2719:33 | &map1 | TRef.V | {EXTERNAL LOCATION} | Box | +| main.rs:2719:29:2719:33 | &map1 | TRef.V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2719:29:2719:33 | &map1 | TRef.V.T | {EXTERNAL LOCATION} | & | +| main.rs:2719:29:2719:33 | &map1 | TRef.V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2719:30:2719:33 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2719:30:2719:33 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2719:30:2719:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2719:30:2719:33 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2719:30:2719:33 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2719:30:2719:33 | map1 | V.T | {EXTERNAL LOCATION} | & | +| main.rs:2719:30:2719:33 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | +| main.rs:2719:35:2719:36 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2723:17:2723:17 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2723:26:2723:26 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2723:26:2723:26 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2725:13:2725:13 | _ | | {EXTERNAL LOCATION} | () | +| main.rs:2725:17:2728:9 | while ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2725:23:2725:23 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2725:23:2725:28 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2725:27:2725:28 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2726:9:2728:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2727:13:2727:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2727:13:2727:18 | ... += ... | | {EXTERNAL LOCATION} | () | +| main.rs:2727:18:2727:18 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2739:40:2741:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2739:40:2741:9 | { ... } | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2739:40:2741:9 | { ... } | T.T | main.rs:2738:10:2738:19 | T | +| main.rs:2740:13:2740:16 | None | | {EXTERNAL LOCATION} | Option | +| main.rs:2740:13:2740:16 | None | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2740:13:2740:16 | None | T.T | main.rs:2738:10:2738:19 | T | +| main.rs:2743:30:2745:9 | { ... } | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2743:30:2745:9 | { ... } | T | main.rs:2738:10:2738:19 | T | +| main.rs:2744:13:2744:28 | S1(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2744:13:2744:28 | S1(...) | T | main.rs:2738:10:2738:19 | T | +| main.rs:2744:16:2744:27 | ...::default(...) | | main.rs:2738:10:2738:19 | T | +| main.rs:2747:19:2747:22 | SelfParam | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2747:19:2747:22 | SelfParam | T | main.rs:2738:10:2738:19 | T | +| main.rs:2747:33:2749:9 | { ... } | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2747:33:2749:9 | { ... } | T | main.rs:2738:10:2738:19 | T | +| main.rs:2748:13:2748:16 | self | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2748:13:2748:16 | self | T | main.rs:2738:10:2738:19 | T | +| main.rs:2760:15:2760:15 | x | | main.rs:2760:12:2760:12 | T | +| main.rs:2760:26:2762:5 | { ... } | | main.rs:2760:12:2760:12 | T | +| main.rs:2761:9:2761:9 | x | | main.rs:2760:12:2760:12 | T | +| main.rs:2764:16:2786:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2765:13:2765:14 | x1 | | {EXTERNAL LOCATION} | Option | +| main.rs:2765:13:2765:14 | x1 | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2765:13:2765:14 | x1 | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2765:34:2765:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2765:34:2765:48 | ...::assoc_fun(...) | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2765:34:2765:48 | ...::assoc_fun(...) | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2766:13:2766:14 | x2 | | {EXTERNAL LOCATION} | Option | +| main.rs:2766:13:2766:14 | x2 | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2766:13:2766:14 | x2 | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2766:18:2766:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2766:18:2766:38 | ...::assoc_fun(...) | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2766:18:2766:38 | ...::assoc_fun(...) | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2767:13:2767:14 | x3 | | {EXTERNAL LOCATION} | Option | +| main.rs:2767:13:2767:14 | x3 | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2767:13:2767:14 | x3 | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2767:18:2767:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2767:18:2767:32 | ...::assoc_fun(...) | T | main.rs:2733:5:2733:20 | S1 | +| main.rs:2767:18:2767:32 | ...::assoc_fun(...) | T.T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2768:13:2768:14 | x4 | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2768:13:2768:14 | x4 | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2768:18:2768:48 | ...::method(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2768:18:2768:48 | ...::method(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2768:35:2768:47 | ...::default(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2768:35:2768:47 | ...::default(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2769:13:2769:14 | x5 | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2769:13:2769:14 | x5 | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2769:18:2769:42 | ...::method(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2769:18:2769:42 | ...::method(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2769:29:2769:41 | ...::default(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2769:29:2769:41 | ...::default(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2770:13:2770:14 | x6 | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2770:13:2770:14 | x6 | T4 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2770:18:2770:45 | S4::<...>(...) | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2770:18:2770:45 | S4::<...>(...) | T4 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2770:27:2770:44 | ...::default(...) | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2771:13:2771:14 | x7 | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2771:13:2771:14 | x7 | T4 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2771:18:2771:23 | S4(...) | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2771:18:2771:23 | S4(...) | T4 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2771:21:2771:22 | S2 | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2772:13:2772:14 | x8 | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2772:13:2772:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 | +| main.rs:2772:18:2772:22 | S4(...) | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2772:18:2772:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | +| main.rs:2772:21:2772:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2773:13:2773:14 | x9 | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2773:13:2773:14 | x9 | T4 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2773:18:2773:34 | S4(...) | | main.rs:2754:5:2754:27 | S4 | +| main.rs:2773:18:2773:34 | S4(...) | T4 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2773:21:2773:33 | ...::default(...) | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2774:13:2774:15 | x10 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2774:13:2774:15 | x10 | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2774:19:2777:9 | S5::<...> {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2774:19:2777:9 | S5::<...> {...} | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2776:20:2776:37 | ...::default(...) | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2778:13:2778:15 | x11 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2778:13:2778:15 | x11 | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2778:19:2778:34 | S5 {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2778:19:2778:34 | S5 {...} | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2778:31:2778:32 | S2 | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2779:13:2779:15 | x12 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2779:13:2779:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:2779:19:2779:33 | S5 {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2779:19:2779:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:2779:31:2779:31 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2780:13:2780:15 | x13 | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2780:13:2780:15 | x13 | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2780:19:2783:9 | S5 {...} | | main.rs:2756:5:2758:5 | S5 | +| main.rs:2780:19:2783:9 | S5 {...} | T5 | main.rs:2735:5:2736:14 | S2 | +| main.rs:2782:20:2782:32 | ...::default(...) | | main.rs:2735:5:2736:14 | S2 | +| main.rs:2784:13:2784:15 | x14 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2784:19:2784:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2784:30:2784:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2785:13:2785:15 | x15 | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2785:13:2785:15 | x15 | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2785:19:2785:37 | ...::default(...) | | main.rs:2733:5:2733:20 | S1 | +| main.rs:2785:19:2785:37 | ...::default(...) | T | main.rs:2735:5:2736:14 | S2 | +| main.rs:2794:35:2796:9 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2794:35:2796:9 | { ... } | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2794:35:2796:9 | { ... } | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2795:13:2795:26 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2795:13:2795:26 | TupleExpr | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2795:13:2795:26 | TupleExpr | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2795:14:2795:18 | S1 {...} | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2795:21:2795:25 | S1 {...} | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2797:16:2797:19 | SelfParam | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2797:22:2797:23 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2800:16:2834:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2801:13:2801:13 | a | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2801:13:2801:13 | a | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2801:13:2801:13 | a | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2801:17:2801:30 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2801:17:2801:30 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2801:17:2801:30 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:17:2802:17 | b | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2802:17:2802:17 | b | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:17:2802:17 | b | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:21:2802:34 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2802:21:2802:34 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2802:21:2802:34 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:13:2803:18 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2803:13:2803:18 | TuplePat | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:13:2803:18 | TuplePat | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:14:2803:14 | c | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:17:2803:17 | d | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:22:2803:35 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2803:22:2803:35 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2803:22:2803:35 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:13:2804:22 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2804:13:2804:22 | TuplePat | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:13:2804:22 | TuplePat | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:18:2804:18 | e | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:21:2804:21 | f | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:26:2804:39 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2804:26:2804:39 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2804:26:2804:39 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:13:2805:26 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2805:13:2805:26 | TuplePat | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:13:2805:26 | TuplePat | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:18:2805:18 | g | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:25:2805:25 | h | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:30:2805:43 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2805:30:2805:43 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2805:30:2805:43 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2807:9:2807:9 | a | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2807:9:2807:9 | a | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2807:9:2807:9 | a | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2807:9:2807:11 | a.0 | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2807:9:2807:17 | ... .foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2808:9:2808:9 | b | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2808:9:2808:9 | b | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2808:9:2808:9 | b | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2808:9:2808:11 | b.1 | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2808:9:2808:17 | ... .foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2809:9:2809:9 | c | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2809:9:2809:15 | c.foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2810:9:2810:9 | d | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2810:9:2810:15 | d.foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2811:9:2811:9 | e | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2811:9:2811:15 | e.foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2812:9:2812:9 | f | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2812:9:2812:15 | f.foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2813:9:2813:9 | g | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2813:9:2813:15 | g.foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2814:9:2814:9 | h | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2814:9:2814:15 | h.foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2819:13:2819:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2819:17:2819:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2820:13:2820:13 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2820:17:2820:34 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2821:13:2821:16 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2821:13:2821:16 | pair | T0 | {EXTERNAL LOCATION} | i64 | +| main.rs:2821:13:2821:16 | pair | T1 | {EXTERNAL LOCATION} | bool | +| main.rs:2821:20:2821:25 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2821:20:2821:25 | TupleExpr | T0 | {EXTERNAL LOCATION} | i64 | +| main.rs:2821:20:2821:25 | TupleExpr | T1 | {EXTERNAL LOCATION} | bool | +| main.rs:2821:21:2821:21 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2821:24:2821:24 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2822:13:2822:13 | i | | {EXTERNAL LOCATION} | i64 | +| main.rs:2822:22:2822:25 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2822:22:2822:25 | pair | T0 | {EXTERNAL LOCATION} | i64 | +| main.rs:2822:22:2822:25 | pair | T1 | {EXTERNAL LOCATION} | bool | +| main.rs:2822:22:2822:27 | pair.0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2823:13:2823:13 | j | | {EXTERNAL LOCATION} | bool | +| main.rs:2823:23:2823:26 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2823:23:2823:26 | pair | T0 | {EXTERNAL LOCATION} | i64 | +| main.rs:2823:23:2823:26 | pair | T1 | {EXTERNAL LOCATION} | bool | +| main.rs:2823:23:2823:28 | pair.1 | | {EXTERNAL LOCATION} | bool | +| main.rs:2825:13:2825:16 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2825:13:2825:16 | pair | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:2825:13:2825:16 | pair | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:2825:20:2825:25 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2825:20:2825:25 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2825:20:2825:32 | ... .into() | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2825:20:2825:32 | ... .into() | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:2825:20:2825:32 | ... .into() | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:2825:21:2825:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2825:24:2825:24 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2826:9:2829:9 | match pair { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2826:15:2826:18 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2826:15:2826:18 | pair | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:2826:15:2826:18 | pair | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:2827:13:2827:18 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2827:13:2827:18 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:2827:13:2827:18 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:2827:14:2827:14 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2827:17:2827:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2827:23:2827:42 | MacroExpr | | {EXTERNAL LOCATION} | () | +| main.rs:2827:30:2827:41 | "unexpected" | | {EXTERNAL LOCATION} | & | +| main.rs:2827:30:2827:41 | "unexpected" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2827:30:2827:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2827:30:2827:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2828:13:2828:13 | _ | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2828:13:2828:13 | _ | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:2828:13:2828:13 | _ | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:2828:18:2828:35 | MacroExpr | | {EXTERNAL LOCATION} | () | +| main.rs:2828:25:2828:34 | "expected" | | {EXTERNAL LOCATION} | & | +| main.rs:2828:25:2828:34 | "expected" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2828:25:2828:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2828:25:2828:34 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2830:13:2830:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:2830:17:2830:20 | pair | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2830:17:2830:20 | pair | T0 | {EXTERNAL LOCATION} | i32 | +| main.rs:2830:17:2830:20 | pair | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:2830:17:2830:22 | pair.0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2832:13:2832:13 | y | | {EXTERNAL LOCATION} | & | +| main.rs:2832:13:2832:13 | y | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2832:13:2832:13 | y | TRef.T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2832:13:2832:13 | y | TRef.T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2832:17:2832:31 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2832:17:2832:31 | &... | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2832:17:2832:31 | &... | TRef.T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2832:17:2832:31 | &... | TRef.T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2832:18:2832:31 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2832:18:2832:31 | ...::get_pair(...) | T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2832:18:2832:31 | ...::get_pair(...) | T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2833:9:2833:9 | y | | {EXTERNAL LOCATION} | & | +| main.rs:2833:9:2833:9 | y | TRef | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2833:9:2833:9 | y | TRef.T0 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2833:9:2833:9 | y | TRef.T1 | main.rs:2790:5:2791:16 | S1 | +| main.rs:2833:9:2833:11 | y.0 | | main.rs:2790:5:2791:16 | S1 | +| main.rs:2833:9:2833:17 | ... .foo() | | {EXTERNAL LOCATION} | () | +| main.rs:2839:27:2861:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2840:13:2840:23 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2840:13:2840:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2840:13:2840:23 | boxed_value | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2840:27:2840:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2840:27:2840:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2840:27:2840:42 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2840:36:2840:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2843:9:2851:9 | match boxed_value { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2843:15:2843:25 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2843:15:2843:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2843:15:2843:25 | boxed_value | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2844:13:2844:19 | box 100 | | {EXTERNAL LOCATION} | Box | +| main.rs:2844:13:2844:19 | box 100 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2844:13:2844:19 | box 100 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2844:17:2844:19 | 100 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2844:24:2846:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2845:26:2845:36 | "Boxed 100\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2845:26:2845:36 | "Boxed 100\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2845:26:2845:36 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2845:26:2845:36 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2847:13:2847:17 | box ... | | {EXTERNAL LOCATION} | Box | +| main.rs:2847:13:2847:17 | box ... | A | {EXTERNAL LOCATION} | Global | +| main.rs:2847:13:2847:17 | box ... | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2847:22:2850:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2849:26:2849:42 | "Boxed value: {}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2849:26:2849:42 | "Boxed value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2849:26:2849:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2849:26:2849:51 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2854:13:2854:22 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2854:13:2854:22 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:13:2854:22 | nested_box | T | {EXTERNAL LOCATION} | Box | +| main.rs:2854:13:2854:22 | nested_box | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:13:2854:22 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2854:26:2854:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2854:26:2854:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:26:2854:50 | ...::new(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2854:26:2854:50 | ...::new(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:26:2854:50 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2854:35:2854:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2854:35:2854:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2854:35:2854:49 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2854:44:2854:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2855:9:2860:9 | match nested_box { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2855:15:2855:24 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2855:15:2855:24 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2855:15:2855:24 | nested_box | T | {EXTERNAL LOCATION} | Box | +| main.rs:2855:15:2855:24 | nested_box | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2855:15:2855:24 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2856:13:2856:21 | box ... | | {EXTERNAL LOCATION} | Box | +| main.rs:2856:13:2856:21 | box ... | A | {EXTERNAL LOCATION} | Global | +| main.rs:2856:13:2856:21 | box ... | T | {EXTERNAL LOCATION} | Box | +| main.rs:2856:13:2856:21 | box ... | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2856:13:2856:21 | box ... | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2856:26:2859:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2858:26:2858:43 | "Nested boxed: {}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2858:26:2858:43 | "Nested boxed: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2858:26:2858:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2858:26:2858:59 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2870:36:2872:9 | { ... } | | main.rs:2867:5:2867:22 | Path | +| main.rs:2871:13:2871:19 | Path {...} | | main.rs:2867:5:2867:22 | Path | +| main.rs:2874:29:2874:33 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2874:29:2874:33 | SelfParam | TRef | main.rs:2867:5:2867:22 | Path | +| main.rs:2874:59:2876:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:2874:59:2876:9 | { ... } | E | {EXTERNAL LOCATION} | () | +| main.rs:2874:59:2876:9 | { ... } | T | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2875:13:2875:30 | Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:2875:13:2875:30 | Ok(...) | E | {EXTERNAL LOCATION} | () | +| main.rs:2875:13:2875:30 | Ok(...) | T | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2875:16:2875:29 | ...::new(...) | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2882:39:2884:9 | { ... } | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2883:13:2883:22 | PathBuf {...} | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2892:18:2892:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2892:18:2892:22 | SelfParam | TRef | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2892:34:2896:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:2892:34:2896:9 | { ... } | TRef | main.rs:2867:5:2867:22 | Path | +| main.rs:2894:33:2894:43 | ...::new(...) | | main.rs:2867:5:2867:22 | Path | +| main.rs:2895:13:2895:17 | &path | | {EXTERNAL LOCATION} | & | +| main.rs:2895:13:2895:17 | &path | TRef | main.rs:2867:5:2867:22 | Path | +| main.rs:2895:14:2895:17 | path | | main.rs:2867:5:2867:22 | Path | +| main.rs:2899:16:2907:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2900:13:2900:17 | path1 | | main.rs:2867:5:2867:22 | Path | +| main.rs:2900:21:2900:31 | ...::new(...) | | main.rs:2867:5:2867:22 | Path | +| main.rs:2901:13:2901:17 | path2 | | {EXTERNAL LOCATION} | Result | +| main.rs:2901:13:2901:17 | path2 | E | {EXTERNAL LOCATION} | () | +| main.rs:2901:13:2901:17 | path2 | T | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2901:21:2901:25 | path1 | | main.rs:2867:5:2867:22 | Path | +| main.rs:2901:21:2901:40 | path1.canonicalize() | | {EXTERNAL LOCATION} | Result | +| main.rs:2901:21:2901:40 | path1.canonicalize() | E | {EXTERNAL LOCATION} | () | +| main.rs:2901:21:2901:40 | path1.canonicalize() | T | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2902:13:2902:17 | path3 | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2902:21:2902:25 | path2 | | {EXTERNAL LOCATION} | Result | +| main.rs:2902:21:2902:25 | path2 | E | {EXTERNAL LOCATION} | () | +| main.rs:2902:21:2902:25 | path2 | T | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2902:21:2902:34 | path2.unwrap() | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2904:13:2904:20 | pathbuf1 | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2904:24:2904:37 | ...::new(...) | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2905:24:2905:31 | pathbuf1 | | main.rs:2879:5:2879:25 | PathBuf | +| main.rs:2912:14:2912:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2912:14:2912:18 | SelfParam | TRef | main.rs:2911:5:2913:5 | Self [trait MyTrait] | +| main.rs:2919:14:2919:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2919:14:2919:18 | SelfParam | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2919:14:2919:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2919:28:2921:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2920:13:2920:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2920:13:2920:16 | self | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2920:13:2920:16 | self | TRef.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2920:13:2920:18 | self.0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2925:14:2925:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2925:14:2925:18 | SelfParam | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2925:14:2925:18 | SelfParam | TRef.T | main.rs:2915:5:2916:19 | S | +| main.rs:2925:14:2925:18 | SelfParam | TRef.T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2925:28:2927:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2926:13:2926:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2926:13:2926:16 | self | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2926:13:2926:16 | self | TRef.T | main.rs:2915:5:2916:19 | S | +| main.rs:2926:13:2926:16 | self | TRef.T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2926:13:2926:18 | self.0 | | main.rs:2915:5:2916:19 | S | +| main.rs:2926:13:2926:18 | self.0 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2926:13:2926:21 | ... .0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2931:15:2931:19 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:2931:15:2931:19 | SelfParam | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2931:15:2931:19 | SelfParam | TRef.T | main.rs:2930:10:2930:16 | T | +| main.rs:2931:33:2933:9 | { ... } | | main.rs:2915:5:2916:19 | S | +| main.rs:2931:33:2933:9 | { ... } | T | main.rs:2915:5:2916:19 | S | +| main.rs:2931:33:2933:9 | { ... } | T.T | main.rs:2930:10:2930:16 | T | +| main.rs:2932:13:2932:24 | S(...) | | main.rs:2915:5:2916:19 | S | +| main.rs:2932:13:2932:24 | S(...) | T | main.rs:2915:5:2916:19 | S | +| main.rs:2932:13:2932:24 | S(...) | T.T | main.rs:2930:10:2930:16 | T | +| main.rs:2932:15:2932:23 | S(...) | | main.rs:2915:5:2916:19 | S | +| main.rs:2932:15:2932:23 | S(...) | T | main.rs:2930:10:2930:16 | T | +| main.rs:2932:17:2932:20 | self | | {EXTERNAL LOCATION} | & | +| main.rs:2932:17:2932:20 | self | TRef | main.rs:2915:5:2916:19 | S | +| main.rs:2932:17:2932:20 | self | TRef.T | main.rs:2930:10:2930:16 | T | +| main.rs:2932:17:2932:22 | self.0 | | main.rs:2930:10:2930:16 | T | +| main.rs:2936:14:2936:14 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2936:48:2953:5 | { ... } | | {EXTERNAL LOCATION} | Box | +| main.rs:2936:48:2953:5 | { ... } | A | {EXTERNAL LOCATION} | Global | +| main.rs:2936:48:2953:5 | { ... } | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:2936:48:2953:5 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2937:13:2937:13 | x | | main.rs:2915:5:2916:19 | S | +| main.rs:2937:13:2937:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2937:17:2942:9 | if b {...} else {...} | | main.rs:2915:5:2916:19 | S | +| main.rs:2937:17:2942:9 | if b {...} else {...} | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2937:20:2937:20 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2937:22:2940:9 | { ... } | | main.rs:2915:5:2916:19 | S | +| main.rs:2937:22:2940:9 | { ... } | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2938:17:2938:17 | y | | main.rs:2915:5:2916:19 | S | +| main.rs:2938:17:2938:17 | y | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2938:21:2938:38 | ...::default(...) | | main.rs:2915:5:2916:19 | S | +| main.rs:2938:21:2938:38 | ...::default(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2939:13:2939:13 | y | | main.rs:2915:5:2916:19 | S | +| main.rs:2939:13:2939:13 | y | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2940:16:2942:9 | { ... } | | main.rs:2915:5:2916:19 | S | +| main.rs:2940:16:2942:9 | { ... } | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2941:13:2941:16 | S(...) | | main.rs:2915:5:2916:19 | S | +| main.rs:2941:13:2941:16 | S(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2941:15:2941:15 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2946:13:2946:13 | x | | main.rs:2915:5:2916:19 | S | +| main.rs:2946:13:2946:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2946:17:2946:20 | S(...) | | main.rs:2915:5:2916:19 | S | +| main.rs:2946:17:2946:20 | S(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2946:19:2946:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2947:9:2952:9 | if b {...} else {...} | | {EXTERNAL LOCATION} | Box | +| main.rs:2947:9:2952:9 | if b {...} else {...} | A | {EXTERNAL LOCATION} | Global | +| main.rs:2947:9:2952:9 | if b {...} else {...} | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:2947:9:2952:9 | if b {...} else {...} | T | main.rs:2915:5:2916:19 | S | +| main.rs:2947:9:2952:9 | if b {...} else {...} | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2947:9:2952:9 | if b {...} else {...} | T.T | main.rs:2915:5:2916:19 | S | +| main.rs:2947:9:2952:9 | if b {...} else {...} | T.T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2947:9:2952:9 | if b {...} else {...} | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2947:12:2947:12 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2947:14:2950:9 | { ... } | | {EXTERNAL LOCATION} | Box | +| main.rs:2947:14:2950:9 | { ... } | A | {EXTERNAL LOCATION} | Global | +| main.rs:2947:14:2950:9 | { ... } | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:2947:14:2950:9 | { ... } | T | main.rs:2915:5:2916:19 | S | +| main.rs:2947:14:2950:9 | { ... } | T.T | main.rs:2915:5:2916:19 | S | +| main.rs:2947:14:2950:9 | { ... } | T.T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2947:14:2950:9 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2948:17:2948:17 | x | | main.rs:2915:5:2916:19 | S | +| main.rs:2948:17:2948:17 | x | T | main.rs:2915:5:2916:19 | S | +| main.rs:2948:17:2948:17 | x | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2948:21:2948:21 | x | | main.rs:2915:5:2916:19 | S | +| main.rs:2948:21:2948:21 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2948:21:2948:26 | x.m2() | | main.rs:2915:5:2916:19 | S | +| main.rs:2948:21:2948:26 | x.m2() | T | main.rs:2915:5:2916:19 | S | +| main.rs:2948:21:2948:26 | x.m2() | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2949:13:2949:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2949:13:2949:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2949:13:2949:23 | ...::new(...) | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:2949:13:2949:23 | ...::new(...) | T | main.rs:2915:5:2916:19 | S | +| main.rs:2949:13:2949:23 | ...::new(...) | T.T | main.rs:2915:5:2916:19 | S | +| main.rs:2949:13:2949:23 | ...::new(...) | T.T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2949:13:2949:23 | ...::new(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2949:22:2949:22 | x | | main.rs:2915:5:2916:19 | S | +| main.rs:2949:22:2949:22 | x | T | main.rs:2915:5:2916:19 | S | +| main.rs:2949:22:2949:22 | x | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2950:16:2952:9 | { ... } | | {EXTERNAL LOCATION} | Box | +| main.rs:2950:16:2952:9 | { ... } | A | {EXTERNAL LOCATION} | Global | +| main.rs:2950:16:2952:9 | { ... } | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:2950:16:2952:9 | { ... } | T | main.rs:2915:5:2916:19 | S | +| main.rs:2950:16:2952:9 | { ... } | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2950:16:2952:9 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2951:13:2951:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2951:13:2951:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2951:13:2951:23 | ...::new(...) | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:2951:13:2951:23 | ...::new(...) | T | main.rs:2915:5:2916:19 | S | +| main.rs:2951:13:2951:23 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2951:13:2951:23 | ...::new(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2951:22:2951:22 | x | | main.rs:2915:5:2916:19 | S | +| main.rs:2951:22:2951:22 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2957:22:2961:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2958:18:2958:18 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:2958:33:2960:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2959:13:2959:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:2959:13:2959:17 | ... + ... | | {EXTERNAL LOCATION} | i32 | +| main.rs:2959:17:2959:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2966:11:2966:14 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2966:30:2974:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2968:13:2968:13 | a | | {EXTERNAL LOCATION} | () | +| main.rs:2968:17:2972:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2969:13:2971:13 | if cond {...} | | {EXTERNAL LOCATION} | () | +| main.rs:2969:16:2969:19 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2969:21:2971:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2970:24:2970:25 | 12 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2973:9:2973:9 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2977:20:2984:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2980:26:2980:27 | 12 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2982:18:2982:26 | "b: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2982:18:2982:26 | "b: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2982:18:2982:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2982:18:2982:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2983:9:2983:9 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2986:20:2988:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2987:16:2987:16 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2991:11:2991:14 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2991:30:2999:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2992:13:2992:13 | a | | {EXTERNAL LOCATION} | () | +| main.rs:2992:17:2996:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2993:13:2995:13 | if cond {...} | | {EXTERNAL LOCATION} | () | +| main.rs:2993:16:2993:19 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:2993:21:2995:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2994:24:2994:25 | 12 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2997:18:2997:26 | "a: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| main.rs:2997:18:2997:26 | "a: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| main.rs:2997:18:2997:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2997:18:2997:29 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2997:29:2997:29 | a | | {EXTERNAL LOCATION} | () | +| main.rs:2998:9:2998:9 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3003:16:3050:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3004:13:3004:13 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3004:13:3004:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3004:17:3004:20 | None | | {EXTERNAL LOCATION} | Option | +| main.rs:3004:17:3004:20 | None | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3005:13:3005:13 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3005:13:3005:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3005:30:3005:30 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3005:30:3005:30 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3006:13:3006:13 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3006:13:3006:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3006:17:3006:35 | ...::None | | {EXTERNAL LOCATION} | Option | +| main.rs:3006:17:3006:35 | ...::None | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3007:13:3007:13 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3007:13:3007:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3007:17:3007:35 | ...::None::<...> | | {EXTERNAL LOCATION} | Option | +| main.rs:3007:17:3007:35 | ...::None::<...> | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3009:26:3009:28 | opt | | {EXTERNAL LOCATION} | Option | +| main.rs:3009:26:3009:28 | opt | T | main.rs:3009:23:3009:23 | T | +| main.rs:3009:42:3009:42 | x | | main.rs:3009:23:3009:23 | T | +| main.rs:3009:48:3009:49 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3011:13:3011:13 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3011:13:3011:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3011:17:3011:20 | None | | {EXTERNAL LOCATION} | Option | +| main.rs:3011:17:3011:20 | None | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3012:9:3012:24 | pin_option(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3012:20:3012:20 | x | | {EXTERNAL LOCATION} | Option | +| main.rs:3012:20:3012:20 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3012:23:3012:23 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3019:13:3019:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3019:13:3019:13 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3019:13:3019:13 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3019:17:3019:39 | ...::A {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3019:17:3019:39 | ...::A {...} | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3019:17:3019:39 | ...::A {...} | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3019:37:3019:37 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3020:13:3020:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3020:13:3020:13 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3020:13:3020:13 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3020:40:3020:40 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3020:40:3020:40 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3020:40:3020:40 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3021:13:3021:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3021:13:3021:13 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3021:13:3021:13 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3021:17:3021:52 | ...::A {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3021:17:3021:52 | ...::A {...} | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3021:17:3021:52 | ...::A {...} | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3021:50:3021:50 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3023:13:3023:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3023:13:3023:13 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3023:13:3023:13 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3023:17:3025:9 | ...::B::<...> {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3023:17:3025:9 | ...::B::<...> {...} | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3023:17:3025:9 | ...::B::<...> {...} | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3024:20:3024:32 | ...::new(...) | | {EXTERNAL LOCATION} | String | +| main.rs:3027:29:3027:29 | e | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3027:29:3027:29 | e | T1 | main.rs:3027:26:3027:26 | T | +| main.rs:3027:29:3027:29 | e | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3027:53:3027:53 | x | | main.rs:3027:26:3027:26 | T | +| main.rs:3027:59:3027:60 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3030:13:3030:13 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3030:13:3030:13 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3030:13:3030:13 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3030:17:3032:9 | ...::B {...} | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3030:17:3032:9 | ...::B {...} | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3030:17:3032:9 | ...::B {...} | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3031:20:3031:32 | ...::new(...) | | {EXTERNAL LOCATION} | String | +| main.rs:3033:9:3033:27 | pin_my_either(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3033:23:3033:23 | x | | main.rs:3014:9:3017:9 | MyEither | +| main.rs:3033:23:3033:23 | x | T1 | {EXTERNAL LOCATION} | i32 | +| main.rs:3033:23:3033:23 | x | T2 | {EXTERNAL LOCATION} | String | +| main.rs:3033:26:3033:26 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3035:13:3035:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3035:13:3035:13 | x | E | {EXTERNAL LOCATION} | String | +| main.rs:3035:13:3035:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3035:17:3035:29 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:3035:17:3035:29 | ...::Ok(...) | E | {EXTERNAL LOCATION} | String | +| main.rs:3035:17:3035:29 | ...::Ok(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3035:28:3035:28 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3036:13:3036:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3036:13:3036:13 | x | E | {EXTERNAL LOCATION} | String | +| main.rs:3036:13:3036:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3036:38:3036:38 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3036:38:3036:38 | x | E | {EXTERNAL LOCATION} | String | +| main.rs:3036:38:3036:38 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3037:13:3037:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3037:13:3037:13 | x | E | {EXTERNAL LOCATION} | String | +| main.rs:3037:13:3037:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3037:17:3037:44 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:3037:17:3037:44 | ...::Ok(...) | E | {EXTERNAL LOCATION} | String | +| main.rs:3037:17:3037:44 | ...::Ok(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3037:43:3037:43 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3038:13:3038:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3038:13:3038:13 | x | E | {EXTERNAL LOCATION} | String | +| main.rs:3038:13:3038:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3038:17:3038:44 | ...::Ok::<...>(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:3038:17:3038:44 | ...::Ok::<...>(...) | E | {EXTERNAL LOCATION} | String | +| main.rs:3038:17:3038:44 | ...::Ok::<...>(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3038:43:3038:43 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3040:29:3040:31 | res | | {EXTERNAL LOCATION} | Result | +| main.rs:3040:29:3040:31 | res | E | main.rs:3040:26:3040:26 | E | +| main.rs:3040:29:3040:31 | res | T | main.rs:3040:23:3040:23 | T | +| main.rs:3040:48:3040:48 | x | | main.rs:3040:26:3040:26 | E | +| main.rs:3040:54:3040:55 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3042:13:3042:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3042:13:3042:13 | x | E | {EXTERNAL LOCATION} | bool | +| main.rs:3042:13:3042:13 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3042:17:3042:29 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:3042:17:3042:29 | ...::Ok(...) | E | {EXTERNAL LOCATION} | bool | +| main.rs:3042:17:3042:29 | ...::Ok(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3042:28:3042:28 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3043:9:3043:28 | pin_result(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3043:20:3043:20 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:3043:20:3043:20 | x | E | {EXTERNAL LOCATION} | bool | +| main.rs:3043:20:3043:20 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3043:23:3043:27 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:3045:17:3045:17 | x | | {EXTERNAL LOCATION} | Vec | +| main.rs:3045:17:3045:17 | x | A | {EXTERNAL LOCATION} | Global | +| main.rs:3045:17:3045:17 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3045:21:3045:30 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:3045:21:3045:30 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:3045:21:3045:30 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3046:9:3046:9 | x | | {EXTERNAL LOCATION} | Vec | +| main.rs:3046:9:3046:9 | x | A | {EXTERNAL LOCATION} | Global | +| main.rs:3046:9:3046:9 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3046:9:3046:17 | x.push(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3046:16:3046:16 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3048:13:3048:13 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:3048:17:3048:34 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:3049:9:3049:9 | x | | {EXTERNAL LOCATION} | Vec | +| main.rs:3049:9:3049:9 | x | A | {EXTERNAL LOCATION} | Global | +| main.rs:3049:9:3049:9 | x | T | {EXTERNAL LOCATION} | i32 | +| main.rs:3049:9:3049:17 | x.push(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3049:16:3049:16 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:3056:14:3056:17 | SelfParam | | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3059:14:3059:18 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:3059:14:3059:18 | SelfParam | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3059:21:3059:25 | other | | {EXTERNAL LOCATION} | & | +| main.rs:3059:21:3059:25 | other | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3059:44:3061:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:3059:44:3061:9 | { ... } | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3060:13:3060:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:3060:13:3060:16 | self | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3060:13:3060:20 | self.f() | | {EXTERNAL LOCATION} | & | +| main.rs:3060:13:3060:20 | self.f() | TRef | main.rs:3054:5:3062:5 | Self [trait MyTrait] | +| main.rs:3066:14:3066:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | +| main.rs:3066:28:3068:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:3067:13:3067:16 | self | | {EXTERNAL LOCATION} | i32 | +| main.rs:3073:14:3073:17 | SelfParam | | {EXTERNAL LOCATION} | usize | +| main.rs:3073:28:3075:9 | { ... } | | {EXTERNAL LOCATION} | usize | +| main.rs:3074:13:3074:16 | self | | {EXTERNAL LOCATION} | usize | +| main.rs:3080:14:3080:17 | SelfParam | | {EXTERNAL LOCATION} | & | +| main.rs:3080:14:3080:17 | SelfParam | TRef | main.rs:3078:10:3078:10 | T | +| main.rs:3080:28:3082:9 | { ... } | | {EXTERNAL LOCATION} | & | +| main.rs:3080:28:3082:9 | { ... } | TRef | main.rs:3078:10:3078:10 | T | +| main.rs:3081:13:3081:16 | self | | {EXTERNAL LOCATION} | & | +| main.rs:3081:13:3081:16 | self | TRef | main.rs:3078:10:3078:10 | T | +| main.rs:3085:25:3089:5 | { ... } | | {EXTERNAL LOCATION} | usize | +| main.rs:3086:17:3086:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:3086:17:3086:17 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3086:21:3086:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3086:21:3086:21 | 0 | | {EXTERNAL LOCATION} | usize | +| main.rs:3087:9:3087:9 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:3087:9:3087:9 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3087:9:3087:17 | ... = ... | | {EXTERNAL LOCATION} | () | +| main.rs:3087:13:3087:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:3087:13:3087:13 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3087:13:3087:17 | x.f() | | {EXTERNAL LOCATION} | i32 | +| main.rs:3087:13:3087:17 | x.f() | | {EXTERNAL LOCATION} | usize | +| main.rs:3088:9:3088:9 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:3088:9:3088:9 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3091:12:3099:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3092:13:3092:13 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3092:24:3092:24 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3092:24:3092:24 | 0 | | {EXTERNAL LOCATION} | usize | +| main.rs:3093:13:3093:13 | y | | {EXTERNAL LOCATION} | & | +| main.rs:3093:13:3093:13 | y | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:3093:17:3093:18 | &1 | | {EXTERNAL LOCATION} | & | +| main.rs:3093:17:3093:18 | &1 | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:3093:18:3093:18 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3094:13:3094:13 | z | | {EXTERNAL LOCATION} | & | +| main.rs:3094:13:3094:13 | z | TRef | {EXTERNAL LOCATION} | usize | +| main.rs:3094:17:3094:17 | x | | {EXTERNAL LOCATION} | usize | +| main.rs:3094:17:3094:22 | x.g(...) | | {EXTERNAL LOCATION} | & | +| main.rs:3094:17:3094:22 | x.g(...) | TRef | {EXTERNAL LOCATION} | usize | +| main.rs:3094:21:3094:21 | y | | {EXTERNAL LOCATION} | & | +| main.rs:3094:21:3094:21 | y | TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:3096:13:3096:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:3096:17:3096:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3097:13:3097:13 | y | | {EXTERNAL LOCATION} | usize | +| main.rs:3097:24:3097:24 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:3097:24:3097:24 | 1 | | {EXTERNAL LOCATION} | usize | +| main.rs:3098:13:3098:13 | z | | {EXTERNAL LOCATION} | i32 | +| main.rs:3098:17:3098:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:3098:17:3098:24 | x.max(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:3098:23:3098:23 | y | | {EXTERNAL LOCATION} | usize | +| main.rs:3107:11:3142:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:3108:5:3108:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3109:5:3109:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:3110:5:3110:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:3110:20:3110:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:3110:41:3110:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:3111:5:3111:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3112:5:3112:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3113:5:3113:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3114:5:3114:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3115:5:3115:33 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3116:5:3116:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3117:5:3117:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3118:5:3118:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3119:5:3119:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3120:5:3120:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3121:5:3121:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3122:5:3122:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3123:5:3123:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3124:5:3124:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3125:5:3125:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3126:5:3126:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3127:5:3127:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:3127:5:3127:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:3128:5:3128:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3129:5:3129:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3130:5:3130:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3131:5:3131:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3132:5:3132:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3133:5:3133:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3134:5:3134:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3135:5:3135:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3136:5:3136:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3137:5:3137:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3138:5:3138:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3139:5:3139:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:3140:5:3140:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:3140:5:3140:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:3140:5:3140:20 | ...::f(...) | T | main.rs:2911:5:2913:5 | dyn MyTrait | +| main.rs:3140:5:3140:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:3140:16:3140:19 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:3141:5:3141:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:13:26:133:1 | { ... } | | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:13:26:133:1 | { ... } | T | file://:0:0:0:0 | () | +| pattern_matching.rs:13:26:133:1 | { ... } | T | {EXTERNAL LOCATION} | () | | pattern_matching.rs:14:9:14:13 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:14:9:14:13 | value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:14:17:14:24 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:14:17:14:24 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:14:22:14:23 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:15:5:18:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:15:5:18:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:15:12:15:21 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:15:12:15:21 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:15:17:15:20 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:15:25:15:29 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:15:25:15:29 | value | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:15:31:18:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:15:31:18:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:16:13:16:16 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:16:20:16:23 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:17:18:17:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:17:18:17:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:17:18:17:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:17:18:17:25 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:17:18:17:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:17:18:17:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:17:20:17:23 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:19:5:25:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:19:5:25:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:19:11:19:15 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:19:11:19:15 | value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:20:9:20:18 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:20:9:20:18 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:20:14:20:17 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:20:23:23:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:20:23:23:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:21:17:21:20 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:21:24:21:27 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:22:22:22:29 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:22:22:22:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:22:22:22:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:22:22:22:29 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:22:22:22:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:22:22:22:29 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:22:24:22:27 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:24:9:24:12 | None | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:24:9:24:12 | None | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:24:17:24:18 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:24:17:24:18 | TupleExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:26:9:26:12 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:26:16:26:20 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:26:16:26:20 | value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:26:16:26:29 | value.unwrap() | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:27:9:27:12 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:27:16:27:19 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:28:14:28:21 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:28:14:28:21 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:28:14:28:21 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:28:14:28:21 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:28:14:28:21 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:28:14:28:21 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:28:16:28:19 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:29:9:29:12 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:29:16:29:20 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:29:16:29:20 | value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:29:16:29:21 | TryExpr | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:30:14:30:21 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:30:14:30:21 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:30:14:30:21 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:30:14:30:21 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:30:14:30:21 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:30:14:30:21 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:30:16:30:19 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:32:9:32:14 | value2 | | file://:0:0:0:0 | & | -| pattern_matching.rs:32:9:32:14 | value2 | &T | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:32:9:32:14 | value2 | &T.T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:32:18:32:26 | &... | | file://:0:0:0:0 | & | -| pattern_matching.rs:32:18:32:26 | &... | &T | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:32:18:32:26 | &... | &T.T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:32:9:32:14 | value2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:32:9:32:14 | value2 | TRef | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:32:9:32:14 | value2 | TRef.T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:32:18:32:26 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:32:18:32:26 | &... | TRef | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:32:18:32:26 | &... | TRef.T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:32:19:32:26 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:32:19:32:26 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:32:24:32:25 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:33:5:36:5 | if ... {...} | | file://:0:0:0:0 | () | -| pattern_matching.rs:33:12:33:22 | &... | | file://:0:0:0:0 | & | -| pattern_matching.rs:33:12:33:22 | &... | &T | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:33:12:33:22 | &... | &T.T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:33:5:36:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:33:12:33:22 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:33:12:33:22 | &... | TRef | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:33:12:33:22 | &... | TRef.T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:33:13:33:22 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:33:13:33:22 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:33:18:33:21 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:33:26:33:31 | value2 | | file://:0:0:0:0 | & | -| pattern_matching.rs:33:26:33:31 | value2 | &T | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:33:26:33:31 | value2 | &T.T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:33:33:36:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:33:26:33:31 | value2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:33:26:33:31 | value2 | TRef | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:33:26:33:31 | value2 | TRef.T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:33:33:36:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:34:13:34:16 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:34:20:34:23 | mesg | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:35:18:35:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:35:18:35:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:35:18:35:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:35:18:35:25 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:35:18:35:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:35:18:35:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:35:20:35:23 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:38:9:38:14 | value3 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:38:18:38:19 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:39:5:42:5 | if ... {...} | | file://:0:0:0:0 | () | -| pattern_matching.rs:39:16:39:19 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:39:16:39:19 | mesg | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:39:5:42:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:39:16:39:19 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:39:16:39:19 | mesg | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:39:23:39:28 | value3 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:39:30:42:5 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:40:13:40:16 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:40:13:40:16 | mesg | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:40:20:40:23 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:40:20:40:23 | mesg | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:41:18:41:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:41:18:41:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:41:18:41:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:41:18:41:25 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:41:20:41:23 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:41:20:41:23 | mesg | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:39:30:42:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:40:13:40:16 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:40:13:40:16 | mesg | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:40:20:40:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:40:20:40:23 | mesg | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:41:18:41:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:41:18:41:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:41:20:41:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:41:20:41:23 | mesg | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:44:9:44:14 | value4 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:44:9:44:14 | value4 | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:44:18:44:25 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:44:18:44:25 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:44:23:44:24 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:45:5:48:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:45:5:48:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:45:12:45:25 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:45:12:45:25 | Some(...) | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:45:21:45:24 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:45:21:45:24 | mesg | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:45:21:45:24 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:45:21:45:24 | mesg | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:45:29:45:34 | value4 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:45:29:45:34 | value4 | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:45:36:48:5 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:46:13:46:16 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:46:13:46:16 | mesg | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:46:20:46:23 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:46:20:46:23 | mesg | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:47:18:47:25 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:47:18:47:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:47:18:47:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:47:18:47:25 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:47:20:47:23 | mesg | | file://:0:0:0:0 | & | -| pattern_matching.rs:47:20:47:23 | mesg | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:50:13:50:18 | value5 | | file://:0:0:0:0 | & | -| pattern_matching.rs:50:13:50:18 | value5 | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:45:36:48:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:46:13:46:16 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:46:13:46:16 | mesg | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:46:20:46:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:46:20:46:23 | mesg | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:47:18:47:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:47:20:47:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:47:20:47:23 | mesg | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:50:13:50:18 | value5 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:50:13:50:18 | value5 | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:50:22:50:23 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:51:9:51:9 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:51:9:51:9 | x | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:51:13:51:18 | value5 | | file://:0:0:0:0 | & | -| pattern_matching.rs:51:13:51:18 | value5 | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:51:9:51:9 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:51:9:51:9 | x | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:51:13:51:18 | value5 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:51:13:51:18 | value5 | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:53:9:53:24 | my_record_struct | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:53:9:53:24 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:53:9:53:24 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool | @@ -6686,7 +11267,7 @@ inferType | pattern_matching.rs:53:28:56:5 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:54:17:54:18 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:55:17:55:21 | false | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:57:5:61:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:57:5:61:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:57:12:57:44 | MyRecordStruct {...} | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:57:12:57:44 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:57:12:57:44 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | bool | @@ -6695,12 +11276,12 @@ inferType | pattern_matching.rs:57:48:57:63 | my_record_struct | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:57:48:57:63 | my_record_struct | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:57:48:57:63 | my_record_struct | T2 | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:57:65:61:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:57:65:61:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:58:13:58:13 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:58:17:58:22 | value1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:59:13:59:13 | y | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:59:17:59:22 | value2 | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:60:9:60:10 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:60:9:60:10 | TupleExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:63:9:63:23 | my_tuple_struct | | pattern_matching.rs:6:1:6:37 | MyTupleStruct | | pattern_matching.rs:63:9:63:23 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:63:9:63:23 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool | @@ -6709,7 +11290,7 @@ inferType | pattern_matching.rs:63:27:63:50 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:63:41:63:42 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:63:45:63:49 | false | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:64:5:68:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:64:5:68:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:64:12:64:40 | MyTupleStruct(...) | | pattern_matching.rs:6:1:6:37 | MyTupleStruct | | pattern_matching.rs:64:12:64:40 | MyTupleStruct(...) | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:64:12:64:40 | MyTupleStruct(...) | T2 | {EXTERNAL LOCATION} | bool | @@ -6718,12 +11299,12 @@ inferType | pattern_matching.rs:64:44:64:58 | my_tuple_struct | | pattern_matching.rs:6:1:6:37 | MyTupleStruct | | pattern_matching.rs:64:44:64:58 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:64:44:64:58 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:64:60:68:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:64:60:68:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:65:13:65:13 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:65:17:65:22 | value1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:66:13:66:13 | y | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:66:17:66:22 | value2 | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:67:9:67:10 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:67:9:67:10 | TupleExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:70:9:70:16 | my_enum1 | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:70:9:70:16 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:70:9:70:16 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool | @@ -6732,7 +11313,7 @@ inferType | pattern_matching.rs:70:20:73:5 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:71:17:71:18 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:72:17:72:21 | false | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:74:5:85:5 | match my_enum1 { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:74:5:85:5 | match my_enum1 { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:74:11:74:18 | my_enum1 | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:74:11:74:18 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:74:11:74:18 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool | @@ -6741,656 +11322,591 @@ inferType | pattern_matching.rs:75:9:75:43 | ...::Variant1 {...} | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:75:28:75:33 | value1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:75:36:75:41 | value2 | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:75:48:79:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:75:48:79:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:76:17:76:17 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:76:21:76:26 | value1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:77:17:77:17 | y | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:77:21:77:26 | value2 | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:78:13:78:14 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:78:13:78:14 | TupleExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:80:9:80:40 | ...::Variant2(...) | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:80:9:80:40 | ...::Variant2(...) | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:80:9:80:40 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:80:26:80:31 | value1 | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:80:34:80:39 | value2 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:80:45:84:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:80:45:84:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:81:17:81:17 | x | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:81:21:81:26 | value1 | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:82:17:82:17 | y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:82:21:82:26 | value2 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:83:13:83:14 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:83:13:83:14 | TupleExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:87:9:87:22 | my_nested_enum | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:87:9:87:22 | my_nested_enum | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:87:9:87:22 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:87:9:87:22 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & | -| pattern_matching.rs:87:9:87:22 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:87:9:87:22 | my_nested_enum | T1.T2 | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:87:9:87:22 | my_nested_enum | T1.T2.TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:87:9:87:22 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & | -| pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | T1.T2 | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | T1.T2.TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:87:26:93:5 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:88:9:88:13 | false | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:89:9:92:9 | MyRecordStruct {...} | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:89:9:92:9 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:89:9:92:9 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & | -| pattern_matching.rs:89:9:92:9 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:89:9:92:9 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:89:9:92:9 | MyRecordStruct {...} | T2.TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:90:21:90:22 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:91:21:91:28 | "string" | | file://:0:0:0:0 | & | -| pattern_matching.rs:91:21:91:28 | "string" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:95:5:109:5 | match my_nested_enum { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:91:21:91:28 | "string" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:91:21:91:28 | "string" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:95:5:109:5 | match my_nested_enum { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:95:11:95:24 | my_nested_enum | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:95:11:95:24 | my_nested_enum | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:95:11:95:24 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:95:11:95:24 | my_nested_enum | T1.T2 | file://:0:0:0:0 | & | -| pattern_matching.rs:95:11:95:24 | my_nested_enum | T1.T2.&T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:95:11:95:24 | my_nested_enum | T1.T2 | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:95:11:95:24 | my_nested_enum | T1.T2.TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:95:11:95:24 | my_nested_enum | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | T1.T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | T1.T2 | file://:0:0:0:0 | & | -| pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | T1.T2.&T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | T1.T2 | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | T1.T2.TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:96:9:102:9 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:97:13:97:18 | value1 | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:98:13:101:13 | MyRecordStruct {...} | | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:98:13:101:13 | MyRecordStruct {...} | T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:98:13:101:13 | MyRecordStruct {...} | T2 | file://:0:0:0:0 | & | -| pattern_matching.rs:98:13:101:13 | MyRecordStruct {...} | T2.&T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:98:13:101:13 | MyRecordStruct {...} | T2 | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:98:13:101:13 | MyRecordStruct {...} | T2.TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:99:25:99:25 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:100:25:100:25 | y | | file://:0:0:0:0 | & | -| pattern_matching.rs:100:25:100:25 | y | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:102:14:107:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:100:25:100:25 | y | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:100:25:100:25 | y | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:102:14:107:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:103:17:103:17 | a | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:103:21:103:26 | value1 | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:104:17:104:17 | b | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:104:21:104:21 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:105:17:105:17 | c | | file://:0:0:0:0 | & | -| pattern_matching.rs:105:17:105:17 | c | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:105:21:105:21 | y | | file://:0:0:0:0 | & | -| pattern_matching.rs:105:21:105:21 | y | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:106:13:106:14 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:105:17:105:17 | c | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:105:17:105:17 | c | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:105:21:105:21 | y | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:105:21:105:21 | y | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:106:13:106:14 | TupleExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:108:9:108:9 | _ | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:108:9:108:9 | _ | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:108:9:108:9 | _ | T1.T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:108:9:108:9 | _ | T1.T2 | file://:0:0:0:0 | & | -| pattern_matching.rs:108:9:108:9 | _ | T1.T2.&T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:108:9:108:9 | _ | T1.T2 | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:108:9:108:9 | _ | T1.T2.TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:108:9:108:9 | _ | T2 | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:108:14:108:15 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:108:14:108:15 | TupleExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:111:9:111:12 | opt1 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:111:9:111:12 | opt1 | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:111:16:111:39 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:111:16:111:39 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:111:21:111:38 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:113:9:113:9 | _ | | file://:0:0:0:0 | () | -| pattern_matching.rs:113:13:116:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:113:9:113:9 | _ | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:113:13:116:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:113:20:113:33 | Some::<...>(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:113:20:113:33 | Some::<...>(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:113:32:113:32 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:113:37:113:40 | opt1 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:113:37:113:40 | opt1 | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:114:5:116:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:114:5:116:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:115:9:115:9 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:118:9:118:12 | opt2 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:118:9:118:12 | opt2 | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:118:16:118:39 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:118:16:118:39 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:118:21:118:38 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:120:9:120:9 | _ | | file://:0:0:0:0 | () | -| pattern_matching.rs:120:13:123:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:120:9:120:9 | _ | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:120:13:123:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:120:20:120:41 | ...::Some::<...>(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:120:20:120:41 | ...::Some::<...>(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:120:40:120:40 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:120:45:120:48 | opt2 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:120:45:120:48 | opt2 | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:121:5:123:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:121:5:123:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:122:9:122:9 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:125:9:125:12 | opt3 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:125:9:125:12 | opt3 | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:125:16:125:39 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:125:16:125:39 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:125:21:125:38 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:127:9:127:9 | _ | | file://:0:0:0:0 | () | -| pattern_matching.rs:127:13:130:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:127:9:127:9 | _ | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:127:13:130:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:127:20:127:41 | ...::Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:127:20:127:41 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:127:40:127:40 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:127:45:127:48 | opt3 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:127:45:127:48 | opt3 | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:128:5:130:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:128:5:130:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:129:9:129:9 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:132:5:132:8 | None | | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:132:5:132:8 | None | T | file://:0:0:0:0 | () | -| pattern_matching.rs:168:27:217:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:132:5:132:8 | None | T | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:168:27:217:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:169:9:169:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:169:17:169:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:171:5:186:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:171:5:186:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:171:11:171:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:173:9:173:10 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:173:15:176:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:173:15:176:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:174:17:174:29 | literal_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:174:33:174:37 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:175:22:175:57 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:175:22:175:57 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:175:22:175:57 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:175:22:175:57 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:175:22:175:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:175:22:175:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:175:45:175:57 | literal_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:177:10:177:10 | 1 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:177:15:180:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:177:15:180:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:178:17:178:32 | negative_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:178:36:178:40 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:179:22:179:61 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:179:22:179:61 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:179:22:179:61 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:179:22:179:61 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:179:22:179:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:179:22:179:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:179:46:179:61 | negative_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:181:9:181:9 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:181:14:184:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:181:14:184:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:182:17:182:28 | zero_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:182:32:182:36 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:183:22:183:53 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:183:22:183:53 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:183:22:183:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:183:22:183:53 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:183:22:183:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:183:22:183:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:183:42:183:53 | zero_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:185:9:185:9 | _ | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:185:14:185:15 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:185:14:185:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:188:9:188:17 | float_val | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:188:21:188:27 | 3.14f64 | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:189:5:195:5 | match float_val { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:189:5:195:5 | match float_val { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:189:11:189:19 | float_val | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:190:9:190:12 | 3.14 | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:190:17:193:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:190:17:193:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:191:17:191:24 | pi_match | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:191:28:191:36 | float_val | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:192:22:192:47 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:192:22:192:47 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:192:22:192:47 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:192:22:192:47 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:192:22:192:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:192:22:192:47 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:192:40:192:47 | pi_match | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:194:9:194:9 | _ | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:194:14:194:15 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:197:9:197:18 | string_val | | file://:0:0:0:0 | & | -| pattern_matching.rs:197:9:197:18 | string_val | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:197:22:197:28 | "hello" | | file://:0:0:0:0 | & | -| pattern_matching.rs:197:22:197:28 | "hello" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:198:5:204:5 | match string_val { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:198:11:198:20 | string_val | | file://:0:0:0:0 | & | -| pattern_matching.rs:198:11:198:20 | string_val | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:199:9:199:15 | "hello" | | file://:0:0:0:0 | & | -| pattern_matching.rs:199:9:199:15 | "hello" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:199:20:202:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:200:17:200:27 | hello_match | | file://:0:0:0:0 | & | -| pattern_matching.rs:200:17:200:27 | hello_match | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:200:31:200:40 | string_val | | file://:0:0:0:0 | & | -| pattern_matching.rs:200:31:200:40 | string_val | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:201:22:201:54 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:201:22:201:54 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:201:22:201:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:201:22:201:54 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:201:44:201:54 | hello_match | | file://:0:0:0:0 | & | -| pattern_matching.rs:201:44:201:54 | hello_match | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:203:9:203:9 | _ | | file://:0:0:0:0 | & | -| pattern_matching.rs:203:9:203:9 | _ | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:203:14:203:15 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:194:14:194:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:197:9:197:18 | string_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:197:9:197:18 | string_val | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:197:22:197:28 | "hello" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:197:22:197:28 | "hello" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:198:5:204:5 | match string_val { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:198:11:198:20 | string_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:198:11:198:20 | string_val | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:199:9:199:15 | "hello" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:199:9:199:15 | "hello" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:199:20:202:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:200:17:200:27 | hello_match | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:200:17:200:27 | hello_match | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:200:31:200:40 | string_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:200:31:200:40 | string_val | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:201:22:201:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:201:22:201:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:201:44:201:54 | hello_match | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:201:44:201:54 | hello_match | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:203:9:203:9 | _ | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:203:9:203:9 | _ | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:203:14:203:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:206:9:206:16 | bool_val | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:206:20:206:23 | true | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:207:5:216:5 | match bool_val { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:207:5:216:5 | match bool_val { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:207:11:207:18 | bool_val | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:208:9:208:12 | true | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:208:17:211:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:208:17:211:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:209:17:209:26 | true_match | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:209:30:209:37 | bool_val | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:210:22:210:51 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:210:22:210:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:210:22:210:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:210:22:210:51 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:210:22:210:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:210:22:210:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:210:42:210:51 | true_match | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:212:9:212:13 | false | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:212:18:215:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:212:18:215:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:213:17:213:27 | false_match | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:213:31:213:38 | bool_val | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:214:22:214:53 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:214:22:214:53 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:214:22:214:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:214:22:214:53 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:214:22:214:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:214:22:214:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:214:43:214:53 | false_match | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:219:30:277:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:219:30:277:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:220:9:220:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:220:17:220:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:223:5:228:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:223:5:228:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:223:11:223:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:224:9:224:9 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:224:14:227:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:224:14:227:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:225:17:225:27 | bound_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:225:31:225:31 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:226:22:226:58 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:226:22:226:58 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:226:22:226:58 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:226:22:226:58 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:226:22:226:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:226:22:226:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:226:48:226:58 | bound_value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:231:5:236:5 | match ... { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:231:11:231:16 | &value | | file://:0:0:0:0 | & | -| pattern_matching.rs:231:11:231:16 | &value | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:231:5:236:5 | match ... { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:231:11:231:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:231:11:231:16 | &value | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:231:12:231:16 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:232:13:232:13 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:232:13:232:13 | x | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:232:13:232:13 | x | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:232:18:235:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:233:17:233:25 | ref_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:233:17:233:25 | ref_bound | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:233:17:233:25 | ref_bound | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:233:29:233:29 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:233:29:233:29 | x | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:233:29:233:29 | x | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:234:22:234:60 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:234:22:234:60 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:234:22:234:60 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:234:22:234:60 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:234:52:234:60 | ref_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:234:52:234:60 | ref_bound | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:234:52:234:60 | ref_bound | &T.&T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:232:13:232:13 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:232:13:232:13 | x | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:232:13:232:13 | x | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:232:18:235:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:233:17:233:25 | ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:233:17:233:25 | ref_bound | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:233:17:233:25 | ref_bound | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:233:29:233:29 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:233:29:233:29 | x | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:233:29:233:29 | x | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:234:22:234:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:234:22:234:60 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:234:52:234:60 | ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:234:52:234:60 | ref_bound | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:234:52:234:60 | ref_bound | TRef.TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:239:13:239:25 | mutable_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:239:29:239:33 | 10i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:240:5:246:5 | match mutable_value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:240:5:246:5 | match mutable_value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:240:11:240:23 | mutable_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:241:13:241:13 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:241:18:245:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:241:18:245:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:242:17:242:25 | mut_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:242:29:242:29 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:243:13:243:13 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:243:13:243:18 | ... += ... | | file://:0:0:0:0 | () | +| pattern_matching.rs:243:13:243:18 | ... += ... | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:243:18:243:18 | 1 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:244:22:244:56 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:244:22:244:56 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:244:22:244:56 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:244:22:244:56 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:244:22:244:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:244:22:244:56 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:244:48:244:56 | mut_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:249:9:249:20 | option_value | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:249:9:249:20 | option_value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:249:24:249:44 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:249:24:249:44 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:249:39:249:43 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:250:5:266:5 | match option_value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:250:5:266:5 | match option_value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:250:11:250:22 | option_value | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:250:11:250:22 | option_value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:251:9:251:30 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:251:9:251:30 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:251:24:251:24 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:251:28:251:29 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:251:35:254:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:251:35:254:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:252:17:252:24 | at_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:252:28:252:28 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:253:22:253:59 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:253:22:253:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:253:22:253:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:253:22:253:59 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:253:22:253:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:253:22:253:59 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:253:52:253:59 | at_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:255:9:255:35 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:255:9:255:35 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:255:24:255:24 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:255:28:255:28 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:255:32:255:34 | 100 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:255:40:258:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:255:40:258:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:256:17:256:30 | range_at_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:256:34:256:34 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:257:22:257:63 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:257:22:257:63 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:257:22:257:63 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:257:22:257:63 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:257:22:257:63 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:257:22:257:63 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:257:50:257:63 | range_at_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:259:9:259:25 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:259:9:259:25 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:259:24:259:24 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:259:30:262:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:259:30:262:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:260:17:260:26 | some_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:260:30:260:30 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:261:22:261:49 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:261:22:261:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:261:22:261:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:261:22:261:49 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:261:22:261:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:261:22:261:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:261:40:261:49 | some_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:263:9:263:22 | ...::None | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:263:9:263:22 | ...::None | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:263:27:265:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:264:22:264:33 | "None value\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:264:22:264:33 | "None value\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:264:22:264:33 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:264:22:264:33 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:264:22:264:33 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:264:22:264:33 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:263:27:265:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:264:22:264:33 | "None value\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:264:22:264:33 | "None value\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:264:22:264:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:264:22:264:33 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:269:13:269:23 | ref_mut_val | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:269:27:269:30 | 5i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:270:5:276:5 | match ... { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | | file://:0:0:0:0 | & | -| pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:270:5:276:5 | match ... { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | TRefMut | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:270:16:270:26 | ref_mut_val | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:271:17:271:17 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:271:17:271:17 | x | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:271:17:271:17 | x | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:271:22:275:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:272:17:272:29 | ref_mut_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:272:17:272:29 | ref_mut_bound | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:272:17:272:29 | ref_mut_bound | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:272:33:272:33 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:272:33:272:33 | x | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:272:33:272:33 | x | &T.&T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:271:17:271:17 | x | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:271:17:271:17 | x | TRefMut | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:271:17:271:17 | x | TRefMut.TRefMut | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:271:22:275:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:272:17:272:29 | ref_mut_bound | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:272:17:272:29 | ref_mut_bound | TRefMut | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:272:17:272:29 | ref_mut_bound | TRefMut.TRefMut | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:272:33:272:33 | x | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:272:33:272:33 | x | TRefMut | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:272:33:272:33 | x | TRefMut.TRefMut | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:13:273:27 | * ... | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:273:13:273:32 | ... += ... | | file://:0:0:0:0 | () | -| pattern_matching.rs:273:14:273:27 | * ... | | file://:0:0:0:0 | & | -| pattern_matching.rs:273:14:273:27 | * ... | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:273:15:273:27 | ref_mut_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:273:15:273:27 | ref_mut_bound | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:273:15:273:27 | ref_mut_bound | &T.&T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:273:13:273:32 | ... += ... | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:273:14:273:27 | * ... | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:273:14:273:27 | * ... | TRefMut | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:273:15:273:27 | ref_mut_bound | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:273:15:273:27 | ref_mut_bound | TRefMut | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:273:15:273:27 | ref_mut_bound | TRefMut.TRefMut | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:273:32:273:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:274:22:274:38 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:274:22:274:38 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:274:22:274:38 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:274:22:274:38 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:279:28:290:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:274:22:274:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:274:22:274:38 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:279:28:290:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:280:9:280:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:280:17:280:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:282:5:289:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:282:5:289:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:282:11:282:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:283:9:283:10 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:283:15:283:40 | MacroExpr | | file://:0:0:0:0 | () | -| pattern_matching.rs:283:24:283:39 | "Specific match\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:283:24:283:39 | "Specific match\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:283:24:283:39 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:283:24:283:39 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:283:24:283:39 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:283:24:283:39 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:283:15:283:40 | MacroExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:283:24:283:39 | "Specific match\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:283:24:283:39 | "Specific match\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:283:24:283:39 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:283:24:283:39 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:285:9:285:9 | _ | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:285:14:288:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:285:14:288:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:286:17:286:32 | wildcard_context | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:286:36:286:40 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:287:22:287:65 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:287:22:287:65 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:287:22:287:65 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:287:22:287:65 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:287:22:287:65 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:287:22:287:65 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:287:50:287:65 | wildcard_context | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:292:25:324:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:292:25:324:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:293:9:293:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:293:17:293:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:295:5:310:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:295:5:310:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:295:11:295:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:297:9:297:9 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:297:9:297:14 | RangePat | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:297:13:297:14 | 10 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:297:19:300:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:297:19:300:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:298:17:298:31 | range_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:298:35:298:39 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:299:22:299:59 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:299:22:299:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:299:22:299:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:299:22:299:59 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:299:22:299:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:299:22:299:59 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:299:45:299:59 | range_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:301:9:301:10 | 11 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:301:9:301:12 | RangePat | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:301:17:304:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:301:17:304:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:302:17:302:26 | range_from | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:302:30:302:34 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:303:22:303:52 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:303:22:303:52 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:303:22:303:52 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:303:22:303:52 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:303:22:303:52 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:303:22:303:52 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:303:43:303:52 | range_from | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:305:9:305:12 | RangePat | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:305:12:305:12 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:305:17:308:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:305:17:308:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:306:17:306:34 | range_to_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:306:38:306:42 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:307:22:307:67 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:307:22:307:67 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:307:22:307:67 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:307:22:307:67 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:307:22:307:67 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:307:22:307:67 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:307:50:307:67 | range_to_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:309:9:309:9 | _ | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:309:14:309:15 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:309:14:309:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:312:9:312:16 | char_val | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:312:20:312:22 | 'c' | | {EXTERNAL LOCATION} | char | -| pattern_matching.rs:313:5:323:5 | match char_val { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:313:5:323:5 | match char_val { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:313:11:313:18 | char_val | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:314:9:314:11 | 'a' | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:314:9:314:17 | RangePat | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:314:15:314:17 | 'z' | | {EXTERNAL LOCATION} | char | -| pattern_matching.rs:314:22:317:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:314:22:317:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:315:17:315:30 | lowercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:315:34:315:41 | char_val | | {EXTERNAL LOCATION} | char | -| pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:316:22:316:57 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:316:22:316:57 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:316:22:316:57 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:316:22:316:57 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:316:22:316:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:316:22:316:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:316:44:316:57 | lowercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:318:9:318:11 | 'A' | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:318:9:318:17 | RangePat | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:318:15:318:17 | 'Z' | | {EXTERNAL LOCATION} | char | -| pattern_matching.rs:318:22:321:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:318:22:321:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:319:17:319:30 | uppercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:319:34:319:41 | char_val | | {EXTERNAL LOCATION} | char | -| pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:320:22:320:57 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:320:22:320:57 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:320:22:320:57 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:320:22:320:57 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:320:22:320:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:320:22:320:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:320:44:320:57 | uppercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:322:9:322:9 | _ | | {EXTERNAL LOCATION} | char | -| pattern_matching.rs:322:14:322:15 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:326:29:355:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:322:14:322:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:326:29:355:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:327:9:327:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:327:17:327:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:328:13:328:25 | mutable_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:328:29:328:33 | 10i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:331:5:340:5 | match ... { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:331:11:331:16 | &value | | file://:0:0:0:0 | & | -| pattern_matching.rs:331:11:331:16 | &value | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:331:5:340:5 | match ... { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:331:11:331:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:331:11:331:16 | &value | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:331:12:331:16 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:332:9:332:11 | &42 | | file://:0:0:0:0 | & | -| pattern_matching.rs:332:9:332:11 | &42 | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:332:9:332:11 | &42 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:332:9:332:11 | &42 | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:332:10:332:11 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:332:16:335:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:332:16:335:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:333:17:333:27 | deref_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:333:31:333:35 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:334:22:334:58 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:334:22:334:58 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:334:22:334:58 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:334:22:334:58 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:334:22:334:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:334:22:334:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:334:48:334:58 | deref_match | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:336:9:336:10 | &... | | file://:0:0:0:0 | & | -| pattern_matching.rs:336:9:336:10 | &... | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:336:9:336:10 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:336:9:336:10 | &... | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:336:10:336:10 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:336:15:339:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:336:15:339:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:337:17:337:27 | deref_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:337:31:337:31 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:338:22:338:60 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:338:22:338:60 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:338:22:338:60 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:338:22:338:60 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:338:22:338:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:338:22:338:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:338:50:338:60 | deref_bound | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:342:5:347:5 | match ... { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:342:11:342:28 | &mut mutable_value | | file://:0:0:0:0 | & | -| pattern_matching.rs:342:11:342:28 | &mut mutable_value | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:342:5:347:5 | match ... { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:342:11:342:28 | &mut mutable_value | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:342:11:342:28 | &mut mutable_value | TRefMut | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:342:16:342:28 | mutable_value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:343:9:343:18 | &mut ... | | file://:0:0:0:0 | & | -| pattern_matching.rs:343:9:343:18 | &mut ... | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:343:18:343:18 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:343:18:343:18 | x | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:343:23:346:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:344:17:344:29 | mut_ref_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:344:17:344:29 | mut_ref_bound | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:344:33:344:33 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:344:33:344:33 | x | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:345:22:345:61 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:345:22:345:61 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:345:22:345:61 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:345:22:345:61 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:345:49:345:61 | mut_ref_bound | | file://:0:0:0:0 | & | -| pattern_matching.rs:345:49:345:61 | mut_ref_bound | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:349:5:354:5 | match ... { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:349:11:349:16 | &value | | file://:0:0:0:0 | & | -| pattern_matching.rs:349:11:349:16 | &value | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:343:9:343:18 | &mut ... | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:343:9:343:18 | &mut ... | TRefMut | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:343:18:343:18 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:343:18:343:18 | x | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:343:23:346:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:344:17:344:29 | mut_ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:344:17:344:29 | mut_ref_bound | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:344:33:344:33 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:344:33:344:33 | x | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:345:22:345:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:345:22:345:61 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:345:49:345:61 | mut_ref_bound | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:345:49:345:61 | mut_ref_bound | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:349:5:354:5 | match ... { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:349:11:349:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:349:11:349:16 | &value | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:349:12:349:16 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:350:13:350:13 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:350:13:350:13 | x | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:350:13:350:13 | x | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:350:18:353:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:351:17:351:27 | ref_pattern | | file://:0:0:0:0 | & | -| pattern_matching.rs:351:17:351:27 | ref_pattern | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:351:17:351:27 | ref_pattern | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:351:31:351:31 | x | | file://:0:0:0:0 | & | -| pattern_matching.rs:351:31:351:31 | x | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:351:31:351:31 | x | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:352:22:352:57 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:352:22:352:57 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:352:22:352:57 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:352:22:352:57 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:352:47:352:57 | ref_pattern | | file://:0:0:0:0 | & | -| pattern_matching.rs:352:47:352:57 | ref_pattern | &T | file://:0:0:0:0 | & | -| pattern_matching.rs:352:47:352:57 | ref_pattern | &T.&T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:357:26:398:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:350:13:350:13 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:350:13:350:13 | x | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:350:13:350:13 | x | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:350:18:353:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:351:17:351:27 | ref_pattern | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:351:17:351:27 | ref_pattern | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:351:17:351:27 | ref_pattern | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:351:31:351:31 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:351:31:351:31 | x | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:351:31:351:31 | x | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:352:22:352:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:352:22:352:57 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:352:47:352:57 | ref_pattern | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:352:47:352:57 | ref_pattern | TRef | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:352:47:352:57 | ref_pattern | TRef.TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:357:26:398:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:358:9:358:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:358:17:358:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:358:28:358:29 | 10 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:358:35:358:36 | 20 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:361:5:380:5 | match point { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:361:5:380:5 | match point { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:361:11:361:15 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:362:9:362:28 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:362:20:362:20 | 0 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:362:26:362:26 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:362:33:365:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:362:33:365:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:363:17:363:22 | origin | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:363:26:363:30 | point | | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:364:22:364:49 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:364:22:364:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:364:22:364:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:364:22:364:49 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:364:22:364:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:364:22:364:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:364:44:364:49 | origin | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:366:9:366:25 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:366:17:366:17 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:366:23:366:23 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:366:30:370:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:366:30:370:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:367:17:367:24 | x_axis_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:367:28:367:28 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:368:17:368:28 | x_axis_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:368:32:368:36 | point | | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | | file://:0:0:0:0 | & | -| pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:369:22:369:80 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:369:22:369:80 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:369:22:369:80 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:369:22:369:80 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:369:22:369:80 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:369:22:369:80 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:369:59:369:66 | x_axis_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:369:69:369:80 | x_axis_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:371:9:371:27 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:371:20:371:21 | 10 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:371:32:374:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:371:32:374:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:372:17:372:27 | ten_x_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:372:31:372:35 | point | | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:373:22:373:57 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:373:22:373:57 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:373:22:373:57 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:373:22:373:57 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:373:22:373:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:373:22:373:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:373:47:373:57 | ten_x_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:375:9:375:22 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:375:17:375:17 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:375:20:375:20 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:375:27:379:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:375:27:379:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:376:17:376:25 | general_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:376:29:376:29 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:377:17:377:25 | general_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:377:29:377:29 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:378:22:378:68 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:378:22:378:68 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:378:22:378:68 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:378:22:378:68 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:378:22:378:68 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:378:22:378:68 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:378:49:378:57 | general_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:378:60:378:68 | general_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:383:9:383:13 | shape | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:383:17:386:5 | ...::Rectangle {...} | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:384:16:384:19 | 10.0 | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:385:17:385:20 | 20.0 | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:387:5:397:5 | match shape { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:387:5:397:5 | match shape { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:387:11:387:15 | shape | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:388:9:391:9 | ...::Rectangle {...} | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:389:20:389:20 | w | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:390:21:390:21 | h | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:391:14:395:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:391:14:395:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:392:17:392:26 | rect_width | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:392:30:392:30 | w | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:393:17:393:27 | rect_height | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:393:31:393:31 | h | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:394:22:394:64 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:394:22:394:64 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:394:22:394:64 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:394:22:394:64 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:394:22:394:64 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:394:22:394:64 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:394:42:394:51 | rect_width | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:394:54:394:64 | rect_height | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:396:9:396:9 | _ | | pattern_matching.rs:145:1:150:1 | Shape | -| pattern_matching.rs:396:14:396:15 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:400:32:441:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:396:14:396:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:400:32:441:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:401:9:401:13 | color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:401:17:401:34 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:401:23:401:25 | 255 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:401:23:401:25 | 255 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:401:28:401:30 | 128 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:401:28:401:30 | 128 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:401:33:401:33 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:401:33:401:33 | 0 | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:404:5:418:5 | match color { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:404:5:418:5 | match color { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:404:11:404:15 | color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:405:9:405:24 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:405:15:405:17 | 255 | | {EXTERNAL LOCATION} | i32 | @@ -7399,153 +11915,141 @@ inferType | pattern_matching.rs:405:20:405:20 | 0 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:405:23:405:23 | 0 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:405:23:405:23 | 0 | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:405:29:408:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:405:29:408:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:406:17:406:25 | red_color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:406:29:406:33 | color | | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:407:22:407:48 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:407:22:407:48 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:407:22:407:48 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:407:22:407:48 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:407:22:407:48 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:407:22:407:48 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:407:40:407:48 | red_color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:409:9:409:22 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:409:15:409:15 | r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:409:18:409:18 | g | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:409:21:409:21 | b | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:409:27:417:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:409:27:417:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:410:17:410:29 | red_component | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:410:33:410:33 | r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:411:17:411:31 | green_component | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:411:35:411:35 | g | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:412:17:412:30 | blue_component | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:412:34:412:34 | b | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:414:17:415:62 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:414:17:415:62 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:414:17:415:62 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:414:17:415:62 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:414:17:415:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:414:17:415:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:415:17:415:29 | red_component | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:415:32:415:46 | green_component | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:415:49:415:62 | blue_component | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:421:5:430:5 | match color { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:421:5:430:5 | match color { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:421:11:421:15 | color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:422:9:422:22 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:422:15:422:17 | 255 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:422:15:422:17 | 255 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:422:20:422:21 | .. | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:422:27:425:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:422:27:425:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:423:17:423:29 | reddish_color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:423:33:423:37 | color | | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:424:22:424:57 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:424:22:424:57 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:424:22:424:57 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:424:22:424:57 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:424:22:424:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:424:22:424:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:424:45:424:57 | reddish_color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:426:9:426:20 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:426:15:426:15 | r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:426:18:426:19 | .. | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:426:25:429:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:426:25:429:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:427:17:427:23 | any_red | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:427:27:427:27 | r | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:428:22:428:54 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:428:22:428:54 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:428:22:428:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:428:22:428:54 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:428:22:428:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:428:22:428:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:428:48:428:54 | any_red | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:434:9:434:15 | wrapper | | pattern_matching.rs:432:5:433:24 | Wrapper | | pattern_matching.rs:434:19:434:29 | Wrapper(...) | | pattern_matching.rs:432:5:433:24 | Wrapper | | pattern_matching.rs:434:27:434:28 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:435:5:440:5 | match wrapper { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:435:5:440:5 | match wrapper { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:435:11:435:17 | wrapper | | pattern_matching.rs:432:5:433:24 | Wrapper | | pattern_matching.rs:436:9:436:18 | Wrapper(...) | | pattern_matching.rs:432:5:433:24 | Wrapper | | pattern_matching.rs:436:17:436:17 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:436:23:439:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:436:23:439:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:437:17:437:29 | wrapped_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:437:33:437:33 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:438:22:438:49 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:438:22:438:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:438:22:438:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:438:22:438:49 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:438:22:438:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:438:22:438:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:438:37:438:49 | wrapped_value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:443:25:498:1 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:444:9:444:13 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:444:9:444:13 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:444:9:444:13 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:444:9:444:13 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:444:9:444:13 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:444:9:444:13 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:444:17:444:36 | TupleExpr | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:444:17:444:36 | TupleExpr | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:444:17:444:36 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:444:17:444:36 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:444:17:444:36 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:444:17:444:36 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:443:25:498:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:444:9:444:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:444:9:444:13 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:9:444:13 | tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:9:444:13 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:444:9:444:13 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:444:9:444:13 | tuple | T2 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:444:17:444:36 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:444:18:444:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:444:24:444:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:444:30:444:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:447:5:458:5 | match tuple { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:447:11:447:15 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:447:11:447:15 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:447:11:447:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:447:11:447:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:447:11:447:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:447:11:447:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:448:9:448:19 | TuplePat | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:448:9:448:19 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:448:9:448:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:448:9:448:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:448:9:448:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:448:9:448:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:447:5:458:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:447:11:447:15 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:447:11:447:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:447:11:447:15 | tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:447:11:447:15 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:447:11:447:15 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:447:11:447:15 | tuple | T2 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:448:9:448:19 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:448:9:448:19 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:448:9:448:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:448:9:448:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:448:9:448:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:448:9:448:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:448:10:448:10 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:448:13:448:13 | 2 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:448:13:448:13 | 2 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:448:16:448:18 | 3.0 | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:448:16:448:18 | 3.0 | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:448:24:451:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:449:17:449:27 | exact_tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:449:17:449:27 | exact_tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:449:17:449:27 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:449:17:449:27 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:449:17:449:27 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:449:17:449:27 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:449:31:449:35 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:449:31:449:35 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:449:31:449:35 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:449:31:449:35 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:449:31:449:35 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:449:31:449:35 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:450:22:450:53 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:450:22:450:53 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:450:22:450:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:450:22:450:53 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:450:43:450:53 | exact_tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:450:43:450:53 | exact_tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:450:43:450:53 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:450:43:450:53 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:450:43:450:53 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:450:43:450:53 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:452:9:452:17 | TuplePat | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:452:9:452:17 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:452:9:452:17 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:452:9:452:17 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:452:9:452:17 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:452:9:452:17 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:448:24:451:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:449:17:449:27 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:449:17:449:27 | exact_tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | T2 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:449:31:449:35 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:449:31:449:35 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:31:449:35 | tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:31:449:35 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:449:31:449:35 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:449:31:449:35 | tuple | T2 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:450:22:450:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:450:22:450:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:450:43:450:53 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:450:43:450:53 | exact_tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | T2 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:452:9:452:17 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:452:9:452:17 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:452:9:452:17 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:452:9:452:17 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:452:9:452:17 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:452:9:452:17 | TuplePat | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:452:10:452:10 | a | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:452:13:452:13 | b | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:452:13:452:13 | b | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:452:16:452:16 | c | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:452:16:452:16 | c | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:452:22:457:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:452:22:457:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:453:17:453:26 | first_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:453:30:453:30 | a | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:454:17:454:27 | second_elem | | {EXTERNAL LOCATION} | i32 | @@ -7556,321 +12060,285 @@ inferType | pattern_matching.rs:455:17:455:26 | third_elem | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:455:30:455:30 | c | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:455:30:455:30 | c | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:456:22:456:79 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:456:22:456:79 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:456:22:456:79 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:456:22:456:79 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:456:22:456:79 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:456:22:456:79 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:456:45:456:54 | first_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:456:57:456:67 | second_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:456:57:456:67 | second_elem | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:456:70:456:79 | third_elem | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:456:70:456:79 | third_elem | | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:461:5:466:5 | match tuple { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:461:11:461:15 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:461:11:461:15 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:461:11:461:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:461:11:461:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:461:11:461:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:461:11:461:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:462:9:462:19 | TuplePat | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:462:9:462:19 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:462:9:462:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:462:9:462:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:462:9:462:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:462:9:462:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:462:24:465:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:464:22:464:53 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:464:22:464:53 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:464:22:464:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:464:22:464:53 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:469:9:469:12 | unit | | file://:0:0:0:0 | () | -| pattern_matching.rs:469:16:469:17 | TupleExpr | | file://:0:0:0:0 | () | -| pattern_matching.rs:470:5:475:5 | match unit { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:470:11:470:14 | unit | | file://:0:0:0:0 | () | -| pattern_matching.rs:471:9:471:10 | TuplePat | | file://:0:0:0:0 | () | -| pattern_matching.rs:471:15:474:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:472:17:472:26 | unit_value | | file://:0:0:0:0 | () | -| pattern_matching.rs:472:30:472:33 | unit | | file://:0:0:0:0 | () | -| pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:473:22:473:51 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:473:22:473:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:473:22:473:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:473:22:473:51 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:473:42:473:51 | unit_value | | file://:0:0:0:0 | () | -| pattern_matching.rs:478:9:478:14 | single | | file://:0:0:0:0 | (T_1) | -| pattern_matching.rs:478:9:478:14 | single | 0(1) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:478:18:478:25 | TupleExpr | | file://:0:0:0:0 | (T_1) | -| pattern_matching.rs:478:18:478:25 | TupleExpr | 0(1) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:461:5:466:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:461:11:461:15 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:461:11:461:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:461:11:461:15 | tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:461:11:461:15 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:461:11:461:15 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:461:11:461:15 | tuple | T2 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:462:9:462:19 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:462:9:462:19 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:462:9:462:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:462:9:462:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:462:9:462:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:462:9:462:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:462:24:465:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:464:22:464:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:464:22:464:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:469:9:469:12 | unit | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:469:16:469:17 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:470:5:475:5 | match unit { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:470:11:470:14 | unit | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:471:9:471:10 | TuplePat | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:471:15:474:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:472:17:472:26 | unit_value | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:472:30:472:33 | unit | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:473:22:473:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:22:473:51 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:42:473:51 | unit_value | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:478:9:478:14 | single | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:478:9:478:14 | single | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:478:18:478:25 | TupleExpr | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:478:18:478:25 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:478:19:478:23 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:479:5:484:5 | match single { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:479:11:479:16 | single | | file://:0:0:0:0 | (T_1) | -| pattern_matching.rs:479:11:479:16 | single | 0(1) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:480:9:480:12 | TuplePat | | file://:0:0:0:0 | (T_1) | -| pattern_matching.rs:480:9:480:12 | TuplePat | 0(1) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:479:5:484:5 | match single { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:479:11:479:16 | single | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:479:11:479:16 | single | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:480:9:480:12 | TuplePat | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:480:9:480:12 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:480:10:480:10 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:480:17:483:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:480:17:483:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:481:17:481:27 | single_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:481:31:481:31 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:482:22:482:60 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:482:22:482:60 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:482:22:482:60 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:482:22:482:60 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:482:22:482:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:482:22:482:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:482:50:482:60 | single_elem | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:487:9:487:18 | ref_tuple1 | | file://:0:0:0:0 | & | -| pattern_matching.rs:487:9:487:18 | ref_tuple1 | &T | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:487:9:487:18 | ref_tuple1 | &T.0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:487:9:487:18 | ref_tuple1 | &T.1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:487:35:487:41 | &... | | file://:0:0:0:0 | & | -| pattern_matching.rs:487:35:487:41 | &... | &T | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:487:35:487:41 | &... | &T.0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:487:35:487:41 | &... | &T.1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:487:36:487:41 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:487:36:487:41 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:487:36:487:41 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:35:487:41 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:487:35:487:41 | &... | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:487:35:487:41 | &... | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:35:487:41 | &... | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:36:487:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:487:36:487:41 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:487:36:487:41 | TupleExpr | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:487:37:487:37 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:487:40:487:40 | 2 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:488:5:491:5 | if ... {...} | | file://:0:0:0:0 | () | -| pattern_matching.rs:488:12:488:17 | TuplePat | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:488:21:488:30 | ref_tuple1 | | file://:0:0:0:0 | & | -| pattern_matching.rs:488:21:488:30 | ref_tuple1 | &T | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:488:21:488:30 | ref_tuple1 | &T.0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:488:21:488:30 | ref_tuple1 | &T.1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:488:32:491:5 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:489:18:489:24 | "n: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:489:18:489:24 | "n: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:489:18:489:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:489:18:489:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:489:18:489:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:489:18:489:27 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:490:18:490:24 | "m: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:490:18:490:24 | "m: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:490:18:490:27 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:490:18:490:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:490:18:490:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:490:18:490:27 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:494:9:494:18 | ref_tuple2 | | file://:0:0:0:0 | & | -| pattern_matching.rs:494:9:494:18 | ref_tuple2 | &T | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:494:9:494:18 | ref_tuple2 | &T.0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:494:9:494:18 | ref_tuple2 | &T.1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:494:35:494:41 | &... | | file://:0:0:0:0 | & | -| pattern_matching.rs:494:35:494:41 | &... | &T | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:494:35:494:41 | &... | &T.0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:494:35:494:41 | &... | &T.1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:494:36:494:41 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:494:36:494:41 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:494:36:494:41 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:488:5:491:5 | if ... {...} | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:488:12:488:17 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:488:32:491:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:489:18:489:24 | "n: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:489:18:489:24 | "n: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:489:18:489:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:489:18:489:27 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:490:18:490:24 | "m: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:490:18:490:24 | "m: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:490:18:490:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:490:18:490:27 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:494:35:494:41 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:494:35:494:41 | &... | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:494:35:494:41 | &... | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:494:35:494:41 | &... | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:494:36:494:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:494:36:494:41 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:494:36:494:41 | TupleExpr | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:494:37:494:37 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:494:40:494:40 | 2 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:495:9:495:14 | TuplePat | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:495:18:495:27 | ref_tuple2 | | file://:0:0:0:0 | & | -| pattern_matching.rs:495:18:495:27 | ref_tuple2 | &T | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:495:18:495:27 | ref_tuple2 | &T.0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:495:18:495:27 | ref_tuple2 | &T.1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:496:14:496:20 | "n: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:496:14:496:20 | "n: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:496:14:496:23 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:496:14:496:23 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:496:14:496:23 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:496:14:496:23 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:497:14:497:20 | "m: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:497:14:497:20 | "m: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:497:14:497:23 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:497:14:497:23 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:497:14:497:23 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:497:14:497:23 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:500:33:520:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:495:9:495:14 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef.T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:496:14:496:20 | "n: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:496:14:496:20 | "n: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:496:14:496:23 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:496:14:496:23 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:497:14:497:20 | "m: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:497:14:497:20 | "m: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:497:14:497:23 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:497:14:497:23 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:500:33:520:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:501:9:501:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:501:17:501:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:504:5:509:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:504:5:509:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:504:11:504:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:505:9:505:11 | (...) | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:505:10:505:10 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:505:16:508:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:505:16:508:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:506:17:506:27 | paren_bound | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:506:31:506:31 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:507:22:507:61 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:507:22:507:61 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:507:22:507:61 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:507:22:507:61 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:507:22:507:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:507:22:507:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:507:51:507:61 | paren_bound | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:512:9:512:13 | tuple | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:512:9:512:13 | tuple | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:512:9:512:13 | tuple | 1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:512:17:512:28 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:512:17:512:28 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:512:17:512:28 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:512:9:512:13 | tuple | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:512:9:512:13 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:512:9:512:13 | tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:512:17:512:28 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:512:17:512:28 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:512:17:512:28 | TupleExpr | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:512:18:512:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:512:24:512:27 | 2i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:513:5:519:5 | match tuple { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:513:11:513:15 | tuple | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:513:11:513:15 | tuple | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:513:11:513:15 | tuple | 1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:514:9:514:16 | TuplePat | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:514:9:514:16 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:514:9:514:16 | TuplePat | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:513:5:519:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:513:11:513:15 | tuple | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:513:11:513:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:513:11:513:15 | tuple | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:514:9:514:16 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:514:9:514:16 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:514:9:514:16 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:514:10:514:10 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:514:13:514:15 | (...) | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:514:14:514:14 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:514:21:518:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:514:21:518:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:515:17:515:23 | paren_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:515:27:515:27 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:516:17:516:23 | paren_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:516:27:516:27 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | | file://:0:0:0:0 | & | -| pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:517:22:517:71 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:517:22:517:71 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:517:22:517:71 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:517:22:517:71 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:517:22:517:71 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:517:22:517:71 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:517:56:517:62 | paren_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:517:65:517:71 | paren_y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:522:25:563:1 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:523:9:523:13 | slice | | file://:0:0:0:0 | & | -| pattern_matching.rs:523:9:523:13 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:523:9:523:13 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:523:25:523:40 | &... | | file://:0:0:0:0 | & | -| pattern_matching.rs:523:25:523:40 | &... | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:523:25:523:40 | &... | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:523:25:523:40 | &... | &T.[T;...] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:523:25:523:40 | &... | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:523:26:523:40 | [...] | | file://:0:0:0:0 | [] | -| pattern_matching.rs:523:26:523:40 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:522:25:563:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:523:9:523:13 | slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:523:9:523:13 | slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:523:9:523:13 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:523:25:523:40 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:523:25:523:40 | &... | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:523:25:523:40 | &... | TRef | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:523:25:523:40 | &... | TRef.TArray | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:523:25:523:40 | &... | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:523:26:523:40 | [...] | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:523:26:523:40 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:27:523:27 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:30:523:30 | 2 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:33:523:33 | 3 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:36:523:36 | 4 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:39:523:39 | 5 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:526:5:551:5 | match slice { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:526:11:526:15 | slice | | file://:0:0:0:0 | & | -| pattern_matching.rs:526:11:526:15 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:526:11:526:15 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:527:9:527:10 | SlicePat | | file://:0:0:0:0 | & | -| pattern_matching.rs:527:9:527:10 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:527:9:527:10 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:527:15:530:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:528:17:528:27 | empty_slice | | file://:0:0:0:0 | & | -| pattern_matching.rs:528:17:528:27 | empty_slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:528:17:528:27 | empty_slice | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:528:31:528:35 | slice | | file://:0:0:0:0 | & | -| pattern_matching.rs:528:31:528:35 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:528:31:528:35 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:529:22:529:53 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:529:22:529:53 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:529:22:529:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:529:22:529:53 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:529:43:529:53 | empty_slice | | file://:0:0:0:0 | & | -| pattern_matching.rs:529:43:529:53 | empty_slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:529:43:529:53 | empty_slice | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:531:9:531:11 | SlicePat | | file://:0:0:0:0 | & | -| pattern_matching.rs:531:9:531:11 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:531:9:531:11 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:531:16:534:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:533:22:533:54 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:533:22:533:54 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:533:22:533:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:533:22:533:54 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:535:9:535:23 | SlicePat | | file://:0:0:0:0 | & | -| pattern_matching.rs:535:9:535:23 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:535:9:535:23 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:535:28:539:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:538:22:538:70 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:538:22:538:70 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:538:22:538:70 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:538:22:538:70 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:540:9:540:34 | SlicePat | | file://:0:0:0:0 | & | -| pattern_matching.rs:540:9:540:34 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:540:9:540:34 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:540:39:550:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | | file://:0:0:0:0 | & | -| pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:545:17:548:34 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:545:17:548:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:545:17:548:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:545:17:548:34 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:554:9:554:13 | array | | file://:0:0:0:0 | [] | -| pattern_matching.rs:554:9:554:13 | array | [T;...] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:554:17:554:28 | [...] | | file://:0:0:0:0 | [] | -| pattern_matching.rs:554:17:554:28 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:526:5:551:5 | match slice { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:526:11:526:15 | slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:526:11:526:15 | slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:526:11:526:15 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:527:9:527:10 | SlicePat | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:527:9:527:10 | SlicePat | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:527:9:527:10 | SlicePat | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:527:15:530:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:528:17:528:27 | empty_slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:528:17:528:27 | empty_slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:528:17:528:27 | empty_slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:528:31:528:35 | slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:528:31:528:35 | slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:528:31:528:35 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:529:22:529:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:529:22:529:53 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:529:43:529:53 | empty_slice | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:529:43:529:53 | empty_slice | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:529:43:529:53 | empty_slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:531:9:531:11 | SlicePat | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:531:9:531:11 | SlicePat | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:531:9:531:11 | SlicePat | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:531:16:534:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:533:22:533:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:533:22:533:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:535:9:535:23 | SlicePat | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:535:9:535:23 | SlicePat | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:535:9:535:23 | SlicePat | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:535:28:539:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:538:22:538:70 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:538:22:538:70 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:540:9:540:34 | SlicePat | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:540:9:540:34 | SlicePat | TRef | {EXTERNAL LOCATION} | [] | +| pattern_matching.rs:540:9:540:34 | SlicePat | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:540:39:550:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:545:17:548:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:545:17:548:34 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:554:9:554:13 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:554:9:554:13 | array | TArray | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:554:17:554:28 | [...] | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:554:17:554:28 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:554:18:554:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:554:24:554:24 | 2 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:554:27:554:27 | 3 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:555:5:562:5 | match array { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:555:11:555:15 | array | | file://:0:0:0:0 | [] | -| pattern_matching.rs:555:11:555:15 | array | [T;...] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:556:9:556:17 | SlicePat | | file://:0:0:0:0 | [] | -| pattern_matching.rs:556:9:556:17 | SlicePat | [T;...] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:556:22:561:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:560:22:560:70 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:560:22:560:70 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:560:22:560:70 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:560:22:560:70 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:565:24:601:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:555:5:562:5 | match array { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:555:11:555:15 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:555:11:555:15 | array | TArray | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:556:9:556:17 | SlicePat | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:556:9:556:17 | SlicePat | TArray | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:556:22:561:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:560:22:560:70 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:560:22:560:70 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:565:24:601:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:567:27:567:28 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:568:9:568:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:568:17:568:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:570:5:576:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:570:5:576:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:570:11:570:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:571:9:571:16 | CONSTANT | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:571:21:574:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:571:21:574:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:572:17:572:27 | const_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:572:31:572:35 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:573:22:573:56 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:573:22:573:56 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:573:22:573:56 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:573:22:573:56 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:573:22:573:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:573:22:573:56 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:573:46:573:56 | const_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:575:9:575:9 | _ | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:575:14:575:15 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:575:14:575:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:579:9:579:14 | option | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:579:9:579:14 | option | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:579:18:579:38 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:579:18:579:38 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:579:33:579:37 | 10i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:580:5:588:5 | match option { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:580:5:588:5 | match option { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:580:11:580:16 | option | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:580:11:580:16 | option | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:581:9:581:22 | ...::None | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:581:9:581:22 | ...::None | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:581:27:583:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:582:22:582:35 | "None variant\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:582:22:582:35 | "None variant\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:582:22:582:35 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:582:22:582:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:582:22:582:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:582:22:582:35 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:581:27:583:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:582:22:582:35 | "None variant\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:582:22:582:35 | "None variant\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:582:22:582:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:582:22:582:35 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:584:9:584:25 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:584:9:584:25 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:584:24:584:24 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:584:30:587:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:584:30:587:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:585:17:585:26 | some_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:585:30:585:30 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:586:22:586:49 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:586:22:586:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:586:22:586:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:586:22:586:49 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:586:22:586:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:586:22:586:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:586:40:586:49 | some_value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:591:5:600:5 | match ... { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:591:5:600:5 | match ... { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:591:11:591:51 | ...::Ok::<...>(...) | | {EXTERNAL LOCATION} | Result | | pattern_matching.rs:591:11:591:51 | ...::Ok::<...>(...) | E | {EXTERNAL LOCATION} | usize | | pattern_matching.rs:591:11:591:51 | ...::Ok::<...>(...) | T | {EXTERNAL LOCATION} | i32 | @@ -7879,69 +12347,61 @@ inferType | pattern_matching.rs:592:9:592:34 | ...::Ok(...) | E | {EXTERNAL LOCATION} | usize | | pattern_matching.rs:592:9:592:34 | ...::Ok(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:592:33:592:33 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:592:39:595:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:592:39:595:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:593:17:593:24 | ok_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:593:28:593:28 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:594:22:594:45 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:594:22:594:45 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:594:22:594:45 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:594:22:594:45 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:594:22:594:45 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:594:22:594:45 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:594:38:594:45 | ok_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:596:9:596:35 | ...::Err(...) | | {EXTERNAL LOCATION} | Result | | pattern_matching.rs:596:9:596:35 | ...::Err(...) | E | {EXTERNAL LOCATION} | usize | | pattern_matching.rs:596:9:596:35 | ...::Err(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:596:34:596:34 | e | | {EXTERNAL LOCATION} | usize | -| pattern_matching.rs:596:40:599:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:596:40:599:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:597:17:597:25 | err_value | | {EXTERNAL LOCATION} | usize | | pattern_matching.rs:597:29:597:29 | e | | {EXTERNAL LOCATION} | usize | -| pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:598:22:598:43 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:598:22:598:43 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:598:22:598:43 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:598:22:598:43 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:598:22:598:43 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:598:22:598:43 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:598:35:598:43 | err_value | | {EXTERNAL LOCATION} | usize | -| pattern_matching.rs:603:22:638:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:603:22:638:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:604:9:604:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:604:17:604:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:607:5:617:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:607:5:617:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:607:11:607:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:608:9:608:9 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:608:9:608:17 | 1 \| 2 \| 3 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:608:13:608:13 | 2 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:608:17:608:17 | 3 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:608:22:611:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:608:22:611:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:609:17:609:25 | small_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:609:29:609:33 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:610:22:610:50 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:610:22:610:50 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:610:22:610:50 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:610:22:610:50 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:610:22:610:50 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:610:22:610:50 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:610:42:610:50 | small_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:612:9:612:10 | 10 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:612:9:612:15 | 10 \| 20 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:612:14:612:15 | 20 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:612:20:615:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:612:20:615:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:613:17:613:25 | round_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:613:29:613:33 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:614:22:614:50 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:614:22:614:50 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:614:22:614:50 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:614:22:614:50 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:614:22:614:50 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:614:22:614:50 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:614:42:614:50 | round_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:616:9:616:9 | _ | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:616:14:616:15 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:616:14:616:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:620:9:620:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:620:17:620:36 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:620:28:620:28 | 0 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:620:34:620:34 | 5 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:621:5:628:5 | match point { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:621:5:628:5 | match point { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:621:11:621:15 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:622:9:622:29 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:622:9:622:53 | ... \| ... | | pattern_matching.rs:135:1:140:1 | Point | @@ -7952,22 +12412,20 @@ inferType | pattern_matching.rs:622:41:622:41 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:622:47:622:47 | y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:622:51:622:51 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:622:58:626:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:622:58:626:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:623:17:623:22 | axis_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:623:26:623:26 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:624:17:624:22 | axis_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:624:26:624:26 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:625:22:625:62 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:625:22:625:62 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:625:22:625:62 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:625:22:625:62 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:625:22:625:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:625:22:625:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:625:49:625:54 | axis_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:625:57:625:62 | axis_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:627:9:627:9 | _ | | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:627:14:627:15 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:631:5:637:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:627:14:627:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:631:5:637:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:631:11:631:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:632:9:632:9 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:632:9:632:14 | RangePat | | {EXTERNAL LOCATION} | i32 | @@ -7976,129 +12434,119 @@ inferType | pattern_matching.rs:632:18:632:19 | 90 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:632:18:632:25 | RangePat | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:632:23:632:25 | 100 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:632:30:635:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:632:30:635:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:633:17:633:30 | range_or_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:633:34:633:38 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:634:22:634:51 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:634:22:634:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:634:22:634:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:634:22:634:51 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:634:22:634:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:634:22:634:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:634:38:634:51 | range_or_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:636:9:636:9 | _ | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:636:14:636:15 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:640:24:674:1 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:641:9:641:13 | tuple | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:641:9:641:13 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:641:9:641:13 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:641:9:641:13 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:641:9:641:13 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:641:17:641:41 | TupleExpr | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:641:17:641:41 | TupleExpr | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:641:17:641:41 | TupleExpr | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:641:17:641:41 | TupleExpr | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:641:17:641:41 | TupleExpr | 3(4) | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:636:14:636:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:640:24:674:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:641:9:641:13 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:641:9:641:13 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:641:9:641:13 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:641:9:641:13 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:641:9:641:13 | tuple | T3 | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:641:17:641:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:641:17:641:41 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:641:17:641:41 | TupleExpr | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:641:17:641:41 | TupleExpr | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:641:17:641:41 | TupleExpr | T3 | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:641:18:641:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:641:24:641:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:641:30:641:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:641:38:641:40 | 4u8 | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:644:5:649:5 | match tuple { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:644:11:644:15 | tuple | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:644:11:644:15 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:644:11:644:15 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:644:11:644:15 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:644:11:644:15 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:645:9:645:19 | TuplePat | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:645:9:645:19 | TuplePat | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:645:9:645:19 | TuplePat | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:645:9:645:19 | TuplePat | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:645:9:645:19 | TuplePat | 3(4) | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:645:24:648:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:647:22:647:54 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:647:22:647:54 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:647:22:647:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:647:22:647:54 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:651:5:656:5 | match tuple { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:651:11:651:15 | tuple | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:651:11:651:15 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:651:11:651:15 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:651:11:651:15 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:651:11:651:15 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:652:9:652:18 | TuplePat | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:652:9:652:18 | TuplePat | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:652:9:652:18 | TuplePat | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:652:9:652:18 | TuplePat | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:652:9:652:18 | TuplePat | 3(4) | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:652:23:655:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:654:22:654:52 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:654:22:654:52 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:654:22:654:52 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:654:22:654:52 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:658:5:664:5 | match tuple { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:658:11:658:15 | tuple | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:658:11:658:15 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:658:11:658:15 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:658:11:658:15 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:658:11:658:15 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:659:9:659:25 | TuplePat | | file://:0:0:0:0 | (T_4) | -| pattern_matching.rs:659:9:659:25 | TuplePat | 0(4) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:659:9:659:25 | TuplePat | 1(4) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:659:9:659:25 | TuplePat | 2(4) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:659:9:659:25 | TuplePat | 3(4) | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:659:30:663:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:662:22:662:67 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:662:22:662:67 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:662:22:662:67 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:662:22:662:67 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:644:5:649:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:644:11:644:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:644:11:644:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:644:11:644:15 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:644:11:644:15 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:644:11:644:15 | tuple | T3 | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:645:9:645:19 | TuplePat | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:645:9:645:19 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:645:9:645:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:645:9:645:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:645:9:645:19 | TuplePat | T3 | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:645:24:648:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:647:22:647:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:647:22:647:54 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:651:5:656:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:651:11:651:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:651:11:651:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:651:11:651:15 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:651:11:651:15 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:651:11:651:15 | tuple | T3 | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:652:9:652:18 | TuplePat | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:652:9:652:18 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:652:9:652:18 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:652:9:652:18 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:652:9:652:18 | TuplePat | T3 | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:652:23:655:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:654:22:654:52 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:654:22:654:52 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:658:5:664:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:658:11:658:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:658:11:658:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:658:11:658:15 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:658:11:658:15 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:658:11:658:15 | tuple | T3 | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:659:9:659:25 | TuplePat | | {EXTERNAL LOCATION} | (T_4) | +| pattern_matching.rs:659:9:659:25 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:659:9:659:25 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:659:9:659:25 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:659:9:659:25 | TuplePat | T3 | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:659:30:663:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:662:22:662:67 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:662:22:662:67 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:667:9:667:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:667:17:667:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:667:28:667:29 | 10 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:667:35:667:36 | 20 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:668:5:673:5 | match point { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:668:5:673:5 | match point { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:668:11:668:15 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:669:9:669:23 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:669:17:669:17 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:669:28:672:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:669:28:672:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:670:17:670:22 | rest_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:670:26:670:26 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:671:22:671:47 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:671:22:671:47 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:671:22:671:47 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:671:22:671:47 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:671:22:671:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:671:22:671:47 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:671:42:671:47 | rest_x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:676:25:696:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:676:25:696:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:678:17:678:18 | 42 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:678:17:678:18 | match 42i32 { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:679:17:679:17 | match 42i32 { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:678:17:678:18 | match 42i32 { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:679:17:679:17 | match 42i32 { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:679:17:679:17 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:694:21:694:25 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:694:21:694:25 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:694:21:694:25 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:694:21:694:29 | match 42i32 { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:694:21:694:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:694:21:694:29 | match 42i32 { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:694:28:694:29 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:695:21:695:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:695:21:695:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:695:21:695:25 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:695:21:695:28 | match 10i32 { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:695:21:695:25 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:695:21:695:28 | match 10i32 { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:695:28:695:28 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:698:34:724:1 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:700:9:700:20 | complex_data | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:700:9:700:20 | complex_data | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:700:9:700:20 | complex_data | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:700:9:700:20 | complex_data | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:700:24:700:79 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:700:24:700:79 | TupleExpr | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:700:24:700:79 | TupleExpr | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:700:24:700:79 | TupleExpr | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:698:34:724:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:700:9:700:20 | complex_data | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:700:9:700:20 | complex_data | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:700:9:700:20 | complex_data | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:700:9:700:20 | complex_data | T1.T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:700:24:700:79 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:700:24:700:79 | TupleExpr | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:700:24:700:79 | TupleExpr | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:700:24:700:79 | TupleExpr | T1.T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:700:25:700:44 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:700:36:700:36 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:700:42:700:42 | 2 | | {EXTERNAL LOCATION} | i32 | @@ -8106,20 +12554,17 @@ inferType | pattern_matching.rs:700:47:700:78 | ...::Some(...) | T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:700:62:700:77 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:700:68:700:70 | 255 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:700:68:700:70 | 255 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:700:73:700:73 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:700:73:700:73 | 0 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:700:76:700:76 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:700:76:700:76 | 0 | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:702:5:723:5 | match complex_data { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:702:11:702:22 | complex_data | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:702:11:702:22 | complex_data | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:702:11:702:22 | complex_data | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:702:11:702:22 | complex_data | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:704:9:704:61 | TuplePat | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:704:9:704:61 | TuplePat | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:704:9:704:61 | TuplePat | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:704:9:704:61 | TuplePat | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:702:5:723:5 | match complex_data { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:702:11:702:22 | complex_data | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:702:11:702:22 | complex_data | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:702:11:702:22 | complex_data | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:702:11:702:22 | complex_data | T1.T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:704:9:704:61 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:704:9:704:61 | TuplePat | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:704:9:704:61 | TuplePat | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:704:9:704:61 | TuplePat | T1.T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:704:10:704:26 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:704:21:704:21 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:704:24:704:24 | y | | {EXTERNAL LOCATION} | i32 | @@ -8130,77 +12575,71 @@ inferType | pattern_matching.rs:704:50:704:52 | 255 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:704:55:704:55 | g | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:704:58:704:58 | b | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:704:66:712:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:704:66:712:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:705:17:705:24 | nested_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:705:28:705:28 | y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:706:17:706:24 | nested_g | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:706:28:706:28 | g | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:707:17:707:24 | nested_b | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:707:28:707:28 | b | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | | file://:0:0:0:0 | & | -| pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:709:17:710:44 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:709:17:710:44 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:709:17:710:44 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:709:17:710:44 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:709:17:710:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:709:17:710:44 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:710:17:710:24 | nested_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:710:27:710:34 | nested_g | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:710:37:710:44 | nested_b | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:714:9:714:41 | TuplePat | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:714:9:714:41 | TuplePat | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:714:9:714:41 | TuplePat | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:714:9:714:41 | TuplePat | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:714:9:714:71 | ... \| ... | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:714:9:714:71 | ... \| ... | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:714:9:714:71 | ... \| ... | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:714:9:714:71 | ... \| ... | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:714:9:714:41 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:714:9:714:41 | TuplePat | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:714:9:714:41 | TuplePat | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:714:9:714:41 | TuplePat | T1.T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:714:9:714:71 | ... \| ... | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:714:9:714:71 | ... \| ... | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:714:9:714:71 | ... \| ... | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:714:9:714:71 | ... \| ... | T1.T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:714:10:714:24 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:714:18:714:18 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:714:27:714:40 | ...::None | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:714:27:714:40 | ...::None | T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:714:45:714:71 | TuplePat | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:714:45:714:71 | TuplePat | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:714:45:714:71 | TuplePat | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:714:45:714:71 | TuplePat | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:714:45:714:71 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:714:45:714:71 | TuplePat | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:714:45:714:71 | TuplePat | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:714:45:714:71 | TuplePat | T1.T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:714:46:714:67 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:714:57:714:57 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:714:61:714:61 | 0 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:714:70:714:70 | _ | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:714:70:714:70 | _ | T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:714:76:717:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:714:76:717:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:715:17:715:29 | alt_complex_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:715:33:715:33 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | | file://:0:0:0:0 | & | -| pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:716:22:716:65 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:716:22:716:65 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:716:22:716:65 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:716:22:716:65 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:716:22:716:65 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:716:22:716:65 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:716:53:716:65 | alt_complex_x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:719:9:719:13 | other | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:719:9:719:13 | other | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:719:9:719:13 | other | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:719:9:719:13 | other | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:719:18:722:9 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:720:17:720:29 | other_complex | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:720:17:720:29 | other_complex | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:720:17:720:29 | other_complex | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:720:17:720:29 | other_complex | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:720:33:720:37 | other | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:720:33:720:37 | other | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:720:33:720:37 | other | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:720:33:720:37 | other | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:721:22:721:62 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:721:22:721:62 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:721:22:721:62 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:721:22:721:62 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:721:50:721:62 | other_complex | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:721:50:721:62 | other_complex | 0(2) | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:721:50:721:62 | other_complex | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | -| pattern_matching.rs:721:50:721:62 | other_complex | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:726:37:758:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:719:9:719:13 | other | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:719:9:719:13 | other | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:719:9:719:13 | other | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:719:9:719:13 | other | T1.T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:719:18:722:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:720:17:720:29 | other_complex | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:720:17:720:29 | other_complex | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:720:17:720:29 | other_complex | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:720:17:720:29 | other_complex | T1.T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:720:33:720:37 | other | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:720:33:720:37 | other | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:720:33:720:37 | other | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:720:33:720:37 | other | T1.T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:721:22:721:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:721:22:721:62 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:721:50:721:62 | other_complex | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:721:50:721:62 | other_complex | T0 | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:721:50:721:62 | other_complex | T1 | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:721:50:721:62 | other_complex | T1.T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:726:37:758:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:728:9:728:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:728:17:728:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:728:28:728:29 | 10 | | {EXTERNAL LOCATION} | i32 | @@ -8213,55 +12652,52 @@ inferType | pattern_matching.rs:730:17:730:17 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:731:9:731:13 | let_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:731:17:731:17 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:733:9:733:13 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:733:9:733:13 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:733:9:733:13 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:733:9:733:13 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:733:17:733:36 | TupleExpr | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:733:17:733:36 | TupleExpr | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:733:17:733:36 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:733:17:733:36 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:733:9:733:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:733:9:733:13 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:733:9:733:13 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:733:9:733:13 | tuple | T2 | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:733:17:733:36 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:733:17:733:36 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:733:17:733:36 | TupleExpr | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:733:17:733:36 | TupleExpr | T2 | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:733:18:733:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:733:24:733:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:733:30:733:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:734:9:734:17 | TuplePat | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:734:9:734:17 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:734:9:734:17 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:734:9:734:17 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:734:9:734:17 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:734:9:734:17 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:734:9:734:17 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:734:9:734:17 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:734:10:734:10 | a | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:734:13:734:13 | b | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:734:16:734:16 | c | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:734:21:734:25 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:734:21:734:25 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:734:21:734:25 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:734:21:734:25 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:734:21:734:25 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:734:21:734:25 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:734:21:734:25 | tuple | T1 | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:734:21:734:25 | tuple | T2 | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:735:9:735:13 | let_a | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:735:17:735:17 | a | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:736:9:736:13 | let_b | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:736:17:736:17 | b | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:737:9:737:13 | let_c | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:737:17:737:17 | c | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:739:9:739:13 | array | | file://:0:0:0:0 | [] | -| pattern_matching.rs:739:9:739:13 | array | [T;...] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:739:17:739:34 | [...] | | file://:0:0:0:0 | [] | -| pattern_matching.rs:739:17:739:34 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:739:9:739:13 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:739:9:739:13 | array | TArray | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:739:17:739:34 | [...] | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:739:17:739:34 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:739:18:739:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:739:24:739:24 | 2 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:739:27:739:27 | 3 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:739:30:739:30 | 4 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:739:33:739:33 | 5 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:740:9:740:25 | SlicePat | | file://:0:0:0:0 | [] | -| pattern_matching.rs:740:9:740:25 | SlicePat | [T;...] | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:740:29:740:33 | array | | file://:0:0:0:0 | [] | -| pattern_matching.rs:740:29:740:33 | array | [T;...] | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:740:9:740:25 | SlicePat | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:740:9:740:25 | SlicePat | TArray | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:740:29:740:33 | array | | {EXTERNAL LOCATION} | [;] | +| pattern_matching.rs:740:29:740:33 | array | TArray | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:744:9:744:13 | color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:744:17:744:34 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:744:23:744:25 | 255 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:744:23:744:25 | 255 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:744:28:744:30 | 128 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:744:28:744:30 | 128 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:744:33:744:33 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:744:33:744:33 | 0 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:745:9:745:22 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:745:15:745:15 | r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:745:18:745:18 | g | | {EXTERNAL LOCATION} | u8 | @@ -8275,31 +12711,31 @@ inferType | pattern_matching.rs:748:17:748:17 | b | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:751:9:751:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:751:17:751:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:752:13:752:19 | ref_val | | file://:0:0:0:0 | & | -| pattern_matching.rs:752:13:752:19 | ref_val | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:752:13:752:19 | ref_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:752:13:752:19 | ref_val | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:752:23:752:27 | value | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:753:9:753:15 | let_ref | | file://:0:0:0:0 | & | -| pattern_matching.rs:753:9:753:15 | let_ref | &T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:753:19:753:25 | ref_val | | file://:0:0:0:0 | & | -| pattern_matching.rs:753:19:753:25 | ref_val | &T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:753:9:753:15 | let_ref | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:753:9:753:15 | let_ref | TRef | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:753:19:753:25 | ref_val | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:753:19:753:25 | ref_val | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:756:13:756:19 | mut_val | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:756:23:756:27 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:757:9:757:15 | let_mut | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:757:19:757:25 | mut_val | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:760:42:789:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:760:42:789:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:763:22:763:35 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:763:30:763:30 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:763:33:763:33 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:763:59:767:5 | { ... } | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:763:59:767:5 | { ... } | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:763:59:767:5 | { ... } | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:763:59:767:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:763:59:767:5 | { ... } | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:763:59:767:5 | { ... } | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:764:13:764:19 | param_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:764:23:764:23 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:765:13:765:19 | param_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:765:23:765:23 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:766:9:766:26 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:766:9:766:26 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:766:9:766:26 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:766:9:766:26 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:766:9:766:26 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:766:9:766:26 | TupleExpr | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:766:10:766:16 | param_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:766:19:766:25 | param_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:769:22:769:35 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | @@ -8310,69 +12746,68 @@ inferType | pattern_matching.rs:770:13:770:19 | param_r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:770:23:770:23 | r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:771:9:771:15 | param_r | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:774:22:774:38 | TuplePat | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:774:22:774:38 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:774:22:774:38 | TuplePat | 1(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:774:22:774:38 | TuplePat | 2(3) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:774:22:774:38 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:774:22:774:38 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:774:22:774:38 | TuplePat | T1 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:774:22:774:38 | TuplePat | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:774:23:774:27 | first | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:774:30:774:30 | _ | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:774:33:774:37 | third | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:774:74:778:5 | { ... } | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:774:74:778:5 | { ... } | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:774:74:778:5 | { ... } | 1(2) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:774:74:778:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:774:74:778:5 | { ... } | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:774:74:778:5 | { ... } | T1 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:775:13:775:23 | param_first | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:775:27:775:31 | first | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:776:13:776:23 | param_third | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:776:27:776:31 | third | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:777:9:777:34 | TupleExpr | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:777:9:777:34 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:777:9:777:34 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:777:9:777:34 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:777:9:777:34 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:777:9:777:34 | TupleExpr | T1 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:777:10:777:20 | param_first | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:777:23:777:33 | param_third | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:781:9:781:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:781:17:781:37 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:781:28:781:28 | 5 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:781:34:781:35 | 10 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:782:9:782:17 | extracted | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:782:9:782:17 | extracted | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:782:9:782:17 | extracted | 1(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:782:21:782:40 | extract_point(...) | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:782:21:782:40 | extract_point(...) | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:782:21:782:40 | extract_point(...) | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:9:782:17 | extracted | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:782:9:782:17 | extracted | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:9:782:17 | extracted | T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:21:782:40 | extract_point(...) | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:782:21:782:40 | extract_point(...) | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:782:21:782:40 | extract_point(...) | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:782:35:782:39 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:784:9:784:13 | color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:784:17:784:35 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:784:23:784:25 | 200 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:784:23:784:25 | 200 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:784:28:784:30 | 100 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:784:28:784:30 | 100 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:784:33:784:34 | 50 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:784:33:784:34 | 50 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:785:9:785:11 | red | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:785:15:785:34 | extract_color(...) | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:785:29:785:33 | color | | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:787:9:787:13 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:787:9:787:13 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:787:9:787:13 | tuple | 1(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:787:9:787:13 | tuple | 2(3) | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:787:17:787:38 | TupleExpr | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:787:17:787:38 | TupleExpr | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:787:17:787:38 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:787:17:787:38 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:787:9:787:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:787:9:787:13 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:787:9:787:13 | tuple | T1 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:787:9:787:13 | tuple | T2 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:787:17:787:38 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:787:17:787:38 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:787:17:787:38 | TupleExpr | T1 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:787:17:787:38 | TupleExpr | T2 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:787:18:787:22 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:787:25:787:31 | 3.14f64 | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:787:34:787:37 | true | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:788:9:788:23 | tuple_extracted | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:788:9:788:23 | tuple_extracted | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:788:9:788:23 | tuple_extracted | 1(2) | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | | file://:0:0:0:0 | (T_2) | -| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | 0(2) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | 1(2) | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:788:41:788:45 | tuple | | file://:0:0:0:0 | (T_3) | -| pattern_matching.rs:788:41:788:45 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:788:41:788:45 | tuple | 1(3) | {EXTERNAL LOCATION} | f64 | -| pattern_matching.rs:788:41:788:45 | tuple | 2(3) | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:792:35:824:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:788:9:788:23 | tuple_extracted | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:788:9:788:23 | tuple_extracted | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:788:9:788:23 | tuple_extracted | T1 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | T1 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:788:41:788:45 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:788:41:788:45 | tuple | T0 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:788:41:788:45 | tuple | T1 | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:788:41:788:45 | tuple | T2 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:792:35:824:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:794:9:794:14 | points | | {EXTERNAL LOCATION} | Vec | +| pattern_matching.rs:794:18:794:65 | MacroExpr | | {EXTERNAL LOCATION} | Vec | | pattern_matching.rs:794:23:794:42 | (...) | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:23:794:42 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:34:794:34 | 1 | | {EXTERNAL LOCATION} | i32 | @@ -8381,21 +12816,20 @@ inferType | pattern_matching.rs:794:45:794:64 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:56:794:56 | 3 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:794:62:794:62 | 4 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:795:5:799:5 | for ... in ... { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:795:5:799:5 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:795:9:795:22 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:795:17:795:17 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:795:20:795:20 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:795:34:799:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:795:27:795:32 | points | | {EXTERNAL LOCATION} | Vec | +| pattern_matching.rs:795:34:799:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:796:13:796:18 | loop_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:796:22:796:22 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:797:13:797:18 | loop_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:797:22:797:22 | y | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:798:18:798:58 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:798:18:798:58 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:798:18:798:58 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:798:18:798:58 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:798:18:798:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:798:18:798:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:798:45:798:50 | loop_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:798:53:798:58 | loop_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:802:9:802:20 | option_value | | pattern_matching.rs:152:1:156:1 | MyOption | @@ -8403,22 +12837,20 @@ inferType | pattern_matching.rs:802:24:802:44 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:802:24:802:44 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:802:39:802:43 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:803:5:806:5 | if ... {...} | | file://:0:0:0:0 | () | +| pattern_matching.rs:803:5:806:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:803:12:803:33 | ...::Some(...) | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:803:12:803:33 | ...::Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:803:27:803:27 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:803:31:803:32 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:803:37:803:48 | option_value | | pattern_matching.rs:152:1:156:1 | MyOption | | pattern_matching.rs:803:37:803:48 | option_value | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:803:50:806:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:803:50:806:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:804:13:804:20 | if_let_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:804:24:804:24 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:805:18:805:54 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:805:18:805:54 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:805:18:805:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:805:18:805:54 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:805:18:805:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:805:18:805:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:805:47:805:54 | if_let_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:809:13:809:17 | stack | | {EXTERNAL LOCATION} | Vec | | pattern_matching.rs:809:13:809:17 | stack | A | {EXTERNAL LOCATION} | Global | @@ -8429,7 +12861,7 @@ inferType | pattern_matching.rs:809:36:809:39 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:809:42:809:42 | 2 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:809:45:809:45 | 3 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:810:5:813:5 | while ... { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:810:5:813:5 | while ... { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:810:15:810:21 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:810:15:810:21 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:810:20:810:20 | x | | {EXTERNAL LOCATION} | i32 | @@ -8438,55 +12870,146 @@ inferType | pattern_matching.rs:810:25:810:29 | stack | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:810:25:810:35 | stack.pop() | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:810:25:810:35 | stack.pop() | T | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:810:37:813:5 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:810:37:813:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:811:13:811:23 | while_let_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:811:27:811:27 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:812:18:812:42 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:812:18:812:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:812:18:812:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:812:18:812:42 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:812:18:812:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:812:18:812:42 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:812:32:812:42 | while_let_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:816:9:816:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:816:17:816:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:817:5:823:5 | match value { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:817:5:823:5 | match value { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:817:11:817:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:818:9:818:9 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:818:14:818:14 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:818:14:818:18 | ... > ... | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:818:18:818:18 | 0 | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:818:23:821:9 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:818:23:821:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:819:17:819:23 | guard_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:819:27:819:27 | x | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | | file://:0:0:0:0 | & | -| pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:820:22:820:44 | ...::_print(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:820:22:820:44 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:820:22:820:44 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| pattern_matching.rs:820:22:820:44 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:820:22:820:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:820:22:820:44 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:820:38:820:44 | guard_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:822:9:822:9 | _ | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:822:14:822:15 | { ... } | | file://:0:0:0:0 | () | -| pattern_matching.rs:826:28:846:1 | { ... } | | file://:0:0:0:0 | () | +| pattern_matching.rs:822:14:822:15 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:826:28:846:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:827:5:827:7 | f(...) | | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:827:5:827:7 | f(...) | T | file://:0:0:0:0 | () | -| pattern_matching.rs:828:5:828:22 | literal_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:829:5:829:25 | identifier_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:830:5:830:23 | wildcard_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:831:5:831:20 | range_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:832:5:832:24 | reference_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:833:5:833:21 | record_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:834:5:834:27 | tuple_struct_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:835:5:835:20 | tuple_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:836:5:836:28 | parenthesized_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:837:5:837:20 | slice_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:838:5:838:19 | path_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:839:5:839:17 | or_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:840:5:840:19 | rest_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:841:5:841:20 | macro_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:842:5:842:29 | complex_nested_patterns(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:843:5:843:32 | patterns_in_let_statements(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:844:5:844:37 | patterns_in_function_parameters(...) | | file://:0:0:0:0 | () | -| pattern_matching.rs:845:5:845:30 | patterns_in_control_flow(...) | | file://:0:0:0:0 | () | +| pattern_matching.rs:827:5:827:7 | f(...) | T | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:828:5:828:22 | literal_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:829:5:829:25 | identifier_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:830:5:830:23 | wildcard_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:831:5:831:20 | range_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:832:5:832:24 | reference_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:833:5:833:21 | record_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:834:5:834:27 | tuple_struct_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:835:5:835:20 | tuple_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:836:5:836:28 | parenthesized_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:837:5:837:20 | slice_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:838:5:838:19 | path_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:839:5:839:17 | or_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:840:5:840:19 | rest_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:841:5:841:20 | macro_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:842:5:842:29 | complex_nested_patterns(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:843:5:843:32 | patterns_in_let_statements(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:844:5:844:37 | patterns_in_function_parameters(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:845:5:845:30 | patterns_in_control_flow(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:3:28:3:28 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:3:28:3:28 | x | TPtrConst | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:3:50:6:1 | { ... } | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:4:9:4:10 | _y | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:4:14:4:26 | { ... } | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:4:23:4:24 | * ... | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:4:24:4:24 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:4:24:4:24 | x | TPtrConst | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:5:5:5:5 | 0 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:8:26:8:26 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:8:26:8:26 | x | TPtrMut | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:8:47:11:1 | { ... } | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:9:9:9:10 | _y | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:9:14:9:26 | { ... } | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:9:23:9:24 | * ... | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:9:24:9:24 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:9:24:9:24 | x | TPtrMut | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:10:5:10:5 | 0 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:13:23:19:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:14:9:14:9 | a | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:14:18:14:19 | 10 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:14:18:14:19 | 10 | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:15:9:15:9 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:15:9:15:9 | x | TPtrConst | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:15:13:15:24 | &raw const a | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:15:13:15:24 | &raw const a | TPtrConst | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:15:24:15:24 | a | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:16:5:18:5 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:17:13:17:14 | _y | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:17:18:17:19 | * ... | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:17:19:17:19 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:17:19:17:19 | x | TPtrConst | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:21:21:27:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:22:13:22:13 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:22:17:22:21 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:23:9:23:9 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:23:9:23:9 | x | TPtrMut | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:23:13:23:22 | &raw mut a | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:23:13:23:22 | &raw mut a | TPtrMut | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:23:22:23:22 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:24:5:26:5 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:25:13:25:14 | _y | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:25:18:25:19 | * ... | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:25:19:25:19 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:25:19:25:19 | x | TPtrMut | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:29:18:29:21 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:29:30:40:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:30:9:30:9 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:30:13:30:17 | 10i32 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:32:9:32:19 | ptr_written | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:32:9:32:19 | ptr_written | TPtrMut | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:32:23:32:32 | null_mut(...) | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:32:23:32:32 | null_mut(...) | TPtrMut | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:33:5:39:5 | if cond {...} | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:33:8:33:11 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:33:13:39:5 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:34:9:38:9 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:36:13:36:24 | * ... | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:36:13:36:28 | ... = ... | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:36:14:36:24 | ptr_written | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:36:14:36:24 | ptr_written | TPtrMut | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:36:28:36:28 | a | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:37:17:37:18 | _y | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:37:22:37:33 | * ... | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:37:23:37:33 | ptr_written | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:37:23:37:33 | ptr_written | TPtrMut | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:42:24:42:27 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:42:36:51:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:44:9:44:16 | ptr_read | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:44:9:44:16 | ptr_read | TPtrMut | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:44:20:44:29 | null_mut(...) | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:44:20:44:29 | null_mut(...) | TPtrMut | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:45:5:50:5 | if cond {...} | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:45:8:45:11 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:45:13:50:5 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:46:9:49:9 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:48:17:48:18 | _y | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:48:27:48:35 | * ... | | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:48:28:48:35 | ptr_read | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:48:28:48:35 | ptr_read | TPtrMut | {EXTERNAL LOCATION} | i64 | +| raw_pointer.rs:53:15:60:1 | { ... } | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:54:5:54:32 | raw_pointer_const_deref(...) | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:54:29:54:31 | &10 | | {EXTERNAL LOCATION} | & | +| raw_pointer.rs:54:29:54:31 | &10 | TRef | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:54:30:54:31 | 10 | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:55:5:55:36 | raw_pointer_mut_deref(...) | | {EXTERNAL LOCATION} | i32 | +| raw_pointer.rs:55:27:55:35 | &mut true | | {EXTERNAL LOCATION} | &mut | +| raw_pointer.rs:55:27:55:35 | &mut true | TRefMut | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:55:32:55:35 | true | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:56:5:56:22 | raw_const_borrow(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:57:5:57:20 | raw_mut_borrow(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:58:5:58:24 | raw_mut_write(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:58:19:58:23 | false | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:59:5:59:30 | raw_type_from_deref(...) | | {EXTERNAL LOCATION} | () | +| raw_pointer.rs:59:25:59:29 | false | | {EXTERNAL LOCATION} | bool | testFailures diff --git a/rust/ql/test/library-tests/type-inference/type-inference.ql b/rust/ql/test/library-tests/type-inference/type-inference.ql index 059cc7848a0..81cad0f975e 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.ql +++ b/rust/ql/test/library-tests/type-inference/type-inference.ql @@ -1,16 +1,28 @@ import rust import utils.test.InlineExpectationsTest +import codeql.rust.internal.Type import codeql.rust.internal.TypeInference as TypeInference import TypeInference -query predicate inferType(AstNode n, TypePath path, Type t) { - t = TypeInference::inferType(n, path) and +private predicate relevantNode(AstNode n) { n.fromSource() and not n.isFromMacroExpansion() and not n instanceof IdentPat and // avoid overlap in the output with the underlying `Name` node not n instanceof LiteralPat // avoid overlap in the output with the underlying `Literal` node } +query predicate inferCertainType(AstNode n, TypePath path, Type t) { + t = TypeInference::CertainTypeInference::inferCertainType(n, path) and + t != TUnknownType() and + relevantNode(n) +} + +query predicate inferType(AstNode n, TypePath path, Type t) { + t = TypeInference::inferType(n, path) and + t != TUnknownType() and + relevantNode(n) +} + module ResolveTest implements TestSig { string getARelevantTag() { result = ["target", "fieldof"] } @@ -36,11 +48,11 @@ module ResolveTest implements TestSig { not target.(Function).getName().getText() = ["panic_fmt", "_print", "format", "must_use"] and tag = "target" or - target = resolveStructFieldExpr(source) and + target = resolveStructFieldExpr(source, _) and any(Struct s | s.getStructField(_) = target).getName().getText() = value and tag = "fieldof" or - target = resolveTupleFieldExpr(source) and + target = resolveTupleFieldExpr(source, _) and any(Struct s | s.getTupleField(_) = target).getName().getText() = value and tag = "fieldof" ) @@ -58,9 +70,10 @@ module TypeTest implements TestSig { exists(AstNode n, TypePath path, Type t | t = TypeInference::inferType(n, path) and ( - if t = TypeInference::CertainTypeInference::inferCertainType(n, path) - then tag = "certainType" - else tag = "type" + tag = "type" + or + t = TypeInference::CertainTypeInference::inferCertainType(n, path) and + tag = "certainType" ) and location = n.getLocation() and ( diff --git a/rust/ql/test/library-tests/variables/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/variables/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 6b4022b86e5..00000000000 --- a/rust/ql/test/library-tests/variables/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -multipleCallTargets -| main.rs:91:19:91:40 | ...::from(...) | -| main.rs:113:19:113:40 | ...::from(...) | diff --git a/rust/ql/test/library-tests/variables/Cfg.expected b/rust/ql/test/library-tests/variables/Cfg.expected index 7d8da915bfb..f93586d373b 100644 --- a/rust/ql/test/library-tests/variables/Cfg.expected +++ b/rust/ql/test/library-tests/variables/Cfg.expected @@ -1798,145 +1798,216 @@ edges | main.rs:753:5:753:16 | print_i64(...) | main.rs:744:18:754:1 | { ... } | | | main.rs:753:5:753:17 | ExprStmt | main.rs:753:5:753:13 | print_i64 | | | main.rs:753:15:753:15 | x | main.rs:753:5:753:16 | print_i64(...) | | -| main.rs:756:1:800:1 | enter fn main | main.rs:757:5:757:25 | ExprStmt | | -| main.rs:756:1:800:1 | exit fn main (normal) | main.rs:756:1:800:1 | exit fn main | | -| main.rs:756:11:800:1 | { ... } | main.rs:756:1:800:1 | exit fn main (normal) | | -| main.rs:757:5:757:22 | immutable_variable | main.rs:757:5:757:24 | immutable_variable(...) | | -| main.rs:757:5:757:24 | immutable_variable(...) | main.rs:758:5:758:23 | ExprStmt | | -| main.rs:757:5:757:25 | ExprStmt | main.rs:757:5:757:22 | immutable_variable | | -| main.rs:758:5:758:20 | mutable_variable | main.rs:758:5:758:22 | mutable_variable(...) | | -| main.rs:758:5:758:22 | mutable_variable(...) | main.rs:759:5:759:40 | ExprStmt | | -| main.rs:758:5:758:23 | ExprStmt | main.rs:758:5:758:20 | mutable_variable | | -| main.rs:759:5:759:37 | mutable_variable_immutable_borrow | main.rs:759:5:759:39 | mutable_variable_immutable_borrow(...) | | -| main.rs:759:5:759:39 | mutable_variable_immutable_borrow(...) | main.rs:760:5:760:23 | ExprStmt | | -| main.rs:759:5:759:40 | ExprStmt | main.rs:759:5:759:37 | mutable_variable_immutable_borrow | | -| main.rs:760:5:760:20 | variable_shadow1 | main.rs:760:5:760:22 | variable_shadow1(...) | | -| main.rs:760:5:760:22 | variable_shadow1(...) | main.rs:761:5:761:23 | ExprStmt | | -| main.rs:760:5:760:23 | ExprStmt | main.rs:760:5:760:20 | variable_shadow1 | | -| main.rs:761:5:761:20 | variable_shadow2 | main.rs:761:5:761:22 | variable_shadow2(...) | | -| main.rs:761:5:761:22 | variable_shadow2(...) | main.rs:762:5:762:19 | ExprStmt | | -| main.rs:761:5:761:23 | ExprStmt | main.rs:761:5:761:20 | variable_shadow2 | | -| main.rs:762:5:762:16 | let_pattern1 | main.rs:762:5:762:18 | let_pattern1(...) | | -| main.rs:762:5:762:18 | let_pattern1(...) | main.rs:763:5:763:19 | ExprStmt | | -| main.rs:762:5:762:19 | ExprStmt | main.rs:762:5:762:16 | let_pattern1 | | -| main.rs:763:5:763:16 | let_pattern2 | main.rs:763:5:763:18 | let_pattern2(...) | | -| main.rs:763:5:763:18 | let_pattern2(...) | main.rs:764:5:764:19 | ExprStmt | | -| main.rs:763:5:763:19 | ExprStmt | main.rs:763:5:763:16 | let_pattern2 | | -| main.rs:764:5:764:16 | let_pattern3 | main.rs:764:5:764:18 | let_pattern3(...) | | -| main.rs:764:5:764:18 | let_pattern3(...) | main.rs:765:5:765:19 | ExprStmt | | -| main.rs:764:5:764:19 | ExprStmt | main.rs:764:5:764:16 | let_pattern3 | | -| main.rs:765:5:765:16 | let_pattern4 | main.rs:765:5:765:18 | let_pattern4(...) | | -| main.rs:765:5:765:18 | let_pattern4(...) | main.rs:766:5:766:21 | ExprStmt | | -| main.rs:765:5:765:19 | ExprStmt | main.rs:765:5:765:16 | let_pattern4 | | -| main.rs:766:5:766:18 | match_pattern1 | main.rs:766:5:766:20 | match_pattern1(...) | | -| main.rs:766:5:766:20 | match_pattern1(...) | main.rs:767:5:767:21 | ExprStmt | | -| main.rs:766:5:766:21 | ExprStmt | main.rs:766:5:766:18 | match_pattern1 | | -| main.rs:767:5:767:18 | match_pattern2 | main.rs:767:5:767:20 | match_pattern2(...) | | -| main.rs:767:5:767:20 | match_pattern2(...) | main.rs:768:5:768:21 | ExprStmt | | -| main.rs:767:5:767:21 | ExprStmt | main.rs:767:5:767:18 | match_pattern2 | | -| main.rs:768:5:768:18 | match_pattern3 | main.rs:768:5:768:20 | match_pattern3(...) | | -| main.rs:768:5:768:20 | match_pattern3(...) | main.rs:769:5:769:21 | ExprStmt | | -| main.rs:768:5:768:21 | ExprStmt | main.rs:768:5:768:18 | match_pattern3 | | -| main.rs:769:5:769:18 | match_pattern4 | main.rs:769:5:769:20 | match_pattern4(...) | | -| main.rs:769:5:769:20 | match_pattern4(...) | main.rs:770:5:770:21 | ExprStmt | | -| main.rs:769:5:769:21 | ExprStmt | main.rs:769:5:769:18 | match_pattern4 | | -| main.rs:770:5:770:18 | match_pattern5 | main.rs:770:5:770:20 | match_pattern5(...) | | -| main.rs:770:5:770:20 | match_pattern5(...) | main.rs:771:5:771:21 | ExprStmt | | -| main.rs:770:5:770:21 | ExprStmt | main.rs:770:5:770:18 | match_pattern5 | | -| main.rs:771:5:771:18 | match_pattern6 | main.rs:771:5:771:20 | match_pattern6(...) | | -| main.rs:771:5:771:20 | match_pattern6(...) | main.rs:772:5:772:21 | ExprStmt | | -| main.rs:771:5:771:21 | ExprStmt | main.rs:771:5:771:18 | match_pattern6 | | -| main.rs:772:5:772:18 | match_pattern7 | main.rs:772:5:772:20 | match_pattern7(...) | | -| main.rs:772:5:772:20 | match_pattern7(...) | main.rs:773:5:773:21 | ExprStmt | | -| main.rs:772:5:772:21 | ExprStmt | main.rs:772:5:772:18 | match_pattern7 | | -| main.rs:773:5:773:18 | match_pattern8 | main.rs:773:5:773:20 | match_pattern8(...) | | -| main.rs:773:5:773:20 | match_pattern8(...) | main.rs:774:5:774:21 | ExprStmt | | -| main.rs:773:5:773:21 | ExprStmt | main.rs:773:5:773:18 | match_pattern8 | | -| main.rs:774:5:774:18 | match_pattern9 | main.rs:774:5:774:20 | match_pattern9(...) | | -| main.rs:774:5:774:20 | match_pattern9(...) | main.rs:775:5:775:22 | ExprStmt | | -| main.rs:774:5:774:21 | ExprStmt | main.rs:774:5:774:18 | match_pattern9 | | -| main.rs:775:5:775:19 | match_pattern10 | main.rs:775:5:775:21 | match_pattern10(...) | | -| main.rs:775:5:775:21 | match_pattern10(...) | main.rs:776:5:776:22 | ExprStmt | | -| main.rs:775:5:775:22 | ExprStmt | main.rs:775:5:775:19 | match_pattern10 | | -| main.rs:776:5:776:19 | match_pattern11 | main.rs:776:5:776:21 | match_pattern11(...) | | -| main.rs:776:5:776:21 | match_pattern11(...) | main.rs:777:5:777:22 | ExprStmt | | -| main.rs:776:5:776:22 | ExprStmt | main.rs:776:5:776:19 | match_pattern11 | | -| main.rs:777:5:777:19 | match_pattern12 | main.rs:777:5:777:21 | match_pattern12(...) | | -| main.rs:777:5:777:21 | match_pattern12(...) | main.rs:778:5:778:22 | ExprStmt | | -| main.rs:777:5:777:22 | ExprStmt | main.rs:777:5:777:19 | match_pattern12 | | -| main.rs:778:5:778:19 | match_pattern13 | main.rs:778:5:778:21 | match_pattern13(...) | | -| main.rs:778:5:778:21 | match_pattern13(...) | main.rs:779:5:779:22 | ExprStmt | | -| main.rs:778:5:778:22 | ExprStmt | main.rs:778:5:778:19 | match_pattern13 | | -| main.rs:779:5:779:19 | match_pattern14 | main.rs:779:5:779:21 | match_pattern14(...) | | -| main.rs:779:5:779:21 | match_pattern14(...) | main.rs:780:5:780:22 | ExprStmt | | -| main.rs:779:5:779:22 | ExprStmt | main.rs:779:5:779:19 | match_pattern14 | | -| main.rs:780:5:780:19 | match_pattern15 | main.rs:780:5:780:21 | match_pattern15(...) | | -| main.rs:780:5:780:21 | match_pattern15(...) | main.rs:781:5:781:22 | ExprStmt | | -| main.rs:780:5:780:22 | ExprStmt | main.rs:780:5:780:19 | match_pattern15 | | -| main.rs:781:5:781:19 | match_pattern16 | main.rs:781:5:781:21 | match_pattern16(...) | | -| main.rs:781:5:781:21 | match_pattern16(...) | main.rs:782:5:782:36 | ExprStmt | | -| main.rs:781:5:781:22 | ExprStmt | main.rs:781:5:781:19 | match_pattern16 | | -| main.rs:782:5:782:18 | param_pattern1 | main.rs:782:20:782:22 | "a" | | -| main.rs:782:5:782:35 | param_pattern1(...) | main.rs:783:5:783:37 | ExprStmt | | -| main.rs:782:5:782:36 | ExprStmt | main.rs:782:5:782:18 | param_pattern1 | | -| main.rs:782:20:782:22 | "a" | main.rs:782:26:782:28 | "b" | | -| main.rs:782:25:782:34 | TupleExpr | main.rs:782:5:782:35 | param_pattern1(...) | | -| main.rs:782:26:782:28 | "b" | main.rs:782:31:782:33 | "c" | | -| main.rs:782:31:782:33 | "c" | main.rs:782:25:782:34 | TupleExpr | | -| main.rs:783:5:783:18 | param_pattern2 | main.rs:783:20:783:31 | ...::Left | | -| main.rs:783:5:783:36 | param_pattern2(...) | main.rs:784:5:784:26 | ExprStmt | | -| main.rs:783:5:783:37 | ExprStmt | main.rs:783:5:783:18 | param_pattern2 | | -| main.rs:783:20:783:31 | ...::Left | main.rs:783:33:783:34 | 45 | | -| main.rs:783:20:783:35 | ...::Left(...) | main.rs:783:5:783:36 | param_pattern2(...) | | -| main.rs:783:33:783:34 | 45 | main.rs:783:20:783:35 | ...::Left(...) | | -| main.rs:784:5:784:23 | destruct_assignment | main.rs:784:5:784:25 | destruct_assignment(...) | | -| main.rs:784:5:784:25 | destruct_assignment(...) | main.rs:785:5:785:23 | ExprStmt | | -| main.rs:784:5:784:26 | ExprStmt | main.rs:784:5:784:23 | destruct_assignment | | -| main.rs:785:5:785:20 | closure_variable | main.rs:785:5:785:22 | closure_variable(...) | | -| main.rs:785:5:785:22 | closure_variable(...) | main.rs:786:5:786:22 | ExprStmt | | -| main.rs:785:5:785:23 | ExprStmt | main.rs:785:5:785:20 | closure_variable | | -| main.rs:786:5:786:19 | nested_function | main.rs:786:5:786:21 | nested_function(...) | | -| main.rs:786:5:786:21 | nested_function(...) | main.rs:787:5:787:19 | ExprStmt | | -| main.rs:786:5:786:22 | ExprStmt | main.rs:786:5:786:19 | nested_function | | -| main.rs:787:5:787:16 | for_variable | main.rs:787:5:787:18 | for_variable(...) | | -| main.rs:787:5:787:18 | for_variable(...) | main.rs:788:5:788:17 | ExprStmt | | -| main.rs:787:5:787:19 | ExprStmt | main.rs:787:5:787:16 | for_variable | | -| main.rs:788:5:788:14 | add_assign | main.rs:788:5:788:16 | add_assign(...) | | -| main.rs:788:5:788:16 | add_assign(...) | main.rs:789:5:789:13 | ExprStmt | | -| main.rs:788:5:788:17 | ExprStmt | main.rs:788:5:788:14 | add_assign | | -| main.rs:789:5:789:10 | mutate | main.rs:789:5:789:12 | mutate(...) | | -| main.rs:789:5:789:12 | mutate(...) | main.rs:790:5:790:17 | ExprStmt | | -| main.rs:789:5:789:13 | ExprStmt | main.rs:789:5:789:10 | mutate | | -| main.rs:790:5:790:14 | mutate_arg | main.rs:790:5:790:16 | mutate_arg(...) | | -| main.rs:790:5:790:16 | mutate_arg(...) | main.rs:791:5:791:12 | ExprStmt | | -| main.rs:790:5:790:17 | ExprStmt | main.rs:790:5:790:14 | mutate_arg | | -| main.rs:791:5:791:9 | alias | main.rs:791:5:791:11 | alias(...) | | -| main.rs:791:5:791:11 | alias(...) | main.rs:792:5:792:18 | ExprStmt | | -| main.rs:791:5:791:12 | ExprStmt | main.rs:791:5:791:9 | alias | | -| main.rs:792:5:792:15 | capture_mut | main.rs:792:5:792:17 | capture_mut(...) | | -| main.rs:792:5:792:17 | capture_mut(...) | main.rs:793:5:793:20 | ExprStmt | | -| main.rs:792:5:792:18 | ExprStmt | main.rs:792:5:792:15 | capture_mut | | -| main.rs:793:5:793:17 | capture_immut | main.rs:793:5:793:19 | capture_immut(...) | | -| main.rs:793:5:793:19 | capture_immut(...) | main.rs:794:5:794:26 | ExprStmt | | -| main.rs:793:5:793:20 | ExprStmt | main.rs:793:5:793:17 | capture_immut | | -| main.rs:794:5:794:23 | async_block_capture | main.rs:794:5:794:25 | async_block_capture(...) | | -| main.rs:794:5:794:25 | async_block_capture(...) | main.rs:795:5:795:14 | ExprStmt | | -| main.rs:794:5:794:26 | ExprStmt | main.rs:794:5:794:23 | async_block_capture | | -| main.rs:795:5:795:11 | structs | main.rs:795:5:795:13 | structs(...) | | -| main.rs:795:5:795:13 | structs(...) | main.rs:796:5:796:14 | ExprStmt | | -| main.rs:795:5:795:14 | ExprStmt | main.rs:795:5:795:11 | structs | | -| main.rs:796:5:796:11 | ref_arg | main.rs:796:5:796:13 | ref_arg(...) | | -| main.rs:796:5:796:13 | ref_arg(...) | main.rs:797:5:797:30 | ExprStmt | | -| main.rs:796:5:796:14 | ExprStmt | main.rs:796:5:796:11 | ref_arg | | -| main.rs:797:5:797:27 | ref_methodcall_receiver | main.rs:797:5:797:29 | ref_methodcall_receiver(...) | | -| main.rs:797:5:797:29 | ref_methodcall_receiver(...) | main.rs:798:5:798:23 | ExprStmt | | -| main.rs:797:5:797:30 | ExprStmt | main.rs:797:5:797:27 | ref_methodcall_receiver | | -| main.rs:798:5:798:20 | macro_invocation | main.rs:798:5:798:22 | macro_invocation(...) | | -| main.rs:798:5:798:22 | macro_invocation(...) | main.rs:799:5:799:18 | ExprStmt | | -| main.rs:798:5:798:23 | ExprStmt | main.rs:798:5:798:20 | macro_invocation | | -| main.rs:799:5:799:15 | capture_phi | main.rs:799:5:799:17 | capture_phi(...) | | -| main.rs:799:5:799:17 | capture_phi(...) | main.rs:756:11:800:1 | { ... } | | -| main.rs:799:5:799:18 | ExprStmt | main.rs:799:5:799:15 | capture_phi | | +| main.rs:757:5:772:5 | enter fn test | main.rs:759:9:759:25 | let ... = ... | | +| main.rs:757:5:772:5 | exit fn test (normal) | main.rs:757:5:772:5 | exit fn test | | +| main.rs:758:34:772:5 | { ... } | main.rs:757:5:772:5 | exit fn test (normal) | | +| main.rs:759:9:759:25 | let ... = ... | main.rs:759:17:759:20 | Some | | +| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | | +| main.rs:759:13:759:13 | x | main.rs:760:9:767:10 | let ... = ... | match | +| main.rs:759:17:759:20 | Some | main.rs:759:22:759:23 | 42 | | +| main.rs:759:17:759:24 | Some(...) | main.rs:759:13:759:13 | x | | +| main.rs:759:22:759:23 | 42 | main.rs:759:17:759:24 | Some(...) | | +| main.rs:760:9:767:10 | let ... = ... | main.rs:761:19:761:19 | x | | +| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | | +| main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y | match | +| main.rs:761:13:767:9 | match x { ... } | main.rs:760:13:760:13 | y | | +| main.rs:761:19:761:19 | x | main.rs:762:13:762:19 | Some(...) | | +| main.rs:762:13:762:19 | Some(...) | main.rs:762:18:762:18 | y | match | +| main.rs:762:13:762:19 | Some(...) | main.rs:765:13:765:16 | None | no-match | +| main.rs:762:18:762:18 | y | main.rs:762:18:762:18 | y | | +| main.rs:762:18:762:18 | y | main.rs:763:17:763:20 | None | match | +| main.rs:762:24:764:13 | { ... } | main.rs:761:13:767:9 | match x { ... } | | +| main.rs:763:17:763:20 | None | main.rs:762:24:764:13 | { ... } | | +| main.rs:765:13:765:16 | None | main.rs:765:13:765:16 | None | | +| main.rs:765:13:765:16 | None | main.rs:766:17:766:20 | None | match | +| main.rs:766:17:766:20 | None | main.rs:761:13:767:9 | match x { ... } | | +| main.rs:768:9:771:9 | match y { ... } | main.rs:758:34:772:5 | { ... } | | +| main.rs:768:15:768:15 | y | main.rs:769:13:769:16 | N0ne | | +| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | | +| main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne | match | +| main.rs:770:17:770:20 | N0ne | main.rs:768:9:771:9 | match y { ... } | | +| main.rs:774:5:781:5 | enter fn test2 | main.rs:776:9:777:17 | let ... = test | | +| main.rs:774:5:781:5 | exit fn test2 (normal) | main.rs:774:5:781:5 | exit fn test2 | | +| main.rs:775:31:781:5 | { ... } | main.rs:774:5:781:5 | exit fn test2 (normal) | | +| main.rs:776:9:777:17 | let ... = test | main.rs:777:13:777:16 | test | | +| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | | +| main.rs:776:13:776:22 | test_alias | main.rs:778:9:779:25 | let ... = ... | match | +| main.rs:777:13:777:16 | test | main.rs:776:13:776:22 | test_alias | | +| main.rs:778:9:779:25 | let ... = ... | main.rs:779:13:779:22 | test_alias | | +| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | | +| main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test | match | +| main.rs:779:13:779:22 | test_alias | main.rs:779:13:779:24 | test_alias(...) | | +| main.rs:779:13:779:24 | test_alias(...) | main.rs:778:13:778:16 | test | | +| main.rs:780:9:780:12 | test | main.rs:775:31:781:5 | { ... } | | +| main.rs:785:5:798:5 | enter fn test3 | main.rs:787:9:787:24 | let ... = ... | | +| main.rs:785:5:798:5 | exit fn test3 (normal) | main.rs:785:5:798:5 | exit fn test3 | | +| main.rs:786:16:798:5 | { ... } | main.rs:785:5:798:5 | exit fn test3 (normal) | | +| main.rs:787:9:787:24 | let ... = ... | main.rs:787:17:787:20 | Some | | +| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | | +| main.rs:787:13:787:13 | x | main.rs:788:9:792:10 | ExprStmt | match | +| main.rs:787:17:787:20 | Some | main.rs:787:22:787:22 | 0 | | +| main.rs:787:17:787:23 | Some(...) | main.rs:787:13:787:13 | x | | +| main.rs:787:22:787:22 | 0 | main.rs:787:17:787:23 | Some(...) | | +| main.rs:788:9:792:9 | match x { ... } | main.rs:793:9:797:10 | ExprStmt | | +| main.rs:788:9:792:10 | ExprStmt | main.rs:788:15:788:15 | x | | +| main.rs:788:15:788:15 | x | main.rs:789:13:789:19 | Some(...) | | +| main.rs:789:13:789:19 | Some(...) | main.rs:789:18:789:18 | x | match | +| main.rs:789:13:789:19 | Some(...) | main.rs:791:13:791:13 | _ | no-match | +| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | | +| main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x | match | +| main.rs:790:20:790:20 | x | main.rs:788:9:792:9 | match x { ... } | | +| main.rs:791:13:791:13 | _ | main.rs:791:18:791:18 | 0 | match | +| main.rs:791:18:791:18 | 0 | main.rs:788:9:792:9 | match x { ... } | | +| main.rs:793:9:797:9 | match x { ... } | main.rs:786:16:798:5 | { ... } | | +| main.rs:793:9:797:10 | ExprStmt | main.rs:793:15:793:15 | x | | +| main.rs:793:15:793:15 | x | main.rs:794:13:794:19 | Some(...) | | +| main.rs:794:13:794:19 | Some(...) | main.rs:794:18:794:18 | z | match | +| main.rs:794:13:794:19 | Some(...) | main.rs:796:13:796:13 | _ | no-match | +| main.rs:794:18:794:18 | z | main.rs:794:18:794:18 | z | | +| main.rs:794:18:794:18 | z | main.rs:795:17:795:17 | z | match | +| main.rs:794:18:794:18 | z | main.rs:796:13:796:13 | _ | no-match | +| main.rs:795:17:795:17 | z | main.rs:793:9:797:9 | match x { ... } | | +| main.rs:796:13:796:13 | _ | main.rs:796:18:796:18 | 0 | match | +| main.rs:796:18:796:18 | 0 | main.rs:793:9:797:9 | match x { ... } | | +| main.rs:801:1:845:1 | enter fn main | main.rs:802:5:802:25 | ExprStmt | | +| main.rs:801:1:845:1 | exit fn main (normal) | main.rs:801:1:845:1 | exit fn main | | +| main.rs:801:11:845:1 | { ... } | main.rs:801:1:845:1 | exit fn main (normal) | | +| main.rs:802:5:802:22 | immutable_variable | main.rs:802:5:802:24 | immutable_variable(...) | | +| main.rs:802:5:802:24 | immutable_variable(...) | main.rs:803:5:803:23 | ExprStmt | | +| main.rs:802:5:802:25 | ExprStmt | main.rs:802:5:802:22 | immutable_variable | | +| main.rs:803:5:803:20 | mutable_variable | main.rs:803:5:803:22 | mutable_variable(...) | | +| main.rs:803:5:803:22 | mutable_variable(...) | main.rs:804:5:804:40 | ExprStmt | | +| main.rs:803:5:803:23 | ExprStmt | main.rs:803:5:803:20 | mutable_variable | | +| main.rs:804:5:804:37 | mutable_variable_immutable_borrow | main.rs:804:5:804:39 | mutable_variable_immutable_borrow(...) | | +| main.rs:804:5:804:39 | mutable_variable_immutable_borrow(...) | main.rs:805:5:805:23 | ExprStmt | | +| main.rs:804:5:804:40 | ExprStmt | main.rs:804:5:804:37 | mutable_variable_immutable_borrow | | +| main.rs:805:5:805:20 | variable_shadow1 | main.rs:805:5:805:22 | variable_shadow1(...) | | +| main.rs:805:5:805:22 | variable_shadow1(...) | main.rs:806:5:806:23 | ExprStmt | | +| main.rs:805:5:805:23 | ExprStmt | main.rs:805:5:805:20 | variable_shadow1 | | +| main.rs:806:5:806:20 | variable_shadow2 | main.rs:806:5:806:22 | variable_shadow2(...) | | +| main.rs:806:5:806:22 | variable_shadow2(...) | main.rs:807:5:807:19 | ExprStmt | | +| main.rs:806:5:806:23 | ExprStmt | main.rs:806:5:806:20 | variable_shadow2 | | +| main.rs:807:5:807:16 | let_pattern1 | main.rs:807:5:807:18 | let_pattern1(...) | | +| main.rs:807:5:807:18 | let_pattern1(...) | main.rs:808:5:808:19 | ExprStmt | | +| main.rs:807:5:807:19 | ExprStmt | main.rs:807:5:807:16 | let_pattern1 | | +| main.rs:808:5:808:16 | let_pattern2 | main.rs:808:5:808:18 | let_pattern2(...) | | +| main.rs:808:5:808:18 | let_pattern2(...) | main.rs:809:5:809:19 | ExprStmt | | +| main.rs:808:5:808:19 | ExprStmt | main.rs:808:5:808:16 | let_pattern2 | | +| main.rs:809:5:809:16 | let_pattern3 | main.rs:809:5:809:18 | let_pattern3(...) | | +| main.rs:809:5:809:18 | let_pattern3(...) | main.rs:810:5:810:19 | ExprStmt | | +| main.rs:809:5:809:19 | ExprStmt | main.rs:809:5:809:16 | let_pattern3 | | +| main.rs:810:5:810:16 | let_pattern4 | main.rs:810:5:810:18 | let_pattern4(...) | | +| main.rs:810:5:810:18 | let_pattern4(...) | main.rs:811:5:811:21 | ExprStmt | | +| main.rs:810:5:810:19 | ExprStmt | main.rs:810:5:810:16 | let_pattern4 | | +| main.rs:811:5:811:18 | match_pattern1 | main.rs:811:5:811:20 | match_pattern1(...) | | +| main.rs:811:5:811:20 | match_pattern1(...) | main.rs:812:5:812:21 | ExprStmt | | +| main.rs:811:5:811:21 | ExprStmt | main.rs:811:5:811:18 | match_pattern1 | | +| main.rs:812:5:812:18 | match_pattern2 | main.rs:812:5:812:20 | match_pattern2(...) | | +| main.rs:812:5:812:20 | match_pattern2(...) | main.rs:813:5:813:21 | ExprStmt | | +| main.rs:812:5:812:21 | ExprStmt | main.rs:812:5:812:18 | match_pattern2 | | +| main.rs:813:5:813:18 | match_pattern3 | main.rs:813:5:813:20 | match_pattern3(...) | | +| main.rs:813:5:813:20 | match_pattern3(...) | main.rs:814:5:814:21 | ExprStmt | | +| main.rs:813:5:813:21 | ExprStmt | main.rs:813:5:813:18 | match_pattern3 | | +| main.rs:814:5:814:18 | match_pattern4 | main.rs:814:5:814:20 | match_pattern4(...) | | +| main.rs:814:5:814:20 | match_pattern4(...) | main.rs:815:5:815:21 | ExprStmt | | +| main.rs:814:5:814:21 | ExprStmt | main.rs:814:5:814:18 | match_pattern4 | | +| main.rs:815:5:815:18 | match_pattern5 | main.rs:815:5:815:20 | match_pattern5(...) | | +| main.rs:815:5:815:20 | match_pattern5(...) | main.rs:816:5:816:21 | ExprStmt | | +| main.rs:815:5:815:21 | ExprStmt | main.rs:815:5:815:18 | match_pattern5 | | +| main.rs:816:5:816:18 | match_pattern6 | main.rs:816:5:816:20 | match_pattern6(...) | | +| main.rs:816:5:816:20 | match_pattern6(...) | main.rs:817:5:817:21 | ExprStmt | | +| main.rs:816:5:816:21 | ExprStmt | main.rs:816:5:816:18 | match_pattern6 | | +| main.rs:817:5:817:18 | match_pattern7 | main.rs:817:5:817:20 | match_pattern7(...) | | +| main.rs:817:5:817:20 | match_pattern7(...) | main.rs:818:5:818:21 | ExprStmt | | +| main.rs:817:5:817:21 | ExprStmt | main.rs:817:5:817:18 | match_pattern7 | | +| main.rs:818:5:818:18 | match_pattern8 | main.rs:818:5:818:20 | match_pattern8(...) | | +| main.rs:818:5:818:20 | match_pattern8(...) | main.rs:819:5:819:21 | ExprStmt | | +| main.rs:818:5:818:21 | ExprStmt | main.rs:818:5:818:18 | match_pattern8 | | +| main.rs:819:5:819:18 | match_pattern9 | main.rs:819:5:819:20 | match_pattern9(...) | | +| main.rs:819:5:819:20 | match_pattern9(...) | main.rs:820:5:820:22 | ExprStmt | | +| main.rs:819:5:819:21 | ExprStmt | main.rs:819:5:819:18 | match_pattern9 | | +| main.rs:820:5:820:19 | match_pattern10 | main.rs:820:5:820:21 | match_pattern10(...) | | +| main.rs:820:5:820:21 | match_pattern10(...) | main.rs:821:5:821:22 | ExprStmt | | +| main.rs:820:5:820:22 | ExprStmt | main.rs:820:5:820:19 | match_pattern10 | | +| main.rs:821:5:821:19 | match_pattern11 | main.rs:821:5:821:21 | match_pattern11(...) | | +| main.rs:821:5:821:21 | match_pattern11(...) | main.rs:822:5:822:22 | ExprStmt | | +| main.rs:821:5:821:22 | ExprStmt | main.rs:821:5:821:19 | match_pattern11 | | +| main.rs:822:5:822:19 | match_pattern12 | main.rs:822:5:822:21 | match_pattern12(...) | | +| main.rs:822:5:822:21 | match_pattern12(...) | main.rs:823:5:823:22 | ExprStmt | | +| main.rs:822:5:822:22 | ExprStmt | main.rs:822:5:822:19 | match_pattern12 | | +| main.rs:823:5:823:19 | match_pattern13 | main.rs:823:5:823:21 | match_pattern13(...) | | +| main.rs:823:5:823:21 | match_pattern13(...) | main.rs:824:5:824:22 | ExprStmt | | +| main.rs:823:5:823:22 | ExprStmt | main.rs:823:5:823:19 | match_pattern13 | | +| main.rs:824:5:824:19 | match_pattern14 | main.rs:824:5:824:21 | match_pattern14(...) | | +| main.rs:824:5:824:21 | match_pattern14(...) | main.rs:825:5:825:22 | ExprStmt | | +| main.rs:824:5:824:22 | ExprStmt | main.rs:824:5:824:19 | match_pattern14 | | +| main.rs:825:5:825:19 | match_pattern15 | main.rs:825:5:825:21 | match_pattern15(...) | | +| main.rs:825:5:825:21 | match_pattern15(...) | main.rs:826:5:826:22 | ExprStmt | | +| main.rs:825:5:825:22 | ExprStmt | main.rs:825:5:825:19 | match_pattern15 | | +| main.rs:826:5:826:19 | match_pattern16 | main.rs:826:5:826:21 | match_pattern16(...) | | +| main.rs:826:5:826:21 | match_pattern16(...) | main.rs:827:5:827:36 | ExprStmt | | +| main.rs:826:5:826:22 | ExprStmt | main.rs:826:5:826:19 | match_pattern16 | | +| main.rs:827:5:827:18 | param_pattern1 | main.rs:827:20:827:22 | "a" | | +| main.rs:827:5:827:35 | param_pattern1(...) | main.rs:828:5:828:37 | ExprStmt | | +| main.rs:827:5:827:36 | ExprStmt | main.rs:827:5:827:18 | param_pattern1 | | +| main.rs:827:20:827:22 | "a" | main.rs:827:26:827:28 | "b" | | +| main.rs:827:25:827:34 | TupleExpr | main.rs:827:5:827:35 | param_pattern1(...) | | +| main.rs:827:26:827:28 | "b" | main.rs:827:31:827:33 | "c" | | +| main.rs:827:31:827:33 | "c" | main.rs:827:25:827:34 | TupleExpr | | +| main.rs:828:5:828:18 | param_pattern2 | main.rs:828:20:828:31 | ...::Left | | +| main.rs:828:5:828:36 | param_pattern2(...) | main.rs:829:5:829:26 | ExprStmt | | +| main.rs:828:5:828:37 | ExprStmt | main.rs:828:5:828:18 | param_pattern2 | | +| main.rs:828:20:828:31 | ...::Left | main.rs:828:33:828:34 | 45 | | +| main.rs:828:20:828:35 | ...::Left(...) | main.rs:828:5:828:36 | param_pattern2(...) | | +| main.rs:828:33:828:34 | 45 | main.rs:828:20:828:35 | ...::Left(...) | | +| main.rs:829:5:829:23 | destruct_assignment | main.rs:829:5:829:25 | destruct_assignment(...) | | +| main.rs:829:5:829:25 | destruct_assignment(...) | main.rs:830:5:830:23 | ExprStmt | | +| main.rs:829:5:829:26 | ExprStmt | main.rs:829:5:829:23 | destruct_assignment | | +| main.rs:830:5:830:20 | closure_variable | main.rs:830:5:830:22 | closure_variable(...) | | +| main.rs:830:5:830:22 | closure_variable(...) | main.rs:831:5:831:22 | ExprStmt | | +| main.rs:830:5:830:23 | ExprStmt | main.rs:830:5:830:20 | closure_variable | | +| main.rs:831:5:831:19 | nested_function | main.rs:831:5:831:21 | nested_function(...) | | +| main.rs:831:5:831:21 | nested_function(...) | main.rs:832:5:832:19 | ExprStmt | | +| main.rs:831:5:831:22 | ExprStmt | main.rs:831:5:831:19 | nested_function | | +| main.rs:832:5:832:16 | for_variable | main.rs:832:5:832:18 | for_variable(...) | | +| main.rs:832:5:832:18 | for_variable(...) | main.rs:833:5:833:17 | ExprStmt | | +| main.rs:832:5:832:19 | ExprStmt | main.rs:832:5:832:16 | for_variable | | +| main.rs:833:5:833:14 | add_assign | main.rs:833:5:833:16 | add_assign(...) | | +| main.rs:833:5:833:16 | add_assign(...) | main.rs:834:5:834:13 | ExprStmt | | +| main.rs:833:5:833:17 | ExprStmt | main.rs:833:5:833:14 | add_assign | | +| main.rs:834:5:834:10 | mutate | main.rs:834:5:834:12 | mutate(...) | | +| main.rs:834:5:834:12 | mutate(...) | main.rs:835:5:835:17 | ExprStmt | | +| main.rs:834:5:834:13 | ExprStmt | main.rs:834:5:834:10 | mutate | | +| main.rs:835:5:835:14 | mutate_arg | main.rs:835:5:835:16 | mutate_arg(...) | | +| main.rs:835:5:835:16 | mutate_arg(...) | main.rs:836:5:836:12 | ExprStmt | | +| main.rs:835:5:835:17 | ExprStmt | main.rs:835:5:835:14 | mutate_arg | | +| main.rs:836:5:836:9 | alias | main.rs:836:5:836:11 | alias(...) | | +| main.rs:836:5:836:11 | alias(...) | main.rs:837:5:837:18 | ExprStmt | | +| main.rs:836:5:836:12 | ExprStmt | main.rs:836:5:836:9 | alias | | +| main.rs:837:5:837:15 | capture_mut | main.rs:837:5:837:17 | capture_mut(...) | | +| main.rs:837:5:837:17 | capture_mut(...) | main.rs:838:5:838:20 | ExprStmt | | +| main.rs:837:5:837:18 | ExprStmt | main.rs:837:5:837:15 | capture_mut | | +| main.rs:838:5:838:17 | capture_immut | main.rs:838:5:838:19 | capture_immut(...) | | +| main.rs:838:5:838:19 | capture_immut(...) | main.rs:839:5:839:26 | ExprStmt | | +| main.rs:838:5:838:20 | ExprStmt | main.rs:838:5:838:17 | capture_immut | | +| main.rs:839:5:839:23 | async_block_capture | main.rs:839:5:839:25 | async_block_capture(...) | | +| main.rs:839:5:839:25 | async_block_capture(...) | main.rs:840:5:840:14 | ExprStmt | | +| main.rs:839:5:839:26 | ExprStmt | main.rs:839:5:839:23 | async_block_capture | | +| main.rs:840:5:840:11 | structs | main.rs:840:5:840:13 | structs(...) | | +| main.rs:840:5:840:13 | structs(...) | main.rs:841:5:841:14 | ExprStmt | | +| main.rs:840:5:840:14 | ExprStmt | main.rs:840:5:840:11 | structs | | +| main.rs:841:5:841:11 | ref_arg | main.rs:841:5:841:13 | ref_arg(...) | | +| main.rs:841:5:841:13 | ref_arg(...) | main.rs:842:5:842:30 | ExprStmt | | +| main.rs:841:5:841:14 | ExprStmt | main.rs:841:5:841:11 | ref_arg | | +| main.rs:842:5:842:27 | ref_methodcall_receiver | main.rs:842:5:842:29 | ref_methodcall_receiver(...) | | +| main.rs:842:5:842:29 | ref_methodcall_receiver(...) | main.rs:843:5:843:23 | ExprStmt | | +| main.rs:842:5:842:30 | ExprStmt | main.rs:842:5:842:27 | ref_methodcall_receiver | | +| main.rs:843:5:843:20 | macro_invocation | main.rs:843:5:843:22 | macro_invocation(...) | | +| main.rs:843:5:843:22 | macro_invocation(...) | main.rs:844:5:844:18 | ExprStmt | | +| main.rs:843:5:843:23 | ExprStmt | main.rs:843:5:843:20 | macro_invocation | | +| main.rs:844:5:844:15 | capture_phi | main.rs:844:5:844:17 | capture_phi(...) | | +| main.rs:844:5:844:17 | capture_phi(...) | main.rs:801:11:845:1 | { ... } | | +| main.rs:844:5:844:18 | ExprStmt | main.rs:844:5:844:15 | capture_phi | | breakTarget | main.rs:326:9:326:13 | break | main.rs:317:5:327:5 | while ... { ... } | continueTarget diff --git a/rust/ql/test/library-tests/variables/Ssa.expected b/rust/ql/test/library-tests/variables/Ssa.expected index 35adac47802..0acf3e94c5b 100644 --- a/rust/ql/test/library-tests/variables/Ssa.expected +++ b/rust/ql/test/library-tests/variables/Ssa.expected @@ -196,6 +196,13 @@ definition | main.rs:748:17:750:9 | SSA phi(x) | main.rs:745:13:745:13 | x | | main.rs:749:13:749:13 | x | main.rs:745:13:745:13 | x | | main.rs:752:5:752:13 | x | main.rs:745:13:745:13 | x | +| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | +| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | +| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | +| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | +| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | +| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | +| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | read | main.rs:5:14:5:14 | s | main.rs:5:14:5:14 | s | main.rs:7:20:7:20 | s | | main.rs:10:14:10:14 | i | main.rs:10:14:10:14 | i | main.rs:12:20:12:20 | i | @@ -404,6 +411,14 @@ read | main.rs:746:13:746:15 | cap | main.rs:746:13:746:15 | cap | main.rs:752:5:752:7 | cap | | main.rs:746:20:746:20 | b | main.rs:746:20:746:20 | b | main.rs:748:20:748:20 | b | | main.rs:752:5:752:13 | x | main.rs:745:13:745:13 | x | main.rs:753:15:753:15 | x | +| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | main.rs:761:19:761:19 | x | +| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y | +| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne | +| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | main.rs:779:13:779:22 | test_alias | +| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test | +| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x | +| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:793:15:793:15 | x | +| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x | firstRead | main.rs:5:14:5:14 | s | main.rs:5:14:5:14 | s | main.rs:7:20:7:20 | s | | main.rs:10:14:10:14 | i | main.rs:10:14:10:14 | i | main.rs:12:20:12:20 | i | @@ -570,6 +585,13 @@ firstRead | main.rs:746:13:746:15 | cap | main.rs:746:13:746:15 | cap | main.rs:752:5:752:7 | cap | | main.rs:746:20:746:20 | b | main.rs:746:20:746:20 | b | main.rs:748:20:748:20 | b | | main.rs:752:5:752:13 | x | main.rs:745:13:745:13 | x | main.rs:753:15:753:15 | x | +| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | main.rs:761:19:761:19 | x | +| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y | +| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne | +| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | main.rs:779:13:779:22 | test_alias | +| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test | +| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x | +| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x | adjacentReads | main.rs:27:5:27:6 | x2 | main.rs:25:13:25:14 | x2 | main.rs:28:15:28:16 | x2 | main.rs:29:10:29:11 | x2 | | main.rs:41:9:41:10 | x3 | main.rs:41:9:41:10 | x3 | main.rs:42:15:42:16 | x3 | main.rs:44:9:44:10 | x3 | @@ -616,6 +638,7 @@ adjacentReads | main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:677:15:677:15 | a | main.rs:678:5:678:5 | a | | main.rs:676:13:676:13 | a | main.rs:676:13:676:13 | a | main.rs:678:5:678:5 | a | main.rs:679:15:679:15 | a | | main.rs:685:9:685:9 | x | main.rs:685:9:685:9 | x | main.rs:686:20:686:20 | x | main.rs:687:15:687:15 | x | +| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x | main.rs:793:15:793:15 | x | phi | main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:9:210:44 | a3 | main.rs:210:22:210:23 | a3 | | main.rs:210:9:210:44 | SSA phi(a3) | main.rs:210:9:210:44 | a3 | main.rs:210:42:210:43 | a3 | @@ -773,3 +796,8 @@ assigns | main.rs:745:13:745:13 | x | main.rs:745:17:745:19 | 100 | | main.rs:746:13:746:15 | cap | main.rs:746:19:751:5 | \|...\| ... | | main.rs:749:13:749:13 | x | main.rs:749:17:749:19 | 200 | +| main.rs:759:13:759:13 | x | main.rs:759:17:759:24 | Some(...) | +| main.rs:760:13:760:13 | y | main.rs:761:13:767:9 | match x { ... } | +| main.rs:776:13:776:22 | test_alias | main.rs:777:13:777:16 | test | +| main.rs:778:13:778:16 | test | main.rs:779:13:779:24 | test_alias(...) | +| main.rs:787:13:787:13 | x | main.rs:787:17:787:23 | Some(...) | diff --git a/rust/ql/test/library-tests/variables/Ssa.ql b/rust/ql/test/library-tests/variables/Ssa.ql index d93a1f13b64..8ca9bd15e66 100644 --- a/rust/ql/test/library-tests/variables/Ssa.ql +++ b/rust/ql/test/library-tests/variables/Ssa.ql @@ -10,17 +10,17 @@ query predicate definition(Ssa::Definition def, Variable v) { toBeTested(v.getEnclosingCfgScope()) and def.getSourceVariable() = v } -query predicate read(Ssa::Definition def, Variable v, CfgNode read) { +query predicate read(Ssa::Definition def, Variable v, Expr read) { toBeTested(v.getEnclosingCfgScope()) and def.getSourceVariable() = v and read = def.getARead() } -query predicate firstRead(Ssa::Definition def, Variable v, CfgNode read) { +query predicate firstRead(Ssa::Definition def, Variable v, Expr read) { toBeTested(v.getEnclosingCfgScope()) and def.getSourceVariable() = v and read = def.getAFirstRead() } -query predicate adjacentReads(Ssa::Definition def, Variable v, CfgNode read1, CfgNode read2) { +query predicate adjacentReads(Ssa::Definition def, Variable v, Expr read1, Expr read2) { toBeTested(v.getEnclosingCfgScope()) and def.getSourceVariable() = v and def.hasAdjacentReads(read1, read2) @@ -54,4 +54,4 @@ query predicate ultimateDef(Ssa::Definition def, Definition ult) { ult != def } -query predicate assigns(Ssa::WriteDefinition def, CfgNode value) { def.assigns(value) } +query predicate assigns(Ssa::WriteDefinition def, Expr value) { def.assigns(value) } diff --git a/rust/ql/test/library-tests/variables/main.rs b/rust/ql/test/library-tests/variables/main.rs index cdfe1091ee3..fe13f89b177 100644 --- a/rust/ql/test/library-tests/variables/main.rs +++ b/rust/ql/test/library-tests/variables/main.rs @@ -753,6 +753,51 @@ fn capture_phi() { print_i64(x); // $ read_access=x } +mod patterns { + #[rustfmt::skip] + pub fn test() -> Option { + let x = Some(42); // x + let y : Option = // y1 + match x { // $ read_access=x + Some(y) => { // y2 + None + } + None => + None + }; + match y { // $ read_access=y1 + N0ne => // n0ne + N0ne // $ read_access=n0ne + } + } + + #[rustfmt::skip] + fn test2() -> Option { + let test_alias = // test_alias + test; + let test = // test + test_alias(); // $ read_access=test_alias + test // $ read_access=test + } + + const z: i32 = 0; + + #[rustfmt::skip] + fn test3() { + let x = Some(0); // x1 + match x { // $ read_access=x1 + Some(x) // x2 + => x, // $ read_access=x2 + _ => 0 + }; + match x { // $ read_access=x1 + Some(z) => + z, + _ => 0 + }; + } +} + fn main() { immutable_variable(); mutable_variable(); diff --git a/rust/ql/test/library-tests/variables/variables.expected b/rust/ql/test/library-tests/variables/variables.expected index 64431803e6d..ea360357d97 100644 --- a/rust/ql/test/library-tests/variables/variables.expected +++ b/rust/ql/test/library-tests/variables/variables.expected @@ -142,6 +142,14 @@ variable | main.rs:745:13:745:13 | x | | main.rs:746:13:746:15 | cap | | main.rs:746:20:746:20 | b | +| main.rs:759:13:759:13 | x | +| main.rs:760:13:760:13 | y | +| main.rs:762:18:762:18 | y | +| main.rs:769:13:769:16 | N0ne | +| main.rs:776:13:776:22 | test_alias | +| main.rs:778:13:778:16 | test | +| main.rs:787:13:787:13 | x | +| main.rs:789:18:789:18 | x | variableAccess | main.rs:7:20:7:20 | s | main.rs:5:14:5:14 | s | | main.rs:12:20:12:20 | i | main.rs:10:14:10:14 | i | @@ -364,6 +372,14 @@ variableAccess | main.rs:749:13:749:13 | x | main.rs:745:13:745:13 | x | | main.rs:752:5:752:7 | cap | main.rs:746:13:746:15 | cap | | main.rs:753:15:753:15 | x | main.rs:745:13:745:13 | x | +| main.rs:761:19:761:19 | x | main.rs:759:13:759:13 | x | +| main.rs:768:15:768:15 | y | main.rs:760:13:760:13 | y | +| main.rs:770:17:770:20 | N0ne | main.rs:769:13:769:16 | N0ne | +| main.rs:779:13:779:22 | test_alias | main.rs:776:13:776:22 | test_alias | +| main.rs:780:9:780:12 | test | main.rs:778:13:778:16 | test | +| main.rs:788:15:788:15 | x | main.rs:787:13:787:13 | x | +| main.rs:790:20:790:20 | x | main.rs:789:18:789:18 | x | +| main.rs:793:15:793:15 | x | main.rs:787:13:787:13 | x | variableWriteAccess | main.rs:27:5:27:6 | x2 | main.rs:25:13:25:14 | x2 | | main.rs:29:5:29:6 | x2 | main.rs:25:13:25:14 | x2 | @@ -576,6 +592,14 @@ variableReadAccess | main.rs:748:20:748:20 | b | main.rs:746:20:746:20 | b | | main.rs:752:5:752:7 | cap | main.rs:746:13:746:15 | cap | | main.rs:753:15:753:15 | x | main.rs:745:13:745:13 | x | +| main.rs:761:19:761:19 | x | main.rs:759:13:759:13 | x | +| main.rs:768:15:768:15 | y | main.rs:760:13:760:13 | y | +| main.rs:770:17:770:20 | N0ne | main.rs:769:13:769:16 | N0ne | +| main.rs:779:13:779:22 | test_alias | main.rs:776:13:776:22 | test_alias | +| main.rs:780:9:780:12 | test | main.rs:778:13:778:16 | test | +| main.rs:788:15:788:15 | x | main.rs:787:13:787:13 | x | +| main.rs:790:20:790:20 | x | main.rs:789:18:789:18 | x | +| main.rs:793:15:793:15 | x | main.rs:787:13:787:13 | x | variableInitializer | main.rs:20:9:20:10 | x1 | main.rs:20:14:20:16 | "a" | | main.rs:25:13:25:14 | x2 | main.rs:25:18:25:18 | 4 | @@ -649,6 +673,11 @@ variableInitializer | main.rs:734:15:734:28 | var_in_macro | main.rs:734:15:734:28 | 0 | | main.rs:745:13:745:13 | x | main.rs:745:17:745:19 | 100 | | main.rs:746:13:746:15 | cap | main.rs:746:19:751:5 | \|...\| ... | +| main.rs:759:13:759:13 | x | main.rs:759:17:759:24 | Some(...) | +| main.rs:760:13:760:13 | y | main.rs:761:13:767:9 | match x { ... } | +| main.rs:776:13:776:22 | test_alias | main.rs:777:13:777:16 | test | +| main.rs:778:13:778:16 | test | main.rs:779:13:779:24 | test_alias(...) | +| main.rs:787:13:787:13 | x | main.rs:787:17:787:23 | Some(...) | capturedVariable | main.rs:557:9:557:9 | x | | main.rs:568:13:568:13 | x | diff --git a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/diagnostics/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index bb60014263b..00000000000 --- a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| my_struct.rs:25:19:25:37 | ...::from(...) | diff --git a/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected b/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected index 563e370b4ed..ed21d9772fc 100644 --- a/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected +++ b/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected @@ -6,7 +6,7 @@ | Files extracted - without errors % | 57 | | Inconsistencies - AST | 0 | | Inconsistencies - CFG | 0 | -| Inconsistencies - Path resolution | 1 | +| Inconsistencies - Path resolution | 0 | | Inconsistencies - SSA | 0 | | Inconsistencies - data flow | 0 | | Lines of code extracted | 60 | diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index a1f9b448ac7..df7070c966a 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -22,11 +22,12 @@ edges | src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:14 | | src/main.rs:11:24:11:32 | file_path | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:50:51:50:59 | file_path | src/main.rs:52:32:52:40 | file_path | provenance | | -| src/main.rs:52:9:52:17 | file_path [&ref] | src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | provenance | Config | +| src/main.rs:52:9:52:17 | file_path [&ref] | src/main.rs:53:21:53:29 | file_path [&ref] | provenance | | | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | src/main.rs:52:9:52:17 | file_path [&ref] | provenance | | | src/main.rs:52:31:52:40 | &file_path [&ref] | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:52:32:52:40 | file_path | src/main.rs:52:31:52:40 | &file_path [&ref] | provenance | | | src/main.rs:53:9:53:17 | file_path | src/main.rs:58:24:58:32 | file_path | provenance | | +| src/main.rs:53:21:53:29 | file_path [&ref] | src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | src/main.rs:53:21:53:53 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:53:21:53:53 | ... .unwrap() | src/main.rs:53:9:53:17 | file_path | provenance | | | src/main.rs:58:24:58:32 | file_path | src/main.rs:58:5:58:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | @@ -37,27 +38,22 @@ edges | src/main.rs:66:32:66:40 | file_path | src/main.rs:66:31:66:40 | &file_path [&ref] | provenance | | | src/main.rs:71:24:71:32 | file_path [&ref] | src/main.rs:71:5:71:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:90:11:90:19 | file_path | src/main.rs:93:32:93:40 | file_path | provenance | | -| src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | +| src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:29 | file_path [&ref] | provenance | | | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | src/main.rs:93:9:93:17 | file_path [&ref] | provenance | | | src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:93:32:93:40 | file_path | src/main.rs:93:31:93:40 | &file_path [&ref] | provenance | | | src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | | +| src/main.rs:98:21:98:29 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:98:21:98:53 | ... .unwrap() | src/main.rs:98:9:98:17 | file_path | provenance | | | src/main.rs:99:24:99:32 | file_path | src/main.rs:99:5:99:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | | -| src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:106:39:106:43 | path1 | provenance | | -| src/main.rs:103:9:103:13 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:109:41:109:45 | path1 | provenance | | -| src/main.rs:103:9:103:13 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:112:45:112:49 | path1 | provenance | | -| src/main.rs:103:9:103:13 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:115:39:115:43 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:122:27:122:31 | path1 | provenance | | -| src/main.rs:103:9:103:13 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:41 | path1 | provenance | | -| src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:17:103:30 | ...::args | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | | src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:10 | | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:11 | @@ -89,8 +85,9 @@ edges | src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:115:39:115:43 | path1 | src/main.rs:115:38:115:43 | &path1 [&ref] | provenance | | | src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:116:13:116:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | -| src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | +| src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:118:17:118:21 | path5 [&ref] | provenance | | | src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | | +| src/main.rs:118:17:118:21 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:118:17:118:45 | ... .unwrap() | src/main.rs:118:9:118:13 | path6 | provenance | | | src/main.rs:119:33:119:37 | path6 | src/main.rs:119:13:119:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | @@ -124,7 +121,7 @@ models | 7 | Source: std::env::args; ReturnValue.Element; commandargs | | 8 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | | 9 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | -| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | | 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | | 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 13 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | @@ -142,6 +139,7 @@ nodes | src/main.rs:52:31:52:40 | &file_path [&ref] | semmle.label | &file_path [&ref] | | src/main.rs:52:32:52:40 | file_path | semmle.label | file_path | | src/main.rs:53:9:53:17 | file_path | semmle.label | file_path | +| src/main.rs:53:21:53:29 | file_path [&ref] | semmle.label | file_path [&ref] | | src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | semmle.label | file_path.canonicalize() [Ok] | | src/main.rs:53:21:53:53 | ... .unwrap() | semmle.label | ... .unwrap() | | src/main.rs:58:5:58:22 | ...::read_to_string | semmle.label | ...::read_to_string | @@ -159,6 +157,7 @@ nodes | src/main.rs:93:31:93:40 | &file_path [&ref] | semmle.label | &file_path [&ref] | | src/main.rs:93:32:93:40 | file_path | semmle.label | file_path | | src/main.rs:98:9:98:17 | file_path | semmle.label | file_path | +| src/main.rs:98:21:98:29 | file_path [&ref] | semmle.label | file_path [&ref] | | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | semmle.label | file_path.canonicalize() [Ok] | | src/main.rs:98:21:98:53 | ... .unwrap() | semmle.label | ... .unwrap() | | src/main.rs:99:5:99:22 | ...::read_to_string | semmle.label | ...::read_to_string | @@ -201,6 +200,7 @@ nodes | src/main.rs:116:13:116:31 | ...::open | semmle.label | ...::open | | src/main.rs:116:33:116:37 | path5 [&ref] | semmle.label | path5 [&ref] | | src/main.rs:118:9:118:13 | path6 | semmle.label | path6 | +| src/main.rs:118:17:118:21 | path5 [&ref] | semmle.label | path5 [&ref] | | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | semmle.label | path5.canonicalize() [Ok] | | src/main.rs:118:17:118:45 | ... .unwrap() | semmle.label | ... .unwrap() | | src/main.rs:119:13:119:31 | ...::open | semmle.label | ...::open | diff --git a/rust/ql/test/query-tests/security/CWE-079/Cargo.lock b/rust/ql/test/query-tests/security/CWE-079/Cargo.lock new file mode 100644 index 00000000000..b8c877bc755 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/Cargo.lock @@ -0,0 +1,1876 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2 0.3.27", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2 0.5.10", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2233f53f6cb18ae038ce1f0713ca0c72ca0c4b71fe9aaeb59924ce2c89c6dd85" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2 0.6.1", + "time", + "tracing", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "axum" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http 1.3.1", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "bytestring" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +dependencies = [ + "bytes", +] + +[[package]] +name = "cc" +version = "1.2.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64", + "bytes", + "headers-core", + "http 1.3.1", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http 1.3.1", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2 0.4.12", + "http 1.3.1", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + +[[package]] +name = "indexmap" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +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 = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "syn" +version = "2.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "test" +version = "0.0.1" +dependencies = [ + "actix-web", + "axum", + "serde", + "tokio", + "warp", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.1", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "warp" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d06d9202adc1f15d709c4f4a2069be5428aa912cc025d6f268ac441ab066b0" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http 1.3.1", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project", + "scoped-tls", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-util", + "tower-service", + "tracing", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/Cargo.lock b/rust/ql/test/query-tests/security/CWE-079/actix/Cargo.lock new file mode 100644 index 00000000000..daf7370f6b5 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/actix/Cargo.lock @@ -0,0 +1,1571 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2", + "http", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2 0.5.10", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2233f53f6cb18ae038ce1f0713ca0c72ca0c4b71fe9aaeb59924ce2c89c6dd85" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2 0.6.1", + "time", + "tracing", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "bytestring" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +dependencies = [ + "bytes", +] + +[[package]] +name = "cc" +version = "1.2.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "html-escape" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" +dependencies = [ + "utf8-width", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +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 = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "test" +version = "0.0.1" +dependencies = [ + "actix-web", + "html-escape", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected new file mode 100644 index 00000000000..9667a9216e6 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected @@ -0,0 +1,34 @@ +#select +| main.rs:25:5:25:13 | ...::new | main.rs:8:1:8:18 | to | main.rs:25:5:25:13 | ...::new | Cross-site scripting vulnerability due to a $@. | main.rs:8:1:8:18 | to | user-provided value | +edges +| main.rs:8:1:8:18 | to | main.rs:9:29:9:51 | ...: ...::Path::<...> | provenance | Src:MaD:2 | +| main.rs:9:29:9:51 | ...: ...::Path::<...> | main.rs:10:22:10:25 | path | provenance | | +| main.rs:10:9:10:18 | user_input | main.rs:13:9:22:18 | MacroExpr | provenance | | +| main.rs:10:22:10:25 | path | main.rs:10:22:10:38 | path.into_inner() | provenance | MaD:3 | +| main.rs:10:22:10:38 | path.into_inner() | main.rs:10:9:10:18 | user_input | provenance | | +| main.rs:12:9:12:12 | html | main.rs:25:15:25:18 | html | provenance | | +| main.rs:13:9:22:18 | ...::format(...) | main.rs:13:9:22:18 | { ... } | provenance | | +| main.rs:13:9:22:18 | ...::must_use(...) | main.rs:12:9:12:12 | html | provenance | | +| main.rs:13:9:22:18 | MacroExpr | main.rs:13:9:22:18 | ...::format(...) | provenance | MaD:4 | +| main.rs:13:9:22:18 | { ... } | main.rs:13:9:22:18 | ...::must_use(...) | provenance | MaD:5 | +| main.rs:25:15:25:18 | html | main.rs:25:5:25:13 | ...::new | provenance | MaD:1 Sink:MaD:1 | +models +| 1 | Sink: ::new; Argument[0]; html-injection | +| 2 | Source: ::to; Argument[0].Parameter[0..7]; remote | +| 3 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | +| 4 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 5 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +nodes +| main.rs:8:1:8:18 | to | semmle.label | to | +| main.rs:9:29:9:51 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| main.rs:10:9:10:18 | user_input | semmle.label | user_input | +| main.rs:10:22:10:25 | path | semmle.label | path | +| main.rs:10:22:10:38 | path.into_inner() | semmle.label | path.into_inner() | +| main.rs:12:9:12:12 | html | semmle.label | html | +| main.rs:13:9:22:18 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:13:9:22:18 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:13:9:22:18 | MacroExpr | semmle.label | MacroExpr | +| main.rs:13:9:22:18 | { ... } | semmle.label | { ... } | +| main.rs:25:5:25:13 | ...::new | semmle.label | ...::new | +| main.rs:25:15:25:18 | html | semmle.label | html | +subpaths diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.qlref b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.qlref new file mode 100644 index 00000000000..52e78e53811 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-079/XSS.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/main.rs b/rust/ql/test/query-tests/security/CWE-079/actix/main.rs new file mode 100644 index 00000000000..42cd760ca6c --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/actix/main.rs @@ -0,0 +1,60 @@ +use actix_web::{ + get, + web::{self, Html}, + App, HttpServer, Responder, +}; + +// The "bad" example from the qldoc +#[get("/bad/{a}")] // $ Source=a +async fn vulnerable_handler(path: web::Path) -> impl Responder { + let user_input = path.into_inner(); + + let html = format!( + r#" + + + Welcome + +

    Hello, {}!

    + + + "#, + user_input + ); + + Html::new(html) // $ Alert[rust/xss]=a +} + +#[get("/good/{a}")] +// The "good" example from the qldoc +async fn safe_handler_with_encoding(path: web::Path) -> impl Responder { + let user_input = path.into_inner(); + let escaped_input = html_escape::encode_text(&user_input); + + let html = format!( + r#" + + + Welcome + +

    Hello, {}!

    + + + "#, + escaped_input + ); + + Html::new(html) // Safe: user input is HTML-encoded +} + +#[actix_web::main] +pub async fn main() -> std::io::Result<()> { + HttpServer::new(|| { + App::new() + .service(vulnerable_handler) + .service(safe_handler_with_encoding) + }) + .bind(("127.0.0.1", 3000))? + .run() + .await +} diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/options.yml b/rust/ql/test/query-tests/security/CWE-079/actix/options.yml new file mode 100644 index 00000000000..f104c0008c4 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/actix/options.yml @@ -0,0 +1,4 @@ +qltest_use_nightly: true +qltest_dependencies: + - actix-web = { version = "4.12.0" } + - html-escape = { version = "0.2.13" } \ No newline at end of file diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/Cargo.lock b/rust/ql/test/query-tests/security/CWE-079/axum/Cargo.lock new file mode 100644 index 00000000000..a28fb29c506 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/axum/Cargo.lock @@ -0,0 +1,646 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "axum" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "test" +version = "0.0.1" +dependencies = [ + "axum", + "serde", + "tokio", +] + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected new file mode 100644 index 00000000000..385ce0f58c4 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected @@ -0,0 +1,24 @@ +#select +| main.rs:10:10:10:21 | html_content | main.rs:15:51:15:53 | get | main.rs:10:10:10:21 | html_content | Cross-site scripting vulnerability due to a $@. | main.rs:15:51:15:53 | get | user-provided value | +edges +| main.rs:8:24:8:59 | ...: Query::<...> | main.rs:9:32:9:63 | MacroExpr | provenance | | +| main.rs:9:9:9:20 | html_content | main.rs:10:10:10:21 | html_content | provenance | | +| main.rs:9:32:9:63 | ...::format(...) | main.rs:9:32:9:63 | { ... } | provenance | | +| main.rs:9:32:9:63 | ...::must_use(...) | main.rs:9:9:9:20 | html_content | provenance | | +| main.rs:9:32:9:63 | MacroExpr | main.rs:9:32:9:63 | ...::format(...) | provenance | MaD:2 | +| main.rs:9:32:9:63 | { ... } | main.rs:9:32:9:63 | ...::must_use(...) | provenance | MaD:3 | +| main.rs:15:51:15:53 | get | main.rs:8:24:8:59 | ...: Query::<...> | provenance | Src:MaD:1 | +models +| 1 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | +| 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 3 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +nodes +| main.rs:8:24:8:59 | ...: Query::<...> | semmle.label | ...: Query::<...> | +| main.rs:9:9:9:20 | html_content | semmle.label | html_content | +| main.rs:9:32:9:63 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:9:32:9:63 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:9:32:9:63 | MacroExpr | semmle.label | MacroExpr | +| main.rs:9:32:9:63 | { ... } | semmle.label | { ... } | +| main.rs:10:10:10:21 | html_content | semmle.label | html_content | +| main.rs:15:51:15:53 | get | semmle.label | get | +subpaths diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/XSS.qlref b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.qlref new file mode 100644 index 00000000000..52e78e53811 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-079/XSS.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/main.rs b/rust/ql/test/query-tests/security/CWE-079/axum/main.rs new file mode 100644 index 00000000000..27807c5883d --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/axum/main.rs @@ -0,0 +1,20 @@ +use axum::{extract::Query, response::Html, routing::get, Router}; + +#[derive(serde::Deserialize)] +struct GreetingParams { + name: String, +} + +async fn greet_handler(Query(params): Query) -> Html { + let html_content = format!("

    Hello, {}!

    ", params.name); + Html(html_content) // $ Alert[rust/xss]=greet +} + +#[tokio::main] +pub async fn main() { + let app = Router::<()>::new().route("/greet", get(greet_handler)); // $ Source=greet + let listener = tokio::net::TcpListener::bind("127.0.0.1:3000") + .await + .unwrap(); + axum::serve(listener, app).await.unwrap(); +} \ No newline at end of file diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/options.yml b/rust/ql/test/query-tests/security/CWE-079/axum/options.yml new file mode 100644 index 00000000000..5a7345bb237 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/axum/options.yml @@ -0,0 +1,5 @@ +qltest_use_nightly: true +qltest_dependencies: + - axum = { version = "0.8.7" } + - serde = { version = "1.0.228", features = ["derive"] } + - tokio = { version = "1", features = ["full"] } \ No newline at end of file diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/Cargo.lock b/rust/ql/test/query-tests/security/CWE-079/warp/Cargo.lock new file mode 100644 index 00000000000..35c058bd45e --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/warp/Cargo.lock @@ -0,0 +1,723 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "test" +version = "0.0.1" +dependencies = [ + "tokio", + "warp", +] + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "warp" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d06d9202adc1f15d709c4f4a2069be5428aa912cc025d6f268ac441ab066b0" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project", + "scoped-tls", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-util", + "tower-service", + "tracing", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected new file mode 100644 index 00000000000..8a366d3b0d5 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected @@ -0,0 +1,27 @@ +#select +| main.rs:10:13:10:29 | ...::html | main.rs:7:10:7:12 | map | main.rs:10:13:10:29 | ...::html | Cross-site scripting vulnerability due to a $@. | main.rs:7:10:7:12 | map | user-provided value | +edges +| main.rs:7:10:7:12 | map | main.rs:7:15:7:26 | ...: String | provenance | Src:MaD:2 | +| main.rs:7:15:7:26 | ...: String | main.rs:9:32:9:56 | MacroExpr | provenance | | +| main.rs:9:17:9:20 | body | main.rs:10:31:10:34 | body | provenance | | +| main.rs:9:32:9:56 | ...::format(...) | main.rs:9:32:9:56 | { ... } | provenance | | +| main.rs:9:32:9:56 | ...::must_use(...) | main.rs:9:17:9:20 | body | provenance | | +| main.rs:9:32:9:56 | MacroExpr | main.rs:9:32:9:56 | ...::format(...) | provenance | MaD:3 | +| main.rs:9:32:9:56 | { ... } | main.rs:9:32:9:56 | ...::must_use(...) | provenance | MaD:4 | +| main.rs:10:31:10:34 | body | main.rs:10:13:10:29 | ...::html | provenance | MaD:1 Sink:MaD:1 | +models +| 1 | Sink: warp::reply::html; Argument[0]; html-injection | +| 2 | Source: <_ as warp::filter::Filter>::map; Argument[0].Parameter[0..7]; remote | +| 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +nodes +| main.rs:7:10:7:12 | map | semmle.label | map | +| main.rs:7:15:7:26 | ...: String | semmle.label | ...: String | +| main.rs:9:17:9:20 | body | semmle.label | body | +| main.rs:9:32:9:56 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:9:32:9:56 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:9:32:9:56 | MacroExpr | semmle.label | MacroExpr | +| main.rs:9:32:9:56 | { ... } | semmle.label | { ... } | +| main.rs:10:13:10:29 | ...::html | semmle.label | ...::html | +| main.rs:10:31:10:34 | body | semmle.label | body | +subpaths diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.qlref b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.qlref new file mode 100644 index 00000000000..52e78e53811 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-079/XSS.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/main.rs b/rust/ql/test/query-tests/security/CWE-079/warp/main.rs new file mode 100644 index 00000000000..fb300f4cdd4 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/warp/main.rs @@ -0,0 +1,15 @@ +use warp::Filter; + +#[tokio::main] +pub async fn main() { + let hello = warp::path("greet") + .and(warp::path::param()) + .map(|name: String| { // $ Source=name + // Vulnerable to XSS because it directly includes user input in the response + let body = format!("

    Hello, {name}!

    "); + warp::reply::html(body) // $ Alert[rust/xss]=name + }); + + // Start the web server on port 3000 + warp::serve(hello).run(([127, 0, 0, 1], 3000)).await; +} diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/options.yml b/rust/ql/test/query-tests/security/CWE-079/warp/options.yml new file mode 100644 index 00000000000..cae7e414d5e --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/warp/options.yml @@ -0,0 +1,4 @@ +qltest_use_nightly: true +qltest_dependencies: + - warp = { version = "0.4.2", features = ["server"]} + - tokio = { version = "1", features = ["rt-multi-thread", "macros"] } \ No newline at end of file diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected index e86f261a249..f957ba46e0f 100644 --- a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected @@ -1,51 +1,3 @@ -multipleCallTargets -| mysql.rs:15:24:15:39 | ...::from(...) | -| mysql.rs:16:26:16:85 | ...::from(...) | -| mysql.rs:18:13:18:66 | ...::from(...) | -| mysql.rs:19:30:19:83 | ...::from(...) | -| mysql.rs:46:45:46:66 | remote_string.as_str() | -| mysql.rs:47:71:47:92 | remote_string.as_str() | -| mysql.rs:48:46:48:67 | remote_string.as_str() | -| mysql.rs:49:33:49:54 | remote_string.as_str() | -| mysql.rs:50:46:50:67 | remote_string.as_str() | -| mysql.rs:52:37:52:58 | remote_string.as_str() | -| mysql.rs:56:14:56:35 | remote_string.as_str() | -| mysql.rs:62:14:62:35 | remote_string.as_str() | -| mysql.rs:66:40:66:61 | remote_string.as_str() | -| mysql.rs:67:39:67:60 | remote_string.as_str() | -| mysql.rs:70:14:70:35 | remote_string.as_str() | -| mysql.rs:100:24:100:39 | ...::from(...) | -| mysql.rs:101:26:101:85 | ...::from(...) | -| mysql.rs:103:13:103:66 | ...::from(...) | -| mysql.rs:104:30:104:83 | ...::from(...) | -| mysql.rs:126:45:126:66 | remote_string.as_str() | -| mysql.rs:128:38:128:59 | remote_string.as_str() | -| mysql.rs:130:33:130:54 | remote_string.as_str() | -| mysql.rs:131:54:131:75 | remote_string.as_str() | -| mysql.rs:135:18:135:39 | remote_string.as_str() | -| mysql.rs:140:40:140:61 | remote_string.as_str() | -| mysql.rs:142:62:142:83 | remote_string.as_str() | -| mysql.rs:145:31:145:52 | remote_string.as_str() | -| sqlx.rs:46:24:46:44 | ...::from(...) | -| sqlx.rs:47:56:47:76 | ...::from(...) | -| sqlx.rs:48:97:48:117 | ...::from(...) | -| sqlx.rs:50:24:50:83 | ...::from(...) | -| sqlx.rs:51:24:51:77 | ...::from(...) | -| sqlx.rs:55:26:55:79 | ...::from(...) | -| sqlx.rs:61:28:61:81 | ...::from(...) | -| sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | -| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | -| sqlx.rs:99:24:99:44 | ...::from(...) | -| sqlx.rs:100:97:100:117 | ...::from(...) | -| sqlx.rs:101:24:101:77 | ...::from(...) | -| sqlx.rs:102:26:102:79 | ...::from(...) | -| sqlx.rs:103:28:103:81 | ...::from(...) | -| sqlx.rs:172:24:172:44 | ...::from(...) | -| sqlx.rs:173:97:173:117 | ...::from(...) | -| sqlx.rs:174:24:174:77 | ...::from(...) | -| sqlx.rs:175:26:175:79 | ...::from(...) | -| sqlx.rs:176:28:176:82 | ...::from(...) | -| sqlx.rs:202:57:202:85 | ...::from(...) | multiplePathResolutions | mysql.rs:5:37:5:74 | Result::<...> | | mysql.rs:26:20:26:44 | Result::<...> | diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index e1024e4ad72..17f03c0fc92 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -36,136 +36,90 @@ edges | mysql.rs:12:13:12:29 | mut remote_string | mysql.rs:18:71:18:83 | remote_string | provenance | | | mysql.rs:12:33:12:54 | ...::get | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:31 | -| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:34 | +| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:33 | | mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:32 | | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | mysql.rs:12:13:12:29 | mut remote_string | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:49 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:75 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:27:25:27:36 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:28:39:28:50 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:29:65:29:76 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:30:33:30:44 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:32:13:32:24 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:36:33:36:44 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:37:32:37:43 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:39:13:39:24 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:42:39:42:50 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:75:31:75:42 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:80:26:80:37 | unsafe_query | provenance | | -| mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | MaD:29 | -| mysql.rs:18:13:18:83 | ... + ... | mysql.rs:17:13:17:24 | unsafe_query | provenance | | | mysql.rs:18:13:18:83 | ... + ... | mysql.rs:18:13:18:89 | ... + ... | provenance | MaD:27 | | mysql.rs:18:13:18:83 | ... + ... | mysql.rs:18:13:18:89 | ... + ... | provenance | MaD:28 | | mysql.rs:18:13:18:89 | ... + ... | mysql.rs:17:13:17:24 | unsafe_query | provenance | | | mysql.rs:18:70:18:83 | &remote_string [&ref] | mysql.rs:18:13:18:83 | ... + ... | provenance | MaD:26 | | mysql.rs:18:71:18:83 | remote_string | mysql.rs:18:70:18:83 | &remote_string [&ref] | provenance | | | mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:25:38:25:58 | unsafe_query.as_str() | mysql.rs:25:32:25:36 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:32:25:36 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:26:64:26:84 | unsafe_query.as_str() | mysql.rs:26:54:26:62 | query_opt | provenance | MaD:9 Sink:MaD:9 | | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:54:26:62 | query_opt | provenance | MaD:9 Sink:MaD:9 | | mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:27:25:27:45 | unsafe_query.as_str() | mysql.rs:27:14:27:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:14:27:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | | mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:28:39:28:59 | unsafe_query.as_str() | mysql.rs:28:27:28:37 | query_first | provenance | MaD:3 Sink:MaD:3 | | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:27:28:37 | query_first | provenance | MaD:3 Sink:MaD:3 | | mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:29:65:29:85 | unsafe_query.as_str() | mysql.rs:29:49:29:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:49:29:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | | mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:30:33:30:53 | unsafe_query.as_str() | mysql.rs:30:22:30:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:22:30:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | | mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:32:13:32:33 | unsafe_query.as_str() | mysql.rs:31:22:31:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:31:22:31:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | | mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:36:33:36:53 | unsafe_query.as_str() | mysql.rs:36:22:36:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:22:36:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | | mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:37:32:37:52 | unsafe_query.as_str() | mysql.rs:37:22:37:30 | query_map | provenance | MaD:7 Sink:MaD:7 | | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:22:37:30 | query_map | provenance | MaD:7 Sink:MaD:7 | | mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:39:13:39:33 | unsafe_query.as_str() | mysql.rs:38:22:38:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:38:22:38:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | | mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:42:39:42:59 | unsafe_query.as_str() | mysql.rs:42:33:42:37 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:33:42:37 | query | provenance | MaD:1 Sink:MaD:1 | | mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:75:31:75:51 | unsafe_query.as_str() | mysql.rs:75:26:75:29 | prep | provenance | MaD:16 Sink:MaD:16 | | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:26:75:29 | prep | provenance | MaD:16 Sink:MaD:16 | | mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:80:26:80:46 | unsafe_query.as_str() | mysql.rs:80:15:80:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:15:80:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | | mysql.rs:97:13:97:29 | mut remote_string | mysql.rs:103:71:103:83 | remote_string | provenance | | | mysql.rs:97:33:97:54 | ...::get | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:31 | -| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:34 | +| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:33 | | mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:32 | | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | mysql.rs:97:13:97:29 | mut remote_string | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:49 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:36 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:112:47:112:58 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:114:25:114:36 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:116:33:116:44 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:118:40:118:51 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:121:24:121:35 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:149:31:149:42 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | MaD:29 | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:154:26:154:37 | unsafe_query | provenance | | -| mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | MaD:29 | -| mysql.rs:103:13:103:83 | ... + ... | mysql.rs:102:13:102:24 | unsafe_query | provenance | | | mysql.rs:103:13:103:83 | ... + ... | mysql.rs:103:13:103:89 | ... + ... | provenance | MaD:27 | | mysql.rs:103:13:103:83 | ... + ... | mysql.rs:103:13:103:89 | ... + ... | provenance | MaD:28 | | mysql.rs:103:13:103:89 | ... + ... | mysql.rs:102:13:102:24 | unsafe_query | provenance | | | mysql.rs:103:70:103:83 | &remote_string [&ref] | mysql.rs:103:13:103:83 | ... + ... | provenance | MaD:26 | | mysql.rs:103:71:103:83 | remote_string | mysql.rs:103:70:103:83 | &remote_string [&ref] | provenance | | | mysql.rs:110:38:110:49 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:110:38:110:58 | unsafe_query.as_str() | mysql.rs:110:32:110:36 | query | provenance | MaD:10 Sink:MaD:10 | | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | mysql.rs:110:32:110:36 | query | provenance | MaD:10 Sink:MaD:10 | | mysql.rs:111:25:111:36 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:111:25:111:45 | unsafe_query.as_str() | mysql.rs:111:14:111:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | mysql.rs:111:14:111:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | | mysql.rs:112:47:112:58 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:112:47:112:67 | unsafe_query.as_str() | mysql.rs:112:35:112:45 | query_first | provenance | MaD:12 Sink:MaD:12 | | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | mysql.rs:112:35:112:45 | query_first | provenance | MaD:12 Sink:MaD:12 | | mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:114:25:114:45 | unsafe_query.as_str() | mysql.rs:114:14:114:23 | query_fold | provenance | MaD:13 Sink:MaD:13 | | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:14:114:23 | query_fold | provenance | MaD:13 Sink:MaD:13 | | mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:116:33:116:53 | unsafe_query.as_str() | mysql.rs:116:22:116:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:22:116:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | | mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:118:40:118:60 | unsafe_query.as_str() | mysql.rs:118:14:118:25 | query_stream | provenance | MaD:15 Sink:MaD:15 | | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:14:118:25 | query_stream | provenance | MaD:15 Sink:MaD:15 | | mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:121:24:121:44 | unsafe_query.as_str() | mysql.rs:121:14:121:22 | query_map | provenance | MaD:14 Sink:MaD:14 | | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:14:121:22 | query_map | provenance | MaD:14 Sink:MaD:14 | | mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:149:31:149:51 | unsafe_query.as_str() | mysql.rs:149:26:149:29 | prep | provenance | MaD:18 Sink:MaD:18 | | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:26:149:29 | prep | provenance | MaD:18 Sink:MaD:18 | | mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:29 | -| mysql.rs:154:26:154:46 | unsafe_query.as_str() | mysql.rs:154:15:154:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:15:154:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | @@ -177,97 +131,76 @@ edges | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:31 | -| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:34 | +| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:33 | | sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:32 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:27:53:36 | arg_string | sqlx.rs:53:26:53:36 | &arg_string [&ref] | provenance | | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:33 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:33 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | | sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:42 | unsafe_query_3 | provenance | | -| sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | MaD:29 | -| sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:9:55:22 | unsafe_query_3 | provenance | | | sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:27 | | sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:28 | | sqlx.rs:55:26:55:102 | ... + ... | sqlx.rs:55:9:55:22 | unsafe_query_3 | provenance | | | sqlx.rs:55:83:55:96 | &remote_string [&ref] | sqlx.rs:55:26:55:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:55:84:55:96 | remote_string | sqlx.rs:55:83:55:96 | &remote_string [&ref] | provenance | | | sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:42 | unsafe_query_4 | provenance | | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:29 | | sqlx.rs:59:17:59:72 | ...::format(...) | sqlx.rs:59:17:59:72 | { ... } | provenance | | | sqlx.rs:59:17:59:72 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | -| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:35 | -| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:36 | +| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:34 | +| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:35 | +| sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:29 | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:100:9:100:21 | remote_string | sqlx.rs:102:84:102:96 | remote_string | provenance | | | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:31 | -| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:34 | +| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:33 | | sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:32 | | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | sqlx.rs:100:9:100:21 | remote_string | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:44 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | MaD:29 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | MaD:29 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | MaD:29 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:68 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | MaD:29 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:68 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | MaD:29 | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | MaD:29 | -| sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:9:102:22 | unsafe_query_1 | provenance | | | sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:27 | | sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:28 | | sqlx.rs:102:26:102:102 | ... + ... | sqlx.rs:102:9:102:22 | unsafe_query_1 | provenance | | | sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:102:84:102:96 | remote_string | sqlx.rs:102:83:102:96 | &remote_string [&ref] | provenance | | | sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:22 Sink:MaD:22 | | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:22 Sink:MaD:22 | | sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | | sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | | sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:173:9:173:21 | remote_string | sqlx.rs:175:84:175:96 | remote_string | provenance | | | sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:31 | -| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:34 | +| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:33 | | sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:32 | | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | sqlx.rs:173:9:173:21 | remote_string | provenance | | | sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:42 | unsafe_query_1 | provenance | | -| sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | MaD:29 | -| sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:9:175:22 | unsafe_query_1 | provenance | | | sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:27 | | sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:28 | | sqlx.rs:175:26:175:102 | ... + ... | sqlx.rs:175:9:175:22 | unsafe_query_1 | provenance | | | sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:175:84:175:96 | remote_string | sqlx.rs:175:83:175:96 | &remote_string [&ref] | provenance | | | sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:29 | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | models | 1 | Sink: <_ as mysql::conn::queryable::Queryable>::query; Argument[0]; sql-injection | @@ -294,7 +227,7 @@ models | 22 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | | 23 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 24 | Source: std::env::args; ReturnValue.Element; commandargs | -| 25 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 25 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | | 26 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | | 27 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint | | 28 | Summary: ::add; Argument[self]; ReturnValue; value | @@ -302,10 +235,9 @@ models | 30 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | | 31 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 32 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 33 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 34 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 36 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 33 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 35 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | mysql.rs:12:13:12:29 | mut remote_string | semmle.label | mut remote_string | | mysql.rs:12:33:12:54 | ...::get | semmle.label | ...::get | @@ -320,55 +252,42 @@ nodes | mysql.rs:18:71:18:83 | remote_string | semmle.label | remote_string | | mysql.rs:25:32:25:36 | query | semmle.label | query | | mysql.rs:25:38:25:49 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:25:38:25:58 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:26:54:26:62 | query_opt | semmle.label | query_opt | | mysql.rs:26:64:26:75 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:26:64:26:84 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:27:14:27:23 | query_drop | semmle.label | query_drop | | mysql.rs:27:25:27:36 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:27:25:27:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:28:27:28:37 | query_first | semmle.label | query_first | | mysql.rs:28:39:28:50 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:28:39:28:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:29:49:29:63 | query_first_opt | semmle.label | query_first_opt | | mysql.rs:29:65:29:76 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:29:65:29:85 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:30:22:30:31 | query_fold | semmle.label | query_fold | | mysql.rs:30:33:30:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:30:33:30:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:31:22:31:35 | query_fold_opt | semmle.label | query_fold_opt | | mysql.rs:32:13:32:24 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:32:13:32:33 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:36:22:36:31 | query_iter | semmle.label | query_iter | | mysql.rs:36:33:36:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:36:33:36:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:37:22:37:30 | query_map | semmle.label | query_map | | mysql.rs:37:32:37:43 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:37:32:37:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:38:22:38:34 | query_map_opt | semmle.label | query_map_opt | | mysql.rs:39:13:39:24 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:39:13:39:33 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:42:33:42:37 | query | semmle.label | query | | mysql.rs:42:39:42:50 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:42:39:42:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:75:26:75:29 | prep | semmle.label | prep | | mysql.rs:75:31:75:42 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:75:31:75:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:80:15:80:24 | query_drop | semmle.label | query_drop | | mysql.rs:80:26:80:37 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:80:26:80:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:97:13:97:29 | mut remote_string | semmle.label | mut remote_string | | mysql.rs:97:33:97:54 | ...::get | semmle.label | ...::get | @@ -383,39 +302,30 @@ nodes | mysql.rs:103:71:103:83 | remote_string | semmle.label | remote_string | | mysql.rs:110:32:110:36 | query | semmle.label | query | | mysql.rs:110:38:110:49 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:110:38:110:58 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:111:14:111:23 | query_drop | semmle.label | query_drop | | mysql.rs:111:25:111:36 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:111:25:111:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:112:35:112:45 | query_first | semmle.label | query_first | | mysql.rs:112:47:112:58 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:112:47:112:67 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:114:14:114:23 | query_fold | semmle.label | query_fold | | mysql.rs:114:25:114:36 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:114:25:114:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:116:22:116:31 | query_iter | semmle.label | query_iter | | mysql.rs:116:33:116:44 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:116:33:116:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:118:14:118:25 | query_stream | semmle.label | query_stream | | mysql.rs:118:40:118:51 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:118:40:118:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:121:14:121:22 | query_map | semmle.label | query_map | | mysql.rs:121:24:121:35 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:121:24:121:44 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:149:26:149:29 | prep | semmle.label | prep | | mysql.rs:149:31:149:42 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:149:31:149:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:154:15:154:24 | query_drop | semmle.label | query_drop | | mysql.rs:154:26:154:37 | unsafe_query | semmle.label | unsafe_query | -| mysql.rs:154:26:154:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | sqlx.rs:47:9:47:18 | arg_string | semmle.label | arg_string | | sqlx.rs:47:22:47:35 | ...::args | semmle.label | ...::args | @@ -445,16 +355,16 @@ nodes | sqlx.rs:59:17:59:72 | MacroExpr | semmle.label | MacroExpr | | sqlx.rs:59:17:59:72 | { ... } | semmle.label | { ... } | | sqlx.rs:78:13:78:23 | ...::query | semmle.label | ...::query | +| sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | semmle.label | unsafe_query_1 [&ref] | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:80:17:80:27 | ...::query | semmle.label | ...::query | +| sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | semmle.label | unsafe_query_2 [&ref] | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | semmle.label | unsafe_query_2.as_str() [&ref] | | sqlx.rs:81:17:81:27 | ...::query | semmle.label | ...::query | | sqlx.rs:81:29:81:42 | unsafe_query_3 | semmle.label | unsafe_query_3 | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | semmle.label | unsafe_query_3.as_str() | | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | semmle.label | unsafe_query_3.as_str() [&ref] | | sqlx.rs:82:17:82:27 | ...::query | semmle.label | ...::query | | sqlx.rs:82:29:82:42 | unsafe_query_4 | semmle.label | unsafe_query_4 | -| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | semmle.label | unsafe_query_4.as_str() | | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | semmle.label | unsafe_query_4.as_str() [&ref] | | sqlx.rs:100:9:100:21 | remote_string | semmle.label | remote_string | | sqlx.rs:100:25:100:46 | ...::get | semmle.label | ...::get | @@ -469,27 +379,21 @@ nodes | sqlx.rs:102:84:102:96 | remote_string | semmle.label | remote_string | | sqlx.rs:113:17:113:29 | ...::raw_sql | semmle.label | ...::raw_sql | | sqlx.rs:113:31:113:44 | unsafe_query_1 | semmle.label | unsafe_query_1 | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:120:17:120:27 | ...::query | semmle.label | ...::query | | sqlx.rs:120:29:120:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:127:17:127:27 | ...::query | semmle.label | ...::query | | sqlx.rs:127:29:127:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:136:40:136:53 | ...::query_as | semmle.label | ...::query_as | | sqlx.rs:136:55:136:68 | unsafe_query_1 | semmle.label | unsafe_query_1 | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:145:40:145:53 | ...::query_as | semmle.label | ...::query_as | | sqlx.rs:145:55:145:68 | unsafe_query_1 | semmle.label | unsafe_query_1 | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:153:17:153:27 | ...::query | semmle.label | ...::query | | sqlx.rs:153:29:153:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:173:9:173:21 | remote_string | semmle.label | remote_string | | sqlx.rs:173:25:173:46 | ...::get | semmle.label | ...::get | @@ -504,6 +408,5 @@ nodes | sqlx.rs:175:84:175:96 | remote_string | semmle.label | remote_string | | sqlx.rs:188:17:188:27 | ...::query | semmle.label | ...::query | | sqlx.rs:188:29:188:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-117/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-117/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index c25043e0ef6..00000000000 --- a/rust/ql/test/query-tests/security/CWE-117/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| main.rs:9:43:9:63 | ...::from(...) | diff --git a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected index 2e00f941c24..d812380d9c7 100644 --- a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected @@ -58,7 +58,7 @@ models | 4 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 5 | Source: std::env::args; ReturnValue.Element; commandargs | | 6 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | -| 7 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 7 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | | 8 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | | 9 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 10 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | diff --git a/rust/ql/test/query-tests/security/CWE-295/Cargo.lock b/rust/ql/test/query-tests/security/CWE-295/Cargo.lock new file mode 100644 index 00000000000..43943439edd --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-295/Cargo.lock @@ -0,0 +1,1596 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1744436df46f0bde35af3eda22aeaba453aada65d8f1c171cd8a5f59030bd69f" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +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 = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "reqwest" +version = "0.12.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "test" +version = "0.0.1" +dependencies = [ + "native-tls", + "rand", + "reqwest", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected new file mode 100644 index 00000000000..bbc67f6fd18 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected @@ -0,0 +1,129 @@ +#select +| main.rs:4:4:4:30 | danger_accept_invalid_certs | main.rs:4:32:4:35 | true | main.rs:4:4:4:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:9:4:9:34 | danger_accept_invalid_hostnames | main.rs:9:36:9:39 | true | main.rs:9:4:9:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:16:4:16:30 | danger_accept_invalid_certs | main.rs:16:32:16:35 | true | main.rs:16:4:16:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:17:4:17:34 | danger_accept_invalid_hostnames | main.rs:17:36:17:39 | true | main.rs:17:4:17:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:37:4:37:30 | danger_accept_invalid_certs | main.rs:37:32:37:35 | true | main.rs:37:4:37:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:42:4:42:34 | danger_accept_invalid_hostnames | main.rs:42:36:42:39 | true | main.rs:42:4:42:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:47:4:47:30 | danger_accept_invalid_certs | main.rs:47:32:47:35 | true | main.rs:47:4:47:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:48:4:48:34 | danger_accept_invalid_hostnames | main.rs:48:36:48:39 | true | main.rs:48:4:48:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:55:4:55:30 | danger_accept_invalid_certs | main.rs:55:32:55:35 | true | main.rs:55:4:55:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:56:4:56:34 | danger_accept_invalid_hostnames | main.rs:56:36:56:39 | true | main.rs:56:4:56:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:83:4:83:30 | danger_accept_invalid_certs | main.rs:74:15:74:18 | true | main.rs:83:4:83:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:88:4:88:30 | danger_accept_invalid_certs | main.rs:75:22:75:25 | true | main.rs:88:4:88:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:93:4:93:30 | danger_accept_invalid_certs | main.rs:154:17:154:20 | true | main.rs:93:4:93:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:109:4:109:34 | danger_accept_invalid_hostnames | main.rs:107:17:107:31 | ...::exists | main.rs:109:4:109:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:115:4:115:34 | danger_accept_invalid_hostnames | main.rs:113:43:113:50 | metadata | main.rs:115:4:115:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:121:4:121:34 | danger_accept_invalid_hostnames | main.rs:119:11:119:27 | ...::metadata | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:146:4:146:34 | danger_accept_invalid_hostnames | main.rs:144:39:144:42 | true | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +edges +| main.rs:4:32:4:35 | true | main.rs:4:4:4:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | +| main.rs:9:36:9:39 | true | main.rs:9:4:9:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | +| main.rs:16:32:16:35 | true | main.rs:16:4:16:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | +| main.rs:17:36:17:39 | true | main.rs:17:4:17:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | +| main.rs:37:32:37:35 | true | main.rs:37:4:37:30 | danger_accept_invalid_certs | provenance | MaD:3 Sink:MaD:3 | +| main.rs:42:36:42:39 | true | main.rs:42:4:42:34 | danger_accept_invalid_hostnames | provenance | MaD:6 Sink:MaD:6 | +| main.rs:47:32:47:35 | true | main.rs:47:4:47:30 | danger_accept_invalid_certs | provenance | MaD:3 Sink:MaD:3 | +| main.rs:48:36:48:39 | true | main.rs:48:4:48:34 | danger_accept_invalid_hostnames | provenance | MaD:4 Sink:MaD:4 | +| main.rs:55:32:55:35 | true | main.rs:55:4:55:30 | danger_accept_invalid_certs | provenance | MaD:5 Sink:MaD:5 | +| main.rs:56:36:56:39 | true | main.rs:56:4:56:34 | danger_accept_invalid_hostnames | provenance | MaD:6 Sink:MaD:6 | +| main.rs:73:19:73:40 | ...: bool | main.rs:93:32:93:47 | sometimes_global | provenance | | +| main.rs:74:6:74:11 | always | main.rs:83:32:83:37 | always | provenance | | +| main.rs:74:15:74:18 | true | main.rs:74:6:74:11 | always | provenance | | +| main.rs:75:6:75:18 | mut sometimes | main.rs:88:32:88:40 | sometimes | provenance | | +| main.rs:75:22:75:25 | true | main.rs:75:6:75:18 | mut sometimes | provenance | | +| main.rs:83:32:83:37 | always | main.rs:83:4:83:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | +| main.rs:88:32:88:40 | sometimes | main.rs:88:4:88:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | +| main.rs:93:32:93:47 | sometimes_global | main.rs:93:4:93:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | +| main.rs:107:6:107:7 | b1 | main.rs:109:36:109:37 | b1 | provenance | | +| main.rs:107:17:107:31 | ...::exists | main.rs:107:17:107:42 | ...::exists(...) [Ok] | provenance | Src:MaD:8 | +| main.rs:107:17:107:42 | ...::exists(...) [Ok] | main.rs:107:17:107:51 | ... .unwrap() | provenance | MaD:10 | +| main.rs:107:17:107:51 | ... .unwrap() | main.rs:107:6:107:7 | b1 | provenance | | +| main.rs:109:36:109:37 | b1 | main.rs:109:4:109:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | +| main.rs:113:6:113:7 | b2 | main.rs:115:36:115:37 | b2 | provenance | | +| main.rs:113:11:113:52 | ... .metadata() [Ok] | main.rs:113:11:113:61 | ... .unwrap() | provenance | MaD:10 | +| main.rs:113:11:113:61 | ... .unwrap() | main.rs:113:11:113:71 | ... .is_file() | provenance | MaD:12 | +| main.rs:113:11:113:71 | ... .is_file() | main.rs:113:6:113:7 | b2 | provenance | | +| main.rs:113:43:113:50 | metadata | main.rs:113:11:113:52 | ... .metadata() [Ok] | provenance | Src:MaD:7 | +| main.rs:115:36:115:37 | b2 | main.rs:115:4:115:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | +| main.rs:119:6:119:7 | b3 | main.rs:121:36:121:37 | b3 | provenance | | +| main.rs:119:11:119:27 | ...::metadata | main.rs:119:11:119:38 | ...::metadata(...) [Ok] | provenance | Src:MaD:9 | +| main.rs:119:11:119:38 | ...::metadata(...) [Ok] | main.rs:119:11:119:47 | ... .unwrap() | provenance | MaD:10 | +| main.rs:119:11:119:47 | ... .unwrap() | main.rs:119:11:119:56 | ... .is_dir() | provenance | MaD:11 | +| main.rs:119:11:119:56 | ... .is_dir() | main.rs:119:6:119:7 | b3 | provenance | | +| main.rs:121:36:121:37 | b3 | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | +| main.rs:144:6:144:7 | b6 | main.rs:146:36:146:37 | b6 | provenance | | +| main.rs:144:39:144:42 | true | main.rs:144:6:144:7 | b6 | provenance | | +| main.rs:146:36:146:37 | b6 | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | +| main.rs:154:17:154:20 | true | main.rs:73:19:73:40 | ...: bool | provenance | | +models +| 1 | Sink: ::danger_accept_invalid_certs; Argument[0]; disable-certificate | +| 2 | Sink: ::danger_accept_invalid_hostnames; Argument[0]; disable-certificate | +| 3 | Sink: ::danger_accept_invalid_certs; Argument[0]; disable-certificate | +| 4 | Sink: ::danger_accept_invalid_hostnames; Argument[0]; disable-certificate | +| 5 | Sink: ::danger_accept_invalid_certs; Argument[0]; disable-certificate | +| 6 | Sink: ::danger_accept_invalid_hostnames; Argument[0]; disable-certificate | +| 7 | Source: ::metadata; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 8 | Source: std::fs::exists; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 9 | Source: std::fs::metadata; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 10 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 11 | Summary: ::is_dir; Argument[self].Reference; ReturnValue; taint | +| 12 | Summary: ::is_file; Argument[self].Reference; ReturnValue; taint | +nodes +| main.rs:4:4:4:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:4:32:4:35 | true | semmle.label | true | +| main.rs:9:4:9:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:9:36:9:39 | true | semmle.label | true | +| main.rs:16:4:16:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:16:32:16:35 | true | semmle.label | true | +| main.rs:17:4:17:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:17:36:17:39 | true | semmle.label | true | +| main.rs:37:4:37:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:37:32:37:35 | true | semmle.label | true | +| main.rs:42:4:42:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:42:36:42:39 | true | semmle.label | true | +| main.rs:47:4:47:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:47:32:47:35 | true | semmle.label | true | +| main.rs:48:4:48:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:48:36:48:39 | true | semmle.label | true | +| main.rs:55:4:55:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:55:32:55:35 | true | semmle.label | true | +| main.rs:56:4:56:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:56:36:56:39 | true | semmle.label | true | +| main.rs:73:19:73:40 | ...: bool | semmle.label | ...: bool | +| main.rs:74:6:74:11 | always | semmle.label | always | +| main.rs:74:15:74:18 | true | semmle.label | true | +| main.rs:75:6:75:18 | mut sometimes | semmle.label | mut sometimes | +| main.rs:75:22:75:25 | true | semmle.label | true | +| main.rs:83:4:83:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:83:32:83:37 | always | semmle.label | always | +| main.rs:88:4:88:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:88:32:88:40 | sometimes | semmle.label | sometimes | +| main.rs:93:4:93:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:93:32:93:47 | sometimes_global | semmle.label | sometimes_global | +| main.rs:107:6:107:7 | b1 | semmle.label | b1 | +| main.rs:107:17:107:31 | ...::exists | semmle.label | ...::exists | +| main.rs:107:17:107:42 | ...::exists(...) [Ok] | semmle.label | ...::exists(...) [Ok] | +| main.rs:107:17:107:51 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:109:4:109:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:109:36:109:37 | b1 | semmle.label | b1 | +| main.rs:113:6:113:7 | b2 | semmle.label | b2 | +| main.rs:113:11:113:52 | ... .metadata() [Ok] | semmle.label | ... .metadata() [Ok] | +| main.rs:113:11:113:61 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:113:11:113:71 | ... .is_file() | semmle.label | ... .is_file() | +| main.rs:113:43:113:50 | metadata | semmle.label | metadata | +| main.rs:115:4:115:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:115:36:115:37 | b2 | semmle.label | b2 | +| main.rs:119:6:119:7 | b3 | semmle.label | b3 | +| main.rs:119:11:119:27 | ...::metadata | semmle.label | ...::metadata | +| main.rs:119:11:119:38 | ...::metadata(...) [Ok] | semmle.label | ...::metadata(...) [Ok] | +| main.rs:119:11:119:47 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:119:11:119:56 | ... .is_dir() | semmle.label | ... .is_dir() | +| main.rs:121:4:121:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:121:36:121:37 | b3 | semmle.label | b3 | +| main.rs:144:6:144:7 | b6 | semmle.label | b6 | +| main.rs:144:39:144:42 | true | semmle.label | true | +| main.rs:146:4:146:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:146:36:146:37 | b6 | semmle.label | b6 | +| main.rs:154:17:154:20 | true | semmle.label | true | +subpaths diff --git a/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.qlref b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.qlref new file mode 100644 index 00000000000..cc99c2b151c --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-295/DisabledCertificateCheck.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-295/main.rs b/rust/ql/test/query-tests/security/CWE-295/main.rs new file mode 100644 index 00000000000..6088e6fc1be --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-295/main.rs @@ -0,0 +1,157 @@ +fn test_native_tls() { + // unsafe + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_certs(true) // $ Alert[rust/disabled-certificate-check] + .build() + .unwrap(); + + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(true) // $ Alert[rust/disabled-certificate-check] + .build() + .unwrap(); + + let _client = native_tls::TlsConnector::builder() + .min_protocol_version(Some(native_tls::Protocol::Tlsv12)) + .use_sni(true) + .danger_accept_invalid_certs(true) // $ Alert[rust/disabled-certificate-check] + .danger_accept_invalid_hostnames(true) // $ Alert[rust/disabled-certificate-check] + .build() + .unwrap(); + + // safe + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_certs(false) // good + .danger_accept_invalid_hostnames(false) // good + .build() + .unwrap(); + + // default (safe) + let _client = native_tls::TlsConnector::builder() + .build() + .unwrap(); +} + +fn test_reqwest() { + // unsafe + let _client = reqwest::Client::builder() + .danger_accept_invalid_certs(true) // $ Alert[rust/disabled-certificate-check] + .build() + .unwrap(); + + let _client = reqwest::blocking::ClientBuilder::new() + .danger_accept_invalid_hostnames(true) // $ Alert[rust/disabled-certificate-check] + .build() + .unwrap(); + + let _client = reqwest::ClientBuilder::new() + .danger_accept_invalid_certs(true) // $ Alert[rust/disabled-certificate-check] + .danger_accept_invalid_hostnames(true) // $ Alert[rust/disabled-certificate-check] + .build() + .unwrap(); + + let _client = reqwest::blocking::Client::builder() + .tcp_keepalive(std::time::Duration::from_secs(30)) + .https_only(true) + .danger_accept_invalid_certs(true) // $ Alert[rust/disabled-certificate-check] + .danger_accept_invalid_hostnames(true) // $ Alert[rust/disabled-certificate-check] + .build() + .unwrap(); + + // safe + let _client = reqwest::blocking::Client::builder() + .danger_accept_invalid_certs(false) // good + .danger_accept_invalid_hostnames(false) // good + .build() + .unwrap(); + + // default (safe) + let _client = reqwest::blocking::Client::builder() + .build() + .unwrap(); +} + +fn test_data_flow(sometimes_global: bool) { + let always = true; // $ Source=always + let mut sometimes = true; // $ Source=sometimes + let never = false; + + if rand::random_range(0 .. 2) == 0 { + sometimes = false; + } + + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_certs(always) // $ Alert[rust/disabled-certificate-check]=always + .build() + .unwrap(); + + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_certs(sometimes) // $ Alert[rust/disabled-certificate-check]=sometimes + .build() + .unwrap(); + + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_certs(sometimes_global) // $ Alert[rust/disabled-certificate-check]=arg + .build() + .unwrap(); + + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_certs(never) // good + .build() + .unwrap(); +} + +fn test_threat_model_source() { + // hostname setting from `fs` functions returning `bool` directly + // (these are highly unnatural but serve to create simple tests) + + let b1: bool = std::fs::exists("main.rs").unwrap(); // $ Source=exists + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(b1) // $ Alert[rust/disabled-certificate-check]=exists + .build() + .unwrap(); + + let b2 = std::path::Path::new("main.rs").metadata().unwrap().is_file(); // $ Source=is_file + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(b2) // $ Alert[rust/disabled-certificate-check]=is_file + .build() + .unwrap(); + + let b3 = std::fs::metadata("main.rs").unwrap().is_dir(); // $ Source=is_dir + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(b3) // $ Alert[rust/disabled-certificate-check]=is_dir + .build() + .unwrap(); + + // hostname setting from `stdin`, parsed to `bool` + // (these are a little closer to something real) + + let mut input_line = String::new(); + let input = std::io::stdin(); + input.read_line(&mut input_line).unwrap(); + + let b4: bool = input_line.parse::().unwrap_or(false); + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(b4) // $ MISSING: Alert[rust/disabled-certificate-check]=stdin + .build() + .unwrap(); + + let b5 = std::str::FromStr::from_str(&input_line).unwrap_or(false); + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(b5) // $ MISSING: Alert[rust/disabled-certificate-check]=stdin + .build() + .unwrap(); + + let b6 = if (input_line == "true") { true } else { false }; // $ Source=true + let _client = native_tls::TlsConnector::builder() + .danger_accept_invalid_hostnames(b6) // $ Alert[rust/disabled-certificate-check]=true + .build() + .unwrap(); +} + +fn main() { + test_native_tls(); + test_reqwest(); + test_data_flow(true); // $ Source=arg + test_data_flow(false); + test_threat_model_source(); +} diff --git a/rust/ql/test/query-tests/security/CWE-295/options.yml b/rust/ql/test/query-tests/security/CWE-295/options.yml new file mode 100644 index 00000000000..711dfe71f8b --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-295/options.yml @@ -0,0 +1,5 @@ +qltest_cargo_check: true +qltest_dependencies: + - reqwest = { version = "0.12.9", features = ["blocking"] } + - native-tls = { version = "0.2.14" } + - rand = { version = "0.9.2" } diff --git a/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected index c84f3becf1f..580c9cd8202 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CONSISTENCY/PathResolutionConsistency.expected @@ -1,24 +1,2 @@ -multipleCallTargets -| test_storage.rs:13:10:13:33 | ...::from(...) | -| test_storage.rs:17:10:17:35 | ...::from(...) | -| test_storage.rs:21:10:21:35 | ...::from(...) | -| test_storage.rs:25:10:25:32 | ...::from(...) | -| test_storage.rs:29:10:29:35 | ...::from(...) | +multipleResolvedTargets | test_storage.rs:36:45:36:57 | text.as_ref() | -| test_storage.rs:68:25:68:74 | ...::from(...) | -| test_storage.rs:69:25:69:76 | ...::from(...) | -| test_storage.rs:70:25:70:82 | ...::from(...) | -| test_storage.rs:71:25:71:79 | ...::from(...) | -| test_storage.rs:72:25:72:70 | ...::from(...) | -| test_storage.rs:73:25:73:67 | ...::from(...) | -| test_storage.rs:75:25:75:65 | ...::from(...) | -| test_storage.rs:76:25:76:65 | ...::from(...) | -| test_storage.rs:77:14:77:24 | s1.as_str() | -| test_storage.rs:78:25:78:65 | ...::from(...) | -| test_storage.rs:79:25:79:65 | ...::from(...) | -| test_storage.rs:80:25:80:70 | ...::from(...) | -| test_storage.rs:81:25:81:72 | ...::from(...) | -| test_storage.rs:82:26:82:77 | ...::from(...) | -| test_storage.rs:188:29:188:86 | ...::from(...) | -| test_storage.rs:189:28:189:82 | ...::from(...) | -| test_storage.rs:190:28:190:81 | ...::from(...) | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 5b1e89fb7aa..4f4cc63cb26 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -49,119 +49,117 @@ | test_logging.rs:223:13:223:28 | ...::assert_failed | test_logging.rs:223:52:223:59 | password | test_logging.rs:223:13:223:28 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:223:52:223:59 | password | password | | test_logging.rs:226:13:226:28 | ...::assert_failed | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:13:226:28 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:226:52:226:59 | password | password | | test_logging.rs:229:23:229:28 | expect | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:23:229:28 | expect | This operation writes $@ to a log file. | test_logging.rs:229:54:229:61 | password | password | -| test_logging.rs:229:23:229:28 | expect | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:23:229:28 | expect | This operation writes $@ to a log file. | test_logging.rs:229:54:229:61 | password | password | | test_logging.rs:242:10:242:14 | write | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:10:242:14 | write | This operation writes $@ to a log file. | test_logging.rs:242:42:242:49 | password | password | | test_logging.rs:245:10:245:18 | write_all | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:10:245:18 | write_all | This operation writes $@ to a log file. | test_logging.rs:245:46:245:53 | password | password | | test_logging.rs:248:9:248:13 | write | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:9:248:13 | write | This operation writes $@ to a log file. | test_logging.rs:248:41:248:48 | password | password | | test_logging.rs:251:9:251:13 | write | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:9:251:13 | write | This operation writes $@ to a log file. | test_logging.rs:251:41:251:48 | password | password | edges -| test_logging.rs:42:12:42:35 | MacroExpr | test_logging.rs:42:5:42:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:42:12:42:35 | MacroExpr | test_logging.rs:42:5:42:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:42:28:42:35 | password | test_logging.rs:42:12:42:35 | MacroExpr | provenance | | -| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | provenance | | -| test_logging.rs:44:11:44:34 | MacroExpr | test_logging.rs:44:5:44:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:44:11:44:34 | MacroExpr | test_logging.rs:44:5:44:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:44:27:44:34 | password | test_logging.rs:44:11:44:34 | MacroExpr | provenance | | -| test_logging.rs:45:12:45:35 | MacroExpr | test_logging.rs:45:5:45:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:45:12:45:35 | MacroExpr | test_logging.rs:45:5:45:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:45:28:45:35 | password | test_logging.rs:45:12:45:35 | MacroExpr | provenance | | -| test_logging.rs:46:11:46:34 | MacroExpr | test_logging.rs:46:5:46:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:46:11:46:34 | MacroExpr | test_logging.rs:46:5:46:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:46:27:46:34 | password | test_logging.rs:46:11:46:34 | MacroExpr | provenance | | -| test_logging.rs:47:24:47:47 | MacroExpr | test_logging.rs:47:5:47:8 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:47:24:47:47 | MacroExpr | test_logging.rs:47:5:47:8 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:47:40:47:47 | password | test_logging.rs:47:24:47:47 | MacroExpr | provenance | | -| test_logging.rs:52:12:52:35 | MacroExpr | test_logging.rs:52:5:52:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:52:12:52:35 | MacroExpr | test_logging.rs:52:5:52:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:52:28:52:35 | password | test_logging.rs:52:12:52:35 | MacroExpr | provenance | | -| test_logging.rs:54:12:54:48 | MacroExpr | test_logging.rs:54:5:54:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:54:12:54:48 | MacroExpr | test_logging.rs:54:5:54:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:54:41:54:48 | password | test_logging.rs:54:12:54:48 | MacroExpr | provenance | | -| test_logging.rs:56:12:56:46 | MacroExpr | test_logging.rs:56:5:56:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:56:12:56:46 | MacroExpr | test_logging.rs:56:5:56:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:56:39:56:46 | password | test_logging.rs:56:12:56:46 | MacroExpr | provenance | | -| test_logging.rs:57:12:57:33 | MacroExpr | test_logging.rs:57:5:57:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:57:12:57:33 | MacroExpr | test_logging.rs:57:5:57:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:57:24:57:31 | password | test_logging.rs:57:12:57:33 | MacroExpr | provenance | | -| test_logging.rs:58:12:58:35 | MacroExpr | test_logging.rs:58:5:58:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:58:12:58:35 | MacroExpr | test_logging.rs:58:5:58:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:35 | MacroExpr | provenance | | -| test_logging.rs:60:30:60:53 | MacroExpr | test_logging.rs:60:5:60:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:60:30:60:53 | MacroExpr | test_logging.rs:60:5:60:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:60:46:60:53 | password | test_logging.rs:60:30:60:53 | MacroExpr | provenance | | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:61:20:61:28 | &password | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:61:20:61:28 | &password [&ref] | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password | provenance | Config | | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password [&ref] | provenance | | -| test_logging.rs:65:24:65:47 | MacroExpr | test_logging.rs:65:5:65:8 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:65:24:65:47 | MacroExpr | test_logging.rs:65:5:65:8 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:65:40:65:47 | password | test_logging.rs:65:24:65:47 | MacroExpr | provenance | | -| test_logging.rs:67:42:67:65 | MacroExpr | test_logging.rs:67:5:67:8 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:67:42:67:65 | MacroExpr | test_logging.rs:67:5:67:8 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:67:58:67:65 | password | test_logging.rs:67:42:67:65 | MacroExpr | provenance | | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:68:18:68:26 | &password | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:68:18:68:26 | &password [&ref] | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password | provenance | Config | | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password [&ref] | provenance | | -| test_logging.rs:72:23:72:46 | MacroExpr | test_logging.rs:72:5:72:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:72:23:72:46 | MacroExpr | test_logging.rs:72:5:72:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:72:39:72:46 | password | test_logging.rs:72:23:72:46 | MacroExpr | provenance | | -| test_logging.rs:74:41:74:64 | MacroExpr | test_logging.rs:74:5:74:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:74:41:74:64 | MacroExpr | test_logging.rs:74:5:74:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:74:57:74:64 | password | test_logging.rs:74:41:74:64 | MacroExpr | provenance | | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:75:20:75:28 | &password | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:75:20:75:28 | &password [&ref] | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password | provenance | Config | | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password [&ref] | provenance | | -| test_logging.rs:76:23:76:46 | MacroExpr | test_logging.rs:76:5:76:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:76:23:76:46 | MacroExpr | test_logging.rs:76:5:76:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:76:39:76:46 | password | test_logging.rs:76:23:76:46 | MacroExpr | provenance | | -| test_logging.rs:82:20:82:43 | MacroExpr | test_logging.rs:82:5:82:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:82:20:82:43 | MacroExpr | test_logging.rs:82:5:82:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:82:36:82:43 | password | test_logging.rs:82:20:82:43 | MacroExpr | provenance | | -| test_logging.rs:84:38:84:61 | MacroExpr | test_logging.rs:84:5:84:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:84:38:84:61 | MacroExpr | test_logging.rs:84:5:84:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:84:54:84:61 | password | test_logging.rs:84:38:84:61 | MacroExpr | provenance | | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 Sink:MaD:13 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:13 Sink:MaD:13 Sink:MaD:13 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:85:20:85:28 | &password | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:85:20:85:28 | &password [&ref] | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password | provenance | Config | | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password [&ref] | provenance | | -| test_logging.rs:86:20:86:43 | MacroExpr | test_logging.rs:86:5:86:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:86:20:86:43 | MacroExpr | test_logging.rs:86:5:86:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:86:36:86:43 | password | test_logging.rs:86:20:86:43 | MacroExpr | provenance | | | test_logging.rs:93:9:93:10 | m1 | test_logging.rs:94:11:94:28 | MacroExpr | provenance | | | test_logging.rs:93:14:93:22 | &password | test_logging.rs:93:9:93:10 | m1 | provenance | | | test_logging.rs:93:15:93:22 | password | test_logging.rs:93:14:93:22 | &password | provenance | Config | -| test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:94:5:94:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:94:5:94:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:96:9:96:10 | m2 | test_logging.rs:97:11:97:18 | MacroExpr | provenance | | | test_logging.rs:96:14:96:49 | ... + ... | test_logging.rs:96:9:96:10 | m2 | provenance | | -| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:9:96:10 | m2 | provenance | | -| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:18 | | test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:17 | -| test_logging.rs:96:41:96:49 | &password [&ref] | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:17 | +| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | +| test_logging.rs:96:41:96:49 | &password [&ref] | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password | provenance | Config | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password [&ref] | provenance | | -| test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:97:5:97:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:97:5:97:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | -| test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | -| test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | | | test_logging.rs:129:9:129:10 | t1 [tuple.1] | test_logging.rs:131:28:131:29 | t1 [tuple.1] | provenance | | | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | test_logging.rs:129:9:129:10 | t1 [tuple.1] | provenance | | | test_logging.rs:129:25:129:32 | password | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | provenance | | -| test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:131:5:131:10 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:131:5:131:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:131:28:131:29 | t1 [tuple.1] | test_logging.rs:131:28:131:31 | t1.1 | provenance | | | test_logging.rs:131:28:131:31 | t1.1 | test_logging.rs:131:12:131:31 | MacroExpr | provenance | | -| test_logging.rs:141:11:141:37 | MacroExpr | test_logging.rs:141:5:141:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:141:11:141:37 | MacroExpr | test_logging.rs:141:5:141:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:141:27:141:37 | s1.password | test_logging.rs:141:11:141:37 | MacroExpr | provenance | | -| test_logging.rs:151:11:151:37 | MacroExpr | test_logging.rs:151:5:151:9 | ...::log | provenance | MaD:12 Sink:MaD:12 | +| test_logging.rs:151:11:151:37 | MacroExpr | test_logging.rs:151:5:151:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:151:27:151:37 | s2.password | test_logging.rs:151:11:151:37 | MacroExpr | provenance | | | test_logging.rs:176:33:176:79 | &... | test_logging.rs:176:22:176:31 | log_expect | provenance | MaD:1 Sink:MaD:1 | | test_logging.rs:176:33:176:79 | &... [&ref] | test_logging.rs:176:22:176:31 | log_expect | provenance | MaD:1 Sink:MaD:1 | @@ -169,8 +167,8 @@ edges | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... [&ref] | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:42:176:78 | { ... } | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | -| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:180:35:180:81 | &... [&ref] | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | @@ -178,104 +176,84 @@ edges | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... [&ref] | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:44:180:80 | { ... } | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | -| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 [Err] | provenance | | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | -| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:16 | +| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:15 | | test_logging.rs:183:51:183:67 | password2.clone() | test_logging.rs:183:47:183:68 | Err(...) [Err] | provenance | | | test_logging.rs:184:13:184:23 | err_result2 [Err] | test_logging.rs:184:25:184:34 | log_expect | provenance | MaD:4 Sink:MaD:4 | | test_logging.rs:187:9:187:19 | err_result3 [Err] | test_logging.rs:188:13:188:23 | err_result3 [Err] | provenance | | | test_logging.rs:187:47:187:60 | Err(...) [Err] | test_logging.rs:187:9:187:19 | err_result3 [Err] | provenance | | | test_logging.rs:187:51:187:59 | password2 | test_logging.rs:187:47:187:60 | Err(...) [Err] | provenance | | | test_logging.rs:188:13:188:23 | err_result3 [Err] | test_logging.rs:188:25:188:34 | log_unwrap | provenance | MaD:5 Sink:MaD:5 | -| test_logging.rs:192:12:192:37 | MacroExpr | test_logging.rs:192:5:192:10 | ...::_print | provenance | MaD:15 Sink:MaD:15 | +| test_logging.rs:192:12:192:37 | MacroExpr | test_logging.rs:192:5:192:10 | ...::_print | provenance | MaD:14 Sink:MaD:14 | | test_logging.rs:192:30:192:37 | password | test_logging.rs:192:12:192:37 | MacroExpr | provenance | | -| test_logging.rs:193:14:193:37 | MacroExpr | test_logging.rs:193:5:193:12 | ...::_print | provenance | MaD:15 Sink:MaD:15 | +| test_logging.rs:193:14:193:37 | MacroExpr | test_logging.rs:193:5:193:12 | ...::_print | provenance | MaD:14 Sink:MaD:14 | | test_logging.rs:193:30:193:37 | password | test_logging.rs:193:14:193:37 | MacroExpr | provenance | | -| test_logging.rs:194:13:194:38 | MacroExpr | test_logging.rs:194:5:194:11 | ...::_eprint | provenance | MaD:14 Sink:MaD:14 | +| test_logging.rs:194:13:194:38 | MacroExpr | test_logging.rs:194:5:194:11 | ...::_eprint | provenance | MaD:13 Sink:MaD:13 | | test_logging.rs:194:31:194:38 | password | test_logging.rs:194:13:194:38 | MacroExpr | provenance | | -| test_logging.rs:195:15:195:38 | MacroExpr | test_logging.rs:195:5:195:13 | ...::_eprint | provenance | MaD:14 Sink:MaD:14 | +| test_logging.rs:195:15:195:38 | MacroExpr | test_logging.rs:195:5:195:13 | ...::_eprint | provenance | MaD:13 Sink:MaD:13 | | test_logging.rs:195:31:195:38 | password | test_logging.rs:195:15:195:38 | MacroExpr | provenance | | -| test_logging.rs:199:20:199:43 | MacroExpr | test_logging.rs:199:13:199:18 | ...::panic_fmt | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:199:20:199:43 | MacroExpr | test_logging.rs:199:13:199:18 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | | test_logging.rs:199:36:199:43 | password | test_logging.rs:199:20:199:43 | MacroExpr | provenance | | -| test_logging.rs:202:19:202:42 | MacroExpr | test_logging.rs:202:13:202:17 | ...::panic_fmt | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:202:19:202:42 | MacroExpr | test_logging.rs:202:13:202:17 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | | test_logging.rs:202:35:202:42 | password | test_logging.rs:202:19:202:42 | MacroExpr | provenance | | -| test_logging.rs:205:28:205:51 | MacroExpr | test_logging.rs:205:13:205:26 | ...::panic_fmt | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:205:28:205:51 | MacroExpr | test_logging.rs:205:13:205:26 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | | test_logging.rs:205:44:205:51 | password | test_logging.rs:205:28:205:51 | MacroExpr | provenance | | -| test_logging.rs:208:26:208:49 | MacroExpr | test_logging.rs:208:13:208:24 | ...::panic_fmt | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:208:26:208:49 | MacroExpr | test_logging.rs:208:13:208:24 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | | test_logging.rs:208:42:208:49 | password | test_logging.rs:208:26:208:49 | MacroExpr | provenance | | -| test_logging.rs:211:28:211:51 | MacroExpr | test_logging.rs:211:13:211:19 | ...::panic_fmt | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:211:28:211:51 | MacroExpr | test_logging.rs:211:13:211:19 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | | test_logging.rs:211:44:211:51 | password | test_logging.rs:211:28:211:51 | MacroExpr | provenance | | -| test_logging.rs:214:13:214:22 | ...::assert_failed [Some] | test_logging.rs:214:13:214:22 | ...::assert_failed | provenance | Sink:MaD:9 | | test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | test_logging.rs:214:13:214:22 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | test_logging.rs:214:13:214:22 | ...::assert_failed [Some] | provenance | MaD:10 | | test_logging.rs:214:30:214:53 | MacroExpr | test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | provenance | | | test_logging.rs:214:46:214:53 | password | test_logging.rs:214:30:214:53 | MacroExpr | provenance | | -| test_logging.rs:217:13:217:22 | ...::assert_failed [Some] | test_logging.rs:217:13:217:22 | ...::assert_failed | provenance | Sink:MaD:9 | | test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | test_logging.rs:217:13:217:22 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | test_logging.rs:217:13:217:22 | ...::assert_failed [Some] | provenance | MaD:10 | | test_logging.rs:217:30:217:53 | MacroExpr | test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | provenance | | | test_logging.rs:217:46:217:53 | password | test_logging.rs:217:30:217:53 | MacroExpr | provenance | | -| test_logging.rs:220:34:220:57 | MacroExpr | test_logging.rs:220:13:220:25 | ...::panic_fmt | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:220:34:220:57 | MacroExpr | test_logging.rs:220:13:220:25 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | | test_logging.rs:220:50:220:57 | password | test_logging.rs:220:34:220:57 | MacroExpr | provenance | | -| test_logging.rs:223:13:223:28 | ...::assert_failed [Some] | test_logging.rs:223:13:223:28 | ...::assert_failed | provenance | Sink:MaD:9 | | test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | test_logging.rs:223:13:223:28 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | test_logging.rs:223:13:223:28 | ...::assert_failed [Some] | provenance | MaD:10 | | test_logging.rs:223:36:223:59 | MacroExpr | test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:223:52:223:59 | password | test_logging.rs:223:36:223:59 | MacroExpr | provenance | | -| test_logging.rs:226:13:226:28 | ...::assert_failed [Some] | test_logging.rs:226:13:226:28 | ...::assert_failed | provenance | Sink:MaD:9 | | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | test_logging.rs:226:13:226:28 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | -| test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | test_logging.rs:226:13:226:28 | ...::assert_failed [Some] | provenance | MaD:10 | | test_logging.rs:226:36:226:59 | MacroExpr | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:36:226:59 | MacroExpr | provenance | | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:20 | -| test_logging.rs:229:30:229:71 | ... .as_str() | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:229:30:229:71 | ... .as_str() | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | -| test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:19 | | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | -| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:20 | -| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | -| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:19 | -| test_logging.rs:242:16:242:61 | ... .as_bytes() | test_logging.rs:242:10:242:14 | write | provenance | MaD:7 Sink:MaD:7 | +| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:18 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | test_logging.rs:242:10:242:14 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | -| test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | MaD:19 | -| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | -| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:19 | -| test_logging.rs:245:20:245:65 | ... .as_bytes() | test_logging.rs:245:10:245:18 | write_all | provenance | MaD:8 Sink:MaD:8 | +| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:18 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | test_logging.rs:245:10:245:18 | write_all | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | -| test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | MaD:19 | -| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | -| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:19 | -| test_logging.rs:248:15:248:60 | ... .as_bytes() | test_logging.rs:248:9:248:13 | write | provenance | MaD:7 Sink:MaD:7 | +| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:18 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | test_logging.rs:248:9:248:13 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | -| test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | MaD:19 | -| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | -| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:19 | -| test_logging.rs:251:15:251:60 | ... .as_bytes() | test_logging.rs:251:9:251:13 | write | provenance | MaD:6 Sink:MaD:6 | +| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:18 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | test_logging.rs:251:9:251:13 | write | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | -| test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | MaD:19 | -| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:21 | -| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:22 | +| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models | 1 | Sink: ::log_expect; Argument[0]; log-injection | @@ -287,19 +265,18 @@ models | 7 | Sink: ::write; Argument[0]; log-injection | | 8 | Sink: ::write_all; Argument[0]; log-injection | | 9 | Sink: core::panicking::assert_failed; Argument[3].Field[core::option::Option::Some(0)]; log-injection | -| 10 | Sink: core::panicking::assert_failed; Argument[3]; log-injection | -| 11 | Sink: core::panicking::panic_fmt; Argument[0]; log-injection | -| 12 | Sink: log::__private_api::log; Argument[1]; log-injection | -| 13 | Sink: log::__private_api::log; Argument[3]; log-injection | -| 14 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | -| 15 | Sink: std::io::stdio::_print; Argument[0]; log-injection | -| 16 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 17 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | -| 18 | Summary: <_ as core::ops::arith::Add>::add; Argument[0]; ReturnValue; taint | -| 19 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 20 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 21 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 22 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 10 | Sink: core::panicking::panic_fmt; Argument[0]; log-injection | +| 11 | Sink: log::__private_api::log; Argument[1]; log-injection | +| 12 | Sink: log::__private_api::log; Argument[3]; log-injection | +| 13 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | +| 14 | Sink: std::io::stdio::_print; Argument[0]; log-injection | +| 15 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 16 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | +| 17 | Summary: <_ as core::ops::arith::Add>::add; Argument[0]; ReturnValue; taint | +| 18 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 19 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 20 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 21 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:5:42:10 | ...::log | semmle.label | ...::log | | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | @@ -486,12 +463,10 @@ nodes | test_logging.rs:211:28:211:51 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:211:44:211:51 | password | semmle.label | password | | test_logging.rs:214:13:214:22 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:214:13:214:22 | ...::assert_failed [Some] | semmle.label | ...::assert_failed [Some] | | test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:214:30:214:53 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:214:46:214:53 | password | semmle.label | password | | test_logging.rs:217:13:217:22 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:217:13:217:22 | ...::assert_failed [Some] | semmle.label | ...::assert_failed [Some] | | test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:217:30:217:53 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:217:46:217:53 | password | semmle.label | password | @@ -499,19 +474,15 @@ nodes | test_logging.rs:220:34:220:57 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:220:50:220:57 | password | semmle.label | password | | test_logging.rs:223:13:223:28 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:223:13:223:28 | ...::assert_failed [Some] | semmle.label | ...::assert_failed [Some] | | test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:223:36:223:59 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:223:52:223:59 | password | semmle.label | password | | test_logging.rs:226:13:226:28 | ...::assert_failed | semmle.label | ...::assert_failed | -| test_logging.rs:226:13:226:28 | ...::assert_failed [Some] | semmle.label | ...::assert_failed [Some] | | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:226:36:226:59 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:226:52:226:59 | password | semmle.label | password | | test_logging.rs:229:23:229:28 | expect | semmle.label | expect | -| test_logging.rs:229:23:229:28 | expect | semmle.label | expect | | test_logging.rs:229:30:229:62 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:229:30:229:71 | ... .as_str() | semmle.label | ... .as_str() | | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | semmle.label | ... .as_str() [&ref] | | test_logging.rs:229:38:229:61 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:229:38:229:61 | ...::must_use(...) | semmle.label | ...::must_use(...) | @@ -520,7 +491,6 @@ nodes | test_logging.rs:229:54:229:61 | password | semmle.label | password | | test_logging.rs:242:10:242:14 | write | semmle.label | write | | test_logging.rs:242:16:242:50 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:242:16:242:61 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | semmle.label | ... .as_bytes() [&ref] | | test_logging.rs:242:24:242:49 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:242:24:242:49 | ...::must_use(...) | semmle.label | ...::must_use(...) | @@ -529,7 +499,6 @@ nodes | test_logging.rs:242:42:242:49 | password | semmle.label | password | | test_logging.rs:245:10:245:18 | write_all | semmle.label | write_all | | test_logging.rs:245:20:245:54 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:245:20:245:65 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | semmle.label | ... .as_bytes() [&ref] | | test_logging.rs:245:28:245:53 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:245:28:245:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | @@ -538,7 +507,6 @@ nodes | test_logging.rs:245:46:245:53 | password | semmle.label | password | | test_logging.rs:248:9:248:13 | write | semmle.label | write | | test_logging.rs:248:15:248:49 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:248:15:248:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | semmle.label | ... .as_bytes() [&ref] | | test_logging.rs:248:23:248:48 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:248:23:248:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | @@ -547,7 +515,6 @@ nodes | test_logging.rs:248:41:248:48 | password | semmle.label | password | | test_logging.rs:251:9:251:13 | write | semmle.label | write | | test_logging.rs:251:15:251:49 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:251:15:251:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | semmle.label | ... .as_bytes() [&ref] | | test_logging.rs:251:23:251:48 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:251:23:251:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected index d5f5cbca002..ab94bd3efe8 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected @@ -9,60 +9,41 @@ | test_storage.rs:204:31:204:37 | prepare | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:204:31:204:37 | prepare | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:190:86:190:103 | get_phone_number(...) | get_phone_number(...) | edges | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:100:25:100:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() | provenance | MaD:10 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:115:27:115:39 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() | provenance | MaD:10 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:119:25:119:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() | provenance | MaD:10 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:125:25:125:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() | provenance | MaD:10 | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:139:25:139:37 | insert_query2 | provenance | | -| test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() | provenance | MaD:10 | -| test_storage.rs:71:25:71:114 | ... + ... | test_storage.rs:71:9:71:21 | insert_query2 | provenance | | | test_storage.rs:71:25:71:114 | ... + ... | test_storage.rs:71:25:71:121 | ... + ... | provenance | MaD:8 | | test_storage.rs:71:25:71:114 | ... + ... | test_storage.rs:71:25:71:121 | ... + ... | provenance | MaD:9 | | test_storage.rs:71:25:71:121 | ... + ... | test_storage.rs:71:9:71:21 | insert_query2 | provenance | | -| test_storage.rs:71:96:71:114 | &... | test_storage.rs:71:9:71:21 | insert_query2 | provenance | | -| test_storage.rs:71:96:71:114 | &... | test_storage.rs:71:25:71:114 | ... + ... | provenance | | | test_storage.rs:71:96:71:114 | &... | test_storage.rs:71:25:71:114 | ... + ... | provenance | MaD:7 | | test_storage.rs:71:96:71:114 | &... | test_storage.rs:71:25:71:114 | ... + ... | provenance | MaD:6 | | test_storage.rs:71:96:71:114 | &... [&ref] | test_storage.rs:71:25:71:114 | ... + ... | provenance | MaD:6 | | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:71:96:71:114 | &... | provenance | Config | | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:71:96:71:114 | &... [&ref] | provenance | | | test_storage.rs:100:25:100:37 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | provenance | MaD:10 | -| test_storage.rs:100:25:100:46 | insert_query2.as_str() | test_storage.rs:100:13:100:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | test_storage.rs:100:13:100:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:115:27:115:39 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | provenance | MaD:10 | -| test_storage.rs:115:27:115:48 | insert_query2.as_str() | test_storage.rs:115:13:115:25 | ...::raw_sql | provenance | MaD:5 Sink:MaD:5 | | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | test_storage.rs:115:13:115:25 | ...::raw_sql | provenance | MaD:5 Sink:MaD:5 | | test_storage.rs:119:25:119:37 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | provenance | MaD:10 | -| test_storage.rs:119:25:119:46 | insert_query2.as_str() | test_storage.rs:119:13:119:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | test_storage.rs:119:13:119:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:125:25:125:37 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | provenance | MaD:10 | -| test_storage.rs:125:25:125:46 | insert_query2.as_str() | test_storage.rs:125:13:125:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | test_storage.rs:125:13:125:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:139:25:139:37 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | provenance | MaD:10 | -| test_storage.rs:139:25:139:46 | insert_query2.as_str() | test_storage.rs:139:13:139:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | test_storage.rs:139:13:139:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | | test_storage.rs:189:9:189:24 | insert_query_bad | test_storage.rs:194:25:194:40 | insert_query_bad | provenance | | -| test_storage.rs:189:28:189:117 | ... + ... | test_storage.rs:189:9:189:24 | insert_query_bad | provenance | | | test_storage.rs:189:28:189:117 | ... + ... | test_storage.rs:189:28:189:124 | ... + ... | provenance | MaD:8 | | test_storage.rs:189:28:189:117 | ... + ... | test_storage.rs:189:28:189:124 | ... + ... | provenance | MaD:9 | | test_storage.rs:189:28:189:124 | ... + ... | test_storage.rs:189:9:189:24 | insert_query_bad | provenance | | -| test_storage.rs:189:99:189:117 | &... | test_storage.rs:189:9:189:24 | insert_query_bad | provenance | | -| test_storage.rs:189:99:189:117 | &... | test_storage.rs:189:28:189:117 | ... + ... | provenance | | | test_storage.rs:189:99:189:117 | &... | test_storage.rs:189:28:189:117 | ... + ... | provenance | MaD:7 | | test_storage.rs:189:99:189:117 | &... | test_storage.rs:189:28:189:117 | ... + ... | provenance | MaD:6 | | test_storage.rs:189:99:189:117 | &... [&ref] | test_storage.rs:189:28:189:117 | ... + ... | provenance | MaD:6 | | test_storage.rs:189:100:189:117 | get_phone_number(...) | test_storage.rs:189:99:189:117 | &... | provenance | Config | | test_storage.rs:189:100:189:117 | get_phone_number(...) | test_storage.rs:189:99:189:117 | &... [&ref] | provenance | | | test_storage.rs:190:9:190:24 | select_query_bad | test_storage.rs:196:35:196:50 | select_query_bad | provenance | | -| test_storage.rs:190:28:190:103 | ... + ... | test_storage.rs:190:9:190:24 | select_query_bad | provenance | | | test_storage.rs:190:28:190:103 | ... + ... | test_storage.rs:190:28:190:109 | ... + ... | provenance | MaD:8 | | test_storage.rs:190:28:190:103 | ... + ... | test_storage.rs:190:28:190:109 | ... + ... | provenance | MaD:9 | | test_storage.rs:190:28:190:109 | ... + ... | test_storage.rs:190:9:190:24 | select_query_bad | provenance | | -| test_storage.rs:190:85:190:103 | &... | test_storage.rs:190:9:190:24 | select_query_bad | provenance | | -| test_storage.rs:190:85:190:103 | &... | test_storage.rs:190:28:190:103 | ... + ... | provenance | | | test_storage.rs:190:85:190:103 | &... | test_storage.rs:190:28:190:103 | ... + ... | provenance | MaD:7 | | test_storage.rs:190:85:190:103 | &... | test_storage.rs:190:28:190:103 | ... + ... | provenance | MaD:6 | | test_storage.rs:190:85:190:103 | &... [&ref] | test_storage.rs:190:28:190:103 | ... + ... | provenance | MaD:6 | @@ -101,23 +82,18 @@ nodes | test_storage.rs:71:97:71:114 | get_phone_number(...) | semmle.label | get_phone_number(...) | | test_storage.rs:100:13:100:23 | ...::query | semmle.label | ...::query | | test_storage.rs:100:25:100:37 | insert_query2 | semmle.label | insert_query2 | -| test_storage.rs:100:25:100:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | | test_storage.rs:115:13:115:25 | ...::raw_sql | semmle.label | ...::raw_sql | | test_storage.rs:115:27:115:39 | insert_query2 | semmle.label | insert_query2 | -| test_storage.rs:115:27:115:48 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | | test_storage.rs:119:13:119:23 | ...::query | semmle.label | ...::query | | test_storage.rs:119:25:119:37 | insert_query2 | semmle.label | insert_query2 | -| test_storage.rs:119:25:119:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | | test_storage.rs:125:13:125:23 | ...::query | semmle.label | ...::query | | test_storage.rs:125:25:125:37 | insert_query2 | semmle.label | insert_query2 | -| test_storage.rs:125:25:125:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | | test_storage.rs:139:13:139:23 | ...::query | semmle.label | ...::query | | test_storage.rs:139:25:139:37 | insert_query2 | semmle.label | insert_query2 | -| test_storage.rs:139:25:139:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | | test_storage.rs:189:9:189:24 | insert_query_bad | semmle.label | insert_query_bad | | test_storage.rs:189:28:189:117 | ... + ... | semmle.label | ... + ... | diff --git a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/CONSISTENCY/PathResolutionConsistency.expected index b9925a323cc..18400b7ab59 100644 --- a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/CONSISTENCY/PathResolutionConsistency.expected @@ -1,2 +1,2 @@ -multipleCallTargets +multipleResolvedTargets | test_cipher.rs:114:23:114:50 | ...::new(...) | diff --git a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/Cargo.lock b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/Cargo.lock index 708b79ed46d..a47021d54b4 100644 --- a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/Cargo.lock +++ b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/Cargo.lock @@ -76,6 +76,15 @@ dependencies = [ "cipher", ] +[[package]] +name = "ecb" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" +dependencies = [ + "cipher", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -146,6 +155,7 @@ dependencies = [ "cbc", "cipher", "des", + "ecb", "rabbit", "rc2", "rc4", diff --git a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/options.yml b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/options.yml index 5a3cf0cab12..139cb084be2 100644 --- a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/options.yml +++ b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/options.yml @@ -8,3 +8,4 @@ qltest_dependencies: - rc2 = { version = "0.8.1" } - rc5 = { version = "0.0.1" } - cbc = { version = "0.1.2" } + - ecb = { version = "0.1.2" } diff --git a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/test_cipher.rs index 61471ac99ec..17db0f9ceb1 100644 --- a/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-327/BrokenCryptoAlgorithm/test_cipher.rs @@ -145,3 +145,33 @@ fn test_cbc( let des_cipher4 = cbc::Encryptor::::new(key.into(), iv.into()); // $ MISSING: Alert[rust/weak-cryptographic-algorithm] _ = des_cipher4.encrypt_padded_b2b_mut::(input, data).unwrap(); } + +type MyAesEcbEncryptor = ecb::Encryptor; + +fn test_ecb( + key: &[u8], key128: &[u8;16], + input: &[u8], data: &mut [u8] +) { + let data_len = data.len(); + + // aes with ECB (weak block mode) + let aes_cipher1 = ecb::Encryptor::::new(key128.into()); // $ MISSING: Alert[rust/weak-cryptographic-algorithm] + _ = aes_cipher1.encrypt_padded_mut::(data, data_len).unwrap(); + + let aes_cipher2 = MyAesEcbEncryptor::new(key.into()); // $ MISSING: Alert[rust/weak-cryptographic-algorithm] + _ = aes_cipher2.encrypt_padded_mut::(data, data_len).unwrap(); + + let aes_cipher3 = ecb::Encryptor::::new_from_slice(&key).unwrap(); // $ MISSING: Alert[rust/weak-cryptographic-algorithm] + _ = aes_cipher3.encrypt_padded_mut::(data, data_len).unwrap(); + + let aes_cipher4 = ecb::Encryptor::::new(key.into()); // $ MISSING: Alert[rust/weak-cryptographic-algorithm] + _ = aes_cipher4.encrypt_padded_b2b_mut::(input, data).unwrap(); + + // des with ECB (broken cipher + weak block mode) + let des_cipher1 = ecb::Encryptor::::new(key.into()); // $ MISSING: Alert[rust/weak-cryptographic-algorithm] + _ = des_cipher1.encrypt_padded_mut::(data, data_len).unwrap(); + + // rc2 with ECB (broken cipher + weak block mode) + let rc2_cipher1 = ecb::Encryptor::::new(key.into()); // $ MISSING: Alert[rust/weak-cryptographic-algorithm] + _ = rc2_cipher1.encrypt_padded_mut::(data, data_len).unwrap(); +} diff --git a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected index e3a4998b532..7decd880f59 100644 --- a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected +++ b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected @@ -125,9 +125,7 @@ edges | main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:35 | | main.rs:53:5:53:63 | ... .secure(...) | main.rs:53:65:53:69 | build | provenance | MaD:2 Sink:MaD:2 | | main.rs:58:9:58:13 | mut a | main.rs:59:13:59:13 | a | provenance | | -| main.rs:58:9:58:13 | mut a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:18 | | main.rs:58:9:58:13 | mut a | main.rs:60:22:60:22 | a | provenance | | -| main.rs:58:9:58:13 | mut a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:18 | | main.rs:58:17:58:27 | ...::new | main.rs:58:17:58:44 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | | main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | | | main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:18 | @@ -135,21 +133,14 @@ edges | main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:18 | | main.rs:60:22:60:30 | a.clone() | main.rs:60:9:60:20 | add_original | provenance | MaD:5 Sink:MaD:5 | | main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:13 | a | provenance | | -| main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:18 | | main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:29 | a | provenance | | -| main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:18 | | main.rs:63:5:63:5 | [SSA] a | main.rs:79:30:79:30 | a | provenance | | -| main.rs:63:5:63:5 | [SSA] a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:18 | | main.rs:63:5:63:5 | a | main.rs:64:13:64:13 | a | provenance | | -| main.rs:63:5:63:5 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:18 | | main.rs:63:5:63:5 | a | main.rs:70:29:70:29 | a | provenance | | -| main.rs:63:5:63:5 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:18 | | main.rs:63:5:63:5 | a | main.rs:79:30:79:30 | a | provenance | | -| main.rs:63:5:63:5 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:18 | | main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:18 | | main.rs:64:13:64:21 | a.clone() | main.rs:64:9:64:11 | add | provenance | MaD:4 Sink:MaD:4 | | main.rs:68:9:68:13 | mut b | main.rs:69:20:69:20 | b | provenance | | -| main.rs:68:9:68:13 | mut b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:18 | | main.rs:68:17:68:29 | ...::named | main.rs:68:17:68:37 | ...::named(...) | provenance | Src:MaD:16 MaD:16 | | main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | | | main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:18 | @@ -157,15 +148,11 @@ edges | main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:18 | | main.rs:70:29:70:37 | a.clone() | main.rs:70:16:70:27 | add_original | provenance | MaD:9 Sink:MaD:9 | | main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:20 | b | provenance | | -| main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:18 | | main.rs:71:5:71:5 | b | main.rs:72:20:72:20 | b | provenance | | -| main.rs:71:5:71:5 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:18 | | main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:18 | | main.rs:72:20:72:28 | b.clone() | main.rs:72:16:72:18 | add | provenance | MaD:8 Sink:MaD:8 | | main.rs:77:9:77:13 | mut c | main.rs:78:21:78:21 | c | provenance | | -| main.rs:77:9:77:13 | mut c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:18 | | main.rs:77:9:77:13 | mut c | main.rs:83:21:83:21 | c | provenance | | -| main.rs:77:9:77:13 | mut c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:18 | | main.rs:77:17:77:28 | ...::from | main.rs:77:17:77:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | | main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | | | main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:18 | @@ -175,9 +162,7 @@ edges | main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:18 | | main.rs:83:21:83:29 | c.clone() | main.rs:83:17:83:19 | add | provenance | MaD:6 Sink:MaD:6 | | main.rs:87:9:87:13 | mut d | main.rs:88:13:88:13 | d | provenance | | -| main.rs:87:9:87:13 | mut d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:18 | | main.rs:87:9:87:13 | mut d | main.rs:94:13:94:13 | d | provenance | | -| main.rs:87:9:87:13 | mut d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:18 | | main.rs:87:17:87:28 | ...::from | main.rs:87:17:87:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | | main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | | | main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:18 | @@ -188,25 +173,22 @@ edges | main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:33 | | main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:56:114:60 | build | provenance | MaD:2 Sink:MaD:2 | | main.rs:122:9:122:9 | a | main.rs:123:20:123:20 | a | provenance | | -| main.rs:122:9:122:9 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:18 | | main.rs:122:13:122:41 | ...::new | main.rs:122:13:122:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | | main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | | | main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:18 | | main.rs:123:20:123:28 | a.clone() | main.rs:123:13:123:18 | insert | provenance | MaD:1 Sink:MaD:1 | | main.rs:130:9:130:9 | c | main.rs:131:20:131:20 | c | provenance | | -| main.rs:130:9:130:9 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:18 | -| main.rs:130:9:130:9 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:25 | +| main.rs:130:9:130:9 | c | main.rs:134:13:134:13 | c | provenance | | | main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:28 | | main.rs:130:13:130:31 | b.set_secure(...) | main.rs:130:9:130:9 | c | provenance | | | main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:18 | | main.rs:131:20:131:28 | c.clone() | main.rs:131:13:131:18 | insert | provenance | MaD:1 Sink:MaD:1 | | main.rs:134:9:134:9 | d | main.rs:135:20:135:20 | d | provenance | | -| main.rs:134:9:134:9 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:18 | +| main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:25 | | main.rs:134:13:134:35 | c.set_partitioned(...) | main.rs:134:9:134:9 | d | provenance | | | main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:18 | | main.rs:135:20:135:28 | d.clone() | main.rs:135:13:135:18 | insert | provenance | MaD:1 Sink:MaD:1 | | main.rs:146:9:146:9 | g | main.rs:147:20:147:20 | g | provenance | | -| main.rs:146:9:146:9 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:18 | | main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:28 | | main.rs:146:13:146:31 | f.set_secure(...) | main.rs:146:9:146:9 | g | provenance | | | main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:18 | @@ -216,29 +198,17 @@ edges | main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | | | main.rs:152:20:152:20 | h | main.rs:152:13:152:18 | insert | provenance | MaD:1 Sink:MaD:1 | | main.rs:155:9:155:9 | i | main.rs:156:20:156:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:157:20:157:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:158:20:158:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:159:20:159:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:160:20:160:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:161:20:161:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:162:20:162:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:163:20:163:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:164:20:164:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:165:20:165:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:166:20:166:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:18 | | main.rs:155:9:155:9 | i | main.rs:167:20:167:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:18 | | main.rs:155:13:155:41 | ...::new | main.rs:155:13:155:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | | main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | | | main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:18 | @@ -285,31 +255,22 @@ edges | main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:34 | | main.rs:198:5:198:63 | ... .path(...) | main.rs:198:65:198:70 | finish | provenance | MaD:3 Sink:MaD:3 | | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | -| main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | -| main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:9:202:11 | add | provenance | MaD:4 Sink:MaD:4 | | main.rs:212:5:212:22 | ...::build | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | | main.rs:212:5:212:39 | ...::build(...) | main.rs:212:41:212:46 | finish | provenance | MaD:3 Sink:MaD:3 | | main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:19 | cookie3 | provenance | | -| main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:18 | | main.rs:214:19:214:34 | ...::new | main.rs:214:19:214:51 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | | main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | | | main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:18 | | main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:9:215:11 | add | provenance | MaD:4 Sink:MaD:4 | | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | -| main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:18 | | main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | -| main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:18 | | main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:18 | | main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:9:219:11 | add | provenance | MaD:4 Sink:MaD:4 | | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | -| main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | -| main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | MaD:39 | -| main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:39 | -| main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:9:229:11 | add | provenance | MaD:11 Sink:MaD:11 | | main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | | @@ -328,23 +289,18 @@ edges | main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:34 | | main.rs:260:5:260:67 | ... .path(...) | main.rs:260:69:260:74 | finish | provenance | MaD:3 Sink:MaD:3 | | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | -| main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | -| main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:18 | | main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:9:264:11 | add | provenance | MaD:4 Sink:MaD:4 | | main.rs:274:5:274:26 | ...::build | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | | main.rs:274:5:274:43 | ...::build(...) | main.rs:274:45:274:50 | finish | provenance | MaD:3 Sink:MaD:3 | | main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:19 | cookie3 | provenance | | -| main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:18 | | main.rs:276:19:276:38 | ...::new | main.rs:276:19:276:55 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | | main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | | | main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:18 | | main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:9:277:11 | add | provenance | MaD:4 Sink:MaD:4 | | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | -| main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:18 | | main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | -| main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:18 | | main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:18 | | main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:9:281:11 | add | provenance | MaD:4 Sink:MaD:4 | models @@ -386,7 +342,6 @@ models | 36 | Summary: ::name; Argument[self]; ReturnValue; taint | | 37 | Summary: ::path; Argument[self]; ReturnValue; taint | | 38 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 39 | Summary: ::set_secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; Argument[self]; taint | nodes | main.rs:8:19:8:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | @@ -526,6 +481,7 @@ nodes | main.rs:131:20:131:20 | c | semmle.label | c | | main.rs:131:20:131:28 | c.clone() | semmle.label | c.clone() | | main.rs:134:9:134:9 | d | semmle.label | d | +| main.rs:134:13:134:13 | c | semmle.label | c | | main.rs:134:13:134:35 | c.set_partitioned(...) | semmle.label | c.set_partitioned(...) | | main.rs:135:13:135:18 | insert | semmle.label | insert | | main.rs:135:20:135:20 | d | semmle.label | d | diff --git a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 538ecf9c2e3..00000000000 --- a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| test.rs:117:9:117:21 | ptr.is_null() | diff --git a/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 1abeb1aeb87..00000000000 --- a/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,7 +0,0 @@ -multipleCallTargets -| main.rs:242:44:242:78 | ... .cast() | -| main.rs:245:44:245:78 | ... .cast() | -| main.rs:248:44:248:78 | ... .cast() | -| main.rs:251:14:251:48 | ... .cast() | -| main.rs:254:14:254:48 | ... .cast() | -| main.rs:257:14:257:48 | ... .cast() | diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 8fcbd27ac02..24edd2ff7f5 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -57,104 +57,109 @@ edges | main.rs:18:41:18:41 | v | main.rs:20:50:20:50 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:29:60:29:60 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:32:60:32:60 | v | provenance | | -| main.rs:18:41:18:41 | v | main.rs:32:60:32:89 | ... * ... | provenance | | -| main.rs:18:41:18:41 | v | main.rs:35:9:35:10 | s6 | provenance | | | main.rs:18:41:18:41 | v | main.rs:35:49:35:49 | v | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:40 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:42 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | -| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:34 | | main.rs:21:31:21:32 | l2 | main.rs:21:13:21:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:21:31:21:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | -| main.rs:21:31:21:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | +| main.rs:21:31:21:32 | l2 | main.rs:22:31:22:32 | l2 | provenance | | +| main.rs:21:31:21:32 | l2 | main.rs:23:31:23:32 | l2 | provenance | | | main.rs:21:31:21:32 | l2 | main.rs:24:38:24:39 | l2 | provenance | | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:40 | +| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:28 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:42 | | main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:13:22:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:40 | -| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:33 | +| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:28 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:42 | +| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:36 | | main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:13:23:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:24:38:24:39 | l2 | main.rs:24:13:24:36 | ...::alloc_zeroed | provenance | MaD:16 Sink:MaD:16 | | main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | -| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:32 | +| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:35 | | main.rs:30:31:30:32 | l4 | main.rs:30:13:30:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:43 | -| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:32 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:27 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:45 | +| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:35 | | main.rs:33:31:33:32 | l5 | main.rs:33:13:33:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:42 | +| main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:24 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:26 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:25 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:44 | | main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | | -| main.rs:36:9:36:10 | l6 [Layout.size] | main.rs:37:31:37:32 | l6 [Layout.size] | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | -| main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) [Layout.size] | main.rs:36:9:36:10 | l6 [Layout.size] | provenance | | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:32 | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) [Layout.size] | provenance | MaD:31 | +| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:35 | | main.rs:37:31:37:32 | l6 | main.rs:37:13:37:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:37:31:37:32 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:37 | -| main.rs:37:31:37:32 | l6 [Layout.size] | main.rs:39:60:39:68 | l6.size() | provenance | MaD:36 | +| main.rs:37:31:37:32 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | -| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:32 | +| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:39 | +| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:35 | | main.rs:40:31:40:32 | l7 | main.rs:40:13:40:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | -| main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:45 | ... + ... | provenance | | +| main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:53:48:53:48 | v | provenance | | -| main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:53 | ... * ... | provenance | | +| main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:42 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | | main.rs:50:31:50:53 | ... .0 | main.rs:50:13:50:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:34 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:37 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:42 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | | main.rs:51:31:51:57 | ... .0 | main.rs:51:13:51:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:34 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:40 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:24 | +| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:37 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:42 | | main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:13:53:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:35 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:40 | +| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:38 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:42 | | main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:13:54:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:35 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:27 | +| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:38 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:39 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:41 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | -| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:34 | +| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:37 | | main.rs:59:31:59:32 | k1 | main.rs:59:13:59:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:59:31:59:32 | k1 | main.rs:60:34:60:35 | k1 | provenance | | -| main.rs:59:31:59:32 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:27 | +| main.rs:59:31:59:32 | k1 | main.rs:62:24:62:25 | k1 | provenance | | | main.rs:59:31:59:32 | k1 | main.rs:64:48:64:49 | k1 | provenance | | -| main.rs:59:31:59:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:29 | +| main.rs:59:31:59:32 | k1 | main.rs:65:31:65:32 | k1 | provenance | | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | | main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:42 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | -| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:26 | +| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:30 | | main.rs:61:31:61:32 | k2 | main.rs:61:13:61:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | | main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:31 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:42 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | | main.rs:63:31:63:32 | k3 | main.rs:63:13:63:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:40 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:42 | | main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:13:64:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:28 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:40 | +| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:32 | +| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:33 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:42 | | main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:13:65:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:40 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:42 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | -| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:29 | | main.rs:68:31:68:32 | l4 | main.rs:68:13:68:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | | main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:40 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:42 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | -| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:34 | | main.rs:88:31:88:36 | layout | main.rs:88:13:88:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | @@ -165,16 +170,16 @@ edges | main.rs:91:38:91:45 | ...: usize | main.rs:161:55:161:55 | v | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:40 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:42 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | -| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:29 | | main.rs:96:35:96:36 | l1 | main.rs:96:17:96:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:96:35:96:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:96:35:96:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | | main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:40 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:42 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | -| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:29 | | main.rs:102:35:102:36 | l1 | main.rs:102:17:102:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:102:35:102:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:102:35:102:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | @@ -185,28 +190,28 @@ edges | main.rs:111:35:111:36 | l1 | main.rs:111:17:111:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:111:35:111:36 | l1 | main.rs:146:35:146:36 | l1 | provenance | | | main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:40 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:42 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | -| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:29 | | main.rs:146:35:146:36 | l1 | main.rs:146:17:146:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:146:35:146:36 | l1 | main.rs:177:31:177:32 | l1 | provenance | | | main.rs:148:35:148:36 | l9 | main.rs:148:17:148:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:40 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:42 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | -| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:45 | +| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:29 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:47 | | main.rs:152:31:152:33 | l10 | main.rs:152:13:152:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:40 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:42 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | -| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:44 | +| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:29 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:46 | | main.rs:155:31:155:33 | l11 | main.rs:155:13:155:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:40 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:42 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | -| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:34 | | main.rs:162:35:162:37 | l13 | main.rs:162:17:162:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:162:35:162:37 | l13 | main.rs:169:35:169:37 | l13 | provenance | | | main.rs:169:35:169:37 | l13 | main.rs:169:17:169:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | @@ -214,9 +219,9 @@ edges | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | | main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | | | main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:40 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:42 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | -| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:29 | | main.rs:193:38:193:39 | l2 | main.rs:193:32:193:36 | alloc | provenance | MaD:10 Sink:MaD:10 | | main.rs:193:38:193:39 | l2 | main.rs:194:45:194:46 | l2 | provenance | | | main.rs:194:45:194:46 | l2 | main.rs:194:32:194:43 | alloc_zeroed | provenance | MaD:11 Sink:MaD:11 | @@ -251,20 +256,21 @@ edges | main.rs:230:46:230:46 | v | main.rs:230:13:230:44 | ...::try_with_capacity_in | provenance | MaD:3 Sink:MaD:3 | | main.rs:230:46:230:46 | v | main.rs:231:42:231:42 | v | provenance | | | main.rs:231:42:231:42 | v | main.rs:231:13:231:40 | ...::with_capacity_in | provenance | MaD:4 Sink:MaD:4 | -| main.rs:279:24:279:41 | ...: String | main.rs:280:21:280:47 | user_input.parse() [Ok] | provenance | MaD:41 | +| main.rs:279:24:279:41 | ...: String | main.rs:280:21:280:30 | user_input | provenance | | | main.rs:280:9:280:17 | num_bytes | main.rs:282:54:282:62 | num_bytes | provenance | | +| main.rs:280:21:280:30 | user_input | main.rs:280:21:280:47 | user_input.parse() [Ok] | provenance | MaD:43 | | main.rs:280:21:280:47 | user_input.parse() [Ok] | main.rs:280:21:280:48 | TryExpr | provenance | | -| main.rs:280:21:280:48 | TryExpr | main.rs:280:9:280:17 | num_bytes | provenance | | -| main.rs:280:21:280:48 | TryExpr | main.rs:280:21:280:77 | ... * ... | provenance | MaD:43 | +| main.rs:280:21:280:48 | TryExpr | main.rs:280:21:280:77 | ... * ... | provenance | MaD:27 | +| main.rs:280:21:280:48 | TryExpr | main.rs:280:21:280:77 | ... * ... | provenance | MaD:45 | | main.rs:280:21:280:77 | ... * ... | main.rs:280:9:280:17 | num_bytes | provenance | | | main.rs:282:9:282:14 | layout | main.rs:284:40:284:45 | layout | provenance | | -| main.rs:282:18:282:66 | ...::from_size_align(...) [Ok] | main.rs:282:18:282:75 | ... .unwrap() | provenance | MaD:40 | +| main.rs:282:18:282:66 | ...::from_size_align(...) [Ok] | main.rs:282:18:282:75 | ... .unwrap() | provenance | MaD:42 | | main.rs:282:18:282:75 | ... .unwrap() | main.rs:282:9:282:14 | layout | provenance | | -| main.rs:282:54:282:62 | num_bytes | main.rs:282:18:282:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:282:54:282:62 | num_bytes | main.rs:282:18:282:66 | ...::from_size_align(...) [Ok] | provenance | MaD:34 | | main.rs:284:40:284:45 | layout | main.rs:284:22:284:38 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:308:25:308:38 | ...::args | main.rs:308:25:308:40 | ...::args(...) [element] | provenance | Src:MaD:22 | | main.rs:308:25:308:40 | ...::args(...) [element] | main.rs:308:25:308:47 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:308:25:308:47 | ... .nth(...) [Some] | main.rs:308:25:308:74 | ... .unwrap_or(...) | provenance | MaD:38 | +| main.rs:308:25:308:47 | ... .nth(...) [Some] | main.rs:308:25:308:74 | ... .unwrap_or(...) | provenance | MaD:40 | | main.rs:308:25:308:74 | ... .unwrap_or(...) | main.rs:279:24:279:41 | ...: String | provenance | | | main.rs:317:9:317:9 | v | main.rs:320:34:320:34 | v | provenance | | | main.rs:317:9:317:9 | v | main.rs:321:42:321:42 | v | provenance | | @@ -274,9 +280,9 @@ edges | main.rs:317:9:317:9 | v | main.rs:325:22:325:22 | v | provenance | | | main.rs:317:13:317:26 | ...::args | main.rs:317:13:317:28 | ...::args(...) [element] | provenance | Src:MaD:22 | | main.rs:317:13:317:28 | ...::args(...) [element] | main.rs:317:13:317:35 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:317:13:317:35 | ... .nth(...) [Some] | main.rs:317:13:317:65 | ... .unwrap_or(...) | provenance | MaD:38 | -| main.rs:317:13:317:65 | ... .unwrap_or(...) | main.rs:317:13:317:82 | ... .parse() [Ok] | provenance | MaD:41 | -| main.rs:317:13:317:82 | ... .parse() [Ok] | main.rs:317:13:317:91 | ... .unwrap() | provenance | MaD:40 | +| main.rs:317:13:317:35 | ... .nth(...) [Some] | main.rs:317:13:317:65 | ... .unwrap_or(...) | provenance | MaD:40 | +| main.rs:317:13:317:65 | ... .unwrap_or(...) | main.rs:317:13:317:82 | ... .parse() [Ok] | provenance | MaD:43 | +| main.rs:317:13:317:82 | ... .parse() [Ok] | main.rs:317:13:317:91 | ... .unwrap() | provenance | MaD:42 | | main.rs:317:13:317:91 | ... .unwrap() | main.rs:317:9:317:9 | v | provenance | | | main.rs:320:34:320:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | | main.rs:321:42:321:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | @@ -307,29 +313,31 @@ models | 20 | Sink: libc::unix::malloc; Argument[0]; alloc-size | | 21 | Sink: libc::unix::realloc; Argument[1]; alloc-size | | 22 | Source: std::env::args; ReturnValue.Element; commandargs | -| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 24 | Summary: ::align_to; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 25 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 26 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 27 | Summary: ::extend; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 28 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 29 | Summary: ::extend_packed; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 30 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 31 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue.Field[core::alloc::layout::Layout::size]; value | -| 32 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | -| 33 | Summary: ::pad_to_align; Argument[self]; ReturnValue; taint | -| 34 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 35 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 36 | Summary: ::size; Argument[self].Field[core::alloc::layout::Layout::size]; ReturnValue; value | -| 37 | Summary: ::size; Argument[self]; ReturnValue; taint | -| 38 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 39 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 40 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 41 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 42 | Summary: ::mul; Argument[0]; ReturnValue; taint | -| 43 | Summary: ::mul; Argument[self]; ReturnValue; taint | -| 44 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 45 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 24 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint | +| 25 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[0].Reference; ReturnValue; taint | +| 26 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[0]; ReturnValue; taint | +| 27 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self]; ReturnValue; taint | +| 28 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 29 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 31 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 32 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 35 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | +| 36 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | +| 37 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 38 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 39 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | +| 40 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 41 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 42 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 43 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 44 | Summary: ::mul; Argument[0]; ReturnValue; taint | +| 45 | Summary: ::mul; Argument[self]; ReturnValue; taint | +| 46 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 47 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:13:18:31 | ...::realloc | semmle.label | ...::realloc | @@ -341,9 +349,11 @@ nodes | main.rs:21:13:21:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:21:31:21:32 | l2 | semmle.label | l2 | | main.rs:22:13:22:29 | ...::alloc | semmle.label | ...::alloc | +| main.rs:22:31:22:32 | l2 | semmle.label | l2 | | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | semmle.label | l2.align_to(...) [Ok] | | main.rs:22:31:22:53 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:23:13:23:29 | ...::alloc | semmle.label | ...::alloc | +| main.rs:23:31:23:32 | l2 | semmle.label | l2 | | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | semmle.label | l2.align_to(...) [Ok] | | main.rs:23:31:23:53 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:23:31:23:68 | ... .pad_to_align() | semmle.label | ... .pad_to_align() | @@ -361,18 +371,17 @@ nodes | main.rs:33:13:33:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:33:31:33:32 | l5 | semmle.label | l5 | | main.rs:35:9:35:10 | s6 | semmle.label | s6 | +| main.rs:35:14:35:54 | ... + ... | semmle.label | ... + ... | | main.rs:35:15:35:49 | ... * ... | semmle.label | ... * ... | | main.rs:35:49:35:49 | v | semmle.label | v | | main.rs:36:9:36:10 | l6 | semmle.label | l6 | -| main.rs:36:9:36:10 | l6 [Layout.size] | semmle.label | l6 [Layout.size] | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | semmle.label | ...::from_size_align_unchecked(...) | -| main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) [Layout.size] | semmle.label | ...::from_size_align_unchecked(...) [Layout.size] | | main.rs:36:60:36:61 | s6 | semmle.label | s6 | | main.rs:37:13:37:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:37:31:37:32 | l6 | semmle.label | l6 | -| main.rs:37:31:37:32 | l6 [Layout.size] | semmle.label | l6 [Layout.size] | | main.rs:39:9:39:10 | l7 | semmle.label | l7 | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | semmle.label | ...::from_size_align_unchecked(...) | +| main.rs:39:60:39:61 | l6 | semmle.label | l6 | | main.rs:39:60:39:68 | l6.size() | semmle.label | l6.size() | | main.rs:40:13:40:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:40:31:40:32 | l7 | semmle.label | l7 | @@ -386,6 +395,7 @@ nodes | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | semmle.label | l2.repeat(...) [Ok, tuple.0] | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | semmle.label | ... .unwrap() [tuple.0] | | main.rs:51:31:51:57 | ... .0 | semmle.label | ... .0 | +| main.rs:51:41:51:41 | v | semmle.label | v | | main.rs:51:41:51:45 | ... + ... | semmle.label | ... + ... | | main.rs:53:13:53:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | semmle.label | l2.repeat_packed(...) [Ok] | @@ -394,6 +404,7 @@ nodes | main.rs:54:13:54:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | semmle.label | l2.repeat_packed(...) [Ok] | | main.rs:54:31:54:63 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:54:48:54:48 | v | semmle.label | v | | main.rs:54:48:54:53 | ... * ... | semmle.label | ... * ... | | main.rs:58:9:58:20 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | | main.rs:58:10:58:11 | k1 | semmle.label | k1 | @@ -411,6 +422,7 @@ nodes | main.rs:61:31:61:32 | k2 | semmle.label | k2 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | | main.rs:62:10:62:11 | k3 | semmle.label | k3 | +| main.rs:62:24:62:25 | k1 | semmle.label | k1 | | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | semmle.label | k1.extend(...) [Ok, tuple.0] | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | semmle.label | ... .unwrap() [tuple.0] | | main.rs:63:13:63:29 | ...::alloc | semmle.label | ...::alloc | @@ -420,6 +432,7 @@ nodes | main.rs:64:31:64:59 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:64:48:64:49 | k1 | semmle.label | k1 | | main.rs:65:13:65:29 | ...::alloc | semmle.label | ...::alloc | +| main.rs:65:31:65:32 | k1 | semmle.label | k1 | | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | semmle.label | k1.extend_packed(...) [Ok] | | main.rs:65:31:65:59 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:67:9:67:10 | l4 | semmle.label | l4 | @@ -532,6 +545,7 @@ nodes | main.rs:231:42:231:42 | v | semmle.label | v | | main.rs:279:24:279:41 | ...: String | semmle.label | ...: String | | main.rs:280:9:280:17 | num_bytes | semmle.label | num_bytes | +| main.rs:280:21:280:30 | user_input | semmle.label | user_input | | main.rs:280:21:280:47 | user_input.parse() [Ok] | semmle.label | user_input.parse() [Ok] | | main.rs:280:21:280:48 | TryExpr | semmle.label | TryExpr | | main.rs:280:21:280:77 | ... * ... | semmle.label | ... * ... | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index e4657a426ea..081ec36f4ed 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -10,37 +10,45 @@ | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:16:22:24 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:22:16:22:24 | ...::from | a key | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:42:14:42:32 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:42:14:42:32 | ...::from | a key | | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:53:14:53:32 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:53:14:53:32 | ...::from | a key | +| test_heuristic.rs:44:31:44:38 | [0u8; 16] | test_heuristic.rs:44:31:44:38 | [0u8; 16] | test_heuristic.rs:45:41:45:48 | const_iv | This hard-coded value is used as $@. | test_heuristic.rs:45:41:45:48 | const_iv | an initialization vector | +| test_heuristic.rs:63:30:63:37 | "secret" | test_heuristic.rs:63:30:63:37 | "secret" | test_heuristic.rs:63:30:63:37 | "secret" | This hard-coded value is used as $@. | test_heuristic.rs:63:30:63:37 | "secret" | a password | +| test_heuristic.rs:64:20:64:27 | [0u8; 16] | test_heuristic.rs:64:20:64:27 | [0u8; 16] | test_heuristic.rs:64:19:64:27 | &... | This hard-coded value is used as $@. | test_heuristic.rs:64:19:64:27 | &... | a nonce | +| test_heuristic.rs:65:31:65:38 | [0u8; 16] | test_heuristic.rs:65:31:65:38 | [0u8; 16] | test_heuristic.rs:65:30:65:38 | &... | This hard-coded value is used as $@. | test_heuristic.rs:65:30:65:38 | &... | a salt | +| test_heuristic.rs:67:22:67:22 | 0 | test_heuristic.rs:67:22:67:22 | 0 | test_heuristic.rs:67:22:67:22 | 0 | This hard-coded value is used as $@. | test_heuristic.rs:67:22:67:22 | 0 | a salt | +| test_heuristic.rs:69:32:69:32 | 1 | test_heuristic.rs:69:32:69:32 | 1 | test_heuristic.rs:69:22:69:32 | ... + ... | This hard-coded value is used as $@. | test_heuristic.rs:69:22:69:32 | ... + ... | a salt | +| test_heuristic.rs:70:34:70:35 | 32 | test_heuristic.rs:70:34:70:35 | 32 | test_heuristic.rs:70:22:70:62 | ... ^ ... | This hard-coded value is used as $@. | test_heuristic.rs:70:22:70:62 | ... ^ ... | a salt | +| test_heuristic.rs:70:52:70:61 | 0xFFFFFFFF | test_heuristic.rs:70:52:70:61 | 0xFFFFFFFF | test_heuristic.rs:70:22:70:62 | ... ^ ... | This hard-coded value is used as $@. | test_heuristic.rs:70:22:70:62 | ... ^ ... | a salt | edges | test_cipher.rs:18:9:18:14 | const1 [&ref] | test_cipher.rs:19:73:19:78 | const1 [&ref] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref] | test_cipher.rs:18:9:18:14 | const1 [&ref] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:28:18:36 | &... [&ref] | provenance | | | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | -| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:19 | | test_cipher.rs:25:9:25:14 | const4 [&ref] | test_cipher.rs:26:66:26:71 | const4 [&ref] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref] | test_cipher.rs:25:9:25:14 | const4 [&ref] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:28:25:36 | &... [&ref] | provenance | | | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:4 Sink:MaD:4 | -| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:19 | | test_cipher.rs:29:9:29:14 | const5 [&ref] | test_cipher.rs:30:95:30:100 | const5 [&ref] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref] | test_cipher.rs:29:9:29:14 | const5 [&ref] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:28:29:36 | &... [&ref] | provenance | | | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:5 Sink:MaD:5 | -| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:19 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:19 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:19 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:7 | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:9 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:19 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 [&ref] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref] | test_cipher.rs:73:9:73:14 | const2 [&ref] | provenance | | @@ -59,9 +67,24 @@ edges | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:8 | | test_cookie.rs:42:34:42:39 | array2 | test_cookie.rs:42:14:42:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | | test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 [element] | provenance | | -| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:10 | +| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:20 | | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | test_cookie.rs:49:9:49:14 | array3 [element] | provenance | | | test_cookie.rs:53:34:53:39 | array3 [element] | test_cookie.rs:53:14:53:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | +| test_heuristic.rs:44:9:44:16 | const_iv [&ref] | test_heuristic.rs:45:41:45:48 | const_iv | provenance | | +| test_heuristic.rs:44:30:44:38 | &... [&ref] | test_heuristic.rs:44:9:44:16 | const_iv [&ref] | provenance | | +| test_heuristic.rs:44:31:44:38 | [0u8; 16] | test_heuristic.rs:44:30:44:38 | &... [&ref] | provenance | | +| test_heuristic.rs:64:20:64:27 | [0u8; 16] | test_heuristic.rs:64:19:64:27 | &... | provenance | | +| test_heuristic.rs:65:31:65:38 | [0u8; 16] | test_heuristic.rs:65:30:65:38 | &... | provenance | | +| test_heuristic.rs:69:32:69:32 | 1 | test_heuristic.rs:69:22:69:32 | ... + ... | provenance | MaD:10 | +| test_heuristic.rs:69:32:69:32 | 1 | test_heuristic.rs:69:22:69:32 | ... + ... | provenance | MaD:9 | +| test_heuristic.rs:70:23:70:35 | ... << ... | test_heuristic.rs:70:22:70:62 | ... ^ ... | provenance | MaD:15 | +| test_heuristic.rs:70:34:70:35 | 32 | test_heuristic.rs:70:23:70:35 | ... << ... | provenance | MaD:17 | +| test_heuristic.rs:70:34:70:35 | 32 | test_heuristic.rs:70:23:70:35 | ... << ... | provenance | MaD:16 | +| test_heuristic.rs:70:34:70:35 | 32 | test_heuristic.rs:70:23:70:35 | ... << ... | provenance | MaD:18 | +| test_heuristic.rs:70:41:70:61 | ... & ... | test_heuristic.rs:70:22:70:62 | ... ^ ... | provenance | MaD:14 | +| test_heuristic.rs:70:41:70:61 | ... & ... | test_heuristic.rs:70:22:70:62 | ... ^ ... | provenance | MaD:13 | +| test_heuristic.rs:70:52:70:61 | 0xFFFFFFFF | test_heuristic.rs:70:41:70:61 | ... & ... | provenance | MaD:12 | +| test_heuristic.rs:70:52:70:61 | 0xFFFFFFFF | test_heuristic.rs:70:41:70:61 | ... & ... | provenance | MaD:11 | models | 1 | Sink: <_ as crypto_common::KeyInit>::new_from_slice; Argument[0]; credentials-key | | 2 | Sink: ::from; Argument[0]; credentials-key | @@ -71,8 +94,18 @@ models | 6 | Sink: ::from; Argument[0].Reference; credentials-key | | 7 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | | 8 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | -| 9 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | -| 10 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | +| 9 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | +| 10 | Summary: <_ as core::ops::arith::Add>::add; Argument[0]; ReturnValue; taint | +| 11 | Summary: <_ as core::ops::bit::BitAnd>::bitand; Argument[0].Reference; ReturnValue; taint | +| 12 | Summary: <_ as core::ops::bit::BitAnd>::bitand; Argument[0]; ReturnValue; taint | +| 13 | Summary: <_ as core::ops::bit::BitXor>::bitxor; Argument[0].Reference; ReturnValue; taint | +| 14 | Summary: <_ as core::ops::bit::BitXor>::bitxor; Argument[0]; ReturnValue; taint | +| 15 | Summary: <_ as core::ops::bit::BitXor>::bitxor; Argument[self]; ReturnValue; taint | +| 16 | Summary: <_ as core::ops::bit::Shl>::shl; Argument[0].Reference; ReturnValue; taint | +| 17 | Summary: <_ as core::ops::bit::Shl>::shl; Argument[0]; ReturnValue; taint | +| 18 | Summary: ::shl; Argument[0]; ReturnValue; taint | +| 19 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 20 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref] | semmle.label | const1 [&ref] | | test_cipher.rs:18:28:18:36 | &... [&ref] | semmle.label | &... [&ref] | @@ -136,4 +169,21 @@ nodes | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | | test_cookie.rs:53:14:53:32 | ...::from | semmle.label | ...::from | | test_cookie.rs:53:34:53:39 | array3 [element] | semmle.label | array3 [element] | +| test_heuristic.rs:44:9:44:16 | const_iv [&ref] | semmle.label | const_iv [&ref] | +| test_heuristic.rs:44:30:44:38 | &... [&ref] | semmle.label | &... [&ref] | +| test_heuristic.rs:44:31:44:38 | [0u8; 16] | semmle.label | [0u8; 16] | +| test_heuristic.rs:45:41:45:48 | const_iv | semmle.label | const_iv | +| test_heuristic.rs:63:30:63:37 | "secret" | semmle.label | "secret" | +| test_heuristic.rs:64:19:64:27 | &... | semmle.label | &... | +| test_heuristic.rs:64:20:64:27 | [0u8; 16] | semmle.label | [0u8; 16] | +| test_heuristic.rs:65:30:65:38 | &... | semmle.label | &... | +| test_heuristic.rs:65:31:65:38 | [0u8; 16] | semmle.label | [0u8; 16] | +| test_heuristic.rs:67:22:67:22 | 0 | semmle.label | 0 | +| test_heuristic.rs:69:22:69:32 | ... + ... | semmle.label | ... + ... | +| test_heuristic.rs:69:32:69:32 | 1 | semmle.label | 1 | +| test_heuristic.rs:70:22:70:62 | ... ^ ... | semmle.label | ... ^ ... | +| test_heuristic.rs:70:23:70:35 | ... << ... | semmle.label | ... << ... | +| test_heuristic.rs:70:34:70:35 | 32 | semmle.label | 32 | +| test_heuristic.rs:70:41:70:61 | ... & ... | semmle.label | ... & ... | +| test_heuristic.rs:70:52:70:61 | 0xFFFFFFFF | semmle.label | 0xFFFFFFFF | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/test_heuristic.rs b/rust/ql/test/query-tests/security/CWE-798/test_heuristic.rs new file mode 100644 index 00000000000..f8f16a16d12 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/test_heuristic.rs @@ -0,0 +1,71 @@ + +// --- tests --- + +fn encrypt_with(plaintext: &str, key: &[u8;16], iv: &[u8;16]) { + // ... +} + +fn encrypt2(plaintext: &str, crypto_key: &[u8;16], iv_bytes: &[u8;16]) { + // ... +} + +fn database_op(text: &str, primary_key: &str, pivot: &str) { + // note: this one has nothing to do with encryption, but has + // `key` and `iv` contained within the parameter names. +} + +struct MyCryptor { +} + +impl MyCryptor { + fn new(password: &str) -> MyCryptor { + MyCryptor { } + } + + fn set_nonce(&self, nonce: &[u8;16]) { + // ... + } + + fn encrypt(&self, plaintext: &str, salt: &[u8;16]) { + // ... + } + + fn set_salt_u64(&self, salt: u64) { + // ... + } +} + +fn test(var_string: &str, var_data: &[u8;16], var_u64: u64) { + encrypt_with("plaintext", var_data, var_data); + + let const_key: &[u8;16] = &[0u8;16]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + encrypt_with("plaintext", const_key, var_data); // $ MISSING: Sink + + let const_iv: &[u8;16] = &[0u8;16]; // $ Alert[rust/hard-coded-cryptographic-value] + encrypt_with("plaintext", var_data, const_iv); // $ Sink + + encrypt2("plaintext", var_data, var_data); + + let const_key2: &[u8;16] = &[1u8;16]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + encrypt2("plaintext", const_key2, var_data); // $ MISSING: Sink + + let const_iv: &[u8;16] = &[1u8;16]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + encrypt2("plaintext", var_data, const_iv); // $ MISSING: Sink + + let const_key_str = "primary_key"; + let const_pivot_str = "pivot"; + database_op("text", const_key_str, const_pivot_str); + + let mc1 = MyCryptor::new(var_string); + mc1.set_nonce(var_data); + mc1.encrypt("plaintext", var_data); + + let mc2 = MyCryptor::new("secret"); // $ Alert[rust/hard-coded-cryptographic-value] + mc2.set_nonce(&[0u8;16]); // $ Alert[rust/hard-coded-cryptographic-value] + mc2.encrypt("plaintext", &[0u8;16]); // $ Alert[rust/hard-coded-cryptographic-value] + + mc2.set_salt_u64(0); // $ Alert[rust/hard-coded-cryptographic-value] + mc2.set_salt_u64(var_u64); + mc2.set_salt_u64(var_u64 + 1); // $ SPURIOUS: Alert[rust/hard-coded-cryptographic-value] + mc2.set_salt_u64((var_u64 << 32) ^ (var_u64 & 0xFFFFFFFF)); // $ SPURIOUS: Alert[rust/hard-coded-cryptographic-value] +} diff --git a/rust/ql/test/query-tests/security/CWE-825/AccessAfterLifetime.expected b/rust/ql/test/query-tests/security/CWE-825/AccessAfterLifetime.expected index f58c58bc896..69573c73857 100644 --- a/rust/ql/test/query-tests/security/CWE-825/AccessAfterLifetime.expected +++ b/rust/ql/test/query-tests/security/CWE-825/AccessAfterLifetime.expected @@ -24,27 +24,9 @@ | lifetime.rs:808:23:808:25 | ptr | lifetime.rs:798:9:798:12 | &val | lifetime.rs:808:23:808:25 | ptr | Access of a pointer to $@ after its lifetime has ended. | lifetime.rs:796:6:796:8 | val | val | | main.rs:64:23:64:24 | p2 | main.rs:44:26:44:28 | &b2 | main.rs:64:23:64:24 | p2 | Access of a pointer to $@ after its lifetime has ended. | main.rs:43:13:43:14 | b2 | b2 | edges -| deallocation.rs:148:6:148:7 | p1 | deallocation.rs:151:14:151:15 | p1 | provenance | | -| deallocation.rs:148:6:148:7 | p1 | deallocation.rs:158:14:158:15 | p1 | provenance | | -| deallocation.rs:148:30:148:38 | &raw const my_buffer | deallocation.rs:148:6:148:7 | p1 | provenance | | -| deallocation.rs:228:28:228:43 | ...: ... | deallocation.rs:230:18:230:20 | ptr | provenance | | -| deallocation.rs:240:27:240:42 | ...: ... | deallocation.rs:248:18:248:20 | ptr | provenance | | -| deallocation.rs:257:7:257:10 | ptr1 | deallocation.rs:260:4:260:7 | ptr1 | provenance | | -| deallocation.rs:257:7:257:10 | ptr1 | deallocation.rs:260:4:260:7 | ptr1 | provenance | | -| deallocation.rs:257:14:257:33 | &raw mut ... | deallocation.rs:257:7:257:10 | ptr1 | provenance | | -| deallocation.rs:258:7:258:10 | ptr2 | deallocation.rs:261:4:261:7 | ptr2 | provenance | | -| deallocation.rs:258:7:258:10 | ptr2 | deallocation.rs:261:4:261:7 | ptr2 | provenance | | -| deallocation.rs:258:14:258:33 | &raw mut ... | deallocation.rs:258:7:258:10 | ptr2 | provenance | | -| deallocation.rs:260:4:260:7 | ptr1 | deallocation.rs:263:27:263:30 | ptr1 | provenance | | -| deallocation.rs:261:4:261:7 | ptr2 | deallocation.rs:265:26:265:29 | ptr2 | provenance | | -| deallocation.rs:263:27:263:30 | ptr1 | deallocation.rs:228:28:228:43 | ...: ... | provenance | | -| deallocation.rs:265:26:265:29 | ptr2 | deallocation.rs:240:27:240:42 | ...: ... | provenance | | -| deallocation.rs:276:6:276:9 | ptr1 | deallocation.rs:279:13:279:16 | ptr1 | provenance | | -| deallocation.rs:276:6:276:9 | ptr1 | deallocation.rs:287:13:287:16 | ptr1 | provenance | | -| deallocation.rs:276:13:276:28 | &raw mut ... | deallocation.rs:276:6:276:9 | ptr1 | provenance | | -| deallocation.rs:295:6:295:9 | ptr2 | deallocation.rs:298:13:298:16 | ptr2 | provenance | | -| deallocation.rs:295:6:295:9 | ptr2 | deallocation.rs:308:13:308:16 | ptr2 | provenance | | -| deallocation.rs:295:13:295:28 | &raw mut ... | deallocation.rs:295:6:295:9 | ptr2 | provenance | | +| deallocation.rs:242:6:242:7 | p1 | deallocation.rs:245:14:245:15 | p1 | provenance | | +| deallocation.rs:242:6:242:7 | p1 | deallocation.rs:252:14:252:15 | p1 | provenance | | +| deallocation.rs:242:30:242:38 | &raw const my_buffer | deallocation.rs:242:6:242:7 | p1 | provenance | | | lifetime.rs:21:2:21:18 | return ... | lifetime.rs:54:11:54:30 | get_local_dangling(...) | provenance | | | lifetime.rs:21:9:21:18 | &my_local1 | lifetime.rs:21:2:21:18 | return ... | provenance | | | lifetime.rs:27:2:27:22 | return ... | lifetime.rs:55:11:55:34 | get_local_dangling_mut(...) | provenance | | @@ -80,15 +62,6 @@ edges | lifetime.rs:94:7:94:16 | &my_local1 | lifetime.rs:94:2:94:3 | p3 | provenance | | | lifetime.rs:119:15:119:24 | &my_local3 | lifetime.rs:91:17:91:30 | ...: ... | provenance | | | lifetime.rs:119:27:119:44 | &mut my_local_mut4 | lifetime.rs:91:33:91:44 | ...: ... | provenance | | -| lifetime.rs:127:2:127:24 | return ... | lifetime.rs:139:11:139:21 | get_const(...) | provenance | | -| lifetime.rs:127:9:127:24 | &MY_GLOBAL_CONST | lifetime.rs:127:2:127:24 | return ... | provenance | | -| lifetime.rs:134:3:134:30 | return ... | lifetime.rs:140:11:140:26 | get_static_mut(...) | provenance | | -| lifetime.rs:134:10:134:30 | &mut MY_GLOBAL_STATIC | lifetime.rs:134:3:134:30 | return ... | provenance | | -| lifetime.rs:139:6:139:7 | p1 | lifetime.rs:147:14:147:15 | p1 | provenance | | -| lifetime.rs:139:11:139:21 | get_const(...) | lifetime.rs:139:6:139:7 | p1 | provenance | | -| lifetime.rs:140:6:140:7 | p2 | lifetime.rs:148:14:148:15 | p2 | provenance | | -| lifetime.rs:140:6:140:7 | p2 | lifetime.rs:154:5:154:6 | p2 | provenance | | -| lifetime.rs:140:11:140:26 | get_static_mut(...) | lifetime.rs:140:6:140:7 | p2 | provenance | | | lifetime.rs:161:17:161:31 | ...: ... | lifetime.rs:164:13:164:15 | ptr | provenance | | | lifetime.rs:169:17:169:31 | ...: ... | lifetime.rs:172:13:172:15 | ptr | provenance | | | lifetime.rs:177:17:177:31 | ...: ... | lifetime.rs:180:13:180:15 | ptr | provenance | | @@ -106,7 +79,6 @@ edges | lifetime.rs:201:15:201:17 | ptr | lifetime.rs:177:17:177:31 | ...: ... | provenance | | | lifetime.rs:206:19:206:36 | ...: ... | lifetime.rs:216:16:216:21 | ptr_up | provenance | | | lifetime.rs:208:6:208:13 | ptr_ours | lifetime.rs:211:33:211:40 | ptr_ours | provenance | | -| lifetime.rs:208:6:208:13 | ptr_ours | lifetime.rs:217:18:217:25 | ptr_ours | provenance | | | lifetime.rs:208:6:208:13 | ptr_ours | lifetime.rs:225:2:225:16 | return ptr_ours | provenance | | | lifetime.rs:208:17:208:29 | &my_local_rec | lifetime.rs:208:6:208:13 | ptr_ours | provenance | | | lifetime.rs:211:7:211:14 | ptr_down | lifetime.rs:218:18:218:25 | ptr_down | provenance | | @@ -141,6 +113,16 @@ edges | lifetime.rs:305:15:305:37 | get_pointer_from_enum(...) | lifetime.rs:305:6:305:11 | result | provenance | | | lifetime.rs:313:10:313:29 | ...::Pointer(...) [Pointer] | lifetime.rs:313:27:313:28 | p2 | provenance | | | lifetime.rs:313:27:313:28 | p2 | lifetime.rs:314:23:314:24 | p2 | provenance | | +| lifetime.rs:332:6:332:13 | mut ref1 | lifetime.rs:338:9:338:35 | ...::Pointer(...) | provenance | | +| lifetime.rs:332:17:332:22 | &enum1 | lifetime.rs:332:6:332:13 | mut ref1 | provenance | | +| lifetime.rs:336:3:336:6 | ref1 | lifetime.rs:338:9:338:35 | ...::Pointer(...) | provenance | | +| lifetime.rs:336:10:336:15 | &inner | lifetime.rs:336:3:336:6 | ref1 | provenance | | +| lifetime.rs:338:9:338:35 | ...::Pointer(...) | lifetime.rs:339:28:339:30 | ptr | provenance | | +| lifetime.rs:348:6:348:13 | mut ref1 | lifetime.rs:354:9:354:35 | ...::Pointer(...) | provenance | | +| lifetime.rs:348:17:348:22 | &enum1 | lifetime.rs:348:6:348:13 | mut ref1 | provenance | | +| lifetime.rs:352:3:352:6 | ref1 | lifetime.rs:354:9:354:35 | ...::Pointer(...) | provenance | | +| lifetime.rs:352:10:352:15 | &inner | lifetime.rs:352:3:352:6 | ref1 | provenance | | +| lifetime.rs:354:9:354:35 | ...::Pointer(...) | lifetime.rs:355:28:355:30 | ptr | provenance | | | lifetime.rs:383:3:383:4 | p1 | lifetime.rs:388:15:388:16 | p1 | provenance | | | lifetime.rs:383:3:383:4 | p1 | lifetime.rs:391:15:391:16 | p1 | provenance | | | lifetime.rs:383:3:383:4 | p1 | lifetime.rs:399:6:399:7 | p1 | provenance | | @@ -150,64 +132,21 @@ edges | lifetime.rs:383:3:383:4 | p1 | lifetime.rs:428:7:428:8 | p1 | provenance | | | lifetime.rs:383:3:383:4 | p1 | lifetime.rs:433:7:433:8 | p1 | provenance | | | lifetime.rs:383:31:383:37 | &raw mut my_pair | lifetime.rs:383:3:383:4 | p1 | provenance | | -| lifetime.rs:384:3:384:4 | p2 | lifetime.rs:394:14:394:15 | p2 | provenance | | -| lifetime.rs:384:3:384:4 | p2 | lifetime.rs:421:15:421:16 | p2 | provenance | | -| lifetime.rs:384:27:384:35 | &raw const ... | lifetime.rs:384:3:384:4 | p2 | provenance | | -| lifetime.rs:385:3:385:4 | p3 | lifetime.rs:395:14:395:15 | p3 | provenance | | -| lifetime.rs:385:3:385:4 | p3 | lifetime.rs:400:5:400:6 | p3 | provenance | | -| lifetime.rs:385:3:385:4 | p3 | lifetime.rs:400:5:400:6 | p3 | provenance | | -| lifetime.rs:385:31:385:39 | &raw mut ... | lifetime.rs:385:3:385:4 | p3 | provenance | | -| lifetime.rs:400:5:400:6 | p3 | lifetime.rs:422:15:422:16 | p3 | provenance | | -| lifetime.rs:400:5:400:6 | p3 | lifetime.rs:429:6:429:7 | p3 | provenance | | | lifetime.rs:442:6:442:7 | r1 | lifetime.rs:443:42:443:43 | r1 | provenance | | | lifetime.rs:442:17:442:23 | &my_val | lifetime.rs:442:6:442:7 | r1 | provenance | | | lifetime.rs:443:6:443:7 | p1 | lifetime.rs:446:13:446:14 | p1 | provenance | | | lifetime.rs:443:6:443:7 | p1 | lifetime.rs:450:2:450:10 | return p1 | provenance | | | lifetime.rs:443:23:443:44 | ...::from_ref(...) | lifetime.rs:443:6:443:7 | p1 | provenance | | -| lifetime.rs:443:42:443:43 | r1 | lifetime.rs:443:23:443:44 | ...::from_ref(...) | provenance | MaD:5 | +| lifetime.rs:443:42:443:43 | r1 | lifetime.rs:443:23:443:44 | ...::from_ref(...) | provenance | MaD:3 | | lifetime.rs:450:2:450:10 | return p1 | lifetime.rs:454:11:454:29 | get_ptr_from_ref(...) | provenance | | | lifetime.rs:450:2:450:10 | return p1 | lifetime.rs:460:13:460:31 | get_ptr_from_ref(...) | provenance | | | lifetime.rs:454:6:454:7 | p1 | lifetime.rs:459:13:459:14 | p1 | provenance | | | lifetime.rs:454:11:454:29 | get_ptr_from_ref(...) | lifetime.rs:454:6:454:7 | p1 | provenance | | | lifetime.rs:568:7:568:8 | p2 | lifetime.rs:572:14:572:15 | p2 | provenance | | | lifetime.rs:568:24:568:33 | &my_local2 | lifetime.rs:568:7:568:8 | p2 | provenance | | -| lifetime.rs:630:3:630:6 | str2 | lifetime.rs:633:15:633:18 | str2 | provenance | | -| lifetime.rs:630:3:630:6 | str2 | lifetime.rs:641:14:641:17 | str2 | provenance | | -| lifetime.rs:630:10:630:25 | &... | lifetime.rs:630:3:630:6 | str2 | provenance | | -| lifetime.rs:654:4:654:7 | str2 | lifetime.rs:655:22:655:25 | str2 | provenance | | -| lifetime.rs:654:11:654:35 | ... + ... | lifetime.rs:654:4:654:7 | str2 | provenance | | -| lifetime.rs:654:31:654:35 | &str1 | lifetime.rs:654:4:654:7 | str2 | provenance | | -| lifetime.rs:654:31:654:35 | &str1 | lifetime.rs:654:11:654:35 | ... + ... | provenance | MaD:2 | -| lifetime.rs:654:31:654:35 | &str1 | lifetime.rs:654:11:654:35 | ... + ... | provenance | MaD:1 | | lifetime.rs:655:4:655:7 | ref1 | lifetime.rs:659:15:659:18 | ref1 | provenance | | | lifetime.rs:655:4:655:7 | ref1 | lifetime.rs:667:14:667:17 | ref1 | provenance | | -| lifetime.rs:655:4:655:7 | ref1 [&ref] | lifetime.rs:659:15:659:18 | ref1 | provenance | | -| lifetime.rs:655:4:655:7 | ref1 [&ref] | lifetime.rs:667:14:667:17 | ref1 | provenance | | | lifetime.rs:655:11:655:25 | &raw const str2 | lifetime.rs:655:4:655:7 | ref1 | provenance | | -| lifetime.rs:655:11:655:25 | &raw const str2 [&ref] | lifetime.rs:655:4:655:7 | ref1 [&ref] | provenance | | -| lifetime.rs:655:22:655:25 | str2 | lifetime.rs:655:11:655:25 | &raw const str2 [&ref] | provenance | | -| lifetime.rs:680:7:680:8 | r1 | lifetime.rs:692:13:692:14 | r1 | provenance | | -| lifetime.rs:682:4:682:12 | &... | lifetime.rs:680:7:680:8 | r1 | provenance | | -| lifetime.rs:684:7:684:14 | TuplePat [tuple.0] | lifetime.rs:684:8:684:9 | r2 | provenance | | -| lifetime.rs:684:7:684:14 | TuplePat [tuple.1] | lifetime.rs:684:12:684:13 | r3 | provenance | | -| lifetime.rs:684:8:684:9 | r2 | lifetime.rs:693:13:693:14 | r2 | provenance | | -| lifetime.rs:684:12:684:13 | r3 | lifetime.rs:694:13:694:14 | r3 | provenance | | -| lifetime.rs:686:4:687:16 | TupleExpr [tuple.0] | lifetime.rs:684:7:684:14 | TuplePat [tuple.0] | provenance | | -| lifetime.rs:686:4:687:16 | TupleExpr [tuple.1] | lifetime.rs:684:7:684:14 | TuplePat [tuple.1] | provenance | | -| lifetime.rs:686:5:686:13 | &... | lifetime.rs:686:4:687:16 | TupleExpr [tuple.0] | provenance | | -| lifetime.rs:687:5:687:15 | &... | lifetime.rs:686:4:687:16 | TupleExpr [tuple.1] | provenance | | -| lifetime.rs:717:35:723:2 | { ... } | lifetime.rs:730:11:730:25 | e1.test_match() | provenance | | -| lifetime.rs:718:7:718:8 | r1 | lifetime.rs:717:35:723:2 | { ... } | provenance | | -| lifetime.rs:719:26:719:34 | &... | lifetime.rs:718:7:718:8 | r1 | provenance | | -| lifetime.rs:730:6:730:7 | r1 | lifetime.rs:734:12:734:13 | r1 | provenance | | -| lifetime.rs:730:11:730:25 | e1.test_match() | lifetime.rs:730:6:730:7 | r1 | provenance | | -| lifetime.rs:766:2:766:11 | &val | lifetime.rs:766:2:766:11 | ptr | provenance | | -| lifetime.rs:766:2:766:11 | ptr | lifetime.rs:766:2:766:11 | ptr | provenance | | -| lifetime.rs:767:2:767:11 | &val | lifetime.rs:767:2:767:11 | ptr | provenance | | -| lifetime.rs:767:2:767:11 | ptr | lifetime.rs:767:2:767:11 | ptr | provenance | | -| lifetime.rs:769:6:769:8 | ptr | lifetime.rs:771:12:771:14 | ptr | provenance | | -| lifetime.rs:769:12:769:21 | &val | lifetime.rs:769:12:769:21 | ptr | provenance | | -| lifetime.rs:769:12:769:21 | ptr | lifetime.rs:769:6:769:8 | ptr | provenance | | | lifetime.rs:781:2:781:19 | return ... | lifetime.rs:785:11:785:41 | get_local_for_unsafe_function(...) | provenance | | | lifetime.rs:781:9:781:19 | &my_local10 | lifetime.rs:781:2:781:19 | return ... | provenance | | | lifetime.rs:785:6:785:7 | p1 | lifetime.rs:789:12:789:13 | p1 | provenance | | @@ -219,47 +158,23 @@ edges | main.rs:18:9:18:10 | p1 [&ref] | main.rs:21:19:21:20 | p1 | provenance | | | main.rs:18:9:18:10 | p1 [&ref] | main.rs:29:19:29:20 | p1 | provenance | | | main.rs:18:14:18:29 | ...::as_ptr(...) [&ref] | main.rs:18:9:18:10 | p1 [&ref] | provenance | | -| main.rs:18:26:18:28 | &b1 | main.rs:18:14:18:29 | ...::as_ptr(...) [&ref] | provenance | MaD:4 | +| main.rs:18:26:18:28 | &b1 | main.rs:18:14:18:29 | ...::as_ptr(...) [&ref] | provenance | MaD:2 | | main.rs:44:9:44:10 | p2 [&ref] | main.rs:51:23:51:24 | p2 | provenance | | | main.rs:44:9:44:10 | p2 [&ref] | main.rs:64:23:64:24 | p2 | provenance | | | main.rs:44:14:44:29 | ...::as_ptr(...) [&ref] | main.rs:44:9:44:10 | p2 [&ref] | provenance | | -| main.rs:44:26:44:28 | &b2 | main.rs:44:14:44:29 | ...::as_ptr(...) [&ref] | provenance | MaD:4 | +| main.rs:44:26:44:28 | &b2 | main.rs:44:14:44:29 | ...::as_ptr(...) [&ref] | provenance | MaD:2 | | main.rs:47:9:47:10 | p3 [&ref] | main.rs:52:23:52:24 | p3 | provenance | | | main.rs:47:14:47:37 | ...::as_mut_ptr(...) [&ref] | main.rs:47:9:47:10 | p3 [&ref] | provenance | | -| main.rs:47:30:47:36 | &mut b3 | main.rs:47:14:47:37 | ...::as_mut_ptr(...) [&ref] | provenance | MaD:3 | +| main.rs:47:30:47:36 | &mut b3 | main.rs:47:14:47:37 | ...::as_mut_ptr(...) [&ref] | provenance | MaD:1 | models -| 1 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | -| 2 | Summary: <_ as core::ops::arith::Add>::add; Argument[0]; ReturnValue; taint | -| 3 | Summary: ::as_mut_ptr; Argument[0].Reference.Reference; ReturnValue.Reference; value | -| 4 | Summary: ::as_ptr; Argument[0].Reference.Reference; ReturnValue.Reference; value | -| 5 | Summary: core::ptr::from_ref; Argument[0]; ReturnValue; value | +| 1 | Summary: ::as_mut_ptr; Argument[0].Reference.Reference; ReturnValue.Reference; value | +| 2 | Summary: ::as_ptr; Argument[0].Reference.Reference; ReturnValue.Reference; value | +| 3 | Summary: core::ptr::from_ref; Argument[0]; ReturnValue; value | nodes -| deallocation.rs:148:6:148:7 | p1 | semmle.label | p1 | -| deallocation.rs:148:30:148:38 | &raw const my_buffer | semmle.label | &raw const my_buffer | -| deallocation.rs:151:14:151:15 | p1 | semmle.label | p1 | -| deallocation.rs:158:14:158:15 | p1 | semmle.label | p1 | -| deallocation.rs:228:28:228:43 | ...: ... | semmle.label | ...: ... | -| deallocation.rs:230:18:230:20 | ptr | semmle.label | ptr | -| deallocation.rs:240:27:240:42 | ...: ... | semmle.label | ...: ... | -| deallocation.rs:248:18:248:20 | ptr | semmle.label | ptr | -| deallocation.rs:257:7:257:10 | ptr1 | semmle.label | ptr1 | -| deallocation.rs:257:14:257:33 | &raw mut ... | semmle.label | &raw mut ... | -| deallocation.rs:258:7:258:10 | ptr2 | semmle.label | ptr2 | -| deallocation.rs:258:14:258:33 | &raw mut ... | semmle.label | &raw mut ... | -| deallocation.rs:260:4:260:7 | ptr1 | semmle.label | ptr1 | -| deallocation.rs:260:4:260:7 | ptr1 | semmle.label | ptr1 | -| deallocation.rs:261:4:261:7 | ptr2 | semmle.label | ptr2 | -| deallocation.rs:261:4:261:7 | ptr2 | semmle.label | ptr2 | -| deallocation.rs:263:27:263:30 | ptr1 | semmle.label | ptr1 | -| deallocation.rs:265:26:265:29 | ptr2 | semmle.label | ptr2 | -| deallocation.rs:276:6:276:9 | ptr1 | semmle.label | ptr1 | -| deallocation.rs:276:13:276:28 | &raw mut ... | semmle.label | &raw mut ... | -| deallocation.rs:279:13:279:16 | ptr1 | semmle.label | ptr1 | -| deallocation.rs:287:13:287:16 | ptr1 | semmle.label | ptr1 | -| deallocation.rs:295:6:295:9 | ptr2 | semmle.label | ptr2 | -| deallocation.rs:295:13:295:28 | &raw mut ... | semmle.label | &raw mut ... | -| deallocation.rs:298:13:298:16 | ptr2 | semmle.label | ptr2 | -| deallocation.rs:308:13:308:16 | ptr2 | semmle.label | ptr2 | +| deallocation.rs:242:6:242:7 | p1 | semmle.label | p1 | +| deallocation.rs:242:30:242:38 | &raw const my_buffer | semmle.label | &raw const my_buffer | +| deallocation.rs:245:14:245:15 | p1 | semmle.label | p1 | +| deallocation.rs:252:14:252:15 | p1 | semmle.label | p1 | | lifetime.rs:21:2:21:18 | return ... | semmle.label | return ... | | lifetime.rs:21:9:21:18 | &my_local1 | semmle.label | &my_local1 | | lifetime.rs:27:2:27:22 | return ... | semmle.label | return ... | @@ -305,17 +220,6 @@ nodes | lifetime.rs:110:5:110:6 | p2 | semmle.label | p2 | | lifetime.rs:119:15:119:24 | &my_local3 | semmle.label | &my_local3 | | lifetime.rs:119:27:119:44 | &mut my_local_mut4 | semmle.label | &mut my_local_mut4 | -| lifetime.rs:127:2:127:24 | return ... | semmle.label | return ... | -| lifetime.rs:127:9:127:24 | &MY_GLOBAL_CONST | semmle.label | &MY_GLOBAL_CONST | -| lifetime.rs:134:3:134:30 | return ... | semmle.label | return ... | -| lifetime.rs:134:10:134:30 | &mut MY_GLOBAL_STATIC | semmle.label | &mut MY_GLOBAL_STATIC | -| lifetime.rs:139:6:139:7 | p1 | semmle.label | p1 | -| lifetime.rs:139:11:139:21 | get_const(...) | semmle.label | get_const(...) | -| lifetime.rs:140:6:140:7 | p2 | semmle.label | p2 | -| lifetime.rs:140:11:140:26 | get_static_mut(...) | semmle.label | get_static_mut(...) | -| lifetime.rs:147:14:147:15 | p1 | semmle.label | p1 | -| lifetime.rs:148:14:148:15 | p2 | semmle.label | p2 | -| lifetime.rs:154:5:154:6 | p2 | semmle.label | p2 | | lifetime.rs:161:17:161:31 | ...: ... | semmle.label | ...: ... | | lifetime.rs:164:13:164:15 | ptr | semmle.label | ptr | | lifetime.rs:169:17:169:31 | ...: ... | semmle.label | ...: ... | @@ -338,7 +242,6 @@ nodes | lifetime.rs:211:18:211:52 | access_ptr_rec(...) | semmle.label | access_ptr_rec(...) | | lifetime.rs:211:33:211:40 | ptr_ours | semmle.label | ptr_ours | | lifetime.rs:216:16:216:21 | ptr_up | semmle.label | ptr_up | -| lifetime.rs:217:18:217:25 | ptr_ours | semmle.label | ptr_ours | | lifetime.rs:218:18:218:25 | ptr_down | semmle.label | ptr_down | | lifetime.rs:225:2:225:16 | return ptr_ours | semmle.label | return ptr_ours | | lifetime.rs:230:6:230:14 | ptr_start | semmle.label | ptr_start | @@ -372,26 +275,27 @@ nodes | lifetime.rs:313:27:313:28 | p2 | semmle.label | p2 | | lifetime.rs:314:23:314:24 | p2 | semmle.label | p2 | | lifetime.rs:317:13:317:18 | result | semmle.label | result | +| lifetime.rs:332:6:332:13 | mut ref1 | semmle.label | mut ref1 | +| lifetime.rs:332:17:332:22 | &enum1 | semmle.label | &enum1 | +| lifetime.rs:336:3:336:6 | ref1 | semmle.label | ref1 | +| lifetime.rs:336:10:336:15 | &inner | semmle.label | &inner | +| lifetime.rs:338:9:338:35 | ...::Pointer(...) | semmle.label | ...::Pointer(...) | +| lifetime.rs:339:28:339:30 | ptr | semmle.label | ptr | +| lifetime.rs:348:6:348:13 | mut ref1 | semmle.label | mut ref1 | +| lifetime.rs:348:17:348:22 | &enum1 | semmle.label | &enum1 | +| lifetime.rs:352:3:352:6 | ref1 | semmle.label | ref1 | +| lifetime.rs:352:10:352:15 | &inner | semmle.label | &inner | +| lifetime.rs:354:9:354:35 | ...::Pointer(...) | semmle.label | ...::Pointer(...) | +| lifetime.rs:355:28:355:30 | ptr | semmle.label | ptr | | lifetime.rs:383:3:383:4 | p1 | semmle.label | p1 | | lifetime.rs:383:31:383:37 | &raw mut my_pair | semmle.label | &raw mut my_pair | -| lifetime.rs:384:3:384:4 | p2 | semmle.label | p2 | -| lifetime.rs:384:27:384:35 | &raw const ... | semmle.label | &raw const ... | -| lifetime.rs:385:3:385:4 | p3 | semmle.label | p3 | -| lifetime.rs:385:31:385:39 | &raw mut ... | semmle.label | &raw mut ... | | lifetime.rs:388:15:388:16 | p1 | semmle.label | p1 | | lifetime.rs:391:15:391:16 | p1 | semmle.label | p1 | -| lifetime.rs:394:14:394:15 | p2 | semmle.label | p2 | -| lifetime.rs:395:14:395:15 | p3 | semmle.label | p3 | | lifetime.rs:399:6:399:7 | p1 | semmle.label | p1 | -| lifetime.rs:400:5:400:6 | p3 | semmle.label | p3 | -| lifetime.rs:400:5:400:6 | p3 | semmle.label | p3 | | lifetime.rs:401:6:401:7 | p1 | semmle.label | p1 | | lifetime.rs:411:16:411:17 | p1 | semmle.label | p1 | | lifetime.rs:416:16:416:17 | p1 | semmle.label | p1 | -| lifetime.rs:421:15:421:16 | p2 | semmle.label | p2 | -| lifetime.rs:422:15:422:16 | p3 | semmle.label | p3 | | lifetime.rs:428:7:428:8 | p1 | semmle.label | p1 | -| lifetime.rs:429:6:429:7 | p3 | semmle.label | p3 | | lifetime.rs:433:7:433:8 | p1 | semmle.label | p1 | | lifetime.rs:442:6:442:7 | r1 | semmle.label | r1 | | lifetime.rs:442:17:442:23 | &my_val | semmle.label | &my_val | @@ -407,49 +311,10 @@ nodes | lifetime.rs:568:7:568:8 | p2 | semmle.label | p2 | | lifetime.rs:568:24:568:33 | &my_local2 | semmle.label | &my_local2 | | lifetime.rs:572:14:572:15 | p2 | semmle.label | p2 | -| lifetime.rs:630:3:630:6 | str2 | semmle.label | str2 | -| lifetime.rs:630:10:630:25 | &... | semmle.label | &... | -| lifetime.rs:633:15:633:18 | str2 | semmle.label | str2 | -| lifetime.rs:641:14:641:17 | str2 | semmle.label | str2 | -| lifetime.rs:654:4:654:7 | str2 | semmle.label | str2 | -| lifetime.rs:654:11:654:35 | ... + ... | semmle.label | ... + ... | -| lifetime.rs:654:31:654:35 | &str1 | semmle.label | &str1 | | lifetime.rs:655:4:655:7 | ref1 | semmle.label | ref1 | -| lifetime.rs:655:4:655:7 | ref1 [&ref] | semmle.label | ref1 [&ref] | | lifetime.rs:655:11:655:25 | &raw const str2 | semmle.label | &raw const str2 | -| lifetime.rs:655:11:655:25 | &raw const str2 [&ref] | semmle.label | &raw const str2 [&ref] | -| lifetime.rs:655:22:655:25 | str2 | semmle.label | str2 | | lifetime.rs:659:15:659:18 | ref1 | semmle.label | ref1 | | lifetime.rs:667:14:667:17 | ref1 | semmle.label | ref1 | -| lifetime.rs:680:7:680:8 | r1 | semmle.label | r1 | -| lifetime.rs:682:4:682:12 | &... | semmle.label | &... | -| lifetime.rs:684:7:684:14 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | -| lifetime.rs:684:7:684:14 | TuplePat [tuple.1] | semmle.label | TuplePat [tuple.1] | -| lifetime.rs:684:8:684:9 | r2 | semmle.label | r2 | -| lifetime.rs:684:12:684:13 | r3 | semmle.label | r3 | -| lifetime.rs:686:4:687:16 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| lifetime.rs:686:4:687:16 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | -| lifetime.rs:686:5:686:13 | &... | semmle.label | &... | -| lifetime.rs:687:5:687:15 | &... | semmle.label | &... | -| lifetime.rs:692:13:692:14 | r1 | semmle.label | r1 | -| lifetime.rs:693:13:693:14 | r2 | semmle.label | r2 | -| lifetime.rs:694:13:694:14 | r3 | semmle.label | r3 | -| lifetime.rs:717:35:723:2 | { ... } | semmle.label | { ... } | -| lifetime.rs:718:7:718:8 | r1 | semmle.label | r1 | -| lifetime.rs:719:26:719:34 | &... | semmle.label | &... | -| lifetime.rs:730:6:730:7 | r1 | semmle.label | r1 | -| lifetime.rs:730:11:730:25 | e1.test_match() | semmle.label | e1.test_match() | -| lifetime.rs:734:12:734:13 | r1 | semmle.label | r1 | -| lifetime.rs:766:2:766:11 | &val | semmle.label | &val | -| lifetime.rs:766:2:766:11 | ptr | semmle.label | ptr | -| lifetime.rs:766:2:766:11 | ptr | semmle.label | ptr | -| lifetime.rs:767:2:767:11 | &val | semmle.label | &val | -| lifetime.rs:767:2:767:11 | ptr | semmle.label | ptr | -| lifetime.rs:767:2:767:11 | ptr | semmle.label | ptr | -| lifetime.rs:769:6:769:8 | ptr | semmle.label | ptr | -| lifetime.rs:769:12:769:21 | &val | semmle.label | &val | -| lifetime.rs:769:12:769:21 | ptr | semmle.label | ptr | -| lifetime.rs:771:12:771:14 | ptr | semmle.label | ptr | | lifetime.rs:781:2:781:19 | return ... | semmle.label | return ... | | lifetime.rs:781:9:781:19 | &my_local10 | semmle.label | &my_local10 | | lifetime.rs:785:6:785:7 | p1 | semmle.label | p1 | diff --git a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected index 1e9bdb3c8bb..d3b5456063f 100644 --- a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected +++ b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected @@ -10,13 +10,23 @@ | deallocation.rs:95:5:95:31 | ...::write::<...> | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:95:5:95:31 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | | deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:3:112:12 | ...::free | invalid | | deallocation.rs:130:14:130:15 | p1 | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:130:14:130:15 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:123:23:123:40 | ...::dangling | invalid | -| deallocation.rs:130:14:130:15 | p1 | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:130:14:130:15 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:123:23:123:40 | ...::dangling | invalid | | deallocation.rs:131:14:131:15 | p2 | deallocation.rs:124:21:124:42 | ...::dangling_mut | deallocation.rs:131:14:131:15 | p2 | This operation dereferences a pointer that may be $@. | deallocation.rs:124:21:124:42 | ...::dangling_mut | invalid | | deallocation.rs:132:14:132:15 | p3 | deallocation.rs:125:23:125:36 | ...::null | deallocation.rs:132:14:132:15 | p3 | This operation dereferences a pointer that may be $@. | deallocation.rs:125:23:125:36 | ...::null | invalid | -| deallocation.rs:180:15:180:16 | p1 | deallocation.rs:176:3:176:25 | ...::drop_in_place | deallocation.rs:180:15:180:16 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:176:3:176:25 | ...::drop_in_place | invalid | -| deallocation.rs:180:15:180:16 | p1 | deallocation.rs:176:3:176:25 | ...::drop_in_place | deallocation.rs:180:15:180:16 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:176:3:176:25 | ...::drop_in_place | invalid | -| deallocation.rs:248:18:248:20 | ptr | deallocation.rs:242:3:242:25 | ...::drop_in_place | deallocation.rs:248:18:248:20 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:242:3:242:25 | ...::drop_in_place | invalid | -| deallocation.rs:248:18:248:20 | ptr | deallocation.rs:242:3:242:25 | ...::drop_in_place | deallocation.rs:248:18:248:20 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:242:3:242:25 | ...::drop_in_place | invalid | +| deallocation.rs:163:13:163:15 | ptr | deallocation.rs:159:9:159:26 | ...::null_mut | deallocation.rs:163:13:163:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:159:9:159:26 | ...::null_mut | invalid | +| deallocation.rs:166:13:166:15 | ptr | deallocation.rs:159:9:159:26 | ...::null_mut | deallocation.rs:166:13:166:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:159:9:159:26 | ...::null_mut | invalid | +| deallocation.rs:175:13:175:15 | ptr | deallocation.rs:171:9:171:26 | ...::null_mut | deallocation.rs:175:13:175:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:171:9:171:26 | ...::null_mut | invalid | +| deallocation.rs:178:13:178:15 | ptr | deallocation.rs:171:9:171:26 | ...::null_mut | deallocation.rs:178:13:178:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:171:9:171:26 | ...::null_mut | invalid | +| deallocation.rs:186:24:186:26 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:186:24:186:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | +| deallocation.rs:190:24:190:26 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:190:24:190:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | +| deallocation.rs:194:25:194:27 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:194:25:194:27 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | +| deallocation.rs:202:24:202:26 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:202:24:202:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | +| deallocation.rs:202:24:202:26 | ptr | deallocation.rs:199:9:199:26 | ...::null_mut | deallocation.rs:202:24:202:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:199:9:199:26 | ...::null_mut | invalid | +| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | +| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:199:9:199:26 | ...::null_mut | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:199:9:199:26 | ...::null_mut | invalid | +| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:207:9:207:26 | ...::null_mut | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:207:9:207:26 | ...::null_mut | invalid | +| deallocation.rs:226:13:226:21 | const_ptr | deallocation.rs:219:15:219:32 | ...::null_mut | deallocation.rs:226:13:226:21 | const_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:219:15:219:32 | ...::null_mut | invalid | +| deallocation.rs:274:15:274:16 | p1 | deallocation.rs:270:3:270:25 | ...::drop_in_place | deallocation.rs:274:15:274:16 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:270:3:270:25 | ...::drop_in_place | invalid | +| deallocation.rs:342:18:342:20 | ptr | deallocation.rs:336:3:336:25 | ...::drop_in_place | deallocation.rs:342:18:342:20 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:336:3:336:25 | ...::drop_in_place | invalid | edges | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:20:23:20:24 | [post] m1 | provenance | Src:MaD:3 MaD:3 | | deallocation.rs:20:23:20:24 | [post] m1 | deallocation.rs:26:15:26:16 | m1 | provenance | | @@ -32,11 +42,10 @@ edges | deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:90:7:90:8 | m2 | provenance | | | deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:95:33:95:34 | m2 | provenance | | | deallocation.rs:95:33:95:34 | m2 | deallocation.rs:95:5:95:31 | ...::write::<...> | provenance | MaD:2 Sink:MaD:2 | -| deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:8 MaD:8 | +| deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:9 MaD:9 | | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | deallocation.rs:115:13:115:18 | my_ptr | provenance | | | deallocation.rs:123:6:123:7 | p1 | deallocation.rs:130:14:130:15 | p1 | provenance | | | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:123:23:123:42 | ...::dangling(...) | provenance | Src:MaD:4 MaD:4 | -| deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:123:23:123:42 | ...::dangling(...) | provenance | Src:MaD:4 MaD:4 | | deallocation.rs:123:23:123:42 | ...::dangling(...) | deallocation.rs:123:6:123:7 | p1 | provenance | | | deallocation.rs:124:6:124:7 | p2 | deallocation.rs:131:14:131:15 | p2 | provenance | | | deallocation.rs:124:21:124:42 | ...::dangling_mut | deallocation.rs:124:21:124:44 | ...::dangling_mut(...) | provenance | Src:MaD:5 MaD:5 | @@ -44,12 +53,35 @@ edges | deallocation.rs:125:6:125:7 | p3 | deallocation.rs:132:14:132:15 | p3 | provenance | | | deallocation.rs:125:23:125:36 | ...::null | deallocation.rs:125:23:125:38 | ...::null(...) | provenance | Src:MaD:7 MaD:7 | | deallocation.rs:125:23:125:38 | ...::null(...) | deallocation.rs:125:6:125:7 | p3 | provenance | | -| deallocation.rs:176:3:176:25 | ...::drop_in_place | deallocation.rs:176:27:176:28 | [post] p1 | provenance | Src:MaD:6 MaD:6 | -| deallocation.rs:176:3:176:25 | ...::drop_in_place | deallocation.rs:176:27:176:28 | [post] p1 | provenance | Src:MaD:6 MaD:6 | -| deallocation.rs:176:27:176:28 | [post] p1 | deallocation.rs:180:15:180:16 | p1 | provenance | | -| deallocation.rs:242:3:242:25 | ...::drop_in_place | deallocation.rs:242:27:242:29 | [post] ptr | provenance | Src:MaD:6 MaD:6 | -| deallocation.rs:242:3:242:25 | ...::drop_in_place | deallocation.rs:242:27:242:29 | [post] ptr | provenance | Src:MaD:6 MaD:6 | -| deallocation.rs:242:27:242:29 | [post] ptr | deallocation.rs:248:18:248:20 | ptr | provenance | | +| deallocation.rs:159:3:159:5 | ptr | deallocation.rs:163:13:163:15 | ptr | provenance | | +| deallocation.rs:159:3:159:5 | ptr | deallocation.rs:166:13:166:15 | ptr | provenance | | +| deallocation.rs:159:9:159:26 | ...::null_mut | deallocation.rs:159:9:159:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | +| deallocation.rs:159:9:159:28 | ...::null_mut(...) | deallocation.rs:159:3:159:5 | ptr | provenance | | +| deallocation.rs:171:3:171:5 | ptr | deallocation.rs:175:13:175:15 | ptr | provenance | | +| deallocation.rs:171:3:171:5 | ptr | deallocation.rs:178:13:178:15 | ptr | provenance | | +| deallocation.rs:171:9:171:26 | ...::null_mut | deallocation.rs:171:9:171:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | +| deallocation.rs:171:9:171:28 | ...::null_mut(...) | deallocation.rs:171:3:171:5 | ptr | provenance | | +| deallocation.rs:183:3:183:5 | ptr | deallocation.rs:186:24:186:26 | ptr | provenance | | +| deallocation.rs:183:3:183:5 | ptr | deallocation.rs:190:24:190:26 | ptr | provenance | | +| deallocation.rs:183:3:183:5 | ptr | deallocation.rs:194:25:194:27 | ptr | provenance | | +| deallocation.rs:183:3:183:5 | ptr | deallocation.rs:202:24:202:26 | ptr | provenance | | +| deallocation.rs:183:3:183:5 | ptr | deallocation.rs:210:7:210:9 | ptr | provenance | | +| deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:183:9:183:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | +| deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:183:3:183:5 | ptr | provenance | | +| deallocation.rs:199:3:199:5 | ptr | deallocation.rs:202:24:202:26 | ptr | provenance | | +| deallocation.rs:199:3:199:5 | ptr | deallocation.rs:210:7:210:9 | ptr | provenance | | +| deallocation.rs:199:9:199:26 | ...::null_mut | deallocation.rs:199:9:199:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | +| deallocation.rs:199:9:199:28 | ...::null_mut(...) | deallocation.rs:199:3:199:5 | ptr | provenance | | +| deallocation.rs:207:3:207:5 | ptr | deallocation.rs:210:7:210:9 | ptr | provenance | | +| deallocation.rs:207:9:207:26 | ...::null_mut | deallocation.rs:207:9:207:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | +| deallocation.rs:207:9:207:28 | ...::null_mut(...) | deallocation.rs:207:3:207:5 | ptr | provenance | | +| deallocation.rs:219:3:219:11 | const_ptr | deallocation.rs:226:13:226:21 | const_ptr | provenance | | +| deallocation.rs:219:15:219:32 | ...::null_mut | deallocation.rs:219:15:219:34 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | +| deallocation.rs:219:15:219:34 | ...::null_mut(...) | deallocation.rs:219:3:219:11 | const_ptr | provenance | | +| deallocation.rs:270:3:270:25 | ...::drop_in_place | deallocation.rs:270:27:270:28 | [post] p1 | provenance | Src:MaD:6 MaD:6 | +| deallocation.rs:270:27:270:28 | [post] p1 | deallocation.rs:274:15:274:16 | p1 | provenance | | +| deallocation.rs:336:3:336:25 | ...::drop_in_place | deallocation.rs:336:27:336:29 | [post] ptr | provenance | Src:MaD:6 MaD:6 | +| deallocation.rs:336:27:336:29 | [post] ptr | deallocation.rs:342:18:342:20 | ptr | provenance | | models | 1 | Sink: core::ptr::read; Argument[0]; pointer-access | | 2 | Sink: core::ptr::write; Argument[0]; pointer-access | @@ -58,7 +90,8 @@ models | 5 | Source: core::ptr::dangling_mut; ReturnValue; pointer-invalidate | | 6 | Source: core::ptr::drop_in_place; Argument[0]; pointer-invalidate | | 7 | Source: core::ptr::null; ReturnValue; pointer-invalidate | -| 8 | Source: libc::unix::free; Argument[0]; pointer-invalidate | +| 8 | Source: core::ptr::null_mut; ReturnValue; pointer-invalidate | +| 9 | Source: libc::unix::free; Argument[0]; pointer-invalidate | nodes | deallocation.rs:20:3:20:21 | ...::dealloc | semmle.label | ...::dealloc | | deallocation.rs:20:23:20:24 | [post] m1 | semmle.label | [post] m1 | @@ -81,7 +114,6 @@ nodes | deallocation.rs:115:13:115:18 | my_ptr | semmle.label | my_ptr | | deallocation.rs:123:6:123:7 | p1 | semmle.label | p1 | | deallocation.rs:123:23:123:40 | ...::dangling | semmle.label | ...::dangling | -| deallocation.rs:123:23:123:40 | ...::dangling | semmle.label | ...::dangling | | deallocation.rs:123:23:123:42 | ...::dangling(...) | semmle.label | ...::dangling(...) | | deallocation.rs:124:6:124:7 | p2 | semmle.label | p2 | | deallocation.rs:124:21:124:42 | ...::dangling_mut | semmle.label | ...::dangling_mut | @@ -92,12 +124,38 @@ nodes | deallocation.rs:130:14:130:15 | p1 | semmle.label | p1 | | deallocation.rs:131:14:131:15 | p2 | semmle.label | p2 | | deallocation.rs:132:14:132:15 | p3 | semmle.label | p3 | -| deallocation.rs:176:3:176:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | -| deallocation.rs:176:3:176:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | -| deallocation.rs:176:27:176:28 | [post] p1 | semmle.label | [post] p1 | -| deallocation.rs:180:15:180:16 | p1 | semmle.label | p1 | -| deallocation.rs:242:3:242:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | -| deallocation.rs:242:3:242:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | -| deallocation.rs:242:27:242:29 | [post] ptr | semmle.label | [post] ptr | -| deallocation.rs:248:18:248:20 | ptr | semmle.label | ptr | +| deallocation.rs:159:3:159:5 | ptr | semmle.label | ptr | +| deallocation.rs:159:9:159:26 | ...::null_mut | semmle.label | ...::null_mut | +| deallocation.rs:159:9:159:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | +| deallocation.rs:163:13:163:15 | ptr | semmle.label | ptr | +| deallocation.rs:166:13:166:15 | ptr | semmle.label | ptr | +| deallocation.rs:171:3:171:5 | ptr | semmle.label | ptr | +| deallocation.rs:171:9:171:26 | ...::null_mut | semmle.label | ...::null_mut | +| deallocation.rs:171:9:171:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | +| deallocation.rs:175:13:175:15 | ptr | semmle.label | ptr | +| deallocation.rs:178:13:178:15 | ptr | semmle.label | ptr | +| deallocation.rs:183:3:183:5 | ptr | semmle.label | ptr | +| deallocation.rs:183:9:183:26 | ...::null_mut | semmle.label | ...::null_mut | +| deallocation.rs:183:9:183:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | +| deallocation.rs:186:24:186:26 | ptr | semmle.label | ptr | +| deallocation.rs:190:24:190:26 | ptr | semmle.label | ptr | +| deallocation.rs:194:25:194:27 | ptr | semmle.label | ptr | +| deallocation.rs:199:3:199:5 | ptr | semmle.label | ptr | +| deallocation.rs:199:9:199:26 | ...::null_mut | semmle.label | ...::null_mut | +| deallocation.rs:199:9:199:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | +| deallocation.rs:202:24:202:26 | ptr | semmle.label | ptr | +| deallocation.rs:207:3:207:5 | ptr | semmle.label | ptr | +| deallocation.rs:207:9:207:26 | ...::null_mut | semmle.label | ...::null_mut | +| deallocation.rs:207:9:207:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | +| deallocation.rs:210:7:210:9 | ptr | semmle.label | ptr | +| deallocation.rs:219:3:219:11 | const_ptr | semmle.label | const_ptr | +| deallocation.rs:219:15:219:32 | ...::null_mut | semmle.label | ...::null_mut | +| deallocation.rs:219:15:219:34 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | +| deallocation.rs:226:13:226:21 | const_ptr | semmle.label | const_ptr | +| deallocation.rs:270:3:270:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | +| deallocation.rs:270:27:270:28 | [post] p1 | semmle.label | [post] p1 | +| deallocation.rs:274:15:274:16 | p1 | semmle.label | p1 | +| deallocation.rs:336:3:336:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | +| deallocation.rs:336:27:336:29 | [post] ptr | semmle.label | [post] ptr | +| deallocation.rs:342:18:342:20 | ptr | semmle.label | ptr | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 81f06adcde3..00000000000 --- a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,6 +0,0 @@ -multipleCallTargets -| deallocation.rs:260:11:260:29 | ...::from(...) | -| deallocation.rs:261:11:261:29 | ...::from(...) | -| lifetime.rs:610:13:610:31 | ...::from(...) | -| lifetime.rs:611:13:611:31 | ...::from(...) | -| lifetime.rs:628:13:628:31 | ...::from(...) | diff --git a/rust/ql/test/query-tests/security/CWE-825/deallocation.rs b/rust/ql/test/query-tests/security/CWE-825/deallocation.rs index 89ef0470e99..ce043d69fdd 100644 --- a/rust/ql/test/query-tests/security/CWE-825/deallocation.rs +++ b/rust/ql/test/query-tests/security/CWE-825/deallocation.rs @@ -137,6 +137,100 @@ pub fn test_ptr_invalid(mode: i32) { } } +struct MyObject { + value: i64 +} + +impl MyObject { + fn is_zero(&self) -> bool { + self.value == 0 + } +} + +pub unsafe fn test_ptr_invalid_conditions(mode: i32) { + let layout = std::alloc::Layout::new::(); + + // --- mutable pointer --- + + let mut ptr = std::alloc::alloc(layout) as *mut MyObject; + (*ptr).value = 0; // good + + if mode == 121 { // (causes a panic below) + ptr = std::ptr::null_mut(); // $ Source[rust/access-invalid-pointer] + } + + if ptr.is_null() { + let v = (*ptr).value; // $ Alert[rust/access-invalid-pointer] + println!(" cond1 v = {v}"); + } else { + let v = (*ptr).value; // $ SPURIOUS: Alert[rust/access-invalid-pointer] good - unreachable with null pointer + println!(" cond2 v = {v}"); + } + + if mode == 122 { // (causes a panic below) + ptr = std::ptr::null_mut(); // $ Source[rust/access-invalid-pointer] + } + + if !(ptr.is_null()) { + let v = (*ptr).value; // $ SPURIOUS: Alert[rust/access-invalid-pointer] good - unreachable with null pointer + println!(" cond3 v = {v}"); + } else { + let v = (*ptr).value; // $ Alert[rust/access-invalid-pointer] + println!(" cond4 v = {v}"); + } + + if mode == 123 { // (causes a panic below) + ptr = std::ptr::null_mut(); // $ Source[rust/access-invalid-pointer] + } + + if ptr.is_null() || (*ptr).value == 0 { // $ SPURIOUS: Alert[rust/access-invalid-pointer] good - deref is protected by short-circuiting + println!(" cond5"); + } + + if ptr.is_null() || (*ptr).is_zero() { // $ SPURIOUS: Alert[rust/access-invalid-pointer] good - deref is protected by short-circuiting + println!(" cond6"); + } + + if !ptr.is_null() || (*ptr).value == 0 { // $ Alert[rust/access-invalid-pointer] + println!(" cond7"); + } + + if mode == 124 { // (causes a panic below) + ptr = std::ptr::null_mut(); // $ Source[rust/access-invalid-pointer] + } + + if ptr.is_null() && (*ptr).is_zero() { // $ Alert[rust/access-invalid-pointer] + println!(" cond8"); + } + + if mode == 125 { // (causes a panic below) + ptr = std::ptr::null_mut(); // $ Source[rust/access-invalid-pointer] + } + + if (*ptr).is_zero() || ptr.is_null() { // $ Alert[rust/access-invalid-pointer] + println!(" cond9"); + } + + // --- immutable pointer --- + + let const_ptr; + + if mode == 126 { // (causes a panic below) + const_ptr = std::ptr::null_mut(); // $ Source[rust/access-invalid-pointer] + } else { + const_ptr = std::alloc::alloc(layout) as *mut MyObject; + (*const_ptr).value = 0; // good + } + + if const_ptr.is_null() { + let v = (*const_ptr).value; // $ Alert[rust/access-invalid-pointer] + println!(" cond10 v = {v}"); + } else { + let v = (*const_ptr).value; // $ good - unreachable with null pointer + println!(" cond11 v = {v}"); + } +} + // --- drop --- struct MyBuffer { @@ -309,3 +403,29 @@ pub fn test_vec_reserve() { println!(" v4 = {}", v4); // corrupt in practice } } + +// --- pointer to reference --- + +pub fn test_pointer_converted_to_reference() { + let layout = std::alloc::Layout::new::(); + let m3; + + // allocate + unsafe { + let m1 = std::alloc::alloc(layout); // *mut u8 + let m2 = m1 as *mut u128; // *mut u128 + m3 = &mut *m2; // &u128 + } + + *m3 = 1; // GOOD + println!(" v1 = {}", *m3); // GOOD + + // free + unsafe { + std::alloc::dealloc((&raw mut *m3) as *mut u8, layout); // $ MISSING: Source[rust/access-invalid-pointer]=dealloc + } + // (m1, m2, m3 are now dangling) + + // (this is corrupt in practice) + println!(" v2 = {} (!)", *m3); // $ MISSING: Alert[rust/access-invalid-pointer]=dealloc +} diff --git a/rust/ql/test/query-tests/security/CWE-825/lifetime.rs b/rust/ql/test/query-tests/security/CWE-825/lifetime.rs index 83317aa13d1..05a099e903f 100644 --- a/rust/ql/test/query-tests/security/CWE-825/lifetime.rs +++ b/rust/ql/test/query-tests/security/CWE-825/lifetime.rs @@ -827,3 +827,33 @@ pub fn test_lifetimes_example_good() { println!(" val = {dereferenced_ptr}"); } + +// --- generic calls --- + +trait Processor { + fn process(ptr: *const i64) -> i64; +} + +struct MyProcessor { +} + +impl Processor for MyProcessor { + fn process(ptr: *const i64) -> i64 { + unsafe { + return *ptr; // good + } + } +} + +fn generic_caller() -> i64 +{ + let local_value: i64 = 10; + let ptr = &local_value as *const i64; + + return T::process(ptr); +} + +pub fn test_generic() { + let result = generic_caller::(); + println!(" result = {result}"); +} diff --git a/rust/ql/test/query-tests/security/CWE-825/main.rs b/rust/ql/test/query-tests/security/CWE-825/main.rs index 8d1f2a42146..d14c5d463ec 100644 --- a/rust/ql/test/query-tests/security/CWE-825/main.rs +++ b/rust/ql/test/query-tests/security/CWE-825/main.rs @@ -126,6 +126,11 @@ fn main() { println!("test_ptr_invalid:"); test_ptr_invalid(mode); + println!("test_ptr_invalid_conditions:"); + unsafe { + test_ptr_invalid_conditions(mode); + } + println!("test_drop:"); test_drop(); @@ -138,6 +143,9 @@ fn main() { println!("test_vec_reserve:"); test_vec_reserve(); + println!("test_pointer_converted_to_reference:"); + test_pointer_converted_to_reference(); + // --- println!("test_local_dangling:"); @@ -204,4 +212,7 @@ fn main() { println!("test_lifetimes_example_good:"); test_lifetimes_example_good(); + + println!("test_generic:"); + test_generic(); } diff --git a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 821f75cee26..00000000000 --- a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -multipleCallTargets -| request_forgery_tests.rs:30:36:30:52 | user_url.as_str() | diff --git a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/unusedentities/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 4d2cdee53ce..00000000000 --- a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,6 +0,0 @@ -multipleCallTargets -| main.rs:14:13:14:29 | ...::from(...) | -| main.rs:15:13:15:29 | ...::from(...) | -| unreachable.rs:165:20:165:42 | ...::from(...) | -| unreachable.rs:171:9:171:15 | ...::from(...) | -| unreachable.rs:177:17:177:25 | ...::from(...) | diff --git a/rust/ql/test/utils-tests/modelgenerator/option.rs b/rust/ql/test/utils-tests/modelgenerator/option.rs index 9af02979135..fd5cd649c2c 100644 --- a/rust/ql/test/utils-tests/modelgenerator/option.rs +++ b/rust/ql/test/utils-tests/modelgenerator/option.rs @@ -325,7 +325,8 @@ impl MyOption { } // summary=::get_or_insert_with;Argument[self].Reference.Field[test::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated - // MISSING: Mutating `self` parameter. + // summary=::get_or_insert_with;Argument[0].ReturnValue;Argument[self].Reference.Field[test::option::MyOption::MySome(0)];value;dfc-generated + // summary=::get_or_insert_with;Argument[0].ReturnValue;ReturnValue.Reference;value;dfc-generated pub fn get_or_insert_with(&mut self, f: F) -> &mut T where F: FnOnce() -> T, diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index 5861ede759b..8896e5809f2 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -6,6 +6,7 @@ class LabelableExpr(Expr): """ The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). """ + label: optional[Label] | child @@ -13,15 +14,22 @@ class LoopingExpr(LabelableExpr): """ The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`). """ + loop_body: optional["BlockExpr"] | child -@annotate(Adt, replace_bases={AstNode: Item}) +@annotate(TypeItem, replace_bases={AstNode: Item}) class _: """ - An ADT (Abstract Data Type) definition, such as `Struct`, `Enum`, or `Union`. + An item that defines a type. Either a `Struct`, `Enum`, or `Union`. """ + derive_macro_expansions: list[MacroItems] | child | rust.detach + attrs: list["Attr"] | child + generic_param_list: optional["GenericParamList"] | child + name: optional["Name"] | child + visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child @annotate(Module) @@ -95,8 +103,8 @@ class _: foo::bar; ``` """ - segment: _ | ql.db_table_name("path_segments_") | doc( - "last segment of this path") + + segment: _ | ql.db_table_name("path_segments_") | doc("last segment of this path") @annotate(GenericArgList) @@ -132,7 +140,9 @@ class PathExprBase(Expr): """ -@annotate(PathExpr, replace_bases={Expr: PathExprBase}, add_bases=(PathAstNode,), cfg=True) +@annotate( + PathExpr, replace_bases={Expr: PathExprBase}, add_bases=(PathAstNode,), cfg=True +) @qltest.test_with(Path) class _: """ @@ -144,6 +154,7 @@ class _: let z = ::foo; ``` """ + path: drop @@ -195,6 +206,7 @@ class _: } ``` """ + label: drop @@ -224,45 +236,40 @@ class _: }; ``` """ + label: drop loop_body: drop -class CallExprBase(Expr): - """ - A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details. - """ - arg_list: optional["ArgList"] | child - attrs: list["Attr"] | child - args: list["Expr"] | synth - - -@annotate(CallExpr, replace_bases={Expr: CallExprBase}, cfg=True) +@annotate(CallExpr, cfg=True) class _: """ - A function call expression. For example: + NOTE: Consider using `Call` instead, as that excludes call expressions that are + instantiations of tuple structs and tuple variants. + + A call expression. For example: ```rust foo(42); foo::(42); foo[0](42); - foo(1) = 4; + Option::Some(42); // tuple variant instantiation ``` """ - arg_list: drop - attrs: drop -@annotate(MethodCallExpr, replace_bases={Expr: CallExprBase}, cfg=True) +@annotate(MethodCallExpr, cfg=True) class _: """ + NOTE: Consider using `MethodCall` instead, as that also includes calls to methods using + call syntax (such as `Foo::method(x)`), operation syntax (such as `x + y`), and + indexing syntax (such as `x[y]`). + A method call expression. For example: ```rust x.foo(42); x.foo::(42); ``` """ - arg_list: drop - attrs: drop @annotate(MatchArm) @@ -303,8 +310,10 @@ class _: } ``` """ + scrutinee: _ | doc( - "scrutinee (the expression being matched) of this match expression") + "scrutinee (the expression being matched) of this match expression" + ) @annotate(ContinueExpr, cfg=True) @@ -354,7 +363,7 @@ class _: 0; }; ``` - """ + """ @annotate(ReturnExpr, cfg=True) @@ -438,6 +447,7 @@ class _: Foo { a: m, .. } = second; ``` """ + path: drop @@ -585,6 +595,7 @@ class ArrayExpr(Expr): [1; 10]; ``` """ + exprs: list[Expr] | child attrs: list[Attr] | child @@ -597,6 +608,7 @@ class ArrayListExpr(ArrayExpr): [1, 2, 3]; ``` """ + __cfg__ = True @@ -608,6 +620,7 @@ class ArrayRepeatExpr(ArrayExpr): [1; 10]; ``` """ + __cfg__ = True repeat_operand: Expr | child @@ -747,6 +760,7 @@ class _: } ``` """ + path: drop @@ -790,6 +804,7 @@ class _: } ``` """ + path: drop @@ -837,6 +852,7 @@ class _: }; ``` """ + path: drop @@ -999,10 +1015,18 @@ class _: const X: i32 = 42; ``` """ - has_implementation: predicate | doc("this constant has an implementation") | desc(""" + + has_implementation: ( + predicate + | doc("this constant has an implementation") + | desc( + """ This is the same as `hasBody` for source code, but for library code (for which we always skip the body), this will hold when the body was present in the original code. - """) | rust.detach + """ + ) + | rust.detach + ) @annotate(ConstArg) @@ -1044,7 +1068,7 @@ class _: """ -@annotate(Enum, replace_bases={Item: None}) # still an Item via Adt +@annotate(Enum, replace_bases={Item: None}) class _: """ An enum declaration. @@ -1055,6 +1079,12 @@ class _: ``` """ + attrs: drop + generic_param_list: drop + name: drop + visibility: drop + where_clause: drop + @annotate(ExternBlock) class _: @@ -1152,6 +1182,7 @@ class _: } ``` """ + label: drop loop_body: drop @@ -1168,6 +1199,7 @@ class _: ``` """ + @annotate(FormatArgsArg, cfg=True) @qltest.test_with(FormatArgsExpr) class _: @@ -1191,6 +1223,7 @@ class _: format_args!("{x}, {y}"); ``` """ + formats: list["Format"] | child | synth @@ -1285,6 +1318,7 @@ class _: enum E {} ``` """ + attribute_macro_expansion: optional[MacroItems] | child | rust.detach @@ -1367,6 +1401,7 @@ class _: println!("Hello, world!"); ``` """ + macro_call_expansion: optional[AstNode] | child | rust.detach @@ -1420,6 +1455,7 @@ class MacroBlockExpr(Expr): my_macro!(); // this macro expands to a sequence of statements (and an expression) ``` """ + __cfg__ = True statements: list[Stmt] | child @@ -1536,6 +1572,7 @@ class ParamBase(AstNode): """ A normal parameter, `Param`, or a self parameter `SelfParam`. """ + attrs: list["Attr"] | child type_repr: optional["TypeRepr"] | child @@ -1555,6 +1592,7 @@ class _: } ``` """ + attrs: drop type_repr: drop @@ -1609,6 +1647,7 @@ class _: - `widgets(..)` - `` """ + type_repr: optional["TypeRepr"] | child | rust.detach trait_type_repr: optional["PathTypeRepr"] | child | rust.detach @@ -1783,6 +1822,7 @@ class _: } ``` """ + attrs: drop type_repr: drop @@ -1841,16 +1881,30 @@ class _: // ^^^^^^^^^ ``` """ - statements: _ | doc("statements of this statement list") | desc(""" + + statements: ( + _ + | doc("statements of this statement list") + | desc( + """ The statements of a `StmtList` do not include any tail expression, which can be accessed with predicates such as `getTailExpr`. - """) - tail_expr: _ | doc("tail expression of this statement list") | desc(""" + """ + ) + ) + tail_expr: ( + _ + | doc("tail expression of this statement list") + | desc( + """ The tail expression is the expression at the end of a block, that determines the block's value. - """) + """ + ) + ) -@annotate(Struct, replace_bases={Item: None}) # still an Item via Adt + +@annotate(Struct, replace_bases={Item: None}) class _: """ A Struct. For example: @@ -1861,7 +1915,13 @@ class _: } ``` """ + field_list: _ | ql.db_table_name("struct_field_lists_") + attrs: drop + generic_param_list: drop + name: drop + visibility: drop + where_clause: drop @annotate(TokenTree) @@ -1926,7 +1986,7 @@ class _: @annotate(TupleField) class _: """ - A field in a tuple struct or tuple enum variant. + A field in a tuple struct or tuple variant. For example: ```rust @@ -1939,7 +1999,7 @@ class _: @annotate(TupleFieldList) class _: """ - A list of fields in a tuple struct or tuple enum variant. + A list of fields in a tuple struct or tuple variant. For example: ```rust @@ -2031,7 +2091,7 @@ class _: """ -@annotate(Union, replace_bases={Item: None}) # still an Item via Adt +@annotate(Union, replace_bases={Item: None}) class _: """ A union declaration. @@ -2042,6 +2102,12 @@ class _: ``` """ + attrs: drop + generic_param_list: drop + name: drop + visibility: drop + where_clause: drop + @annotate(Use) class _: @@ -2158,6 +2224,7 @@ class _: } ``` """ + label: drop loop_body: drop @@ -2166,10 +2233,17 @@ class _: class _: param_list: drop attrs: drop - has_implementation: predicate | doc("this function has an implementation") | desc(""" + has_implementation: ( + predicate + | doc("this function has an implementation") + | desc( + """ This is the same as `hasBody` for source code, but for library code (for which we always skip the body), this will hold when the body was present in the original code. - """) | rust.detach + """ + ) + | rust.detach + ) @annotate(ClosureExpr, add_bases=[Callable]) @@ -2197,35 +2271,61 @@ class Format(Locatable): println!("Value {value:#width$.precision$}"); ``` """ + parent: FormatArgsExpr index: int - argument_ref: optional["FormatArgument"] | child | desc(""" + argument_ref: ( + optional["FormatArgument"] + | child + | desc( + """ For example `name` and `0` in: ```rust let name = "Alice"; println!("{name} in wonderland"); println!("{0} in wonderland", name); ``` - """) - width_argument: optional["FormatArgument"] | child | desc(""" + """ + ) + ) + width_argument: ( + optional["FormatArgument"] + | child + | desc( + """ For example `width` and `1` in: ```rust let width = 6; println!("{:width$}", PI); println!("{:1$}", PI, width); ``` - """) - precision_argument: optional["FormatArgument"] | child | desc(""" + """ + ) + ) + precision_argument: ( + optional["FormatArgument"] + | child + | desc( + """ For example `prec` and `1` in: ```rust let prec = 6; println!("{:.prec$}", PI); println!("{:.1$}", PI, prec); ``` - """) + """ + ) + ) -@synth.on_arguments(parent=FormatArgsExpr, index=int, kind=int, name=string, positional=boolean, offset=int) +@synth.on_arguments( + parent=FormatArgsExpr, + index=int, + kind=int, + name=string, + positional=boolean, + offset=int, +) @qltest.test_with(FormatArgsExpr) class FormatArgument(Locatable): """ @@ -2238,6 +2338,7 @@ class FormatArgument(Locatable): println!("Value {0:#1$.2$}", value, width, precision); ``` """ + parent: Format variable: optional[FormatTemplateVariableAccess] | child diff --git a/rust/schema/ast.py b/rust/schema/ast.py index d338c7a1636..5d8a7393ea6 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -2,7 +2,7 @@ from .prelude import * -class Adt(AstNode, ): +class TypeItem(AstNode, ): pass class AsmOperand(AstNode, ): @@ -206,7 +206,7 @@ class ContinueExpr(Expr, ): class DynTraitTypeRepr(TypeRepr, ): type_bound_list: optional["TypeBoundList"] | child -class Enum(Adt, Item, ): +class Enum(TypeItem, Item, ): attrs: list["Attr"] | child generic_param_list: optional["GenericParamList"] | child name: optional["Name"] | child @@ -623,7 +623,7 @@ class StmtList(AstNode, ): statements: list["Stmt"] | child tail_expr: optional["Expr"] | child -class Struct(Adt, Item, ): +class Struct(TypeItem, Item, ): attrs: list["Attr"] | child field_list: optional["FieldList"] | child generic_param_list: optional["GenericParamList"] | child @@ -712,7 +712,7 @@ class TypeParam(GenericParam, ): class UnderscoreExpr(Expr, ): attrs: list["Attr"] | child -class Union(Adt, Item, ): +class Union(TypeItem, Item, ): attrs: list["Attr"] | child generic_param_list: optional["GenericParamList"] | child name: optional["Name"] | child diff --git a/rust/tools/builtins/mentions.rs b/rust/tools/builtins/mentions.rs new file mode 100644 index 00000000000..a3731164893 --- /dev/null +++ b/rust/tools/builtins/mentions.rs @@ -0,0 +1,6 @@ +// Type mentions required by type inference + +use std::future::Future; +fn mention_dyn_future(f: &dyn Future) {} + +fn mention_dyn_fn_once(f: &dyn FnOnce() -> F) {} diff --git a/rust/tools/builtins/types.rs b/rust/tools/builtins/types.rs index 91989b5262b..d3fd06b2168 100644 --- a/rust/tools/builtins/types.rs +++ b/rust/tools/builtins/types.rs @@ -23,3 +23,50 @@ pub struct isize; // floating-point types pub struct f32; pub struct f64; + +struct Slice; +struct Array; +struct Ref; +struct RefMut; +struct PtrConst; +struct PtrMut; + +// tuples +struct Tuple0; +struct Tuple1(T0); +struct Tuple2(T0, T1); +struct Tuple3(T0, T1, T2); +struct Tuple4(T0, T1, T2, T3); +struct Tuple5(T0, T1, T2, T3, T4); +struct Tuple6(T0, T1, T2, T3, T4, T5); +struct Tuple7(T0, T1, T2, T3, T4, T5, T6); +struct Tuple8(T0, T1, T2, T3, T4, T5, T6, T7); +struct Tuple9(T0, T1, T2, T3, T4, T5, T6, T7, T8); +struct Tuple10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9); +struct Tuple11( + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, +); +struct Tuple12( + T0, + T1, + T2, + T3, + T4, + T5, + T6, + T7, + T8, + T9, + T10, + T11, +); diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index 4d0898b90e4..e2c7978d2b6 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,19 @@ +## 0.0.12 + +No user-facing changes. + +## 0.0.11 + +No user-facing changes. + +## 0.0.10 + +No user-facing changes. + +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.10.md b/shared/concepts/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..22391080fd4 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.10.md @@ -0,0 +1,3 @@ +## 0.0.10 + +No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.11.md b/shared/concepts/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..19a2a55bd68 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.11.md @@ -0,0 +1,3 @@ +## 0.0.11 + +No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.12.md b/shared/concepts/change-notes/released/0.0.12.md new file mode 100644 index 00000000000..0e206033bc4 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.12.md @@ -0,0 +1,3 @@ +## 0.0.12 + +No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.9.md b/shared/concepts/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index 58fdc6b45de..997fb8da83c 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.12 diff --git a/shared/concepts/codeql/concepts/internal/CryptoAlgorithmNames.qll b/shared/concepts/codeql/concepts/internal/CryptoAlgorithmNames.qll index efcd870c724..86392890caf 100644 --- a/shared/concepts/codeql/concepts/internal/CryptoAlgorithmNames.qll +++ b/shared/concepts/codeql/concepts/internal/CryptoAlgorithmNames.qll @@ -23,7 +23,8 @@ predicate isStrongHashingAlgorithm(string name) { "BLAKE3", // "DSA", "ED25519", "ES256", "ECDSA256", "ES384", "ECDSA384", "ES512", "ECDSA512", "SHA2", - "SHA224", "SHA256", "SHA384", "SHA512", "SHA3", "SHA3224", "SHA3256", "SHA3384", "SHA3512", + "SHA224", "SHA256", "SHA384", "SHA512", "SHA512224", "SHA512256", "SHA3", "SHA3224", + "SHA3256", "SHA3384", "SHA3512", // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#cryptography.hazmat.primitives.hashes.SHAKE128 "SHAKE128", "SHAKE256", // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#sm3 diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index f76c1f2ae45..8c44a51ff93 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.9-dev +version: 0.0.13-dev groups: shared library: true dependencies: diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index c5b9b9d696a..523f7667b24 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,19 @@ +## 2.0.22 + +No user-facing changes. + +## 2.0.21 + +No user-facing changes. + +## 2.0.20 + +No user-facing changes. + +## 2.0.19 + +No user-facing changes. + ## 2.0.18 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.19.md b/shared/controlflow/change-notes/released/2.0.19.md new file mode 100644 index 00000000000..b37b6798b12 --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.19.md @@ -0,0 +1,3 @@ +## 2.0.19 + +No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.20.md b/shared/controlflow/change-notes/released/2.0.20.md new file mode 100644 index 00000000000..6756bd5f6c1 --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.20.md @@ -0,0 +1,3 @@ +## 2.0.20 + +No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.21.md b/shared/controlflow/change-notes/released/2.0.21.md new file mode 100644 index 00000000000..bdc5029b70b --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.21.md @@ -0,0 +1,3 @@ +## 2.0.21 + +No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.22.md b/shared/controlflow/change-notes/released/2.0.22.md new file mode 100644 index 00000000000..8a2611adad2 --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.22.md @@ -0,0 +1,3 @@ +## 2.0.22 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 16342205c73..980bdfe195b 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.18 +lastReleaseVersion: 2.0.22 diff --git a/shared/controlflow/codeql/controlflow/Guards.qll b/shared/controlflow/codeql/controlflow/Guards.qll index 17aee2a7cae..b313afcdb6b 100644 --- a/shared/controlflow/codeql/controlflow/Guards.qll +++ b/shared/controlflow/codeql/controlflow/Guards.qll @@ -926,6 +926,9 @@ module Make< guardControls(g0, v0, tgtGuard, tgtVal) and additionalImpliesStep(g0, v0, guard, v) ) + or + baseGuardValue(tgtGuard, tgtVal) and + disjunctiveGuardControls(guard, v, tgtGuard, tgtVal) } /** @@ -1003,11 +1006,111 @@ module Make< ) } + private import DisjunctiveGuard + + private module DisjunctiveGuard { + /** + * Holds if `disjunction` evaluating to `val` means that either + * `disjunct1` or `disjunct2` is `val`. + */ + private predicate disjunction( + Guard disjunction, GuardValue val, Guard disjunct1, Guard disjunct2 + ) { + 2 = + strictcount(Guard op | + disjunction.(OrExpr).getAnOperand() = op or disjunction.(AndExpr).getAnOperand() = op + ) and + disjunct1 != disjunct2 and + ( + exists(OrExpr d | d = disjunction | + d.getAnOperand() = disjunct1 and + d.getAnOperand() = disjunct2 and + val.asBooleanValue() = true + ) + or + exists(AndExpr d | d = disjunction | + d.getAnOperand() = disjunct1 and + d.getAnOperand() = disjunct2 and + val.asBooleanValue() = false + ) + ) + } + + private predicate disjunct(Guard guard, GuardValue val) { disjunction(_, val, guard, _) } + + module DisjunctImplies = ImpliesTC; + + /** + * Holds if one of the disjuncts in `disjunction` evaluating to `dv` implies that `def` + * evaluates to `v`. The other disjunct is `otherDisjunct`. + */ + pragma[nomagic] + private predicate ssaControlsDisjunct( + SsaDefinition def, GuardValue v, Guard disjunction, Guard otherDisjunct, GuardValue dv + ) { + exists(Guard disjunct | + disjunction(disjunction, dv, disjunct, otherDisjunct) and + DisjunctImplies::ssaControls(def, v, disjunct, dv) + ) + } + + /** + * Holds if the disjunction of `def` evaluating to `v` and + * `otherDisjunct` evaluating to `dv` controls `bb`. + */ + pragma[nomagic] + private predicate ssaDisjunctionControls( + SsaDefinition def, GuardValue v, Guard otherDisjunct, GuardValue dv, BasicBlock bb + ) { + exists(Guard disjunction | + ssaControlsDisjunct(def, v, disjunction, otherDisjunct, dv) and + disjunction.valueControls(bb, dv) + ) + } + + /** + * Holds if `tgtGuard` evaluating to `tgtVal` implies that `def` + * evaluates to `v`. The basic block of `tgtGuard` is `bb`. + */ + pragma[nomagic] + private predicate ssaControlsGuard( + SsaDefinition def, GuardValue v, Guard tgtGuard, GuardValue tgtVal, BasicBlock bb + ) { + ( + BranchImplies::ssaControls(def, v, tgtGuard, tgtVal) or + WrapperGuard::ReturnImplies::ssaControls(def, v, tgtGuard, tgtVal) + ) and + tgtGuard.getBasicBlock() = bb + } + + /** + * Holds if `tgtGuard` evaluating to `tgtVal` implies that `guard` + * evaluates to `v`. + */ + pragma[nomagic] + predicate disjunctiveGuardControls( + Guard guard, GuardValue v, Guard tgtGuard, GuardValue tgtVal + ) { + exists(SsaDefinition def, GuardValue v1, GuardValue v2, BasicBlock bb | + // If `def==v1 || guard==v` controls `bb`, + ssaDisjunctionControls(def, v1, guard, v, bb) and + // and `tgtGuard==tgtVal` in `bb` implies `def==v2`, + ssaControlsGuard(def, v2, tgtGuard, tgtVal, bb) and + // and `v1` and `v2` are disjoint, + disjointValues(v1, v2) + // then assuming `tgtGuard==tgtVal` it follows that `def` cannot be `v1` + // and therefore we must have `guard==v`. + ) + } + } + /** * Provides an implementation of guard implication logic for guard * wrappers. */ private module WrapperGuard { + private import codeql.util.DenseRank + final private class FinalExpr = Expr; class ReturnExpr extends FinalExpr { @@ -1019,21 +1122,59 @@ module Make< BasicBlock getBasicBlock() { result = super.getBasicBlock() } } - private predicate relevantCallValue(NonOverridableMethodCall call, GuardValue val) { - BranchImplies::guardControls(call, val, _, _) or - ReturnImplies::guardControls(call, val, _, _) + private module DenseRankInput implements DenseRankInputSig1 { + class C = NonOverridableMethod; + + class Ranked = ReturnExpr; + + int getRank(NonOverridableMethod m, ReturnExpr ret) { + m.getAReturnExpr() = ret and + result = ret.getLocation().getStartLine() + } } - predicate relevantReturnValue(NonOverridableMethod m, GuardValue val) { + private module ReturnExprRank = DenseRank1; + + private predicate rankedReturnExpr = ReturnExprRank::denseRank/2; + + private int maxRank(NonOverridableMethod m) { + result = max(int rnk | exists(rankedReturnExpr(m, rnk))) + } + + private predicate relevantCallValue(NonOverridableMethodCall call, GuardValue val) { + BranchImplies::guardControls(call, val, _, _) or + ReturnImplies::guardControls(call, val, _, _) or + DisjunctImplies::guardControls(call, val, _, _) + } + + /** + * Holds if a call to `m` having a return value of `retval` is reachable + * by a chain of implications. + */ + predicate relevantReturnValue(NonOverridableMethod m, GuardValue retval) { exists(NonOverridableMethodCall call | - relevantCallValue(call, val) and + relevantCallValue(call, retval) and call.getMethod() = m and - not val instanceof TException + not retval instanceof TException + ) + } + + /** + * Holds if a call to `m` having a return value of `retval` is reachable + * by a chain of implications, and `ret` is a return expression in `m` + * that could possibly have the value `retval`. + */ + predicate relevantReturnExprValue(NonOverridableMethod m, ReturnExpr ret, GuardValue retval) { + relevantReturnValue(m, retval) and + ret = m.getAReturnExpr() and + not exists(GuardValue notRetval | + exprHasValue(ret, notRetval) and + disjointValues(notRetval, retval) ) } private predicate returnGuard(Guard guard, GuardValue val) { - relevantReturnValue(guard.(ReturnExpr).getMethod(), val) + relevantReturnExprValue(_, guard, val) } module ReturnImplies = ImpliesTC; @@ -1043,28 +1184,58 @@ module Make< guard.directlyValueControls(ret.getBasicBlock(), val) } + private predicate parameterControlsReturnExpr( + SsaParameterInit param, GuardValue val, ReturnExpr ret + ) { + exists(Guard g0, GuardValue v0 | + directlyControlsReturn(g0, v0, ret) and + BranchImplies::ssaControls(param, val, g0, v0) + ) + } + /** * Holds if `ret` is a return expression in a non-overridable method that * on a return value of `retval` allows the conclusion that the `ppos`th * parameter has the value `val`. */ private predicate validReturnInCustomGuard( - ReturnExpr ret, ParameterPosition ppos, GuardValue retval, GuardValue val + ReturnExpr ret, int rnk, NonOverridableMethod m, ParameterPosition ppos, GuardValue retval, + GuardValue val ) { - exists(NonOverridableMethod m, SsaParameterInit param | - m.getAReturnExpr() = ret and + exists(SsaParameterInit param | + ret = rankedReturnExpr(m, rnk) and param.getParameter() = m.getParameter(ppos) | - exists(Guard g0, GuardValue v0 | - directlyControlsReturn(g0, v0, ret) and - BranchImplies::ssaControls(param, val, g0, v0) and - relevantReturnValue(m, retval) - ) + parameterControlsReturnExpr(param, val, ret) and + relevantReturnExprValue(m, ret, retval) or ReturnImplies::ssaControls(param, val, ret, retval) ) } + private predicate validReturnInCustomGuardToRank( + int rnk, NonOverridableMethod m, ParameterPosition ppos, GuardValue retval, GuardValue val + ) { + // The forall-range has been pushed all the way into + // `relevantReturnExprValue` and `validReturnInCustomGuard`. This means + // that this base case ensures that at least one return expression + // non-vacuously satisfies that it's a valid implication from return + // value to parameter value. + validReturnInCustomGuard(_, _, m, ppos, retval, val) and rnk = 0 + or + validReturnInCustomGuardToRank(rnk - 1, m, ppos, retval, val) and + rnk <= maxRank(m) and + forall(ReturnExpr ret | + ret = rankedReturnExpr(m, rnk) and + not exists(GuardValue notRetval | + exprHasValue(ret, notRetval) and + disjointValues(notRetval, retval) + ) + | + validReturnInCustomGuard(ret, rnk, m, ppos, retval, val) + ) + } + private predicate guardDirectlyControlsExit(Guard guard, GuardValue val) { exists(BasicBlock bb | guard.directlyValueControls(bb, val) and @@ -1080,15 +1251,7 @@ module Make< private NonOverridableMethod wrapperGuard( ParameterPosition ppos, GuardValue retval, GuardValue val ) { - forex(ReturnExpr ret | - result.getAReturnExpr() = ret and - not exists(GuardValue notRetval | - exprHasValue(ret, notRetval) and - disjointValues(notRetval, retval) - ) - | - validReturnInCustomGuard(ret, ppos, retval, val) - ) + validReturnInCustomGuardToRank(maxRank(result), result, ppos, retval, val) or exists(SsaParameterInit param, Guard g0, GuardValue v0 | param.getParameter() = result.getParameter(ppos) and @@ -1117,39 +1280,38 @@ module Make< } } - signature predicate guardChecksSig(Guard g, Expr e, boolean branch); + signature predicate guardChecksSig(Guard g, Expr e, GuardValue gv); bindingset[this] - signature class StateSig; + signature class ParamSig; - private module WithState { - signature predicate guardChecksSig(Guard g, Expr e, boolean branch, State state); + private module WithParam { + signature predicate guardChecksSig(Guard g, Expr e, GuardValue gv, P par); } /** * Extends a `BarrierGuard` input predicate with wrapped invocations. */ module ValidationWrapper { - private predicate guardChecksWithState(Guard g, Expr e, boolean branch, Unit state) { - guardChecks0(g, e, branch) and exists(state) + private predicate guardChecksWithParam(Guard g, Expr e, GuardValue gv, Unit par) { + guardChecks0(g, e, gv) and exists(par) } - private module StatefulWrapper = ValidationWrapperWithState; + private module ParameterizedWrapper = + ParameterizedValidationWrapper; /** * Holds if the guard `g` validates the SSA definition `def` upon evaluating to `val`. */ predicate guardChecksDef(Guard g, SsaDefinition def, GuardValue val) { - StatefulWrapper::guardChecksDef(g, def, val, _) + ParameterizedWrapper::guardChecksDef(g, def, val, _) } } /** * Extends a `BarrierGuard` input predicate with wrapped invocations. */ - module ValidationWrapperWithState< - StateSig State, WithState::guardChecksSig/4 guardChecks0> - { + module ParameterizedValidationWrapper::guardChecksSig/4 guardChecks0> { private import WrapperGuard /** @@ -1158,15 +1320,15 @@ module Make< * parameter has been validated by the given guard. */ private predicate validReturnInValidationWrapper( - ReturnExpr ret, ParameterPosition ppos, GuardValue retval, State state + ReturnExpr ret, ParameterPosition ppos, GuardValue retval, P par ) { exists(NonOverridableMethod m, SsaParameterInit param, Guard guard, GuardValue val | m.getAReturnExpr() = ret and param.getParameter() = m.getParameter(ppos) and - guardChecksDef(guard, param, val, state) + guardChecksDef(guard, param, val, par) | guard.valueControls(ret.getBasicBlock(), val) and - relevantReturnValue(m, retval) + relevantReturnExprValue(m, ret, retval) or ReturnImplies::guardControls(guard, val, ret, retval) ) @@ -1178,7 +1340,7 @@ module Make< * that the argument has been validated by the given guard. */ private NonOverridableMethod validationWrapper( - ParameterPosition ppos, GuardValue retval, State state + ParameterPosition ppos, GuardValue retval, P par ) { forex(ReturnExpr ret | result.getAReturnExpr() = ret and @@ -1187,12 +1349,12 @@ module Make< disjointValues(notRetval, retval) ) | - validReturnInValidationWrapper(ret, ppos, retval, state) + validReturnInValidationWrapper(ret, ppos, retval, par) ) or exists(SsaParameterInit param, BasicBlock bb, Guard guard, GuardValue val | param.getParameter() = result.getParameter(ppos) and - guardChecksDef(guard, param, val, state) and + guardChecksDef(guard, param, val, par) and guard.valueControls(bb, val) and normalExitBlock(bb) and retval = TException(false) @@ -1202,12 +1364,12 @@ module Make< /** * Holds if the guard `g` validates the expression `e` upon evaluating to `val`. */ - private predicate guardChecks(Guard g, Expr e, GuardValue val, State state) { - guardChecks0(g, e, val.asBooleanValue(), state) + private predicate guardChecks(Guard g, Expr e, GuardValue val, P par) { + guardChecks0(g, e, val, par) or exists(NonOverridableMethodCall call, ParameterPosition ppos, ArgumentPosition apos | g = call and - call.getMethod() = validationWrapper(ppos, val, state) and + call.getMethod() = validationWrapper(ppos, val, par) and call.getArgument(apos) = e and parameterMatch(pragma[only_bind_out](ppos), pragma[only_bind_out](apos)) ) @@ -1216,9 +1378,9 @@ module Make< /** * Holds if the guard `g` validates the SSA definition `def` upon evaluating to `val`. */ - predicate guardChecksDef(Guard g, SsaDefinition def, GuardValue val, State state) { + predicate guardChecksDef(Guard g, SsaDefinition def, GuardValue val, P par) { exists(Expr e | - guardChecks(g, e, val, state) and + guardChecks(g, e, val, par) and guardReadsSsaVar(e, def) ) } diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index fdf7de8e6a7..37ae8d21aaf 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.19-dev +version: 2.0.23-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index f963117ea88..8ade6c20ef4 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,19 @@ +## 2.0.22 + +No user-facing changes. + +## 2.0.21 + +No user-facing changes. + +## 2.0.20 + +No user-facing changes. + +## 2.0.19 + +No user-facing changes. + ## 2.0.18 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.0.19.md b/shared/dataflow/change-notes/released/2.0.19.md new file mode 100644 index 00000000000..b37b6798b12 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.0.19.md @@ -0,0 +1,3 @@ +## 2.0.19 + +No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.0.20.md b/shared/dataflow/change-notes/released/2.0.20.md new file mode 100644 index 00000000000..6756bd5f6c1 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.0.20.md @@ -0,0 +1,3 @@ +## 2.0.20 + +No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.0.21.md b/shared/dataflow/change-notes/released/2.0.21.md new file mode 100644 index 00000000000..bdc5029b70b --- /dev/null +++ b/shared/dataflow/change-notes/released/2.0.21.md @@ -0,0 +1,3 @@ +## 2.0.21 + +No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.0.22.md b/shared/dataflow/change-notes/released/2.0.22.md new file mode 100644 index 00000000000..8a2611adad2 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.0.22.md @@ -0,0 +1,3 @@ +## 2.0.22 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 16342205c73..980bdfe195b 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.18 +lastReleaseVersion: 2.0.22 diff --git a/shared/dataflow/codeql/dataflow/internal/ContentDataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/ContentDataFlowImpl.qll index baf473efff1..0c84d33244c 100644 --- a/shared/dataflow/codeql/dataflow/internal/ContentDataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/ContentDataFlowImpl.qll @@ -75,6 +75,9 @@ module MakeImplContentDataFlow Lang> { /** Gets a limit on the number of reads out of sources and number of stores into sinks. */ default int accessPathLimit() { result = Lang::accessPathLimit() } + /** Gets the access path limit used in the internal invocation of the standard data flow library. */ + default int accessPathLimitInternal() { result = Lang::accessPathLimit() } + /** Holds if `c` is relevant for reads out of sources or stores into sinks. */ default predicate isRelevantContent(ContentSet c) { any() } } @@ -110,7 +113,7 @@ module MakeImplContentDataFlow Lang> { FlowFeature getAFeature() { result = ContentConfig::getAFeature() } - predicate accessPathLimit = ContentConfig::accessPathLimit/0; + predicate accessPathLimit = ContentConfig::accessPathLimitInternal/0; // needed to record reads/stores inside summarized callables predicate includeHiddenNodes() { any() } @@ -274,6 +277,16 @@ module MakeImplContentDataFlow Lang> { ) } + /** + * Gets the length of this access path. + */ + int length() { + this = TAccessPathNil() and + result = 0 + or + result = this.getTail().length() + 1 + } + /** * Gets the content set at index `i` in this access path, if any. */ diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index ddcd052e8fd..aa74e44a8e8 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -207,6 +207,28 @@ module MakeImpl Lang> { flowLocal(source, sink) and Config::observeOverlayInformedIncrementalMode() } + /** + * Holds if data can flow from `source` to some sink. + * This is a local predicate that only has results local to the overlay/base database. + */ + predicate flowFromLocal(Node source) = forceLocal(Flow::flowFrom/1)(source) + + /** + * Holds if data can flow from `source` to some sink. + */ + predicate flowFrom(Node source) { + Flow::flowFrom(source) + or + // If we are overlay informed (i.e. we are not diff-informed), we + // merge in the local results which includes the base database results. + flowFromLocal(source) and Config::observeOverlayInformedIncrementalMode() + } + + /** + * Holds if data can flow from `source` to some sink. + */ + predicate flowFromExpr(Lang::DataFlowExpr source) { flowFrom(exprNode(source)) } + /** * Holds if data can flow from some source to `sink`. * This is a local predicate that only has results local to the overlay/base database. @@ -3501,6 +3523,16 @@ module MakeImpl Lang> { ) } + /** + * Holds if data can flow from `source` to some sink. + */ + predicate flowFrom(Node source) { exists(PathNode n | n.isSource() and n.getNode() = source) } + + /** + * Holds if data can flow from `source` to some sink. + */ + predicate flowFromExpr(Expr source) { flowFrom(exprNode(source)) } + /** * Holds if data can flow from some source to `sink`. */ diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll index 8f0d2cbdb77..c892cfe1034 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll @@ -74,6 +74,9 @@ signature module InputSig DataFlowL ) { none() } + + /** Holds if `(n1, n2)` should be excluded from the consistency test `localFlowIsLocal`. */ + default predicate localFlowIsLocalExclude(DataFlowLang::Node n1, DataFlowLang::Node n2) { none() } } module MakeConsistency< @@ -169,6 +172,7 @@ module MakeConsistency< query predicate localFlowIsLocal(Node n1, Node n2, string msg) { simpleLocalFlowStep(n1, n2, _) and nodeGetEnclosingCallable(n1) != nodeGetEnclosingCallable(n2) and + not Input::localFlowIsLocalExclude(n1, n2) and msg = "Local flow step does not preserve enclosing callable." } @@ -240,6 +244,13 @@ module MakeConsistency< private predicate hasPost(Node n) { exists(PostUpdateNode post | post.getPreUpdateNode() = n) } + /** + * Consider code like `a.b.f = source()`. There is flow from `source()` to + * `[post] a.b` (with an appropriate access path), but we also want there to + * be flow to `[post] a` (with an appropriate access path). The data flow + * library is able to infer this step because there is a read step from `a` + * to `a.b`, as long as the post-update node for `a` exists. + */ query predicate reverseRead(Node n, string msg) { exists(Node n2 | readStep(n, _, n2) and hasPost(n2) and not hasPost(n)) and not Input::reverseReadExclude(n) and diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 6cc9d6f88a4..a8260440938 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -215,6 +215,35 @@ module Make< ] } + class AcceptingValue extends string { + AcceptingValue() { + this = + [ + "true", + "false", + "no-exception", + "zero", + "not-zero", + "null", + "not-null", + ] + } + + predicate isTrue() { this = "true" } + + predicate isFalse() { this = "false" } + + predicate isNoException() { this = "no-exception" } + + predicate isZero() { this = "zero" } + + predicate isNotZero() { this = "not-zero" } + + predicate isNull() { this = "null" } + + predicate isNotNull() { this = "not-null" } + } + /** * A class used to represent provenance values for MaD models. * @@ -633,6 +662,30 @@ module Make< unsupportedCallable(callable, _, _, _) } + private predicate isRelevantSource( + SourceElement e, string output, string kind, Provenance provenance, string model + ) { + e.isSource(output, kind, provenance, model) and + ( + provenance.isManual() + or + provenance.isGenerated() and + not exists(Provenance p | p.isManual() and e.isSource(_, kind, p, _)) + ) + } + + private predicate isRelevantSink( + SinkElement e, string input, string kind, Provenance provenance, string model + ) { + e.isSink(input, kind, provenance, model) and + ( + provenance.isManual() + or + provenance.isGenerated() and + not exists(Provenance p | p.isManual() and e.isSink(_, kind, p, _)) + ) + } + private predicate summarySpec(string spec) { exists(SummarizedCallable c | c.propagatesFlow(spec, _, _, _) @@ -640,9 +693,9 @@ module Make< c.propagatesFlow(_, spec, _, _) ) or - any(SourceElement s).isSource(spec, _, _, _) + isRelevantSource(_, spec, _, _, _) or - any(SinkElement s).isSink(spec, _, _, _) + isRelevantSink(_, spec, _, _, _) } import AccessPathSyntax::AccessPath @@ -1005,7 +1058,7 @@ module Make< SourceElement source, SummaryComponentStack s, string kind, string model ) { exists(string outSpec | - source.isSource(outSpec, kind, _, model) and + isRelevantSource(source, outSpec, kind, _, model) and External::interpretSpec(outSpec, s) ) } @@ -1028,7 +1081,7 @@ module Make< SinkElement sink, SummaryComponentStack s, string kind, string model ) { exists(string inSpec | - sink.isSink(inSpec, kind, _, model) and + isRelevantSink(sink, inSpec, kind, _, model) and External::interpretSpec(inSpec, s) ) } @@ -2015,6 +2068,12 @@ module Make< not exists(interpretComponent(c)) } + /** Holds if `acceptingvalue` is not a valid barrier guard accepting-value. */ + bindingset[acceptingvalue] + predicate invalidAcceptingValue(string acceptingvalue) { + not acceptingvalue instanceof AcceptingValue + } + /** Holds if `provenance` is not a valid provenance value. */ bindingset[provenance] predicate invalidProvenance(string provenance) { not provenance instanceof Provenance } @@ -2052,6 +2111,23 @@ module Make< Element n, string input, string kind, Provenance provenance, string model ); + /** + * Holds if an external barrier specification exists for `n` with output specification + * `output` and kind `kind`. + */ + predicate barrierElement( + Element n, string output, string kind, Provenance provenance, string model + ); + + /** + * Holds if an external barrier guard specification exists for `n` with input + * specification `input`, accepting value `acceptingvalue`, and kind `kind`. + */ + predicate barrierGuardElement( + Element n, string input, AcceptingValue acceptingvalue, string kind, + Provenance provenance, string model + ); + class SourceOrSinkElement extends Element; /** An entity used to interpret a source/sink specification. */ @@ -2105,7 +2181,9 @@ module Make< private predicate sourceSinkSpec(string spec) { sourceElement(_, spec, _, _, _) or - sinkElement(_, spec, _, _, _) + sinkElement(_, spec, _, _, _) or + barrierElement(_, spec, _, _, _) or + barrierGuardElement(_, spec, _, _, _, _) } private module AccessPath = AccessPathSyntax::AccessPath; @@ -2160,11 +2238,34 @@ module Make< ) } + private predicate barrierElementRef( + InterpretNode ref, SourceSinkAccessPath output, string kind, string model + ) { + exists(SourceOrSinkElement e | + barrierElement(e, output, kind, _, model) and + if outputNeedsReferenceExt(output.getToken(0)) + then e = ref.getCallTarget() + else e = ref.asElement() + ) + } + + private predicate barrierGuardElementRef( + InterpretNode ref, SourceSinkAccessPath input, AcceptingValue acceptingvalue, string kind, + string model + ) { + exists(SourceOrSinkElement e | + barrierGuardElement(e, input, acceptingvalue, kind, _, model) and + if inputNeedsReferenceExt(input.getToken(0)) + then e = ref.getCallTarget() + else e = ref.asElement() + ) + } + /** Holds if the first `n` tokens of `output` resolve to the given interpretation. */ private predicate interpretOutput( SourceSinkAccessPath output, int n, InterpretNode ref, InterpretNode node ) { - sourceElementRef(ref, output, _, _) and + (sourceElementRef(ref, output, _, _) or barrierElementRef(ref, output, _, _)) and n = 0 and ( if output = "" @@ -2220,7 +2321,7 @@ module Make< private predicate interpretInput( SourceSinkAccessPath input, int n, InterpretNode ref, InterpretNode node ) { - sinkElementRef(ref, input, _, _) and + (sinkElementRef(ref, input, _, _) or barrierGuardElementRef(ref, input, _, _, _)) and n = 0 and ( if input = "" @@ -2280,6 +2381,30 @@ module Make< ) } + /** + * Holds if `node` is specified as a barrier with the given kind in a MaD flow + * model. + */ + predicate isBarrierNode(InterpretNode node, string kind, string model) { + exists(InterpretNode ref, SourceSinkAccessPath output | + barrierElementRef(ref, output, kind, model) and + interpretOutput(output, output.getNumToken(), ref, node) + ) + } + + /** + * Holds if `node` is specified as a barrier guard argument with the + * given kind in a MaD flow model. + */ + predicate isBarrierGuardNode( + InterpretNode node, AcceptingValue acceptingvalue, string kind, string model + ) { + exists(InterpretNode ref, SourceSinkAccessPath input | + barrierGuardElementRef(ref, input, acceptingvalue, kind, model) and + interpretInput(input, input.getNumToken(), ref, node) + ) + } + final private class SourceOrSinkElementFinal = SourceOrSinkElement; signature predicate sourceOrSinkElementSig( diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 7f969fdef42..33335ec904f 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.0.19-dev +version: 2.0.23-dev groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index b0b444f8c41..27e5fb03dfa 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.35.md b/shared/mad/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.36.md b/shared/mad/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.37.md b/shared/mad/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/mad/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.38.md b/shared/mad/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/mad/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/mad/codeql/mad/ModelValidation.qll b/shared/mad/codeql/mad/ModelValidation.qll index 5d4698bed1d..9791355d03a 100644 --- a/shared/mad/codeql/mad/ModelValidation.qll +++ b/shared/mad/codeql/mad/ModelValidation.qll @@ -173,7 +173,7 @@ module KindValidation { or exists(string kind, string msg | Config::sinkKind(kind) | not kind instanceof ValidSinkKind and - msg = "Invalid kind \"" + kind + "\" in sink model." and + msg = "Invalid kind \"" + kind + "\" in sink or barrier model." and // The part of this message that refers to outdated sink kinds can be deleted after June 1st, 2024. if kind instanceof OutdatedSinkKind then result = msg + " " + kind.(OutdatedSinkKind).outdatedMessage() diff --git a/shared/mad/codeql/mad/modelgenerator/internal/ModelGeneratorImpl.qll b/shared/mad/codeql/mad/modelgenerator/internal/ModelGeneratorImpl.qll index 51dafc2cc96..8abe4563580 100644 --- a/shared/mad/codeql/mad/modelgenerator/internal/ModelGeneratorImpl.qll +++ b/shared/mad/codeql/mad/modelgenerator/internal/ModelGeneratorImpl.qll @@ -277,6 +277,16 @@ module MakeModelGeneratorFactory< */ predicate isAdditionalContentFlowStep(Lang::Node nodeFrom, Lang::Node nodeTo); + /** + * Gets the access path limit for content flow analysis. + */ + default int contentAccessPathLimit() { result = 2 } + + /** + * Gets the internal access path limit for content flow analysis. + */ + default int contentAccessPathLimitInternal() { result = Lang::accessPathLimit() } + /** * Holds if the content set `c` is field like. */ @@ -650,7 +660,10 @@ module MakeModelGeneratorFactory< exists(Type t | t = n.(NodeExtended).getType() and not isRelevantType(t)) } - int accessPathLimit() { result = 2 } + predicate accessPathLimit = SummaryModelGeneratorInput::contentAccessPathLimit/0; + + predicate accessPathLimitInternal = + SummaryModelGeneratorInput::contentAccessPathLimitInternal/0; predicate isRelevantContent(DataFlow::ContentSet s) { isRelevantContent0(s) } @@ -703,14 +716,17 @@ module MakeModelGeneratorFactory< } /** - * Holds if the access path `ap` is not a parameter or returnvalue of a callback - * stored in a field. + * Holds if `ap` is valid for generating summary models. * - * That is, we currently don't include summaries that rely on parameters or return values - * of callbacks stored in fields. + * We currently don't include summaries that rely on parameters or return values + * of callbacks stored in fields, as those are not supported by the data flow + * library. + * + * We also exclude access paths with contents not supported by `printContent`. */ private predicate validateAccessPath(PropagateContentFlow::AccessPath ap) { - not (mentionsField(ap) and mentionsCallback(ap)) + not (mentionsField(ap) and mentionsCallback(ap)) and + forall(int i | i in [0 .. ap.length() - 1] | exists(getContent(ap, i))) } private predicate apiFlow( @@ -720,7 +736,9 @@ module MakeModelGeneratorFactory< ) { PropagateContentFlow::flow(p, reads, returnNodeExt, stores, preservesValue) and getEnclosingCallable(returnNodeExt) = api and - getEnclosingCallable(p) = api + getEnclosingCallable(p) = api and + validateAccessPath(reads) and + validateAccessPath(stores) } /** @@ -763,9 +781,7 @@ module MakeModelGeneratorFactory< PropagateContentFlow::AccessPath reads, ReturnNodeExt returnNodeExt, PropagateContentFlow::AccessPath stores, boolean preservesValue ) { - PropagateContentFlow::flow(p, reads, returnNodeExt, stores, preservesValue) and - getEnclosingCallable(returnNodeExt) = api and - getEnclosingCallable(p) = api and + apiFlow(api, p, reads, returnNodeExt, stores, preservesValue) and p = api.getARelevantParameterNode() } @@ -956,8 +972,6 @@ module MakeModelGeneratorFactory< input = parameterNodeAsExactInput(p) + printReadAccessPath(reads) and output = getExactOutput(returnNodeExt) + printStoreAccessPath(stores) and input != output and - validateAccessPath(reads) and - validateAccessPath(stores) and ( if mentionsField(reads) or mentionsField(stores) then lift = false and api.isRelevant() diff --git a/shared/mad/codeql/mad/static/ModelsAsData.qll b/shared/mad/codeql/mad/static/ModelsAsData.qll new file mode 100644 index 00000000000..84daaa9b6c8 --- /dev/null +++ b/shared/mad/codeql/mad/static/ModelsAsData.qll @@ -0,0 +1,345 @@ +overlay[local?] +module; + +signature module ExtensionsSig { + /** + * Holds if a source model exists for the given parameters. + */ + predicate sourceModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, QlBuiltins::ExtensionId madId + ); + + /** + * Holds if a sink model exists for the given parameters. + */ + predicate sinkModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind, string provenance, QlBuiltins::ExtensionId madId + ); + + /** + * Holds if a barrier model exists for the given parameters. + */ + predicate barrierModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, QlBuiltins::ExtensionId madId + ); + + /** + * Holds if a barrier guard model exists for the given parameters. + */ + predicate barrierGuardModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string acceptingvalue, string kind, string provenance, + QlBuiltins::ExtensionId madId + ); + + /** + * Holds if a summary model exists for the given parameters. + */ + predicate summaryModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string provenance, QlBuiltins::ExtensionId madId + ); + + /** + * Holds if a neutral model exists for the given parameters. + */ + predicate neutralModel( + string namespace, string type, string name, string signature, string kind, string provenance + ); + + /** + * Holds if the namespace `namespace` is part of the group `group`. + */ + predicate namespaceGrouping(string group, string namespace); +} + +signature module InputSig { + /** + * Holds if a source model exists for the given parameters. + */ + default predicate additionalSourceModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, string model + ) { + none() + } + + /** + * Holds if a sink model exists for the given parameters. + */ + default predicate additionalSinkModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind, string provenance, string model + ) { + none() + } + + /** + * Holds if a summary model exists for the given parameters. + */ + default predicate additionalSummaryModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string provenance, string model + ) { + none() + } + + /** Gets the separator used between namespace segments. */ + default string namespaceSegmentSeparator() { result = "." } + + /** Gets a cleaned-up version of the namespace for presentation in model coverage. */ + bindingset[ns] + default string cleanNamespace(string ns) { result = ns } +} + +module ModelsAsData { + /** + * Holds if the given extension tuple `madId` should pretty-print as `model`. + * + * Barrier models are included for completeness even though they will not show up in a path. + * + * This predicate should only be used in tests. + */ + predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance + | + Extensions::sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, + provenance, madId) + | + model = + "Source: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + + "; " + ext + "; " + output + "; " + kind + "; " + provenance + ) + or + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind, string provenance + | + Extensions::sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, + provenance, madId) + | + model = + "Sink: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + "; " + + ext + "; " + input + "; " + kind + "; " + provenance + ) + or + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance + | + Extensions::barrierModel(namespace, type, subtypes, name, signature, ext, output, kind, + provenance, madId) + | + model = + "Barrier: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + + "; " + ext + "; " + output + "; " + kind + "; " + provenance + ) + or + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string acceptingvalue, string kind, string provenance + | + Extensions::barrierGuardModel(namespace, type, subtypes, name, signature, ext, input, + acceptingvalue, kind, provenance, madId) + | + model = + "Barrier Guard: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + + signature + "; " + ext + "; " + input + "; " + acceptingvalue + "; " + kind + "; " + + provenance + ) + or + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string provenance + | + Extensions::summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, + provenance, madId) + | + model = + "Summary: " + namespace + "; " + type + "; " + subtypes + "; " + name + "; " + signature + + "; " + ext + "; " + input + "; " + output + "; " + kind + "; " + provenance + ) + } + + /** Gets the prefix for a group of namespaces. */ + private string groupPrefix() { result = "group:" } + + /** + * Gets a namespace represented by `namespaceOrGroup`. + * + * If `namespaceOrGroup` is of the form `group:` then `result` is a + * namespace in the group ``, as determined by `namespaceGrouping`. + * Otherwise, `result` is `namespaceOrGroup`. + */ + bindingset[namespaceOrGroup] + private string getNamespace(string namespaceOrGroup) { + not exists(string group | namespaceOrGroup = groupPrefix() + group) and + result = namespaceOrGroup + or + exists(string group | + Extensions::namespaceGrouping(group, result) and + namespaceOrGroup = groupPrefix() + group + ) + } + + /** + * Holds if a source model exists for the given parameters. + */ + predicate sourceModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, string model + ) { + exists(string namespaceOrGroup | namespace = getNamespace(namespaceOrGroup) | + exists(QlBuiltins::ExtensionId madId | + Extensions::sourceModel(namespaceOrGroup, type, subtypes, name, signature, ext, output, + kind, provenance, madId) and + model = "MaD:" + madId.toString() + ) + or + Input::additionalSourceModel(namespaceOrGroup, type, subtypes, name, signature, ext, output, + kind, provenance, model) + ) + } + + /** + * Holds if a sink model exists for the given parameters. + */ + predicate sinkModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind, string provenance, string model + ) { + exists(string namespaceOrGroup | namespace = getNamespace(namespaceOrGroup) | + exists(QlBuiltins::ExtensionId madId | + Extensions::sinkModel(namespaceOrGroup, type, subtypes, name, signature, ext, input, kind, + provenance, madId) and + model = "MaD:" + madId.toString() + ) + or + Input::additionalSinkModel(namespaceOrGroup, type, subtypes, name, signature, ext, input, + kind, provenance, model) + ) + } + + /** Holds if a barrier model exists for the given parameters. */ + predicate barrierModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance, string model + ) { + exists(string namespaceOrGroup, QlBuiltins::ExtensionId madId | + namespace = getNamespace(namespaceOrGroup) and + Extensions::barrierModel(namespaceOrGroup, type, subtypes, name, signature, ext, output, kind, + provenance, madId) and + model = "MaD:" + madId.toString() + ) + } + + /** Holds if a barrier guard model exists for the given parameters. */ + predicate barrierGuardModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string acceptingvalue, string kind, string provenance, string model + ) { + exists(string namespaceOrGroup, QlBuiltins::ExtensionId madId | + namespace = getNamespace(namespaceOrGroup) and + Extensions::barrierGuardModel(namespaceOrGroup, type, subtypes, name, signature, ext, input, + acceptingvalue, kind, provenance, madId) and + model = "MaD:" + madId.toString() + ) + } + + /** + * Holds if a summary model exists for the given parameters. + */ + predicate summaryModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string provenance, string model + ) { + exists(string namespaceOrGroup | namespace = getNamespace(namespaceOrGroup) | + exists(QlBuiltins::ExtensionId madId | + Extensions::summaryModel(namespaceOrGroup, type, subtypes, name, signature, ext, input, + output, kind, provenance, madId) and + model = "MaD:" + madId.toString() + ) + or + Input::additionalSummaryModel(namespaceOrGroup, type, subtypes, name, signature, ext, input, + output, kind, provenance, model) + ) + } + + /** + * Holds if a neutral model exists for the given parameters. + */ + predicate neutralModel( + string namespace, string type, string name, string signature, string kind, string provenance + ) { + exists(string namespaceOrGroup | namespace = getNamespace(namespaceOrGroup) | + Extensions::neutralModel(namespaceOrGroup, type, name, signature, kind, provenance) + ) + } + + private predicate relevantNamespace(string namespace) { + exists(string ns | namespace = Input::cleanNamespace(ns) | + sourceModel(ns, _, _, _, _, _, _, _, _, _) or + sinkModel(ns, _, _, _, _, _, _, _, _, _) or + summaryModel(ns, _, _, _, _, _, _, _, _, _, _) + ) + } + + private predicate namespaceLink(string shortns, string longns) { + relevantNamespace(shortns) and + relevantNamespace(longns) and + longns.prefix(longns.indexOf(Input::namespaceSegmentSeparator())) = shortns + } + + private predicate canonicalNamespace(string namespace) { + relevantNamespace(namespace) and not namespaceLink(_, namespace) + } + + private predicate canonicalNamespaceLink(string namespace, string subns) { + canonicalNamespace(namespace) and + (subns = namespace or namespaceLink(namespace, subns)) + } + + /** + * Holds if MaD framework coverage of `namespace` is `n` api endpoints of the + * kind `(kind, part)`, and `namespaces` is the number of subnamespaces of + * `namespace` which have MaD framework coverage (including `namespace` + * itself). + */ + predicate modelCoverage(string namespace, int namespaces, string kind, string part, int n) { + namespaces = strictcount(string subns | canonicalNamespaceLink(namespace, subns)) and + ( + part = "source" and + n = + strictcount(string subns, string subnsClean, string type, boolean subtypes, string name, + string signature, string ext, string output, string provenance | + canonicalNamespaceLink(namespace, subnsClean) and + subnsClean = Input::cleanNamespace(subns) and + sourceModel(subns, type, subtypes, name, signature, ext, output, kind, provenance, _) + ) + or + part = "sink" and + n = + strictcount(string subns, string subnsClean, string type, boolean subtypes, string name, + string signature, string ext, string input, string provenance | + canonicalNamespaceLink(namespace, subnsClean) and + subnsClean = Input::cleanNamespace(subns) and + sinkModel(subns, type, subtypes, name, signature, ext, input, kind, provenance, _) + ) + or + part = "summary" and + n = + strictcount(string subns, string subnsClean, string type, boolean subtypes, string name, + string signature, string ext, string input, string output, string provenance | + canonicalNamespaceLink(namespace, subnsClean) and + subnsClean = Input::cleanNamespace(subns) and + summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind, provenance, + _) + ) + ) + } +} diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 13a5b8507b3..271e93b5c0b 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index 83a42fb0551..28235d47f61 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,19 @@ +## 0.0.16 + +No user-facing changes. + +## 0.0.15 + +No user-facing changes. + +## 0.0.14 + +No user-facing changes. + +## 0.0.13 + +No user-facing changes. + ## 0.0.12 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.13.md b/shared/quantum/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..f679eaf0313 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.13.md @@ -0,0 +1,3 @@ +## 0.0.13 + +No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.14.md b/shared/quantum/change-notes/released/0.0.14.md new file mode 100644 index 00000000000..63b4d50ca45 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.14.md @@ -0,0 +1,3 @@ +## 0.0.14 + +No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.15.md b/shared/quantum/change-notes/released/0.0.15.md new file mode 100644 index 00000000000..7af9c05f23f --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.15.md @@ -0,0 +1,3 @@ +## 0.0.15 + +No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.16.md b/shared/quantum/change-notes/released/0.0.16.md new file mode 100644 index 00000000000..62b5521ea01 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.16.md @@ -0,0 +1,3 @@ +## 0.0.16 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index 997fb8da83c..a49f7be4cff 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.12 +lastReleaseVersion: 0.0.16 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 0cc0fbad906..1f08c524321 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.13-dev +version: 0.0.17-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 640d26270e1..c1a36a57de3 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.35.md b/shared/rangeanalysis/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.36.md b/shared/rangeanalysis/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.37.md b/shared/rangeanalysis/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.38.md b/shared/rangeanalysis/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 24b697d1f49..f69da48d3fe 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 1e3fb3c306c..0002bcde38e 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.35.md b/shared/regex/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.36.md b/shared/regex/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.37.md b/shared/regex/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/regex/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.38.md b/shared/regex/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/regex/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index f66b9d743f6..522248c9f30 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 2d8087cd96c..1dfec3daacc 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,19 @@ +## 2.0.14 + +No user-facing changes. + +## 2.0.13 + +No user-facing changes. + +## 2.0.12 + +No user-facing changes. + +## 2.0.11 + +No user-facing changes. + ## 2.0.10 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.11.md b/shared/ssa/change-notes/released/2.0.11.md new file mode 100644 index 00000000000..b3d110bcba5 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.11.md @@ -0,0 +1,3 @@ +## 2.0.11 + +No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.12.md b/shared/ssa/change-notes/released/2.0.12.md new file mode 100644 index 00000000000..c93809466de --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.12.md @@ -0,0 +1,3 @@ +## 2.0.12 + +No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.13.md b/shared/ssa/change-notes/released/2.0.13.md new file mode 100644 index 00000000000..39a24682b50 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.13.md @@ -0,0 +1,3 @@ +## 2.0.13 + +No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.14.md b/shared/ssa/change-notes/released/2.0.14.md new file mode 100644 index 00000000000..13190ad53e3 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.14.md @@ -0,0 +1,3 @@ +## 2.0.14 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 96ea0220a69..23aa0864b29 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.10 +lastReleaseVersion: 2.0.14 diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index 5edf51127b8..26f3d9f9771 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1617,6 +1617,9 @@ module Make< /** A static single assignment (SSA) definition. */ class SsaDefinition extends FinalDefinition { + /** Gets a textual representation of this SSA definition. */ + string toString() { result = super.toString() } + /** * Gets the control flow node of this SSA definition. * @@ -1708,6 +1711,8 @@ module Make< class SsaParameterInit extends SsaExplicitWrite { SsaParameterInit() { parameterInit(this, _) } + override string toString() { result = "SSA param(" + this.getSourceVariable() + ")" } + /** * Gets the parameter that this definition represents. This is equivalent * to `getDefinition().isParameterInit(result)` @@ -1725,6 +1730,8 @@ module Make< */ class SsaImplicitWrite extends SsaWriteDefinition { SsaImplicitWrite() { not explicitWrite(this, _) } + + override string toString() { result = "SSA implicit def(" + this.getSourceVariable() + ")" } } /** @@ -1734,6 +1741,8 @@ module Make< */ class SsaImplicitEntryDefinition extends SsaImplicitWrite { SsaImplicitEntryDefinition() { this.definesAt(_, any(EntryBasicBlock bb), -1) } + + override string toString() { result = "SSA entry def(" + this.getSourceVariable() + ")" } } /** An SSA definition that represents an uncertain variable update. */ @@ -1761,7 +1770,7 @@ module Make< * ``` * a phi definition for `x` is inserted just before the call `puts x`. */ - class SsaPhiDefinition extends SsaDefinition { + class SsaPhiDefinition extends SsaDefinition instanceof PhiNode { /** Holds if `inp` is an input to this phi definition along the edge originating in `bb`. */ predicate hasInputFromBlock(SsaDefinition inp, BasicBlock bb) { phiHasInputFromBlockCached(this, inp, bb) diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 0aada9508ee..30854239413 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.11-dev +version: 2.0.15-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 870695d684c..00273047253 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.35.md b/shared/threat-models/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.36.md b/shared/threat-models/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.37.md b/shared/threat-models/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.38.md b/shared/threat-models/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 4bb9cb4cb5f..6b972def924 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.35-dev +version: 1.0.39-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 23fd78f42e5..ad2c71497db 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.35.md b/shared/tutorial/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.36.md b/shared/tutorial/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.37.md b/shared/tutorial/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.38.md b/shared/tutorial/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index fa53c0be99f..a1ea6bd35cf 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index d95faf69864..38e81a0275d 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.35.md b/shared/typeflow/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.36.md b/shared/typeflow/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.37.md b/shared/typeflow/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.38.md b/shared/typeflow/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 94cae6f26a6..e2e41e87b79 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index 4f4b3189bb4..d5252bfc0c4 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,19 @@ +## 0.0.19 + +No user-facing changes. + +## 0.0.18 + +No user-facing changes. + +## 0.0.17 + +No user-facing changes. + +## 0.0.16 + +No user-facing changes. + ## 0.0.15 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.16.md b/shared/typeinference/change-notes/released/0.0.16.md new file mode 100644 index 00000000000..62b5521ea01 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.16.md @@ -0,0 +1,3 @@ +## 0.0.16 + +No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.17.md b/shared/typeinference/change-notes/released/0.0.17.md new file mode 100644 index 00000000000..62cc89030a6 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.17.md @@ -0,0 +1,3 @@ +## 0.0.17 + +No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.18.md b/shared/typeinference/change-notes/released/0.0.18.md new file mode 100644 index 00000000000..86c60b8abe7 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.18.md @@ -0,0 +1,3 @@ +## 0.0.18 + +No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.19.md b/shared/typeinference/change-notes/released/0.0.19.md new file mode 100644 index 00000000000..914e4c9074d --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.19.md @@ -0,0 +1,3 @@ +## 0.0.19 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index dff35216fc6..f406319f372 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.15 +lastReleaseVersion: 0.0.19 diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index a827ef3cd79..f53f15b5a6a 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -224,25 +224,17 @@ signature module InputSig1 { module Make1 Input1> { private import Input1 + private import codeql.util.UnboundList as UnboundListImpl - private module TypeParameter { - private import codeql.util.DenseRank + private module UnboundListInput implements UnboundListImpl::InputSig { + class Element = TypeParameter; - private module DenseRankInput implements DenseRankInputSig { - class Ranked = TypeParameter; + predicate getId = getTypeParameterId/1; - predicate getRank = getTypeParameterId/1; - } - - int getRank(TypeParameter tp) { tp = DenseRank::denseRank(result) } - - string encode(TypeParameter tp) { result = getRank(tp).toString() } - - bindingset[s] - TypeParameter decode(string s) { encode(result) = s } + predicate getLengthLimit = getTypePathLimit/0; } - final private class String = string; + private import UnboundListImpl::Make /** * A path into a type. @@ -274,101 +266,10 @@ module Make1 Input1> { * implementation uses unique type parameter identifiers, in order to not mix * up type parameters from different types. */ - class TypePath extends String { - bindingset[this] - TypePath() { exists(this) } - - bindingset[this] - private TypeParameter getTypeParameter(int i) { - result = TypeParameter::decode(this.splitAt(".", i)) - } - - /** Gets a textual representation of this type path. */ - bindingset[this] - string toString() { - result = - concat(int i, TypeParameter tp | - tp = this.getTypeParameter(i) - | - tp.toString(), "." order by i - ) - } - - /** Holds if this type path is empty. */ - predicate isEmpty() { this = "" } - - /** Gets the length of this path. */ - bindingset[this] - pragma[inline_late] - int length() { - // Same as - // `result = count(this.indexOf("."))` - // but performs better because it doesn't use an aggregate - result = this.regexpReplaceAll("[0-9]+", "").length() - } - - /** Gets the path obtained by appending `suffix` onto this path. */ - bindingset[this, suffix] - TypePath append(TypePath suffix) { - result = this + suffix and - ( - not exists(getTypePathLimit()) - or - result.length() <= getTypePathLimit() - ) - } - - /** - * Gets the path obtained by appending `suffix` onto this path. - * - * Unlike `append`, this predicate has `result` in the binding set, - * so there is no need to check the length of `result`. - */ - bindingset[this, result] - TypePath appendInverse(TypePath suffix) { suffix = result.stripPrefix(this) } - - /** Gets the path obtained by removing `prefix` from this path. */ - bindingset[this, prefix] - TypePath stripPrefix(TypePath prefix) { this = prefix + result } - - /** Holds if this path starts with `tp`, followed by `suffix`. */ - bindingset[this] - predicate isCons(TypeParameter tp, TypePath suffix) { - exists(string regexp | regexp = "([0-9]+)\\.(.*)" | - tp = TypeParameter::decode(this.regexpCapture(regexp, 1)) and - suffix = this.regexpCapture(regexp, 2) - ) - } - - /** Holds if this path starts with `prefix`, followed by `tp`. */ - bindingset[this] - predicate isSnoc(TypePath prefix, TypeParameter tp) { - exists(string regexp | regexp = "(|.+\\.)([0-9]+)\\." | - prefix = this.regexpCapture(regexp, 1) and - tp = TypeParameter::decode(this.regexpCapture(regexp, 2)) - ) - } - - /** Gets the head of this path, if any. */ - bindingset[this] - TypeParameter getHead() { result = this.getTypeParameter(0) } - } + class TypePath = UnboundList; /** Provides predicates for constructing `TypePath`s. */ - module TypePath { - /** Gets the empty type path. */ - TypePath nil() { result.isEmpty() } - - /** Gets the singleton type path `tp`. */ - TypePath singleton(TypeParameter tp) { result = TypeParameter::encode(tp) + "." } - - /** - * Gets the type path obtained by appending the singleton type path `tp` - * onto `suffix`. - */ - bindingset[suffix] - TypePath cons(TypeParameter tp, TypePath suffix) { result = singleton(tp).append(suffix) } - } + module TypePath = UnboundList; /** * A class that has a type tree associated with it. @@ -449,7 +350,9 @@ module Make1 Input1> { * - `abs` is a type abstraction that introduces type variables that are * free in `condition` and `constraint`, * - and for every instantiation of the type parameters from `abs` the - * resulting `condition` satisifies the constraint given by `constraint`. + * resulting `condition` satisfies the constraint given by `constraint`. + * - `transitive` corresponds to whether any further constraints satisfied + * through `constraint` should also apply to `condition`. * * Example in C#: * ```csharp @@ -487,7 +390,7 @@ module Make1 Input1> { * should be empty. */ predicate conditionSatisfiesConstraint( - TypeAbstraction abs, TypeMention condition, TypeMention constraint + TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive ); } @@ -578,7 +481,7 @@ module Make1 Input1> { } pragma[nomagic] - private predicate satisfiesConcreteTypesFromIndex( + private predicate satisfiesConcreteTypesToIndex( App app, TypeAbstraction abs, Constraint constraint, int i ) { exists(Type t, TypePath path | @@ -586,23 +489,19 @@ module Make1 Input1> { if t = abs.getATypeParameter() then any() else app.getTypeAt(path) = t ) and // Recurse unless we are at the first path - if i = 0 then any() else satisfiesConcreteTypesFromIndex(app, abs, constraint, i - 1) + if i = 0 then any() else satisfiesConcreteTypesToIndex(app, abs, constraint, i - 1) } /** Holds if all the concrete types in `constraint` also occur in `app`. */ pragma[nomagic] private predicate satisfiesConcreteTypes(App app, TypeAbstraction abs, Constraint constraint) { - satisfiesConcreteTypesFromIndex(app, abs, constraint, + satisfiesConcreteTypesToIndex(app, abs, constraint, max(int i | exists(getNthPath(constraint, i)))) } private TypeParameter getNthTypeParameter(TypeAbstraction abs, int i) { result = - rank[i + 1](TypeParameter tp | - tp = abs.getATypeParameter() - | - tp order by TypeParameter::getRank(tp) - ) + rank[i + 1](TypeParameter tp | tp = abs.getATypeParameter() | tp order by getRank(tp)) } /** @@ -620,7 +519,7 @@ module Make1 Input1> { } pragma[nomagic] - private predicate typeParametersEqualFromIndexBase( + private predicate typeParametersEqualToIndexBase( App app, TypeAbstraction abs, Constraint constraint, TypeParameter tp, TypePath path ) { path = getNthTypeParameterPath(constraint, tp, 0) and @@ -630,15 +529,15 @@ module Make1 Input1> { } pragma[nomagic] - private predicate typeParametersEqualFromIndex( + private predicate typeParametersEqualToIndex( App app, TypeAbstraction abs, Constraint constraint, TypeParameter tp, Type t, int i ) { exists(TypePath path | t = app.getTypeAt(path) and if i = 0 - then typeParametersEqualFromIndexBase(app, abs, constraint, tp, path) + then typeParametersEqualToIndexBase(app, abs, constraint, tp, path) else ( - typeParametersEqualFromIndex(app, abs, constraint, tp, t, i - 1) and + typeParametersEqualToIndex(app, abs, constraint, tp, t, i - 1) and path = getNthTypeParameterPath(constraint, tp, i) ) ) @@ -655,19 +554,19 @@ module Make1 Input1> { exists(int n | n = max(int i | exists(getNthTypeParameterPath(constraint, tp, i))) | // If the largest index is 0, then there are no equalities to check as // the type parameter only occurs once. - if n = 0 then any() else typeParametersEqualFromIndex(app, abs, constraint, tp, _, n) + if n = 0 then any() else typeParametersEqualToIndex(app, abs, constraint, tp, _, n) ) ) } - private predicate typeParametersHaveEqualInstantiationFromIndex( + private predicate typeParametersHaveEqualInstantiationToIndex( App app, TypeAbstraction abs, Constraint constraint, int i ) { exists(TypeParameter tp | tp = getNthTypeParameter(abs, i) | typeParametersEqual(app, abs, constraint, tp) and if i = 0 then any() - else typeParametersHaveEqualInstantiationFromIndex(app, abs, constraint, i - 1) + else typeParametersHaveEqualInstantiationToIndex(app, abs, constraint, i - 1) ) } @@ -697,13 +596,14 @@ module Make1 Input1> { not exists(getNthTypeParameter(abs, _)) or exists(int n | n = max(int i | exists(getNthTypeParameter(abs, i))) | - typeParametersHaveEqualInstantiationFromIndex(app, abs, constraint, n) + typeParametersHaveEqualInstantiationToIndex(app, abs, constraint, n) ) ) } /** - * Holds if `app` is _not_ a possible instantiation of `constraint`. + * Holds if `app` is _not_ a possible instantiation of `constraint`, because `app` + * and `constraint` differ on concrete types at `path`. * * This is an approximation of `not isInstantiationOf(app, abs, constraint)`, but * defined without a negative occurrence of `isInstantiationOf`. @@ -717,9 +617,11 @@ module Make1 Input1> { * `isInstantiationOf` nor `isNotInstantiationOf` will hold. */ pragma[nomagic] - predicate isNotInstantiationOf(App app, TypeAbstraction abs, Constraint constraint) { + predicate isNotInstantiationOf( + App app, TypeAbstraction abs, Constraint constraint, TypePath path + ) { // `app` and `constraint` differ on a concrete type - exists(Type t, Type t2, TypePath path | + exists(Type t, Type t2 | t = resolveTypeAt(app, abs, constraint, path) and not t = abs.getATypeParameter() and app.getTypeAt(path) = t2 and @@ -754,13 +656,13 @@ module Make1 Input1> { private predicate typeCondition( Type type, TypeAbstraction abs, TypeMentionTypeTree condition ) { - conditionSatisfiesConstraint(abs, condition, _) and + conditionSatisfiesConstraint(abs, condition, _, _) and type = resolveTypeMentionRoot(condition) } pragma[nomagic] private predicate typeConstraint(Type type, TypeMentionTypeTree constraint) { - conditionSatisfiesConstraint(_, _, constraint) and + conditionSatisfiesConstraint(_, _, constraint, _) and type = resolveTypeMentionRoot(constraint) } @@ -781,12 +683,12 @@ module Make1 Input1> { TypeAbstraction abs, TypeMention condition, TypeMention constraint, TypePath path, Type t ) { // base case - conditionSatisfiesConstraint(abs, condition, constraint) and + conditionSatisfiesConstraint(abs, condition, constraint, _) and constraint.resolveTypeAt(path) = t or // recursive case exists(TypeAbstraction midAbs, TypeMention midConstraint, TypeMention midCondition | - conditionSatisfiesConstraint(abs, condition, midConstraint) and + conditionSatisfiesConstraint(abs, condition, midConstraint, true) and // NOTE: `midAbs` describe the free type variables in `midCondition`, hence // we use that for instantiation check. IsInstantiationOf::isInstantiationOf(midConstraint, @@ -981,6 +883,9 @@ module Make1 Input1> { } } + private module SatisfiesConstraintIsInstantiationOf = + IsInstantiationOf; + /** * Holds if `tt` satisfies `constraint` through `abs`, `sub`, and `constraintMention`. */ @@ -990,7 +895,7 @@ module Make1 Input1> { TypeMention constraintMention ) { exists(Type type | hasTypeConstraint(tt, type, constraint) | - useUniversalConditions() and + useUniversalConditions() and // todo: remove, and instead check constraints not exists(countConstraintImplementations(type, constraint)) and conditionSatisfiesConstraintTypeAt(abs, condition, constraintMention, _, _) and resolveTypeMentionRoot(condition) = abs.getATypeParameter() and @@ -1002,13 +907,21 @@ module Make1 Input1> { // constraint we need to find the right implementation, which is the // one where the type instantiates the precondition. if multipleConstraintImplementations(type, constraint) - then - IsInstantiationOf::isInstantiationOf(tt, - abs, condition) + then SatisfiesConstraintIsInstantiationOf::isInstantiationOf(tt, abs, condition) else any() ) } + pragma[nomagic] + private predicate isNotInstantiationOf( + HasTypeTree tt, TypeAbstraction abs, TypeMention condition, Type root + ) { + exists(TypePath path | + SatisfiesConstraintIsInstantiationOf::isNotInstantiationOf(tt, abs, condition, path) and + path.isCons(root.getATypeParameter(), _) + ) + } + /** * Holds if `tt` does not satisfy `constraint`. * @@ -1038,8 +951,7 @@ module Make1 Input1> { forex(TypeAbstraction abs, TypeMention condition | rootTypesSatisfaction(type, constraint, abs, condition, _) | - IsInstantiationOf::isNotInstantiationOf(tt, - abs, condition) + isNotInstantiationOf(tt, abs, condition, type) ) ) ) diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 00008849702..0a5b99e7f11 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.16-dev +version: 0.0.20-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 4edafe87290..81415ed396f 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,19 @@ +## 2.0.22 + +No user-facing changes. + +## 2.0.21 + +No user-facing changes. + +## 2.0.20 + +No user-facing changes. + +## 2.0.19 + +No user-facing changes. + ## 2.0.18 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.19.md b/shared/typetracking/change-notes/released/2.0.19.md new file mode 100644 index 00000000000..b37b6798b12 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.19.md @@ -0,0 +1,3 @@ +## 2.0.19 + +No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.20.md b/shared/typetracking/change-notes/released/2.0.20.md new file mode 100644 index 00000000000..6756bd5f6c1 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.20.md @@ -0,0 +1,3 @@ +## 2.0.20 + +No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.21.md b/shared/typetracking/change-notes/released/2.0.21.md new file mode 100644 index 00000000000..bdc5029b70b --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.21.md @@ -0,0 +1,3 @@ +## 2.0.21 + +No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.22.md b/shared/typetracking/change-notes/released/2.0.22.md new file mode 100644 index 00000000000..8a2611adad2 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.22.md @@ -0,0 +1,3 @@ +## 2.0.22 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 16342205c73..980bdfe195b 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.18 +lastReleaseVersion: 2.0.22 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 0c588182911..e657f74f636 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.19-dev +version: 2.0.23-dev groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 9fbdb39d493..6c9dced04a3 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.35.md b/shared/typos/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.36.md b/shared/typos/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.37.md b/shared/typos/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/typos/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.38.md b/shared/typos/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/typos/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index b876c84bbe3..31dfb14955f 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 88679dd6846..30fd964656d 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,19 @@ +## 2.0.25 + +No user-facing changes. + +## 2.0.24 + +No user-facing changes. + +## 2.0.23 + +No user-facing changes. + +## 2.0.22 + +No user-facing changes. + ## 2.0.21 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.22.md b/shared/util/change-notes/released/2.0.22.md new file mode 100644 index 00000000000..8a2611adad2 --- /dev/null +++ b/shared/util/change-notes/released/2.0.22.md @@ -0,0 +1,3 @@ +## 2.0.22 + +No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.23.md b/shared/util/change-notes/released/2.0.23.md new file mode 100644 index 00000000000..ab6f6f171ed --- /dev/null +++ b/shared/util/change-notes/released/2.0.23.md @@ -0,0 +1,3 @@ +## 2.0.23 + +No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.24.md b/shared/util/change-notes/released/2.0.24.md new file mode 100644 index 00000000000..6547901c334 --- /dev/null +++ b/shared/util/change-notes/released/2.0.24.md @@ -0,0 +1,3 @@ +## 2.0.24 + +No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.25.md b/shared/util/change-notes/released/2.0.25.md new file mode 100644 index 00000000000..ca39dd50c69 --- /dev/null +++ b/shared/util/change-notes/released/2.0.25.md @@ -0,0 +1,3 @@ +## 2.0.25 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index a572e88bffd..f54d8620118 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.21 +lastReleaseVersion: 2.0.25 diff --git a/shared/util/codeql/util/UnboundList.qll b/shared/util/codeql/util/UnboundList.qll new file mode 100644 index 00000000000..d9a8b905a13 --- /dev/null +++ b/shared/util/codeql/util/UnboundList.qll @@ -0,0 +1,153 @@ +/** + * Provides logic for representing unbound lists. + * + * The lists are represented internally as strings, and generally it should + * be preferred to instead use a `newtype` representation, but in certain + * cases where this is not feasible (typically because of performance) unbound + * lists can be used. + */ +overlay[local?] +module; + +private import Location + +/** Provides the input to `Make`. */ +signature module InputSig { + /** An element. */ + class Element { + /** Gets a textual representation of this element. */ + string toString(); + + /** Gets the location of this element. */ + Location getLocation(); + } + + /** Gets a unique ID used to identify element `e` amongst all elements. */ + int getId(Element e); + + /** + * Gets a textual representation for element `e`, which will be used in the + * `toString` representation for unbound lists. + */ + default string getElementString(Element e) { result = e.toString() } + + /** Gets an optional length limit for unbound lists. */ + default int getLengthLimit() { none() } +} + +final private class String = string; + +/** Provides the `UnboundList` implementation. */ +module Make Input> { + private import Input + private import codeql.util.DenseRank + + // Use dense ranking to assign compact IDs to elements + private module DenseRankInput implements DenseRankInputSig { + class Ranked = Element; + + predicate getRank = getId/1; + } + + /** Gets the rank of element `e`, which is used internally in the string encoding. */ + int getRank(Element e) { e = DenseRank::denseRank(result) } + + private string encode(Element e) { result = getRank(e).toString() } + + bindingset[s] + private Element decode(string s) { encode(result) = s } + + /** + * An unbound list encoded as a string. + */ + class UnboundList extends String { + bindingset[this] + UnboundList() { exists(this) } + + /** Gets the `i`th element in this list. */ + bindingset[this] + private Element getElement(int i) { result = decode(this.splitAt(".", i)) } + + /** Gets a textual representation of this list. */ + bindingset[this] + string toString() { + result = + concat(int i, Element e | e = this.getElement(i) | getElementString(e), "." order by i) + } + + /** Holds if this list is empty. */ + predicate isEmpty() { this = "" } + + /** Gets the length of this list. */ + bindingset[this] + pragma[inline_late] + int length() { + // Same as + // `result = count(this.indexOf("."))` + // but performs better because it doesn't use an aggregate + result = this.regexpReplaceAll("[0-9]+", "").length() + } + + /** Gets the list obtained by appending `suffix` onto this list. */ + bindingset[this, suffix] + UnboundList append(UnboundList suffix) { + result = this + suffix and + ( + not exists(getLengthLimit()) + or + result.length() <= getLengthLimit() + ) + } + + /** + * Gets the list obtained by appending `suffix` onto this list. + * + * Unlike `append`, this predicate has `result` in the binding set, + * so there is no need to check the length of `result`. + */ + bindingset[this, result] + UnboundList appendInverse(UnboundList suffix) { suffix = result.stripPrefix(this) } + + /** Gets the list obtained by removing `prefix` from this list. */ + bindingset[this, prefix] + UnboundList stripPrefix(UnboundList prefix) { this = prefix + result } + + /** Holds if this list starts with `e`, followed by `suffix`. */ + bindingset[this] + predicate isCons(Element e, UnboundList suffix) { + exists(string regexp | regexp = "([0-9]+)\\.(.*)" | + e = decode(this.regexpCapture(regexp, 1)) and + suffix = this.regexpCapture(regexp, 2) + ) + } + + /** Holds if this list starts with `prefix`, followed by `e`. */ + bindingset[this] + predicate isSnoc(UnboundList prefix, Element e) { + exists(string regexp | regexp = "(|.+\\.)([0-9]+)\\." | + prefix = this.regexpCapture(regexp, 1) and + e = decode(this.regexpCapture(regexp, 2)) + ) + } + + /** Gets the head of this list, if any. */ + bindingset[this] + Element getHead() { result = this.getElement(0) } + } + + /** Provides predicates for constructing `UnboundList`s. */ + module UnboundList { + /** Gets the empty list. */ + UnboundList nil() { result.isEmpty() } + + /** Gets the singleton list `e`. */ + UnboundList singleton(Element e) { result = encode(e) + "." } + + /** + * Gets the list obtained by appending the singleton list `e` + * onto `suffix`. + */ + bindingset[suffix] + UnboundList cons(Element e, UnboundList suffix) { result = singleton(e).append(suffix) } + } +} diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 4d4b671071e..fed06829e33 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.22-dev +version: 2.0.26-dev groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index ff67592d22b..5c7447a15dd 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.35.md b/shared/xml/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.36.md b/shared/xml/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.37.md b/shared/xml/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/xml/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.38.md b/shared/xml/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/xml/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 40a7eadd828..079ebe8518c 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index fb623a1f26c..073ffd8edae 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.0.38 + +No user-facing changes. + +## 1.0.37 + +No user-facing changes. + +## 1.0.36 + +No user-facing changes. + +## 1.0.35 + +No user-facing changes. + ## 1.0.34 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.35.md b/shared/yaml/change-notes/released/1.0.35.md new file mode 100644 index 00000000000..c539ed2d3b1 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.35.md @@ -0,0 +1,3 @@ +## 1.0.35 + +No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.36.md b/shared/yaml/change-notes/released/1.0.36.md new file mode 100644 index 00000000000..6cefe97d8b8 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.36.md @@ -0,0 +1,3 @@ +## 1.0.36 + +No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.37.md b/shared/yaml/change-notes/released/1.0.37.md new file mode 100644 index 00000000000..505bacf104d --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.37.md @@ -0,0 +1,3 @@ +## 1.0.37 + +No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.38.md b/shared/yaml/change-notes/released/1.0.38.md new file mode 100644 index 00000000000..2c984549c5f --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.38.md @@ -0,0 +1,3 @@ +## 1.0.38 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index b736654032c..b14e9763a8d 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.34 +lastReleaseVersion: 1.0.38 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index a1af32ac079..1e60008ca44 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.35-dev +version: 1.0.39-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/extractor/infra/SwiftTagTraits.h b/swift/extractor/infra/SwiftTagTraits.h index 806ad0a5ffd..f7825043edd 100644 --- a/swift/extractor/infra/SwiftTagTraits.h +++ b/swift/extractor/infra/SwiftTagTraits.h @@ -287,6 +287,7 @@ MAP(swift::TypeBase, TypeTag) MAP(swift::BuiltinNonDefaultDistributedActorStorageType, void) // Does not appear in AST/SIL, only used during IRGen MAP(swift::BuiltinFixedArrayType, BuiltinFixedArrayTypeTag) MAP(swift::BuiltinUnboundGenericType, void) // Only used during type resolution + MAP(swift::BuiltinImplicitActorType, void) // SIL type MAP(swift::TupleType, TupleTypeTag) MAP(swift::ReferenceStorageType, ReferenceStorageTypeTag) MAP(swift::WeakStorageType, WeakStorageTypeTag) diff --git a/swift/extractor/translators/ExprTranslator.cpp b/swift/extractor/translators/ExprTranslator.cpp index 936bf64940f..a5ae49230b8 100644 --- a/swift/extractor/translators/ExprTranslator.cpp +++ b/swift/extractor/translators/ExprTranslator.cpp @@ -538,7 +538,7 @@ void ExprTranslator::fillSelfApplyExpr(const swift::SelfApplyExpr& expr, void ExprTranslator::fillLookupExpr(const swift::LookupExpr& expr, codeql::LookupExpr& entry) { entry.base = dispatcher.fetchLabel(expr.getBase()); - if (expr.hasDecl()) { + if (expr.hasDecl() && !expr.getDecl().getDecl()->isUnavailable()) { entry.member = dispatcher.fetchLabel(expr.getDecl().getDecl()); } } diff --git a/swift/logging/Formatters.h b/swift/logging/Formatters.h deleted file mode 100644 index 9dc003b9ffe..00000000000 --- a/swift/logging/Formatters.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -// Provides formatters for standard library types to be used with fmtlib. -// TODO: Patch fmtlib to support using `fmt/std.h` without RTTI -// (https://github.com/fmtlib/fmt/issues/3170). - -#include -#include -#include - -namespace fmt { -FMT_FORMAT_AS(std::filesystem::path, std::string); -} - -template <> -struct fmt::formatter : fmt::formatter { - auto format(const std::error_code& e, format_context& ctx) const { - return fmt::formatter::format(e.message(), ctx); - } -}; diff --git a/swift/logging/SwiftLogging.h b/swift/logging/SwiftLogging.h index e94ceb0f6f8..16275858203 100644 --- a/swift/logging/SwiftLogging.h +++ b/swift/logging/SwiftLogging.h @@ -8,8 +8,7 @@ #include #include - -#include "swift/logging/Formatters.h" +#include #include #include diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index b1b958708e0..da1d658ad02 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,21 @@ +## 6.1.3 + +No user-facing changes. + +## 6.1.2 + +No user-facing changes. + +## 6.1.1 + +No user-facing changes. + +## 6.1.0 + +### Major Analysis Improvements + +* Upgraded to allow analysis of Swift 6.2.1. + ## 6.0.0 ### Breaking Changes diff --git a/swift/ql/lib/change-notes/2025-12-11-swift-6.2.2.md b/swift/ql/lib/change-notes/2025-12-11-swift-6.2.2.md new file mode 100644 index 00000000000..27927802dba --- /dev/null +++ b/swift/ql/lib/change-notes/2025-12-11-swift-6.2.2.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Upgraded to allow analysis of Swift 6.2.2. \ No newline at end of file diff --git a/swift/ql/lib/change-notes/2025-12-18-swift-6.2.3.md b/swift/ql/lib/change-notes/2025-12-18-swift-6.2.3.md new file mode 100644 index 00000000000..b8106460049 --- /dev/null +++ b/swift/ql/lib/change-notes/2025-12-18-swift-6.2.3.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Upgraded to allow analysis of Swift 6.2.3. \ No newline at end of file diff --git a/swift/ql/lib/change-notes/2025-10-22-swift-6.2.1.md b/swift/ql/lib/change-notes/released/6.1.0.md similarity index 51% rename from swift/ql/lib/change-notes/2025-10-22-swift-6.2.1.md rename to swift/ql/lib/change-notes/released/6.1.0.md index 42a738ff746..2c16ed106e6 100644 --- a/swift/ql/lib/change-notes/2025-10-22-swift-6.2.1.md +++ b/swift/ql/lib/change-notes/released/6.1.0.md @@ -1,4 +1,5 @@ ---- -category: majorAnalysis ---- +## 6.1.0 + +### Major Analysis Improvements + * Upgraded to allow analysis of Swift 6.2.1. diff --git a/swift/ql/lib/change-notes/released/6.1.1.md b/swift/ql/lib/change-notes/released/6.1.1.md new file mode 100644 index 00000000000..c23a3b809a5 --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.1.1.md @@ -0,0 +1,3 @@ +## 6.1.1 + +No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/6.1.2.md b/swift/ql/lib/change-notes/released/6.1.2.md new file mode 100644 index 00000000000..8e41b366dab --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.1.2.md @@ -0,0 +1,3 @@ +## 6.1.2 + +No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/6.1.3.md b/swift/ql/lib/change-notes/released/6.1.3.md new file mode 100644 index 00000000000..34916dd37c8 --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.1.3.md @@ -0,0 +1,3 @@ +## 6.1.3 + +No user-facing changes. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index f8c4fa43ccb..e641a874973 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.0 +lastReleaseVersion: 6.1.3 diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll index 46e2e63f2ca..692e3626080 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll @@ -159,6 +159,19 @@ module SourceSinkInterpretationInput implements ) } + predicate barrierElement( + Element n, string output, string kind, Public::Provenance provenance, string model + ) { + none() + } + + predicate barrierGuardElement( + Element n, string input, Public::AcceptingValue acceptingvalue, string kind, + Public::Provenance provenance, string model + ) { + none() + } + private newtype TInterpretNode = TElement_(Element n) or TNode_(Node n) or diff --git a/swift/ql/lib/codeql/swift/security/CleartextTransmissionExtensions.qll b/swift/ql/lib/codeql/swift/security/CleartextTransmissionExtensions.qll index 4b31a7ab23f..03d8dff3148 100644 --- a/swift/ql/lib/codeql/swift/security/CleartextTransmissionExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/CleartextTransmissionExtensions.qll @@ -87,7 +87,7 @@ private class UrlTransmittedSink extends CleartextTransmissionSink { // exclude `tel:` and similar URLs. These URLs necessarily contain // sensitive data which you expect to transmit only by making the // phone call (or similar operation). - not ExcludeUrlFlow::flow(_, this) + not ExcludeUrlFlow::flowTo(this) } } diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index ba8c8aac044..3e1437148de 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.0.1-dev +version: 6.1.4-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 99b5491b9db..d3fc5577d26 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.2.12 + +No user-facing changes. + +## 1.2.11 + +No user-facing changes. + +## 1.2.10 + +No user-facing changes. + +## 1.2.9 + +No user-facing changes. + ## 1.2.8 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.2.10.md b/swift/ql/src/change-notes/released/1.2.10.md new file mode 100644 index 00000000000..d86ede66f5b --- /dev/null +++ b/swift/ql/src/change-notes/released/1.2.10.md @@ -0,0 +1,3 @@ +## 1.2.10 + +No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.2.11.md b/swift/ql/src/change-notes/released/1.2.11.md new file mode 100644 index 00000000000..f7a45eaa8d7 --- /dev/null +++ b/swift/ql/src/change-notes/released/1.2.11.md @@ -0,0 +1,3 @@ +## 1.2.11 + +No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.2.12.md b/swift/ql/src/change-notes/released/1.2.12.md new file mode 100644 index 00000000000..222316e646d --- /dev/null +++ b/swift/ql/src/change-notes/released/1.2.12.md @@ -0,0 +1,3 @@ +## 1.2.12 + +No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.2.9.md b/swift/ql/src/change-notes/released/1.2.9.md new file mode 100644 index 00000000000..a928703e4be --- /dev/null +++ b/swift/ql/src/change-notes/released/1.2.9.md @@ -0,0 +1,3 @@ +## 1.2.9 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index a49a92ee5ab..3f5f457c354 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.8 +lastReleaseVersion: 1.2.12 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index d5a55b365f1..82f916cc3cc 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.2.9-dev +version: 1.2.13-dev groups: - swift - queries diff --git a/swift/third_party/resources/resource-dir-linux.zip b/swift/third_party/resources/resource-dir-linux.zip index 970660d813f..2daa0182274 100644 --- a/swift/third_party/resources/resource-dir-linux.zip +++ b/swift/third_party/resources/resource-dir-linux.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e08f6da9166c36d8cc1bb6c3c80f18664feade81ae193daeaada5a9a009748b0 -size 385198654 +oid sha256:ab0279edb35706dbd5c238f6ea29b2a275bb837e1d6485e150801551c7f0740e +size 385211225 diff --git a/swift/third_party/resources/resource-dir-macos.zip b/swift/third_party/resources/resource-dir-macos.zip index c802f6fab29..3bcca5372ba 100644 --- a/swift/third_party/resources/resource-dir-macos.zip +++ b/swift/third_party/resources/resource-dir-macos.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7505fccfe0a537b1583b754fbdd0720415cd9c5e076b542be0d4ec976c955c8 -size 613718859 +oid sha256:e358d99dab2bf07d70a06d8d4119c05ee40e33cdc659ad787595dc56cb405755 +size 613934298 diff --git a/swift/third_party/resources/swift-prebuilt-linux.tar.zst b/swift/third_party/resources/swift-prebuilt-linux.tar.zst index 1f1dba6a974..5caeaeb8b5f 100644 --- a/swift/third_party/resources/swift-prebuilt-linux.tar.zst +++ b/swift/third_party/resources/swift-prebuilt-linux.tar.zst @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1aa54c08025679cea2128499040790c4792debcbe214144b099469debe0d488d -size 132780711 +oid sha256:ad8d6611bfd3c749435e44fa25a300082efb308c21c5da1305c65bd2c5d8fec4 +size 132921192 diff --git a/swift/third_party/resources/swift-prebuilt-macos.tar.zst b/swift/third_party/resources/swift-prebuilt-macos.tar.zst index c66199543e1..b57ed126f8f 100644 --- a/swift/third_party/resources/swift-prebuilt-macos.tar.zst +++ b/swift/third_party/resources/swift-prebuilt-macos.tar.zst @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5b96fe3e221accd9435f40dbd123d388c3418e1e451751ffd6e67339b063cf7 -size 115298493 +oid sha256:a96536acde3a054a2528feedbb6ffa71fb7ffa6b68f0838f2f007e7474fc0b84 +size 115338478 diff --git a/swift/tools/tracing-config.lua b/swift/tools/tracing-config.lua index fdb0cfd16b6..a29e7b3b953 100644 --- a/swift/tools/tracing-config.lua +++ b/swift/tools/tracing-config.lua @@ -53,6 +53,13 @@ function RegisterExtractorPack(id) strip_unsupported_arg(args, '-stack-check', 0) strip_unsupported_arg(args, '-experimental-skip-non-inlinable-function-bodies-without-types', 0) strip_unsupported_clang_arg(args, '-ivfsstatcache', 1) + strip_unsupported_clang_arg(args, '-fno-odr-hash-protocols', 0) + strip_unsupported_clang_arg(args, '-clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation', 0) + strip_unsupported_clang_arg(args, '-clang-vendor-feature=+enableAggressiveVLAFolding', 0) + strip_unsupported_clang_arg(args, '-clang-vendor-feature=+revert09abecef7bbf', 0) + strip_unsupported_clang_arg(args, '-clang-vendor-feature=+thisNoAlignAttr', 0) + strip_unsupported_clang_arg(args, '-clang-vendor-feature=+thisNoNullAttr', 0) + strip_unsupported_clang_arg(args, '-clang-vendor-feature=+disableAtImportPrivateFrameworkInImplementationError', 0) -- The four args below are removed to workaround version mismatches due to recent versions -- of Xcode defaulting to explicit modules: strip_unsupported_arg(args, '-disable-implicit-swift-modules', 0) @@ -120,6 +127,9 @@ function RegisterExtractorPack(id) if compilerArguments.argv[1] == '-emit-supported-features' then return nil end + if compilerArguments.argv[1] == '-scan-dependencies' then + return nil + end strip_unsupported_args(compilerArguments.argv) replace_resource_dir(compilerPath, compilerArguments.argv)